diff --git a/.env.development b/.env.development
index 6edf51d2..6aba1651 100644
--- a/.env.development
+++ b/.env.development
@@ -34,6 +34,7 @@ QQ_SMTP_AUTH_CODE =
# 调试猫源-推荐开启
CAT_DEBUG=1
+PHP_PATH=
PYTHON_PATH=
VIRTUAL_ENV=
daemonMode=0
diff --git a/.gitignore b/.gitignore
index 78c5d859..7bbca429 100644
--- a/.gitignore
+++ b/.gitignore
@@ -159,3 +159,6 @@ dist
/scripts/mjs/index.db
/scripts/test/rsa-test.json
/apps/salary/
+/jx/_30wmv.js
+.DS_Store
+/spider/catvod/mtv60w[差].js
diff --git a/.plugins.example.js b/.plugins.example.js
index c61674e6..6b429d01 100644
--- a/.plugins.example.js
+++ b/.plugins.example.js
@@ -35,14 +35,14 @@ const plugins = [
path: 'plugins/pup-sniffer', // 插件路径
params: '-port 57573', // 启动参数:端口57573
desc: 'drplayer嗅探服务', // 插件描述:提供视频适配代理功能
- active: true // 是否激活:true表示启用此插件
+ active: false // 是否激活:true表示启用此插件
},
{
name: 'mediaProxy', // 插件名称
path: 'plugins/mediaProxy', // 插件路径
params: '-port 57574', // 启动参数:端口57574
desc: 'go媒体代理服务', // 插件描述:提供视频适配代理功能
- active: true // 是否激活:true表示启用此插件
+ active: false // 是否激活:true表示启用此插件
},
]
diff --git a/Dockerfile b/Dockerfile
index 0377fc19..63bb1162 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -43,13 +43,28 @@ RUN cp /app/.env.development /app/.env && \
# 但是,我们仍然需要安装Node.js运行时本身(除非drpys项目是一个纯静态资源服务,不需要Node.js运行时)
RUN apk add --no-cache nodejs
+# 安装php8.3及其扩展
+RUN apk add --no-cache \
+ php83 \
+ php83-cli \
+ php83-curl \
+ php83-mbstring \
+ php83-xml \
+ php83-pdo \
+ php83-pdo_mysql \
+ php83-pdo_sqlite \
+ php83-openssl \
+ php83-sqlite3 \
+ php83-json
+RUN ln -sf /usr/bin/php83 /usr/bin/php
+
# 安装python3依赖
RUN apk add --no-cache python3 \
py3-pip \
py3-setuptools \
py3-wheel
-# 激活python3虚拟环境并安装依pip3赖
+# 激活python3虚拟环境并安装requirements依赖
RUN python3 -m venv /app/.venv && \
. /app/.venv/bin/activate && \
pip3 install -r /app/spider/py/base/requirements.txt
diff --git a/README.md b/README.md
index da5f1e36..0e0387e6 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,8 @@ nodejs作为服务端的drpy实现。全面升级异步写法
### 常用超链接
* [本项目主页-免翻](https://github.com/hjdhnx/drpy-node)
-* [最新DS本地包-适配皮卡丘](/gh/release)
+* ~~[最新DS本地包-适配皮卡丘](/gh/release)~~
+* [DS本地包下载中心](/admin/download)
* [接口文档](docs/apidoc.md) | [接口列表如定时任务](docs/apiList.md) |
~~[小猫影视-待对接T4](https://github.com/waifu-project/movie/pull/135)~~
* [代码质量评估工具说明](docs/codeCheck.md) | [DS项目代码评估报告](docs/codeCheckReport.md)
@@ -19,9 +20,11 @@ nodejs作为服务端的drpy实现。全面升级异步写法
* [本地配置接口-动态外网/局域网](/config/1?healthy=1&pwd=$pwd)
* [其他配置接口-订阅过滤](/docs/sub.md)
* [python环境](/docs/pyenv.md) | [DS项目环境变量说明](/docs/envdoc.md)
+* php环境(详见 spider/php/readme.md) 不在这里赘述
* [猫源调试教程](/docs/catDebug.md)
* [接口压测教程](/docs/httpTest.md)
* [AI编程工具 trae](https://www.trae.ai/account-setting#subscription) | 邮编ZIP输入: 518000
+* [推荐使用AI模型-GLM4.7](https://www.bigmodel.cn/glm-coding?ic=DRV3C8M5NX) | [GLM配置文档](https://docs.bigmodel.cn/cn/coding-plan/tool/trae)
* [免费AI-360纳米](https://bot.n.cn/)|[免费AI-当贝AI](https://ai.dangbei.com/chat)|[国外聚合全模型](https://lmarena.ai/)
* [本站防止爬虫协议](/robots.txt)
* [油猴脚本-反切屏检测](/public/monkey/check_screen_leave.user.js)
@@ -44,6 +47,7 @@ nodejs作为服务端的drpy实现。全面升级异步写法
* [DS时钟插件-白色时钟](/apps/clock/white_clock.html)|[日历时钟](/apps/clock/index.html)
* [DS庆祝页面-完结撒花](/apps/happy/index.html)
* [bookReader](/apps/book-reader)
+* [系统备份与恢复](/apps/backup-restore/index.html)
* [代码加解密工具](/admin/encoder)
* [央视点播解析工具](/proxy/央视大全[官]/index.html)
* [在线猫ds源主页](/cat/index.html)
@@ -66,13 +70,17 @@ nodejs作为服务端的drpy实现。全面升级异步写法
## 更新记录
-### 20260113
+### 20260208
-更新至V1.3.16
+更新至V1.3.22
-### 20260112
+### 20260131
-更新至V1.3.15
+更新至V1.3.21
+
+### 20260127
+
+更新至V1.3.20
[点此查看完整更新记录](docs/updateRecord.md)
@@ -176,6 +184,7 @@ pm2 restart drpys
* [源动力-老](https://sourcepower.top/index)
* [电竞专业反应测试](https://www.arealme.com/brain-memory-game/zh/)
* [桌面启动器](https://wwbty.lanzouv.com/iDZaP3d3i5ud)
+* [不知名获取网盘CK工具](http://sspa8.top:8100/pan/admin/index.php)
## AI接入
diff --git a/apps/backup-restore/index.html b/apps/backup-restore/index.html
new file mode 100644
index 00000000..98a03231
--- /dev/null
+++ b/apps/backup-restore/index.html
@@ -0,0 +1,373 @@
+
+
+
+
+
+ 系统备份与恢复
+
+
+
+
+
📂 系统备份与恢复
+
+
+
+
备份说明: 点击“立即备份”将系统配置、插件及脚本备份到同级 backup 目录。
+
恢复说明: 点击“恢复备份”将从 backup 目录恢复文件覆盖当前系统。
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/cookie-butler/index.html b/apps/cookie-butler/index.html
index 51942ecc..ca9d936d 100644
--- a/apps/cookie-butler/index.html
+++ b/apps/cookie-butler/index.html
@@ -12,6 +12,7 @@
+
@@ -19,10 +20,13 @@
@@ -93,28 +97,67 @@
const textValue = document.getElementById("cookie-res").value || '';
const active_name = activeLi.textContent.trim();
const active_key = activeLi.getAttribute('data-platform').trim();
- const save_key = active_key === 'ali' ? active_key + '_token' : active_key + '_cookie';
+ let save_key = ''
+ if (/ali|pikpak/.test(active_key)) {
+ save_key = active_key + '_token'
+ } else {
+ save_key = active_key + '_cookie';
+ }
+
console.log(`准备入库cookie:${active_name} ${save_key},值为:${textValue}`);
const cookie_auth_code = prompt('cookie入库功能需要管理员授权码,请你正确输入后继续');
if (cookie_auth_code) {
- // 使用 axios 发送 POST 请求
- axios.post('/admin/cookie-set', {
- cookie_auth_code: cookie_auth_code,
- key: save_key,
- value: textValue.trim().replaceAll('\n', '')
- })
- .then(response => {
+ if (save_key.includes('pikpak')) {
+ // 使用 axios 发送 POST 请求
+ axios.post('/admin/cookie-set', {
+ cookie_auth_code: cookie_auth_code,
+ key: save_key,
+ value: textValue.split(';')[0].trim().replaceAll('\n', '')
+ }).then(response => {
if (response.data.success) {
alert(`Cookie 入库成功:${active_name} (${save_key})`);
} else {
alert(`入库失败:${response.data.message}`);
}
- })
- .catch(error => {
+ }).catch(error => {
+ console.error('请求失败:', error);
+ alert(`入库失败,服务器出现问题,请稍后再试。\n${error.response.data.message}`);
+ });
+ axios.post('/admin/cookie-set', {
+ cookie_auth_code: cookie_auth_code,
+ key: save_key.replace('token', 'refresh_token'),
+ value: textValue.split(';')[1].trim().replaceAll('\n', '')
+ }).then(response => {
+ if (response.data.success) {
+ alert(`Cookie 入库成功:${active_name} (${save_key.replace('token', 'refresh_token')})`);
+ } else {
+ alert(`入库失败:${response.data.message}`);
+ }
+ }).catch(error => {
console.error('请求失败:', error);
alert(`入库失败,服务器出现问题,请稍后再试。\n${error.response.data.message}`);
});
+ } else {
+ // 使用 axios 发送 POST 请求
+ axios.post('/admin/cookie-set', {
+ cookie_auth_code: cookie_auth_code,
+ key: save_key,
+ value: textValue.trim().replaceAll('\n', '')
+ })
+ .then(response => {
+ if (response.data.success) {
+ alert(`Cookie 入库成功:${active_name} (${save_key})`);
+ } else {
+ alert(`入库失败:${response.data.message}`);
+ }
+ })
+ .catch(error => {
+ console.error('请求失败:', error);
+ alert(`入库失败,服务器出现问题,请稍后再试。\n${error.response.data.message}`);
+ });
+ }
+
}
} else {
alert('至少选中一个cookie入库项目');
diff --git a/apps/cookie-butler/static/js/cookie.js b/apps/cookie-butler/static/js/cookie.js
index bff8f94a..f01be452 100644
--- a/apps/cookie-butler/static/js/cookie.js
+++ b/apps/cookie-butler/static/js/cookie.js
@@ -20,7 +20,7 @@ function showToast(message, type = 'success') {
// 初始化页面
async function initializePage() {
// 加载cookie
- const platforms = ['ali', 'quark', 'uc', 'uc_token', 'bili', 'baidu'];
+ const platforms = ['ali', 'quark', 'quark_token', 'uc', 'uc_token', 'bili', 'yun', 'baidu', 'pikpak'];
// 绑定按钮事件
platforms.forEach(platform => {
diff --git a/apps/cookie-butler/static/js/jsencrypt.min.js b/apps/cookie-butler/static/js/jsencrypt.min.js
new file mode 100644
index 00000000..27c29d5e
--- /dev/null
+++ b/apps/cookie-butler/static/js/jsencrypt.min.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.JSEncrypt={})}(this,function(t){"use strict";var e="0123456789abcdefghijklmnopqrstuvwxyz";function a(t){return e.charAt(t)}function i(t,e){return t&e}function u(t,e){return t|e}function r(t,e){return t^e}function n(t,e){return t&~e}function s(t){if(0==t)return-1;var e=0;return 0==(65535&t)&&(t>>=16,e+=16),0==(255&t)&&(t>>=8,e+=8),0==(15&t)&&(t>>=4,e+=4),0==(3&t)&&(t>>=2,e+=2),0==(1&t)&&++e,e}function o(t){for(var e=0;0!=t;)t&=t-1,++e;return e}var h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function c(t){var e,i,r="";for(e=0;e+3<=t.length;e+=3)i=parseInt(t.substring(e,e+3),16),r+=h.charAt(i>>6)+h.charAt(63&i);for(e+1==t.length?(i=parseInt(t.substring(e,e+1),16),r+=h.charAt(i<<2)):e+2==t.length&&(i=parseInt(t.substring(e,e+2),16),r+=h.charAt(i>>2)+h.charAt((3&i)<<4));0<(3&r.length);)r+="=";return r}function f(t){var e,i="",r=0,n=0;for(e=0;e
>2),n=3&s,r=1):1==r?(i+=a(n<<2|s>>4),n=15&s,r=2):2==r?(i+=a(n),i+=a(s>>2),n=3&s,r=3):(i+=a(n<<2|s>>4),i+=a(15&s),r=0))}return 1==r&&(i+=a(n<<2)),i}var l,p=function(t,e){return(p=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i])})(t,e)};var g,d=function(t){var e;if(void 0===l){var i="0123456789ABCDEF",r=" \f\n\r\t \u2028\u2029";for(l={},e=0;e<16;++e)l[i.charAt(e)]=e;for(i=i.toLowerCase(),e=10;e<16;++e)l[i.charAt(e)]=e;for(e=0;e>16,r[r.length]=n>>8&255,r[r.length]=255&n,s=n=0):n<<=6}}switch(s){case 1:throw new Error("Base64 encoding incomplete: at least 2 bits missing");case 2:r[r.length]=n>>10;break;case 3:r[r.length]=n>>16,r[r.length]=n>>8&255}return r},re:/-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,unarmor:function(t){var e=v.re.exec(t);if(e)if(e[1])t=e[1];else{if(!e[2])throw new Error("RegExp out of sync");t=e[2]}return v.decode(t)}},m=1e13,y=function(){function t(t){this.buf=[+t||0]}return t.prototype.mulAdd=function(t,e){var i,r,n=this.buf,s=n.length;for(i=0;ie&&(t=t.substring(0,e)+b),t}var w,D=function(){function i(t,e){this.hexDigits="0123456789ABCDEF",t instanceof i?(this.enc=t.enc,this.pos=t.pos):(this.enc=t,this.pos=e)}return i.prototype.get=function(t){if(void 0===t&&(t=this.pos++),t>=this.enc.length)throw new Error("Requesting byte offset "+t+" on a stream of length "+this.enc.length);return"string"==typeof this.enc?this.enc.charCodeAt(t):this.enc[t]},i.prototype.hexByte=function(t){return this.hexDigits.charAt(t>>4&15)+this.hexDigits.charAt(15&t)},i.prototype.hexDump=function(t,e,i){for(var r="",n=t;n>u&1?"1":"0";if(s.length>i)return n+E(s,i)}return n+s},i.prototype.parseOctetString=function(t,e,i){if(this.isASCII(t,e))return E(this.parseStringISO(t,e),i);var r=e-t,n="("+r+" byte)\n";(i/=2)i)return E(r,i);n=new y,s=0}}return 0>6,this.tagConstructed=0!=(32&e),this.tagNumber=31&e,31==this.tagNumber){for(var i=new y;e=t.get(),i.mulAdd(128,127&e),128&e;);this.tagNumber=i.simplify()}}return t.prototype.isUniversal=function(){return 0===this.tagClass},t.prototype.isEOC=function(){return 0===this.tagClass&&0===this.tagNumber},t}(),B=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997],A=(1<<26)/B[B.length-1],O=function(){function b(t,e,i){null!=t&&("number"==typeof t?this.fromNumber(t,e,i):null==e&&"string"!=typeof t?this.fromString(t,256):this.fromString(t,e))}return b.prototype.toString=function(t){if(this.s<0)return"-"+this.negate().toString(t);var e;if(16==t)e=4;else if(8==t)e=3;else if(2==t)e=1;else if(32==t)e=5;else{if(4!=t)return this.toRadix(t);e=2}var i,r=(1<>h)&&(n=!0,s=a(i));0<=o;)h>(h+=this.DB-e)):(i=this[o]>>(h-=e)&r,h<=0&&(h+=this.DB,--o)),0>24},b.prototype.shortValue=function(){return 0==this.t?this.s:this[0]<<16>>16},b.prototype.signum=function(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1},b.prototype.toByteArray=function(){var t=this.t,e=[];e[0]=this.s;var i,r=this.DB-t*this.DB%8,n=0;if(0>r)!=(this.s&this.DM)>>r&&(e[n++]=i|this.s<>(r+=this.DB-8)):(i=this[t]>>(r-=8)&255,r<=0&&(r+=this.DB,--t)),0!=(128&i)&&(i|=-256),0==n&&(128&this.s)!=(128&i)&&++n,(0=this.t?0!=this.s:0!=(this[e]&1<>n-a&u:(f=(t[p]&(1<>this.DB+n-a)),h=i;0==(1&f);)f>>=1,--h;if((n-=h)<0&&(n+=this.DB,--p),g)o[f].copyTo(s),g=!1;else{for(;1this.DB?(this[this.t-1]|=(o&(1<>this.DB-s):this[this.t-1]|=o<=this.DB&&(s-=this.DB))}8==i&&0!=(128&+t[0])&&(this.s=-1,0>r|o,o=(this[h]&n)<=this.t)e.t=0;else{var r=t%this.DB,n=this.DB-r,s=(1<>r;for(var o=i+1;o>r;0>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;i>=this.DB;r-=t.s}e.s=r<0?-1:0,r<-1?e[i++]=this.DV+r:0=e.DV&&(t[i+e.t]-=e.DV,t[i+e.t+1]=1)}0>this.F2:0),l=this.FV/f,p=(1<=i&&(this.dMultiply(r),this.dAddOffset(o,0),o=s=0))}0t&&this.subTo(b.ONE.shiftLeft(t-1),this);else{var r=[],n=7&t;r.length=1+(t>>3),e.nextBytes(r),0>=this.DB;if(t.t>=this.DB;r+=this.s}else{for(r+=this.s;i>=this.DB;r+=t.s}e.s=r<0?-1:0,0=this.DV;)this[e]-=this.DV,++e>=this.t&&(this[this.t++]=0),++this[e]}},b.prototype.multiplyLowerTo=function(t,e,i){var r=Math.min(this.t+t.t,e);for(i.s=0,i.t=r;0>1)&&(t=B.length);for(var n=M(),s=0;st&&n.subTo(b.ONE.shiftLeft(t-1),n),n.isProbablePrime(e)?setTimeout(function(){r()},0):setTimeout(s,0)};setTimeout(s,0)}else{var o=[],h=7&t;o.length=1+(t>>3),e.nextBytes(o),0>15,this.um=(1<>15)*this.mpl&this.um)<<15)&t.DM;for(t[i=e+this.m.t]+=this.m.am(0,r,t,e,0,this.m.t);t[i]>=t.DV;)t[i]-=t.DV,t[++i]++}t.clamp(),t.drShiftTo(this.m.t,t),0<=t.compareTo(this.m)&&t.subTo(this.m,t)},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i),this.reduce(i)},t.prototype.sqrTo=function(t,e){t.squareTo(e),this.reduce(e)},t}(),P=function(){function t(t){this.m=t,this.r2=M(),this.q3=M(),O.ONE.dlShiftTo(2*t.t,this.r2),this.mu=this.r2.divide(t)}return t.prototype.convert=function(t){if(t.s<0||t.t>2*this.m.t)return t.mod(this.m);if(t.compareTo(this.m)<0)return t;var e=M();return t.copyTo(e),this.reduce(e),e},t.prototype.revert=function(t){return t},t.prototype.reduce=function(t){for(t.drShiftTo(this.m.t-1,this.r2),t.t>this.m.t+1&&(t.t=this.m.t+1,t.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);t.compareTo(this.r2)<0;)t.dAddOffset(1,this.m.t+1);for(t.subTo(this.r2,t);0<=t.compareTo(this.m);)t.subTo(this.m,t)},t.prototype.mulTo=function(t,e,i){t.multiplyTo(e,i),this.reduce(i)},t.prototype.sqrTo=function(t,e){t.squareTo(e),this.reduce(e)},t}();function M(){return new O(null)}function q(t,e){return new O(t,e)}"Microsoft Internet Explorer"==navigator.appName?(O.prototype.am=function(t,e,i,r,n,s){for(var o=32767&e,h=e>>15;0<=--s;){var a=32767&this[t],u=this[t++]>>15,c=h*a+u*o;n=((a=o*a+((32767&c)<<15)+i[r]+(1073741823&n))>>>30)+(c>>>15)+h*u+(n>>>30),i[r++]=1073741823&a}return n},w=30):"Netscape"!=navigator.appName?(O.prototype.am=function(t,e,i,r,n,s){for(;0<=--s;){var o=e*this[t++]+i[r]+n;n=Math.floor(o/67108864),i[r++]=67108863&o}return n},w=26):(O.prototype.am=function(t,e,i,r,n,s){for(var o=16383&e,h=e>>14;0<=--s;){var a=16383&this[t],u=this[t++]>>14,c=h*a+u*o;n=((a=o*a+((16383&c)<<14)+i[r]+n)>>28)+(c>>14)+h*u,i[r++]=268435455&a}return n},w=28),O.prototype.DB=w,O.prototype.DM=(1<>>16)&&(t=e,i+=16),0!=(e=t>>8)&&(t=e,i+=8),0!=(e=t>>4)&&(t=e,i+=4),0!=(e=t>>2)&&(t=e,i+=2),0!=(e=t>>1)&&(t=e,i+=1),i}O.ZERO=F(0),O.ONE=F(1);var K=function(){function t(){this.i=0,this.j=0,this.S=[]}return t.prototype.init=function(t){var e,i,r;for(e=0;e<256;++e)this.S[e]=e;for(e=i=0;e<256;++e)i=i+this.S[e]+t[e%t.length]&255,r=this.S[e],this.S[e]=this.S[i],this.S[i]=r;this.i=0,this.j=0},t.prototype.next=function(){var t;return this.i=this.i+1&255,this.j=this.j+this.S[this.i]&255,t=this.S[this.i],this.S[this.i]=this.S[this.j],this.S[this.j]=t,this.S[t+this.S[this.i]&255]},t}();var k,_,z=256,Z=null;if(null==Z){Z=[];var G=void(_=0);if(window.crypto&&window.crypto.getRandomValues){var $=new Uint32Array(256);for(window.crypto.getRandomValues($),G=0;G<$.length;++G)Z[_++]=255&$[G]}var Y=function(t){if(this.count=this.count||0,256<=this.count||z<=_)window.removeEventListener?window.removeEventListener("mousemove",Y,!1):window.detachEvent&&window.detachEvent("onmousemove",Y);else try{var e=t.x+t.y;Z[_++]=255&e,this.count+=1}catch(t){}};window.addEventListener?window.addEventListener("mousemove",Y,!1):window.attachEvent&&window.attachEvent("onmousemove",Y)}function J(){if(null==k){for(k=new K;_>6|192):(i[--e]=63&n|128,i[--e]=n>>6&63|128,i[--e]=n>>12|224)}i[--e]=0;for(var s=new X,o=[];2>3);if(null==e)return null;var i=this.doPublic(e);if(null==i)return null;var r=i.toString(16);return 0==(1&r.length)?r:"0"+r},t.prototype.setPrivate=function(t,e,i){null!=t&&null!=e&&0>1;this.e=parseInt(e,16);for(var n=new O(e,16);;){for(;this.p=new O(t-r,1,i),0!=this.p.subtract(O.ONE).gcd(n).compareTo(O.ONE)||!this.p.isProbablePrime(10););for(;this.q=new O(r,1,i),0!=this.q.subtract(O.ONE).gcd(n).compareTo(O.ONE)||!this.q.isProbablePrime(10););if(this.p.compareTo(this.q)<=0){var s=this.p;this.p=this.q,this.q=s}var o=this.p.subtract(O.ONE),h=this.q.subtract(O.ONE),a=o.multiply(h);if(0==a.gcd(n).compareTo(O.ONE)){this.n=this.p.multiply(this.q),this.d=n.modInverse(a),this.dmp1=this.d.mod(o),this.dmq1=this.d.mod(h),this.coeff=this.q.modInverse(this.p);break}}},t.prototype.decrypt=function(t){var e=q(t,16),i=this.doPrivate(e);return null==i?null:function(t,e){var i=t.toByteArray(),r=0;for(;r=i.length)return null;var n="";for(;++r>3)},t.prototype.generateAsync=function(t,e,n){var s=new X,o=t>>1;this.e=parseInt(e,16);var h=new O(e,16),a=this,u=function(){var e=function(){if(a.p.compareTo(a.q)<=0){var t=a.p;a.p=a.q,a.q=t}var e=a.p.subtract(O.ONE),i=a.q.subtract(O.ONE),r=e.multiply(i);0==r.gcd(h).compareTo(O.ONE)?(a.n=a.p.multiply(a.q),a.d=h.modInverse(r),a.dmp1=a.d.mod(e),a.dmq1=a.d.mod(i),a.coeff=a.q.modInverse(a.p),setTimeout(function(){n()},0)):setTimeout(u,0)},i=function(){a.q=M(),a.q.fromNumberAsync(o,1,s,function(){a.q.subtract(O.ONE).gcda(h,function(t){0==t.compareTo(O.ONE)&&a.q.isProbablePrime(10)?setTimeout(e,0):setTimeout(i,0)})})},r=function(){a.p=M(),a.p.fromNumberAsync(t-o,1,s,function(){a.p.subtract(O.ONE).gcda(h,function(t){0==t.compareTo(O.ONE)&&a.p.isProbablePrime(10)?setTimeout(i,0):setTimeout(r,0)})})};setTimeout(r,0)};setTimeout(u,0)},t.prototype.sign=function(t,e,i){var r=function(t,e){if(e=e?t:new Array(e-t.length+1).join("0")+t},this.getString=function(){return this.s},this.setString=function(t){this.hTLV=null,this.isModified=!0,this.s=t,this.hV=stohex(t)},this.setByDateValue=function(t,e,i,r,n,s){var o=new Date(Date.UTC(t,e-1,i,r,n,s,0));this.setByDate(o)},this.getFreshValueHex=function(){return this.hV}},tt.lang.extend(et.asn1.DERAbstractTime,et.asn1.ASN1Object),et.asn1.DERAbstractStructured=function(t){et.asn1.DERAbstractString.superclass.constructor.call(this),this.setByASN1ObjectArray=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array=t},this.appendASN1Object=function(t){this.hTLV=null,this.isModified=!0,this.asn1Array.push(t)},this.asn1Array=new Array,void 0!==t&&void 0!==t.array&&(this.asn1Array=t.array)},tt.lang.extend(et.asn1.DERAbstractStructured,et.asn1.ASN1Object),et.asn1.DERBoolean=function(){et.asn1.DERBoolean.superclass.constructor.call(this),this.hT="01",this.hTLV="0101ff"},tt.lang.extend(et.asn1.DERBoolean,et.asn1.ASN1Object),et.asn1.DERInteger=function(t){et.asn1.DERInteger.superclass.constructor.call(this),this.hT="02",this.setByBigInteger=function(t){this.hTLV=null,this.isModified=!0,this.hV=et.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger=function(t){var e=new O(String(t),10);this.setByBigInteger(e)},this.setValueHex=function(t){this.hV=t},this.getFreshValueHex=function(){return this.hV},void 0!==t&&(void 0!==t.bigint?this.setByBigInteger(t.bigint):void 0!==t.int?this.setByInteger(t.int):"number"==typeof t?this.setByInteger(t):void 0!==t.hex&&this.setValueHex(t.hex))},tt.lang.extend(et.asn1.DERInteger,et.asn1.ASN1Object),et.asn1.DERBitString=function(t){if(void 0!==t&&void 0!==t.obj){var e=et.asn1.ASN1Util.newObject(t.obj);t.hex="00"+e.getEncodedHex()}et.asn1.DERBitString.superclass.constructor.call(this),this.hT="03",this.setHexValueIncludingUnusedBits=function(t){this.hTLV=null,this.isModified=!0,this.hV=t},this.setUnusedBitsAndHexValue=function(t,e){if(t<0||7 {
- if (enable_dr2 === '1') {
+ if (enable_dr2 === '1' || enable_dr2 === '2') {
// dr2ApiType=0 使用接口drpy2 dr2ApiType=1 使用壳子内置的drpy2
let api = dr2ApiType ? `assets://js/lib/drpy2.js` : `${requestHost}/public/drpy/drpy2.min.js`;
+ if (enable_dr2 === '2') {
+ api = `${requestHost}/public/drpy/drpy2-fast.min.js`;
+ }
let ext = `${requestHost}/js/${file}`;
if (pwd) {
ext += `?pwd=${pwd}`;
@@ -348,31 +369,33 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
ext: ext || "", // 固定为空字符串
};
sites.push(site);
- } else if (enable_dr2 === '2') {
- // 模式2:只启用T3脚本的T4风格API配置
- const t4site = {
- key: fileSite.key,
- name: fileSite.name,
- type: 4, // 固定值
- api: `${requestHost}/api/${baseName}`,
- ...ruleMeta,
- ext: "", // 固定为空字符串
- };
- // 添加isdr2参数到API URL
- if (pwd) {
- t4site.api += `?pwd=${pwd}&do=dr`;
- } else {
- t4site.api += `?do=dr`;
- }
-
- // 处理传参源的API参数
- if (fileSite.queryStr) {
- const separator = t4site.api.includes('?') ? '&' : '?';
- site.api += `${separator}extend=${encodeURIComponent(fileSite.queryStr)}`;
- }
-
- sites.push(t4site);
}
+ // else if (enable_dr2 === '2') {
+ //
+ // // 模式2:只启用T3脚本的T4风格API配置
+ // const t4site = {
+ // key: fileSite.key,
+ // name: fileSite.name,
+ // type: 4, // 固定值
+ // api: `${requestHost}/api/${baseName}`,
+ // ...ruleMeta,
+ // ext: "", // 固定为空字符串
+ // };
+ // // 添加isdr2参数到API URL
+ // if (pwd) {
+ // t4site.api += `?pwd=${pwd}&do=dr`;
+ // } else {
+ // t4site.api += `?do=dr`;
+ // }
+ //
+ // // 处理传参源的API参数
+ // if (fileSite.queryStr) {
+ // const separator = t4site.api.includes('?') ? '&' : '?';
+ // site.api += `${separator}extend=${encodeURIComponent(fileSite.queryStr)}`;
+ // }
+ //
+ // sites.push(t4site);
+ // }
});
},
param: {file, dr2Dir, requestHost, pwd, drpyS, SitesMap},
@@ -412,6 +435,11 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
filterable: 1, // 固定值
quickSearch: 1, // 固定值
};
+ if (baseName.includes('[画]')) {
+ ruleObject.类型 = '漫画'
+ } else if (baseName.includes('[书]')) {
+ ruleObject.类型 = '小说'
+ }
let ruleMeta = {...ruleObject};
const filePath = path.join(pyDir, file);
const header = await FileHeaderManager.readHeader(filePath);
@@ -485,6 +513,68 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
await batchExecute(py_tasks, listener);
}
+
+ // 根据用户是否启用php源去生成对应配置
+ const enable_php = ENV.get('enable_php', '1');
+ console.log('isPhpAvailable:', isPhpAvailable);
+ if ((enable_php === '1' && isPhpAvailable) || enable_php === '2') {
+ const php_files = readdirSync(phpDir);
+ const api_type = enable_php === '2' ? 3 : 4;
+ let php_valid_files = php_files.filter((file) => file.endsWith('.php') && !file.startsWith('_') && !['config.php', 'index.php', 'test_runner.php'].includes(file));
+ log(`开始生成php的T${api_type}配置,phpDir:${phpDir},源数量: ${php_valid_files.length}`);
+
+ const php_tasks = php_valid_files.map((file) => {
+ return {
+ func: async ({file, phpDir, requestHost, pwd, SitesMap}) => {
+ const baseName = path.basename(file, '.php');
+ let api = enable_php === '2' ? `${requestHost}/php/${file}` : `${requestHost}/api/${baseName}?do=php`;
+ let ext = '';
+ if (pwd) {
+ api += enable_php === '2' ? `?pwd=${pwd}` : `&pwd=${pwd}`;
+ }
+ let ruleObject = {
+ searchable: 1,
+ filterable: 1,
+ quickSearch: 1,
+ };
+ if (baseName.includes('[画]')) {
+ ruleObject.类型 = '漫画'
+ } else if (baseName.includes('[书]')) {
+ ruleObject.类型 = '小说'
+ }
+ let ruleMeta = {...ruleObject};
+ const filePath = path.join(phpDir, file);
+
+ Object.assign(ruleMeta, {
+ title: baseName,
+ lang: 'php',
+ });
+ ruleMeta.title = enableRuleName ? ruleMeta.title || baseName : baseName;
+
+ let fileSites = [];
+ let key = `php_${ruleMeta.title}`;
+ let name = `${ruleMeta.title}(PHP)`;
+ fileSites.push({key, name, ext});
+
+ fileSites.forEach((fileSite) => {
+ const site = {
+ key: fileSite.key,
+ name: fileSite.name,
+ type: api_type,
+ api,
+ ...ruleMeta,
+ ext: fileSite.ext || "",
+ };
+ sites.push(site);
+ });
+ },
+ param: {file, phpDir, requestHost, pwd, SitesMap},
+ id: file,
+ };
+ });
+ await batchExecute(php_tasks, listener);
+ }
+
const enable_cat = ENV.get('enable_cat', '1');
// 根据用户是否启用cat源去生成对应配置
if (enable_cat === '1' || enable_cat === '2') {
@@ -515,6 +605,11 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
filterable: 1, // 固定值
quickSearch: 1, // 固定值
};
+ if (baseName.includes('[画]')) {
+ ruleObject.类型 = '漫画'
+ } else if (baseName.includes('[书]')) {
+ ruleObject.类型 = '小说'
+ }
let ruleMeta = {...ruleObject};
const filePath = path.join(catDir, file);
const header = await FileHeaderManager.readHeader(filePath);
@@ -655,78 +750,82 @@ async function generateSiteJSON(options, requestHost, sub, pwd) {
* @returns {Promise ', '状态');
+ let kid = cutStr(it, 'href="', '"', 'Id');
+ kvods.push({
+ vod_name: kname,
+ vod_pic: kpic,
+ vod_remarks: kremarks,
+ vod_id: `${kid}@${kname}@${kpic}@${kremarks}`
+ });
+ }
+ return kvods;
+ } catch (e) {
+ console.error(`生成视频列表失败:`, e.message);
+ return [];
+ }
+}
+
+async function detail(ids) {
+ try {
+ let [id, kname, kpic, kremarks] = ids.split('@');
+ let detailUrl = !/^http/.test(id) ? `${HOST}${id}` : id;
+ let resHtml = await request(detailUrl);
+ if (!resHtml) {throw new Error('源码为空');}
+ let intros = cutStr(resHtml, 'search-show', '', '', false);
+ let ktabs = pdfa(resHtml, '.anthology-tab&&a').map((it,idx) => cutStr(it, '', '<', `线路${idx+1}`));
+ let kurls = pdfa(resHtml, '.anthology-list-play').map(item => {
+ return pdfa(item, 'a').map(it => { return `${cutStr(it, '>', '<', 'noEpi')}$${cutStr(it, 'href="', '"', 'noUrl')}` }).join('#');
+ });
+ let VOD = {
+ vod_id: detailUrl,
+ vod_name: kname,
+ vod_pic: kpic,
+ type_name: cutStr(intros, '类型:', '', '类型'),
+ vod_remarks: `${cutStr(intros, '状态:', '', '状态')}|${cutStr(intros, '更新:', '', '更新')}`,
+ vod_year: cutStr(intros, '年份:', '', '1000'),
+ vod_area: cutStr(intros, '地区:', '', '地区'),
+ vod_lang: cutStr(intros, '语言:', '', '语言'),
+ vod_director: cutStr(intros, '导演:', '', '').replace(/,$/, '') || '导演',
+ vod_actor: cutStr(intros, '主演:', '', '').replace(/,$/, '') || '主演',
+ vod_content: cutStr(intros, '简介:', '', '') || kname,
+ vod_play_from: ktabs.join('$$$'),
+ vod_play_url: kurls.join('$$$')
+ };
+ return JSON.stringify({list: [VOD]});
+ } catch (e) {
+ console.error('详情页获取失败:', e.message);
+ return JSON.stringify({list: []});
+ }
+}
+
+async function play(flag, ids, flags) {
+ try {
+ let playUrl = !/^http/.test(ids) ? `${HOST}${ids}` : ids;
+ let kp = 0, kurl = '';
+ let resHtml = await request(playUrl);
+ let codeObj = safeParseJSON(cutStr(resHtml, 'var player_£=', '<', '', false));
+ let jurl = codeObj?.url ?? '';
+ jurl = safeUrlDecode(safeB64Decode(jurl));
+ if (jurl) {
+ jurl = `${HOST}/player/?url=${jurl}&next=`;
+ resHtml = await request(jurl);
+ let encryptedUrl = cutStr(resHtml, 'const encryptedUrl = "', '"', '');
+ let sessionKey = cutStr(resHtml, 'const sessionKey = "', '"', '');
+ kurl = urlAesDecrypt(encryptedUrl, sessionKey);
+ }
+ if (!/^http/.test(kurl)) {
+ kurl = playUrl;
+ kp = 1;
+ }
+ return JSON.stringify({jx: 0, parse: kp, url: kurl, header: DefHeader});
+ } catch (e) {
+ console.error('播放失败:', e.message);
+ return JSON.stringify({jx: 0, parse: 0, url: '', header: {}});
+ }
+}
+
+function urlAesDecrypt(ciphertext, key) {
+ try {
+ const rawData = Crypto.enc.Base64.parse(ciphertext);
+ const keyWordArr = Crypto.enc.Utf8.parse(key);
+ const ivWordArr = Crypto.lib.WordArray.create(rawData.words.slice(0, 4));
+ const encrypted = Crypto.lib.WordArray.create(rawData.words.slice(4));
+ const decrypted = Crypto.AES.decrypt( { ciphertext: encrypted }, keyWordArr,
+ {
+ iv: ivWordArr,
+ mode: Crypto.mode.CBC,
+ padding: Crypto.pad.Pkcs7
+ }
+ );
+ return decrypted.toString(Crypto.enc.Utf8);
+ } catch (e) {
+ return '';
+ }
+}
+
+function safeB64Decode(b64Str) {
+ try {return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(b64Str));} catch (e) {return '';}
+}
+
+function safeUrlDecode(urlStr) {
+ try {return decodeURIComponent(urlStr);} catch (e) {return '';}
+}
+
+function safeParseJSON(jStr) {
+ try {return JSON.parse(jStr);} catch (e) {return null;}
+}
+
+function cutStr(str, prefix = '', suffix = '', defaultVal = 'cutFaile', clean = true, i = 1, all = false) {
+ try {
+ if (typeof str !== 'string' || !str) {throw new Error('被截取对象需为非空字符串');}
+ const cleanStr = cs => String(cs).replace(/<[^>]*?>/g, ' ').replace(/( |\u00A0|\s)+/g, ' ').trim().replace(/\s+/g, ' ');
+ const esc = s => String(s).replace(/[.*+?${}()|[\]\\/^]/g, '\\$&');
+ let pre = esc(prefix).replace(/£/g, '[^]*?'), end = esc(suffix);
+ let regex = new RegExp(`${pre ? pre : '^'}([^]*?)${end ? end : '$'}`, 'g');
+ let matchIterator = str.matchAll(regex);
+ if (all) {
+ let matchArr = [...matchIterator];
+ return matchArr.length ? matchArr.map(it => {
+ const val = it[1] ?? defaultVal;
+ return clean && val !== defaultVal ? cleanStr(val) : val;
+ }) : [defaultVal];
+ }
+ i = parseInt(i, 10);
+ if (isNaN(i) || i < 1) {throw new Error('序号必须为正整数');}
+ let tgIdx = i - 1,matchIdx = 0;
+ for (const match of matchIterator) {
+ if (matchIdx++ === tgIdx) {
+ const result = match[1] ?? defaultVal;
+ return clean && result !== defaultVal ? cleanStr(result) : result;
+ }
+ }
+ return defaultVal;
+ } catch (e) {
+ console.error(`字符串截取失败:`, e.message);
+ return all ? ['cutErr'] : 'cutErr';
+ }
+}
+
+async function request(reqUrl, options = {}) {
+ try {
+ if (typeof reqUrl !== 'string' || !reqUrl.trim()) { throw new Error('reqUrl需为字符串且非空'); }
+ if (typeof options !== 'object' || Array.isArray(options) || options === null) { throw new Error('options类型需为非null对象'); }
+ options.method = options.method?.toUpperCase() || 'GET';
+ if (['GET', 'HEAD'].includes(options.method)) {
+ delete options.body;
+ delete options.data;
+ delete options.postType;
+ }
+ let {headers, timeout, buffer, ...restOpts} = options;
+ const optObj = {
+ headers: (typeof headers === 'object' && !Array.isArray(headers) && headers) ? headers : KParams.headers,
+ timeout: parseInt(timeout, 10) > 0 ? parseInt(timeout, 10) : KParams.timeout,
+ buffer: buffer ?? 0,
+ ...restOpts
+ };
+ const res = await req(reqUrl, optObj);
+ if (options.withHeaders) {
+ const resHeaders = typeof res.headers === 'object' && !Array.isArray(res.headers) && res.headers ? res.headers : {};
+ const resWithHeaders = { ...resHeaders, body: res?.content ?? '' };
+ return JSON.stringify(resWithHeaders);
+ }
+ return res?.content ?? '';
+ } catch (e) {
+ console.error(`${reqUrl}→请求失败:`, e.message);
+ return options?.withHeaders ? JSON.stringify({ body: '' }) : '';
+ }
+}
+
+export function __jsEvalReturn() {
+ return {
+ init,
+ home,
+ homeVod,
+ category,
+ search,
+ detail,
+ play,
+ proxy: null
+ };
+}
\ No newline at end of file
diff --git "a/spider/catvod/\345\244\256\345\244\256[\345\256\230].js" "b/spider/catvod/\345\244\256\345\244\256[\345\256\230].js"
new file mode 100644
index 00000000..478e4b10
--- /dev/null
+++ "b/spider/catvod/\345\244\256\345\244\256[\345\256\230].js"
@@ -0,0 +1,290 @@
+/**
+ * 央视大全 - 猫影视/TVBox JS爬虫格式
+ * 继承BaseSpider类
+ @header({
+ searchable: 1,
+ filterable: 1,
+ quickSearch: 1,
+ title: '央央[官]',
+ lang: 'cat'
+ })
+ */
+
+class Spider extends BaseSpider {
+
+ constructor() {
+ super();
+ this.host = 'https://api.cntv.cn';
+ this.siteName = '央视大全';
+ this.sessionStore = {};
+ this.videoCache = {};
+
+ this.headers = {
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
+ "Referer": "https://tv.cctv.com",
+ "Accept": "application/json, text/plain, */*",
+ "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
+ };
+ }
+
+ init(extend = "") {
+ return "";
+ }
+
+ getName() {
+ return this.siteName;
+ }
+
+ isVideoFormat(url) {
+ return url.includes('.m3u8') || url.includes('.mp4');
+ }
+
+ manualVideoCheck() {
+ return false;
+ }
+
+ destroy() {
+ this.sessionStore = {};
+ this.videoCache = {};
+ }
+
+ homeContent(filter) {
+ const categories = [
+ {type_id: "栏目大全", type_name: "栏目大全"},
+ {type_id: "特别节目", type_name: "特别节目"},
+ {type_id: "纪录片", type_name: "纪录片"},
+ {type_id: "电视剧", type_name: "电视剧"},
+ {type_id: "动画片", type_name: "动画片"}
+ ];
+
+ return {class: categories};
+ }
+
+ async homeVideoContent() {
+ // 央视首页推荐
+ return {list: []};
+ }
+
+ async categoryContent(tid, pg, filter, extend) {
+ try {
+ const page = parseInt(pg) || 1;
+ const videos = [];
+
+ const channelMap = {
+ "特别节目": "CHAL1460955953877151",
+ "纪录片": "CHAL1460955924871139",
+ "电视剧": "CHAL1460955853485115",
+ "动画片": "CHAL1460955899450127",
+ };
+
+ let filterObj = {};
+ if (extend && typeof extend === 'object') {
+ filterObj = extend;
+ }
+
+ if (tid === '栏目大全') {
+ const url = `${this.host}/lanmu/columnSearch?&fl=&fc=&cid=&p=${page}&n=20&serviceId=tvcctv&t=json`;
+ const response = await this.fetch(url, {}, this.headers);
+ const data = response.data;
+
+ if (data && data.response && data.response.docs) {
+ const docs = data.response.docs;
+ docs.forEach(it => {
+ videos.push({
+ vod_id: `${it.lastVIDE.videoSharedCode}|${it.column_firstclass}|${it.column_name}|${it.channel_name}|${it.column_brief}|${it.column_logo}|${it.lastVIDE.videoTitle}|栏目大全`,
+ vod_name: it.column_name,
+ vod_pic: it.column_logo,
+ vod_remarks: it.channel_name,
+ vod_content: ''
+ });
+ });
+ }
+ } else {
+ // 处理筛选参数
+ let fl_url = `&channelid=${channelMap[tid] || ''}&fc=${encodeURIComponent(tid)}`;
+ if (filterObj.channel) fl_url += `&channel=${encodeURIComponent(filterObj.channel)}`;
+ if (filterObj.sc) fl_url += `&sc=${encodeURIComponent(filterObj.sc)}`;
+ if (filterObj.year) fl_url += `&year=${filterObj.year}`;
+
+ const url = `${this.host}/list/getVideoAlbumList?${fl_url}&area=&letter=&n=24&serviceId=tvcctv&t=json&p=${page}`;
+ const response = await this.fetch(url, {}, this.headers);
+ const data = response.data;
+
+ if (data && data.data && data.data.list) {
+ const dataList = data.data.list;
+ dataList.forEach(it => {
+ videos.push({
+ vod_id: `${it.id}|${it.sc}|${it.title}|${it.channel}|${it.brief}|${it.image}|${it.count}|${tid}`,
+ vod_name: it.title,
+ vod_pic: it.image,
+ vod_remarks: `${it.sc}${it.year ? '·' + it.year : ''}`,
+ vod_content: it.brief || ''
+ });
+ });
+ }
+ }
+
+ return {
+ list: videos,
+ page: page,
+ pagecount: 9999,
+ limit: 20,
+ total: 999999
+ };
+
+ } catch (error) {
+ console.error(`categoryContent error: ${error.message}`);
+ return {
+ list: [],
+ page: pg,
+ pagecount: 0,
+ limit: 20,
+ total: 0
+ };
+ }
+ }
+
+ async detailContent(ids) {
+ try {
+ const id = ids[0];
+ if (!id) return {list: []};
+
+ // 检查缓存
+ const cacheKey = `detail_${id}`;
+ if (this.videoCache[cacheKey]) {
+ return {list: [this.videoCache[cacheKey]]};
+ }
+
+ const info = id.split("|");
+ // ID 结构: 0:id, 1:sc, 2:title, 3:channel, 4:brief, 5:image, 6:count/remark, 7:cate
+
+ const cate = info[7];
+ const ctid = info[0];
+ const modeMap = {
+ "特别节目": "0",
+ "纪录片": "0",
+ "电视剧": "0",
+ "动画片": "1"
+ };
+
+ // 获取选集列表
+ let playUrls = [];
+ const mode = modeMap[cate] || '0';
+ const albumUrl = `${this.host}/NewVideo/getVideoListByAlbumIdNew?id=${ctid}&serviceId=tvcctv&p=1&n=100&mode=${mode}&pub=1`;
+
+ const response = await this.fetch(albumUrl, {}, this.headers);
+ const data = response.data;
+
+ if (data.errcode === '1001') {
+ // 需要获取真实的ctid
+ const videoInfoUrl = `${this.host}/video/videoinfoByGuid?guid=${ctid}&serviceId=tvcctv`;
+ const vInfoRes = await this.fetch(videoInfoUrl, {}, this.headers);
+ const vInfoData = vInfoRes.data;
+ const realCtid = vInfoData.ctid;
+
+ const columnUrl = `${this.host}/NewVideo/getVideoListByColumn?id=${realCtid}&d=&p=1&n=100&sort=desc&mode=0&serviceId=tvcctv&t=json`;
+ const colRes = await this.fetch(columnUrl, {}, this.headers);
+ const colData = colRes.data;
+ playUrls = colData.data?.list || [];
+ } else {
+ playUrls = data.data?.list || [];
+ }
+
+ // 构建播放列表
+ const playList = [];
+ if (playUrls.length > 0) {
+ for (const item of playUrls) {
+ const title = item.title || `第${item.index || '?'}集`;
+ const cleanTitle = title.replace(/\$/g, '');
+ const guid = item.guid || '';
+ playList.push(`${cleanTitle}$${guid}`);
+ }
+ }
+
+ const vod = {
+ vod_id: id,
+ vod_name: info[2] || '',
+ vod_pic: info[5] || '',
+ type_name: info[1] || '',
+ vod_year: '',
+ vod_area: '',
+ vod_remarks: info[6] ? `共${info[6]}集` : '',
+ vod_actor: '',
+ vod_director: '',
+ vod_content: info[4] || '',
+ vod_play_from: playList.length > 0 ? '央视频' : '',
+ vod_play_url: playList.length > 0 ? playList.join('#') : ''
+ };
+
+ // 缓存结果
+ this.videoCache[cacheKey] = vod;
+
+ return {list: [vod]};
+
+ } catch (error) {
+ console.error(`detailContent error: ${error.message}`);
+ return {list: []};
+ }
+ }
+
+ async searchContent(key, quick, pg = "1") {
+ // CCTV搜索接口较复杂,这里返回空结果
+ return {
+ list: [],
+ page: pg,
+ pagecount: 0,
+ limit: 20,
+ total: 0
+ };
+ }
+
+ async playerContent(flag, id, vipFlags) {
+ try {
+ // 央视视频采用直接播放的方式
+ // 根据GUID拼接m3u8地址
+ let playUrl = `https://cntv.playdreamer.cn/proxy/asp/hls/2000/0303000a/3/default/${id}/2000.m3u8`;
+
+ // 也可以尝试其他格式
+ // playUrl = `https://hls.cntv.myalicdn.com/asp/hls/2000/0303000a/3/default/${id}/2000.m3u8`;
+
+ return {
+ parse: 0, // 0表示直接播放,不需要解析
+ jx: 0, // 0表示不解析
+ url: playUrl,
+ header: JSON.stringify({
+ 'User-Agent': this.headers['User-Agent'],
+ 'Referer': 'https://tv.cctv.com',
+ 'Origin': 'https://tv.cctv.com'
+ })
+ };
+
+ } catch (error) {
+ console.error(`playerContent error: ${error.message}`);
+ return {
+ parse: 0,
+ jx: 0,
+ url: id,
+ header: JSON.stringify(this.headers)
+ };
+ }
+ }
+
+ localProxy(param) {
+ return null;
+ }
+
+ // 辅助方法:安全获取对象属性
+ getSafe(obj, path, defaultValue = '') {
+ if (!obj || typeof obj !== 'object') return defaultValue;
+ try {
+ return path.split('.').reduce((o, key) => {
+ if (o == null) return defaultValue;
+ return o[key];
+ }, obj) ?? defaultValue;
+ } catch {
+ return defaultValue;
+ }
+ }
+}
+
+export default new Spider();
\ No newline at end of file
diff --git "a/spider/catvod/\345\245\207\345\245\207[\345\256\230].js" "b/spider/catvod/\345\245\207\345\245\207[\345\256\230].js"
new file mode 100644
index 00000000..89ce8472
--- /dev/null
+++ "b/spider/catvod/\345\245\207\345\245\207[\345\256\230].js"
@@ -0,0 +1,403 @@
+/**
+ * 爱奇艺视频 - 猫影视/TVBox JS爬虫格式
+ * 调用壳子超级解析功能(壳子会自动读取json配置)
+ @header({
+ searchable: 1,
+ filterable: 1,
+ quickSearch: 1,
+ title: '奇奇[官]',
+ lang: 'cat'
+ })
+ */
+
+class Spider extends BaseSpider {
+
+ constructor() {
+ super();
+ this.host = 'https://www.iqiyi.com';
+ this.sessionStore = {};
+
+ this.headers = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
+ 'Referer': 'https://www.iqiyi.com',
+ 'Accept': 'application/json, text/plain, */*',
+ 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
+ 'Accept-Encoding': 'gzip, deflate, br',
+ 'Connection': 'keep-alive'
+ };
+
+ // 分类配置
+ this.classes = [
+ {type_id: '1', type_name: '电影'},
+ {type_id: '2', type_name: '电视剧'},
+ {type_id: '6', type_name: '综艺'},
+ {type_id: '4', type_name: '动漫'},
+ {type_id: '3', type_name: '纪录片'},
+ {type_id: '5', type_name: '音乐'},
+ {type_id: '16', type_name: '网络电影'}
+ ];
+
+ // 筛选配置
+ this.filters = {
+ '1': [{
+ key: 'year',
+ name: '年代',
+ value: [{n: '全部', v: ''}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'}, {n: '2023', v: '2023'}]
+ }],
+ '2': [{
+ key: 'year',
+ name: '年代',
+ value: [{n: '全部', v: ''}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'}, {n: '2023', v: '2023'}]
+ }]
+ };
+ }
+
+ init(extend = '') {
+ return '';
+ }
+
+ getName() {
+ return '爱奇艺视频';
+ }
+
+ isVideoFormat(url) {
+ return true;
+ }
+
+ manualVideoCheck() {
+ return false;
+ }
+
+ destroy() {
+ // 清理资源
+ }
+
+ homeContent(filter) {
+ const result = {
+ class: this.classes,
+ filters: this.filters
+ };
+
+ return result;
+ }
+
+ homeVideoContent() {
+ return {list: []};
+ }
+
+ async categoryContent(tid, pg, filter, extend) {
+ try {
+ let channelId = tid;
+ let dataType = 1;
+ let extraParams = "";
+ const page = parseInt(pg) || 1;
+
+ if (tid === "16") {
+ channelId = "1";
+ extraParams = "&three_category_id=27401";
+ } else if (tid === "5") {
+ dataType = 2;
+ }
+
+ // 处理筛选条件
+ if (extend) {
+ let extendObj = {};
+ if (typeof extend === 'string') {
+ try {
+ extendObj = JSON.parse(extend);
+ } catch (e) {
+ // 如果不是JSON,尝试解析为key=value格式
+ extend.split('&').forEach(item => {
+ const [key, value] = item.split('=');
+ if (key && value) {
+ extendObj[key] = value;
+ }
+ });
+ }
+ } else if (typeof extend === 'object') {
+ extendObj = extend;
+ }
+
+ if (extendObj.year) {
+ extraParams += `&market_release_date_level=${extendObj.year}`;
+ }
+ }
+
+ const url = `https://pcw-api.iqiyi.com/search/recommend/list?channel_id=${channelId}&data_type=${dataType}&page_id=${page}&ret_num=20${extraParams}`;
+
+ const response = await this.fetch(url, {}, this.headers);
+ const jsonData = response.data;
+
+ const videos = [];
+ if (jsonData.data && jsonData.data.list) {
+ for (const item of jsonData.data.list) {
+ const vid = `${item.channelId}$${item.albumId}`;
+ let remarks = "";
+
+ if (item.channelId === 1) {
+ remarks = item.score ? `${item.score}分` : "";
+ } else if (item.channelId === 2 || item.channelId === 4) {
+ if (item.latestOrder && item.videoCount) {
+ remarks = item.latestOrder === item.videoCount ?
+ `${item.latestOrder}集全` :
+ `更新至${item.latestOrder}集`;
+ } else {
+ remarks = item.focus || "";
+ }
+ } else {
+ remarks = item.period || item.focus || "";
+ }
+
+ videos.push({
+ vod_id: vid,
+ vod_name: item.name,
+ vod_pic: item.imageUrl ? item.imageUrl.replace(".jpg", "_390_520.jpg") : "",
+ vod_remarks: remarks
+ });
+ }
+ }
+
+ return {
+ list: videos,
+ page: page,
+ pagecount: 9999,
+ limit: 20,
+ total: 999999
+ };
+
+ } catch (error) {
+ console.error(`categoryContent error: ${error.message}`);
+ return {
+ list: [],
+ page: pg,
+ pagecount: 0,
+ limit: 20,
+ total: 0
+ };
+ }
+ }
+
+ async getPlaylists(channelId, albumId, data) {
+ let playlists = [];
+ const cid = parseInt(channelId || data.channelId || 0);
+
+ try {
+ if (cid === 1 || cid === 5) {
+ // 电影或音乐
+ if (data.playUrl) {
+ playlists.push({title: data.name || '正片', url: data.playUrl});
+ }
+ } else if (cid === 6 && data.period) {
+ // 综艺
+ let qs = data.period.toString().split("-")[0];
+ let listUrl = `https://pcw-api.iqiyi.com/album/source/svlistinfo?cid=6&sourceid=${albumId}&timelist=${qs}`;
+ try {
+ const listResp = await this.fetch(listUrl, {}, this.headers);
+ const listJson = listResp.data;
+ if (listJson.data && listJson.data[qs]) {
+ listJson.data[qs].forEach(it => {
+ playlists.push({
+ title: it.shortTitle || it.period || it.focus || `期${it.order}`,
+ url: it.playUrl
+ });
+ });
+ }
+ } catch (e) {
+ console.error(`综艺列表获取失败: ${e.message}`);
+ }
+ } else {
+ // 电视剧、动漫等
+ let listUrl = `https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid=${albumId}&size=100&page=1`;
+ try {
+ const listResp = await this.fetch(listUrl, {}, this.headers);
+ const listJson = listResp.data;
+
+ if (listJson.data && listJson.data.epsodelist) {
+ playlists = listJson.data.epsodelist.map(item => ({
+ title: item.shortTitle || item.title ||
+ (item.order ? `第${item.order}集` : `集${item.timelist}`),
+ url: item.playUrl || item.url || ''
+ }));
+
+ // 处理分页
+ const total = listJson.data.total;
+ if (total > 100) {
+ const totalPages = Math.ceil(total / 100);
+ for (let i = 2; i <= totalPages; i++) {
+ let nextUrl = `https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid=${albumId}&size=100&page=${i}`;
+ try {
+ const nextResp = await this.fetch(nextUrl, {}, this.headers);
+ const nextJson = nextResp.data;
+ if (nextJson.data && nextJson.data.epsodelist) {
+ playlists = playlists.concat(nextJson.data.epsodelist.map(item => ({
+ title: item.shortTitle || item.title ||
+ (item.order ? `第${item.order}集` : `集${item.timelist}`),
+ url: item.playUrl || item.url || ''
+ })));
+ }
+ } catch (e) {
+ break;
+ }
+ }
+ }
+ }
+ } catch (e) {
+ console.error(`剧集列表获取失败: ${e.message}`);
+ }
+ }
+ } catch (error) {
+ console.error(`getPlaylists error: ${error.message}`);
+ }
+
+ return playlists;
+ }
+
+ async detailContent(ids) {
+ try {
+ const id = ids[0];
+ let channelId = "";
+ let albumId = id;
+
+ if (id.includes('$')) {
+ const parts = id.split('$');
+ channelId = parts[0];
+ albumId = parts[1];
+ }
+
+ // 获取视频基本信息
+ const infoUrl = `https://pcw-api.iqiyi.com/video/video/videoinfowithuser/${albumId}?agent_type=1&authcookie=&subkey=${albumId}&subscribe=1`;
+ const infoResp = await this.fetch(infoUrl, {}, this.headers);
+ const infoJson = infoResp.data;
+ const data = infoJson.data || {};
+
+ // 获取播放列表
+ const playlists = await this.getPlaylists(channelId, albumId, data);
+
+ // 构建播放地址
+ const playUrls = [];
+ if (playlists.length > 0) {
+ for (const item of playlists) {
+ if (item.url) {
+ playUrls.push(`${item.title}$${item.url}`);
+ }
+ }
+ }
+
+ const vod = {
+ vod_id: id,
+ vod_name: data.name || '未知标题',
+ type_name: data.categories ? data.categories.map(it => it.name).join(',') : '',
+ vod_year: data.formatPeriod || '',
+ vod_area: data.areas ? data.areas.map(it => it.name).join(',') : '',
+ vod_remarks: data.latestOrder ?
+ `更新至${data.latestOrder}集` :
+ (data.period || playlists.length > 0 ? `${playlists.length}集` : ''),
+ vod_actor: data.people && data.people.main_charactor ?
+ data.people.main_charactor.map(it => it.name).join(',') : '',
+ vod_director: data.people && data.people.director ?
+ data.people.director.map(it => it.name).join(',') : '',
+ vod_content: data.description || '暂无简介',
+ vod_pic: data.imageUrl ? data.imageUrl.replace(".jpg", "_480_270.jpg") : '',
+ vod_play_from: playUrls.length > 0 ? '爱奇艺视频' : '',
+ vod_play_url: playUrls.length > 0 ? playUrls.join('#') : ''
+ };
+
+ return {list: [vod]};
+
+ } catch (error) {
+ console.error(`detailContent error: ${error.message}`);
+ return {list: []};
+ }
+ }
+
+ async searchContent(key, quick, pg = '1') {
+ try {
+ const page = parseInt(pg) || 1;
+ const url = `https://search.video.iqiyi.com/o?if=html5&key=${encodeURIComponent(key)}&pageNum=${page}&pos=1&pageSize=20&site=iqiyi`;
+
+ const response = await this.fetch(url, {}, this.headers);
+ const jsonData = response.data;
+
+ const videos = [];
+
+ if (jsonData.data && jsonData.data.docinfos) {
+ for (const item of jsonData.data.docinfos) {
+ if (item.albumDocInfo) {
+ const doc = item.albumDocInfo;
+ const channelId = doc.channel ? doc.channel.split(',')[0] : '0';
+ videos.push({
+ vod_id: `${channelId}$${doc.albumId}`,
+ vod_name: doc.albumTitle || '',
+ vod_pic: doc.albumVImage || '',
+ vod_remarks: doc.tvFocus || doc.year || ''
+ });
+ }
+ }
+ }
+
+ return {
+ list: videos,
+ page: page,
+ pagecount: 10,
+ limit: 20,
+ total: videos.length
+ };
+
+ } catch (error) {
+ console.error(`searchContent error: ${error.message}`);
+ return {
+ list: [],
+ page: pg,
+ pagecount: 0,
+ limit: 20,
+ total: 0
+ };
+ }
+ }
+
+ async playerContent(flag, id, vipFlags) {
+ try {
+ // 解析播放地址
+ let playUrl = id;
+ if (id.includes('$')) {
+ playUrl = id.split('$')[1];
+ }
+
+ // 关键:调用壳子超级解析
+ const playData = {
+ parse: 1, // 必须为1,表示需要解析
+ jx: 1, // 必须为1,启用解析
+ play_parse: true, // 启用播放解析
+ parse_type: '壳子超级解析',
+ parse_source: '爱奇艺视频',
+ url: playUrl, // 原始爱奇艺链接
+ header: JSON.stringify({
+ 'User-Agent': this.headers['User-Agent'],
+ 'Referer': 'https://www.iqiyi.com',
+ 'Origin': 'https://www.iqiyi.com'
+ })
+ };
+
+ return playData;
+
+ } catch (error) {
+ console.error(`playerContent error: ${error.message}`);
+ // 即使出错也返回超级解析参数,让壳子处理
+ return {
+ parse: 1,
+ jx: 1,
+ play_parse: true,
+ parse_type: '壳子超级解析',
+ parse_source: '爱奇艺视频',
+ url: id,
+ header: JSON.stringify(this.headers)
+ };
+ }
+ }
+
+ localProxy(param) {
+ return null;
+ }
+}
+
+export default new Spider();
\ No newline at end of file
diff --git "a/spider/catvod/\346\236\234\346\236\234[\345\256\230].js" "b/spider/catvod/\346\236\234\346\236\234[\345\256\230].js"
new file mode 100644
index 00000000..ea5846fc
--- /dev/null
+++ "b/spider/catvod/\346\236\234\346\236\234[\345\256\230].js"
@@ -0,0 +1,365 @@
+/**
+ * 芒果TV - 猫影视JS爬虫格式(第二个版本)
+ * 调用壳子超级解析功能
+ @header({
+ searchable: 1,
+ filterable: 1,
+ quickSearch: 1,
+ title: '果果[官]',
+ lang: 'cat'
+ })
+ */
+
+class Spider extends BaseSpider {
+
+ constructor() {
+ super();
+ this.host = 'https://www.mgtv.com';
+ this.headers = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
+ 'Referer': 'https://www.mgtv.com/',
+ 'Accept': 'application/json, text/plain, */*',
+ 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
+ 'Accept-Encoding': 'gzip, deflate, br',
+ 'Connection': 'keep-alive'
+ };
+ }
+
+ init(extend = '') {
+ return '';
+ }
+
+ getName() {
+ return '芒果TV2';
+ }
+
+ isVideoFormat(url) {
+ return true;
+ }
+
+ manualVideoCheck() {
+ return false;
+ }
+
+ destroy() {
+ // 清理资源
+ }
+
+ homeContent(filter) {
+ const classes = [
+ {type_id: '3', type_name: '电影'},
+ {type_id: '2', type_name: '电视剧'},
+ {type_id: '1', type_name: '综艺'},
+ {type_id: '50', type_name: '动漫'},
+ {type_id: '51', type_name: '纪录片'},
+ {type_id: '115', type_name: '教育'},
+ {type_id: '10', type_name: '少儿'}
+ ];
+
+ const filters = {
+ '3': [
+ {
+ key: 'year', name: '年份', value: [
+ {n: '全部', v: 'all'}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'},
+ {n: '2023', v: '2023'}, {n: '2022', v: '2022'}, {n: '2021', v: '2021'},
+ {n: '2020', v: '2020'}, {n: '2019', v: '2019'}, {n: '2010-2019', v: '2010-2019'},
+ {n: '2000-2009', v: '2000-2009'}
+ ]
+ },
+ {
+ key: 'sort', name: '排序', value: [
+ {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'}
+ ]
+ }
+ ],
+ '2': [
+ {
+ key: 'year', name: '年份', value: [
+ {n: '全部', v: 'all'}, {n: '2025', v: '2025'}, {n: '2024', v: '2024'},
+ {n: '2023', v: '2023'}, {n: '2022', v: '2022'}, {n: '2021', v: '2021'},
+ {n: '2020', v: '2020'}
+ ]
+ },
+ {
+ key: 'sort', name: '排序', value: [
+ {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'}
+ ]
+ }
+ ],
+ '1': [
+ {
+ key: 'sort', name: '排序', value: [
+ {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'}
+ ]
+ }
+ ],
+ '50': [
+ {
+ key: 'sort', name: '排序', value: [
+ {n: '综合', v: 'c1'}, {n: '最新', v: 'c2'}, {n: '最热', v: 'c4'}
+ ]
+ }
+ ]
+ };
+
+ return {
+ class: classes,
+ filters: filters
+ };
+ }
+
+ homeVideoContent() {
+ return {list: []};
+ }
+
+ async categoryContent(tid, pg, filter, extend) {
+ try {
+ const page = parseInt(pg) || 1;
+ const baseUrl = 'https://pianku.api.mgtv.com/rider/list/pcweb/v3';
+
+ // 构建查询参数
+ const params = {
+ platform: 'pcweb',
+ channelId: tid,
+ pn: page,
+ pc: '20',
+ hudong: '1',
+ _support: '10000000',
+ kind: 'a1',
+ area: 'a1'
+ };
+
+ // 处理筛选条件
+ if (extend) {
+ if (extend.year && extend.year !== 'all') {
+ params.year = extend.year;
+ }
+ if (extend.sort) {
+ params.sort = extend.sort;
+ }
+ if (extend.chargeInfo) {
+ params.chargeInfo = extend.chargeInfo;
+ }
+ }
+
+ const queryString = new URLSearchParams(params).toString();
+ const url = `${baseUrl}?${queryString}`;
+
+ const response = await this.fetch(url, {}, this.headers);
+ const json = response.data || {};
+
+ const videos = [];
+ if (json.data?.hitDocs && Array.isArray(json.data.hitDocs)) {
+ for (const item of json.data.hitDocs) {
+ videos.push({
+ vod_id: item.playPartId || '',
+ vod_name: item.title || '',
+ vod_pic: item.img || '',
+ vod_remarks: item.updateInfo || item.rightCorner?.text || ''
+ });
+ }
+ }
+
+ return {
+ list: videos,
+ page: page,
+ pagecount: json.data?.totalPage || 999,
+ limit: 20,
+ total: json.data?.totalHit || 9999
+ };
+
+ } catch (error) {
+ console.error(`categoryContent error: ${error.message}`);
+ return {
+ list: [],
+ page: pg,
+ pagecount: 0,
+ limit: 20,
+ total: 0
+ };
+ }
+ }
+
+ async detailContent(ids) {
+ try {
+ const videoId = ids[0];
+
+ // 获取视频基本信息
+ const infoUrl = `https://pcweb.api.mgtv.com/video/info?video_id=${videoId}`;
+ const infoResponse = await this.fetch(infoUrl, {}, this.headers);
+ const infoData = infoResponse.data?.data?.info || {};
+
+ const vod = {
+ vod_id: videoId,
+ vod_name: infoData.title || '',
+ type_name: infoData.root_kind || '',
+ vod_actor: '',
+ vod_year: infoData.release_time || '',
+ vod_content: infoData.desc || '',
+ vod_remarks: infoData.time || '',
+ vod_pic: infoData.img || '',
+ vod_play_from: '芒果TV',
+ vod_play_url: ''
+ };
+
+ // 分页获取所有剧集
+ const pageSize = 50;
+ let allEpisodes = [];
+
+ try {
+ // 获取第一页,同时获取总页数
+ const firstPageUrl = `https://pcweb.api.mgtv.com/episode/list?video_id=${videoId}&page=1&size=${pageSize}`;
+ const firstResponse = await this.fetch(firstPageUrl, {}, this.headers);
+ const firstData = firstResponse.data?.data || {};
+
+ if (firstData.list && Array.isArray(firstData.list)) {
+ allEpisodes = allEpisodes.concat(firstData.list);
+ const totalPages = firstData.total_page || 1;
+
+ // 如果有多页,获取剩余页面
+ if (totalPages > 1) {
+ const pagePromises = [];
+ for (let i = 2; i <= totalPages; i++) {
+ const pageUrl = `https://pcweb.api.mgtv.com/episode/list?video_id=${videoId}&page=${i}&size=${pageSize}`;
+ pagePromises.push(this.fetch(pageUrl, {}, this.headers));
+ }
+
+ const responses = await Promise.all(pagePromises);
+ for (const response of responses) {
+ const data = response.data?.data || {};
+ if (data.list && Array.isArray(data.list)) {
+ allEpisodes = allEpisodes.concat(data.list);
+ }
+ }
+ }
+ }
+ } catch (episodeError) {
+ console.error(`获取剧集列表失败: ${episodeError.message}`);
+ }
+
+ // 构建播放列表
+ const playUrls = [];
+ if (allEpisodes.length > 0) {
+ // 过滤可播放的剧集(isIntact = 1)
+ const validEpisodes = allEpisodes.filter(item =>
+ item.isIntact === "1" || item.isIntact === 1
+ );
+
+ // 按集数排序
+ validEpisodes.sort((a, b) => {
+ const orderA = parseInt(a.order) || 0;
+ const orderB = parseInt(b.order) || 0;
+ return orderA - orderB;
+ });
+
+ // 构建播放链接
+ for (const item of validEpisodes) {
+ const name = item.t4 || item.t3 || item.title || `第${item.order || '?'}集`;
+ const playLink = item.url ? `https://www.mgtv.com${item.url}` : '';
+
+ if (playLink) {
+ playUrls.push(`${name}$${playLink}`);
+ }
+ }
+ }
+
+ vod.vod_play_url = playUrls.join('#');
+
+ return {list: [vod]};
+
+ } catch (error) {
+ console.error(`detailContent error: ${error.message}`);
+ return {list: []};
+ }
+ }
+
+ async searchContent(key, quick, pg = '1') {
+ try {
+ const page = parseInt(pg) || 1;
+ const searchUrl = `https://mobileso.bz.mgtv.com/msite/search/v2?q=${encodeURIComponent(key)}&pn=${page}&pc=20`;
+
+ const response = await this.fetch(searchUrl, {}, this.headers);
+ const json = response.data?.data || {};
+
+ const videos = [];
+
+ if (json.contents && Array.isArray(json.contents)) {
+ for (const group of json.contents) {
+ if (group.type === 'media' && group.data && Array.isArray(group.data)) {
+ for (const item of group.data) {
+ if (item.source === 'imgo') {
+ // 提取视频ID
+ const match = item.url.match(/\/(\d+)\.html/);
+ if (match) {
+ videos.push({
+ vod_id: match[1],
+ vod_name: item.title ? item.title.replace(/|<\/B>/g, '') : '',
+ vod_pic: item.img || '',
+ vod_remarks: item.desc ? item.desc.join(' ') : ''
+ });
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return {
+ list: videos,
+ page: page,
+ pagecount: 10,
+ limit: 20,
+ total: videos.length
+ };
+
+ } catch (error) {
+ console.error(`searchContent error: ${error.message}`);
+ return {
+ list: [],
+ page: pg,
+ pagecount: 0,
+ limit: 20,
+ total: 0
+ };
+ }
+ }
+
+ async playerContent(flag, id, vipFlags) {
+ try {
+ // 调用壳子超级解析
+ const playData = {
+ parse: 1,
+ jx: 1,
+ play_parse: true,
+ parse_type: '壳子超级解析',
+ parse_source: '芒果TV2',
+ url: id,
+ header: JSON.stringify({
+ 'User-Agent': this.headers['User-Agent'],
+ 'Referer': 'https://www.mgtv.com',
+ 'Origin': 'https://www.mgtv.com'
+ })
+ };
+
+ return playData;
+
+ } catch (error) {
+ console.error(`playerContent error: ${error.message}`);
+ return {
+ parse: 1,
+ jx: 1,
+ play_parse: true,
+ parse_type: '壳子超级解析',
+ parse_source: '芒果TV2',
+ url: id,
+ header: JSON.stringify(this.headers)
+ };
+ }
+ }
+
+ localProxy(param) {
+ return null;
+ }
+}
+
+export default new Spider();
\ No newline at end of file
diff --git "a/spider/catvod/\347\225\252\350\214\204\346\274\253\347\224\273[\347\224\273].js" "b/spider/catvod/\347\225\252\350\214\204\346\274\253\347\224\273[\347\224\273].js"
new file mode 100644
index 00000000..1afdc504
--- /dev/null
+++ "b/spider/catvod/\347\225\252\350\214\204\346\274\253\347\224\273[\347\224\273].js"
@@ -0,0 +1,252 @@
+/*
+@header({
+ searchable: 1,
+ filterable: 0,
+ quickSearch: 0,
+ title: '番茄漫画',
+ '类型': '漫画',
+ lang: 'ds'
+})
+*/
+import cheerio from 'assets://js/lib/cheerio.min.js';
+
+let HOST = 'https://qkfqapi.vv9v.cn';
+let UA = {
+ "User-Agent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36"
+};
+
+async function request(url, obj) {
+ if (!obj) {
+ obj = {
+ headers: UA,
+ timeout: 5000
+ }
+ }
+ const response = await req(url, obj);
+ return response.content;
+}
+
+function init(cfg) {
+ const ext = cfg.ext;
+ console.log('番茄漫画源初始化');
+ console.log('初始化完成');
+}
+
+async function home(filter) {
+ try {
+ let html = await request('https://qkfqapi.vv9v.cn/api/discover/style?tab=漫画&source_type=男频');
+ let json = JSON.parse(html);
+ let data = json.data;
+ let d = [];
+ data.forEach((it) => {
+ if (it.url && it.url.trim() !== '') {
+ d.push({
+ type_name: it.title,
+ type_id: it.url,
+ });
+ }
+ });
+ return JSON.stringify({
+ 'class': d
+ });
+ } catch (error) {
+ console.log('home函数错误:', error);
+ }
+}
+
+
+async function homeVod(params) {
+ try {
+ let url = HOST + '/api/discover?tab=漫画&type=7&gender=2&genre_type=110&page=1';
+ let html = await request(url);
+ let json = JSON.parse(html);
+
+ if (json && json.data) {
+ let data = json.data.data || json.data;
+ let d = [];
+
+ data.forEach((item) => {
+ if (item && item.book_name) {
+ d.push({
+ vod_name: item.book_name,
+ vod_id: item.book_id || item.id,
+ vod_pic: item.thumb_url || item.cover,
+ vod_remarks: item.author || item.category || '',
+ vod_content: item.abstract || item.description || ''
+ });
+ }
+ });
+
+ return JSON.stringify({
+ list: d
+ });
+ }
+ } catch (error) {
+ console.log('首页推荐请求错误:', error);
+ }
+}
+
+async function category(tid, pg, filter, extend) {
+ try {
+ let url = tid;
+ let html = await request(url);
+ let json = JSON.parse(html);
+
+ if (json && json.data) {
+ let data = json.data.data || json.data;
+ let d = [];
+
+ data.forEach((item) => {
+ if (item && item.book_name) {
+ d.push({
+ vod_name: item.book_name,
+ vod_id: item.book_id || item.id,
+ vod_pic: item.thumb_url || item.cover,
+ vod_remarks: item.author || item.category || '',
+ vod_content: item.abstract || item.description || ''
+ });
+ }
+ });
+
+ if (d.length > 0) {
+ return JSON.stringify({
+ list: d,
+ page: pg,
+ pagecount: 999,
+ limit: 20,
+ total: 999
+ });
+ }
+ }
+ } catch (error) {
+ console.log('分类请求错误:', error);
+ }
+}
+
+async function detail(vod_url) {
+ try {
+ let detailUrl = HOST + '/api/detail?book_id=' + vod_url;
+ let json = JSON.parse(await request(detailUrl));
+
+ if (json?.data?.data) {
+ let data = json.data.data;
+ let vod = {
+ vod_name: data.book_name || '',
+ vod_id: vod_url,
+ type_name: data.category || '',
+ vod_pic: data.thumb_url || '',
+ vod_content: data.abstract || '',
+ vod_remarks: data.sub_info || '',
+ vod_director: data.author || '',
+ vod_play_from: '番茄漫画',
+ vod_play_url: ''
+ };
+
+ let chapterUrl = HOST + '/api/book?book_id=' + vod_url;
+ let chapterJson = JSON.parse(await request(chapterUrl));
+ if (chapterJson?.data?.data) {
+ let bookInfo = chapterJson.data.data;
+ let list = bookInfo.chapterListWithVolume.flat();
+
+ let urls = [];
+ list.forEach((it) => {
+ if (it && it.title && it.itemId) {
+ urls.push(it.title + '$' + it.itemId + '@' + it.title);
+ }
+ });
+ vod.vod_play_url = urls.join('#');
+ }
+
+ return JSON.stringify({list: [vod]});
+ }
+ } catch (error) {
+ console.log('详情请求错误:', error);
+ }
+}
+
+async function play(flag, id, flags) {
+ try {
+ let itemId = id;
+ let title = '';
+
+ if (id.includes('@')) {
+ let parts = id.split('@');
+ itemId = parts[0];
+ title = parts[1] || '';
+ }
+
+ let url = HOST + '/api/content?tab=漫画&item_id=' + itemId + '&show_html=0';
+ let html = await request(url);
+ let json = JSON.parse(html);
+ let images = json.data.images;
+ images = pdfa(images, 'img');
+ let pics = [];
+ images.forEach((img) => {
+ let pic = pdfh(img, 'img&&src');
+ pics.push(pic);
+ });
+
+ if (pics.length > 0) {
+ return JSON.stringify({
+ parse: 0,
+ url: 'pics://' + pics.join('&&')
+ });
+ }
+ } catch (error) {
+ console.log('播放 请求错误:', error);
+ }
+}
+
+async function search(wd, quick) {
+ try {
+ let searchUrl = HOST + '/api/search?key=' + encodeURIComponent(wd) + '&tab_type=8&offset=0';
+ let html = await request(searchUrl);
+ let json = JSON.parse(html);
+
+ if (json && json.data) {
+ let searchTabs = json.data.search_tabs || [];
+ let bookList = [];
+
+ if (searchTabs.length > 3 && searchTabs[3].data) {
+ bookList = searchTabs[3].data;
+ } else if (json.data.data) {
+ bookList = json.data.data;
+ }
+
+ let d = [];
+ bookList.forEach((item) => {
+ let book = item.book_data ? item.book_data[0] : item;
+ if (book && book.book_name) {
+ d.push({
+ vod_name: book.book_name,
+ vod_id: book.book_id,
+ vod_pic: book.thumb_url || '',
+ vod_remarks: book.author || '',
+ vod_content: book.book_abstract || book.abstract || ''
+ });
+ }
+ });
+
+ return JSON.stringify({
+ list: d
+ });
+ }
+ } catch (error) {
+ console.log('搜索请求错误:', error);
+ }
+}
+
+function proxy(params) {
+ return [200, 'text/plain;charset=utf-8', '番茄漫画源代理测试', null];
+}
+
+export default {
+ init: init,
+ home: home,
+ homeVod: homeVod,
+ category: category,
+ detail: detail,
+ play: play,
+ search: search,
+ proxy: proxy,
+}
\ No newline at end of file
diff --git "a/spider/catvod/\350\223\235\350\216\223\350\201\232\345\220\210\347\237\255\345\211\247[B].js" "b/spider/catvod/\350\223\235\350\216\223\350\201\232\345\220\210\347\237\255\345\211\247[B].js"
index 3b24d738..2b940d50 100644
--- "a/spider/catvod/\350\223\235\350\216\223\350\201\232\345\220\210\347\237\255\345\211\247[B].js"
+++ "b/spider/catvod/\350\223\235\350\216\223\350\201\232\345\220\210\347\237\255\345\211\247[B].js"
@@ -8,4 +8,4 @@
})
*/
-435F35785E45BA969DB95FC07396BBF327C50F94B452155A10B2127EB2743F686695A42CC071322F2A3F2D1F5DF8371791ED1331D3FC196192B1F5779953C4F0A74B825A27808280AF58BCEA6F33B6E1ADAD9A4FEA22075DE973CA16897BDFEE04A404065A3A4A9DF5598F7AD6F7312B612AF89D455139A6E96EE884F1D8D0404461A7D04472C01F875989C600C5C9B312189C7E05A8D06DE4EFC9C90E9626A577255A1BA848653FC669B7AEBBB00F15779981DF268A9FB202B853C63846F9220895F15EAA14568EBCEE1BC2CE35FF12BBC093E81BC02C4B57C6141ADC72B847C36F28028FF2BCD60D3AA72F6795DECC1A76CB2FF432D4DD66B253EF88909FC10E1FBFF1E7FD00ECDDA622B307053DA10648F23A133ED170B473B3DFE288C0219232673E5F11538B54534E9ED45A296E064C3FBBB1FA78DBAD5B7C42B2C286502F73421F3F448DC33E402961487AE257935734D0E20A2CB8037B47F2305DCDC5CB61AB7433D63150AC02AC258753EFED9E078291139039A81DD9E4EFD846D881724AE1A51228CD2D9E9D6896A63FF00479B9EF00BBC912F38FC624364BE0A1EE50BAECA4BA62D36D460EB0B70E4706EB787C62BF92D5B24629918C85EB2F0F914E58CD6759D248008B7388192A731530CC6E5CCBFA6B2C183114F6B099D7843510E012C2F7E09FDBA63EBF14AF321B293282997D1FB2B2199D350ABB235C7D4D4C40FE29993F5CE496AD45A26DBCB47527CCCCCC993BD007D29228BE3D813AD2B133390A39586B974FFFC524A9BFC96F68F9F295CB88A795AD7AD149E8139BE057244B9C2EF569AA1515845D22DE3654BF6B6149AAEDACCB9AFAA0B08FFA8B4104D3A2237FDBF6AAC3A1276C577C37113F3F411A8F6DEB33C2AD78341E9E9DD342EAD3FDD9D5546AF9381E50890249AD2E699F4E974D8808F8858E9B441373032693DE29ED770A0B9A35788A7C37E73922A0757471BEF52B8C0FEDADA03BE09A2DE1D222B5A2E20F0E56CF834BE8C7057F539D73728DBBBB6D06C79583CD86BB80B370A8EB643112C8234CE533FA48408B3BAA71DA651E566CAAF893F51FFF2F278041CA7EE421A03E96178BA38D585B168B4DC1FBBB4DBC855C425F74BA510A6E150175881E51ECD535EDC6B2C7C817CD5934C26A3486ACDB6C9E685D03B552DDD2D8D6D55903FF892B68C39097F05F422C27032D7CEADE1142C13C778291061E4F6F933B4795AA6DDAF057D5F4209AFEC7043F6F13C4B447BE11A7188BC439DF94D7F409BD7FDCBB726E213E02E78212620FD11599686CAF57D191B822BF6A2C3E4D387A3CAE2CE8F415DA13D83809908A9C9EEDBD797F8A6A3E0DFCDEFEE108B54E0155DEFF67291E2A850332634B28A28A213B5F4BA18B5F8AA5F0DD11558F32FDD9E78D15F67B04B91894EA8EB4F6506D60506C48B638ADF3CFB651590EE5AE5D869DA166CD23B634AF9A19AF1E5B70935CF0508EBA0D8F7A0D2B8321F91A0DAF61B708743A6EB7522289561273504A2A24A67F4651DB0DCBD44CBB4A62B9648FB814BF7C6E08671C03C7E0D2B56AED7E04332DDBD804559236022A9A4B0AF9CB04DB49D43B590E50943E248F86DE7F43F3E865022D842AB51BC9B9ECA8E47DD8DAA0786F161C5B5EF3E8C41A809AEA96F6B185BDE4F8A41306BA471740E5A38F6DD320F612A1AC3F10A485485124952139A26D1B30E5C3CAEAFB462927D28404FF79BBF0FED9C0BFA41708900E89E36FF8BB460C3BE6D94EF67626126A6F1449FBBC136E67FC3239E5F3793FC9E235A441C7CD3DAC7CECB1CBD4080F12C4C975F053045DC2B333BCE3ED7880A8C604718BAB96C339C9273C2BE62663833A99178882E6BC0125ED14B99A0E55535C65011BBA82EF1D5750BCED03CD31A2EFC249575011F387529639EB74B70F888850A50FE9477684F9A4E81B780CBC943315A303C12F65565DE3B060E66C733E355C7907DDC8401EDF2075B0EAAA4BE8EB9755DD92D3F3282DEDC7CC2771E256C7B1FC8434F2737D4C9C7A55072E36B8D9C07530E5FFBC2D70E643F0D3172D5BDAABF92B21DE2AF93966AE9D88EA917939B96D0A55351FD08BE8A07102196D87AEA586652BC53DBBC9952067D8E9E88AE6D12B772FF10057EB2BE32F2020B0E63AF8AD992F4696141353568FF720E3901980B27F32B24B2DE09219FBF0FC3B9E0376F5026558D5752DFCC73894B4261AA83B0A4EFB890F7215B50DAC1496BF67F1AEEEA31B3C8590E5DC390311C920E5472211FFE620000C306339A71F19A396B9F1589BBE9249E2A7FEEB1C56B42B89806AE62ADB41BD1AB93672DF5B426B447984C6FD5D82B9AC47AE78E2E1B02CEEA327DBB8F4D25258F0A53480FF68C788F133F02D923CFF658DF19D70C5D5E2E90FF659E1A5C4AD87EC5A93910F883FF77998D036EB5ADD91A6F56A78ACFEFD564E606AD2C93AF20A65AC03A0FD20C97BFE905950B22C028314F52F671CD0B6A268703EC909997B70372408C8A595C8DB35972193A76D5A39C1DD190955099DE507DB1A0AEAD1D78104F551F2A5AB25D4C53A1A5858EB2D08017909C4818AE75EEB8FAD7DF222415F76FDDEEA46AB882D626C23BB19080950D1FBCC8326CEA8249F13C669BE3A19754F8FEBC08EB0C4EBAC03DB1E54268276FD8D260E6532A58E41CFBB4311A48DB5459A2CCC2D27AE527144394371540A0150590E9EBC82325B42E403E7E857463E5757952B856B91DC642F4E43322BF0EB882A8F6EFF306B4004F3C183E6D4E9A0E7902FE1EC779CB0A7760720E036BBDFE765B2FEA463F262D87DFA5ECD4C38093F4993FF57AC74D11224EA30584301851EA36A4B86CDF186C96111E3449E69F9426DDA9AA6C29E409B4CA7F8DB95CF4BC202736D3AC884B00760CEDCBED1210A2EA017FAE4AF4AC082AC1441ACA99692222D0D37751D4767AAE64BE13B4C774FC27628E018AEF407D1AE64F03F91127F1CB924E2E1EAE89BB1D7412C26C629203F3ADCBA9F03BD213AD4D583EAE1C88C20D80149386C566936E0916567774B1276D0DA8880BAADB28C60C99279002F795819F3D8E2C58A58200ECD94761960CFD1A0CA735D67779341890F7888D5D0D3EAF5862A57998D0C6BA865AC2FC671885D84516297D03EAA021920AF521D448D8E9EE71B7F840D8F0C93218EE0B5FE07BADE0BD9EC6D1F12E22C2598E07B060FADEA688B1A5534F051C77660FE4FF00F79EC9881B0BFCF13FAFCB6E18004188FCF8B8A955CE0BB3C9368D5545751DC24853D2CA9F8AF798D11FD9574FDCF3AC7A888ACEF079A7C28F875177B3151CAF7CB6E84238A901077945678ABD363AA1572736ABED0E056029E754BE2D0333D90658AEE3F797B1C054D026ED0D1E055034C7A56655A08CEBC556FBF6E09B36F0440148195CDDD775E02245891B2011E38AC3B89939D88B5C6A12EDA6C2124320718964E603BF4A5032F63C112955BE80EF162F0C81DD0580066291A92581545432A239B6670CBF6DF1DB42341605353CA5C08D88591B0B065B666C59BDCE627ECD5D51DA5C2E92C54CA247542F99E3A6D49825C8FA3688AE5091E2EACF22AE8FA5A4CD65631D1B6CC4AD98B8C89C90A8D0910D30B656465CDD5DF4B08710BB916A2AA87E33ED1CE9A383C19369DBD152C46C2A6FF075173138565316F0A60B4DD93360FC07396BBF327C50F94B452155A10B213E8F78EFE0C9ED08F588B02091B4B69EBAFC8E5FCEE4E62FA6DCE39CA1D6C924F0B4332A7CCC6A0ABD1A0F0B67CF4DB1609C13BAF685A8C9353A2EAC2C4D3F7257E9152B5E289D17BB5B73959A49F877BF7F80C76F7B86675CB1DDB21404FA79EA28B61574F456257300302421FC36286D56342E1351FA3A158764EE162CCB97543468558BACAE631282DE11B78B563993ED941ED3451E9C0C2A3A4D39F61D87CA012885DCCCB0BD17CA28186B8C9F9FA3DB738E12E355C3208E337C505CFCDFEE74331EBE36B7A90DF91AF028441A51D2198992F969E8C3E9DEF8ADF16E01339A2D701B4B8A89AAABA1CF26FA61F00B8C305EE63FDB68B40FBC3BE227E9ADD6E64D2E784F2B44EC6C655479919A11793E99F5FDF45945797E786D619935CEE9AF4BB059F69527A45C196BB89AB35C6EBCE7507C092679F2BA7D0841C6764DF494CCB8C707E245C8F10D48E67F1CAC8B047F03D921C35FDF481AD46B78B87C4BFD7895D3A7FF9DE1C29EE2C573C5FF628A28458AD7BBF5FF72CEB83153270C50C22A1CABE2E619CC68FB784030FC84EBBF12C207606751AE0C707B1927F6BD42640FB540F099816265739C43CE0E04E03B0A0DB3094474BE690439F0772A73E3BAAB8B40484ACF326918C0FA6A3CC22F39342FEDBD6BD54CD43646F67F7F3AFD5BC717FBB4F22CE891411C278FBAD56A57A64A1863FFB10B163643317B21D14854F170905CE2B0894DBCD6950130D80C047E379EA5D982EE5363F9D2A6457A3815275889F1F00BBAFC5265D1B0887FC83E1D24722BE878D5DA2D693AE0FF6CD2B7F49E4CC0EBA132A74BAABCF9C66242AF0143A01F2EA6B4163E9196015D10197C75196581E5F3D28C11CE7AE02B8361FDC6CD13643A5AFC0BB21351910DE2CA47E33BA5C0972A666B6CCE1B9C62DAA8178F0942C96A4EA7B5E30FD87C11180929137E5AA496F275F527DFB02063F37D6C29CAB881BD4E5AE9886FB9842B86E8DAA9176EE9C2448A80815C6658E4AFB2798E348324AE2E9F27A874AB05190350B2D445DDFBA4A5AEB1410FEF3C09673C986D741ADC2781306F2930B1CBA604B3863CE19BF3FD78FE3EACE85F7355BED0B41AB740407E919AB98B062DC824A52E72F8FD627B49930D1C818B5D298CBD2F24290DC65E14A683B100092A2A3BC250D2AF06983C79B7D467C3AD941229E9D89C457761C061228F88776ECC2C93D53D1697A1FB1EEAA76AC1BD3AF43FDCED744D9CB89E8A4C342234C4B66F33928D2DD2965F4CB1FB7D7A1524F6755BDFCFD8FDFCA8FCE99C67C7828CE650654CDF283314E49962A28E1F8A7D654FB9EC3B8CB997A1BD08E7FB34C44B98BEEED7B79588B4C92E2ECA0B4F72D73BC46113A6A6E3E17E07AAD79E7585D793E5CBF7D829E626C71A5C91611C0036BECFDCB2E9C15B0F52178F5A31D59548DDF0BA0F3A6132A8D8E469DD32E43779B8AD10170399CC64EBCF6B04E44D6344406807781D00ACE8933D4154BAA16FBFCDA5D78C94C55B0F52178F5A31D59548DDF0BA0F3A61E9590F8712727B0D463BABD0F964CE89BA3830E0A7794EE34160B704E43DD174D2AF06983C79B7D467C3AD941229E9D88B247251C5DB9248713F4CDCFD778851796140B75F704D95B3BFD1DB59A79A7AFE9196A205AD4B2E5031929394417776C3994DFEA258A0A2860C0F2737B2E0C10897D32AEC1EB91BE453987BFB0D96AD0FC0C44D60350AFB7999DE88624185E923276034DC7796253D4560A0F841DFDB016BD3CDD13D6561CE0A69E415CD30CEBBA9106D82F166A6D3E8FAFE3B3B1F7E3A12C32DE46CDC9F3B761CB440FCC3365B0F52178F5A31D59548DDF0BA0F3A61EE68A987833C77097E538B19B926CDFAA2EF4663EA8C7379A5BF67FCB84CDCAE5B0F52178F5A31D59548DDF0BA0F3A61FA99BB5DCF1AF52BDA8A3F2ADEF75FA67C1B0A68B253ED0151563FF3E9ED84B818BD8A65ADC13D9021E3F7DFFA80B11C31B4DAD3EAA868FFB3B8A3F728C222BDA7DBE5ACD3E4E7547C51FC3C5D1F52D950D5757C3C87424C73B63AFBC4C6AC50106F71F9BCB94E5DD2E7590F915EEBF54ABD7DFE15B25A944931B8A48D335677F87F87734A730E8F90CE07DE2EFE6D7364F10DD581FC787D1B4BCBBC70FFE0EEA85984CE65E8EEE415BA94FDA1CC76565B0F52178F5A31D59548DDF0BA0F3A61C50E253EE3FAD89BE6152298B97138219BD7E8E76ADD1AE54887575B62956805CDB759037797E2E265C7591D35680B23F32CFF71D04ABC967827DBD20CC6AB324ABD7DFE15B25A944931B8A48D335677C317E3E5A8F0A31EC1E20336EBCDF1E07A3084ABD06F2F799616BAA890461B111D5E409BE3720F51CE50674C5CE75F649ABB9892EBC26A3B4676945AB51325521B25805656A7F2C5C1F4C6763F52DCD75B0F52178F5A31D59548DDF0BA0F3A61F6523210C73BE3747CB103E43AECFF646852CFA6ED371B71EB48C7639EBFE67B870A05637CEF0A50AA603056837F1438E56FF31DBABE17785F4443EAB6491F355BB58B31A3538ED0E79EC3752CC1E4845B0F52178F5A31D59548DDF0BA0F3A61851B028CC7B792DD33BAC70AF19D92C0078A5F6465DADBF7A4B77CDAC8B435CD82FFC7AD55467603E162F5F023C245607291A6F92798A2F10DEA3BC2C4AE7F67E62AA9F07E966C75AC39EB92C2D6804D73A66CDAF814D9C3951EF3EAAFB37CF80DB60ED2FEA32964A78D91D26C505813F28C0DDD34A7AC1BF58E0B800748F57F9CBEA21698A4E8B8DBACF81DFF89B81D668F097B50F3D2C53F6D5BB87BF26F332BB77DBB8FA16F618B2623503825A51FBE78F5A9FD23E4F66A4F98479F1A9ADCE09970542DADC30D964CB1A6E2BEF2EABAF0AC194EFBB7ACDC0CAFC58AD4C89152AF525B07851D7CA05B0F9944FCFB6EA4B86CDF186C96111E3449E69F9426DD11F08A32C3CE3BDFF37D6E3EAF2AEC8554E5F5CE52A5F92A9BBF9500687796E07B3DE3E23431A700F19B9907933147F8C1C3B2FE45CF2F3E244E6B870164173A924DEC731D64ADA7D6D100860356F092AFAE25926D89EAE216E9C94CC089F18899759E8396F5B5C1823C607B153AD1A0CB399B283C6B0FE993BA234C52CED8B4DA8BB5DDA77E8A59FEC85982182E8ED31E22070E06A125220DA1055112C0430CF0CCD04BB0C9793824D458A0AC53D3B7EFF4D3E7DE93D0D718D2035503A5099AA00B6D34D85F57DD96EF6522D370460D046FD36FA255D44A1F7C8E9DD49B57C7769A0947A5C2ED31055A465A5E8D3841BFC34E9DE955C79ECC5BD0EDAD29F427C32C4400D24E24F9EFE247D997C539011A472F70239B6FB2F895E993EB65470502CEC1E8F9FD6222E3E4FAACF6EDA0D8848F94DEA596BEEA61D3DAE7ED2713AC6C0134FC088050348C7B198801524603FFE17434BBD6A10A72E712EEC389C75ACC00E8AAA665C8418D1E014487C85C13496C31DFB6E6DE94817EAB42FB08AA7C02CEC1E8F9FD6222E3E4FAACF6EDA0D8D4887EE342362F29F64903BBE86753D8F918989C7F43EBB9497C7ED8C082881E321EE07FB62E7A4D84CDEE5CBFA9551C37E10CAEF20F2FEA31ABFA3824693197DE6E99048108EE9D76FABD77910181ACA7A274E12E59D44667438E40A679A04CF6BF6AB46440B65643CBD3F9C1FF0841BF3117CE42D12295D680B64976B9AFA359F0289F2CE66278B7CD7D6791F35249C36547BF8D6B3F8EF31AE86C5B9A1EA35F98FE01A31E08821058D69AEE1D3DA9DD80F93EFE8261CEF47DEF66072ADFA09B27DA881917A28E8253577A12AA662C07C1D3755E979744152E7C2708D437A77AC0AEED3B17104A27EF3E9E62C276BFDD80F93EFE8261CEF47DEF66072ADFA06D466652AA7470DD6A10D7487465F78F1B9208CB7B817A3F59C802350BBACE174A8FBC42E284F7F104802C0695E44FA1DAB2E67B6EAA637EA154F2A33A0D9D6613069C7A234146B28B6FCD7F1EA9F8F5B38922F55E96BB8A50732B5B8385BE3B8AF6FF3A4596FE7B6626E553A5EEE53DE7C1A07D2A16C221EB34C037AD1F7AEB461A1DC99712A45E829FCA1166857932D405BF384A7E8CA19CE4FF1630A3721BA1D7F58DE5300FD70AA6C91F4CBFB1B745254FB3A5D136C29B458FE41CAD9944FAFA513893A78D1FC9CC74C898E11E6CAC28F4AD3A85E574B45E338032B911896FD00E2581218A4A890F3F0C6F4BDB5DBC0A777C3FD91AFBDF870BDD9BD3A2DB10A4E3D08FF95F4D29845B4A6BED699149BD592DCFB06A21A5CE706E3C8B0AE2D9F6AF062B51B64E0A5FDED1D1A738B44918E6BFCF3ECB3A3761AAC73F6439D0C27B9D01CAE03D852BB8F3DEB1752924C6020A4A5DC38C78B932107660436C74333001E6B4A3E6FF9EAAD620029364B73A43ED596442381CAC1E74CBC4CCAAD5D596E5C1869C9A043E845DD48D07C57883879AAB0239B30E055EA80394CA2450D293D54FBFC411957EA632E8F1BDAD0C6F63B2ECD10118F9A5C56D463EF70E6BA481ABCFA29330C37283DF676101CD5FC8887379B3ADD6CD2C46D1FA6FAB4609CAE2921E1F4D6D21E0D13D0B689F9C702EAD429F0C89118ED0677E51A10727B8D0F7E24DF323CAE93434E552A4AB81FE31284D173AB286A2F0956E04C3956ECE1247E8ED0026C7A114E55CFCE24E2A506572CC77481EC38986C956F3A489B509851460D695815821E49B70AEA3A1237EF0CCD04BB0C9793824D458A0AC53D3B7EFF4D3E7DE93D0D718D2035503A5099A579BD3066E00A2AF59A770FE7E7259E6C66D53BCB6F62289C02346C3023196C94D5337834CE431DE4479FE150AB2828FE48AD42C771AD65DF2E3F4172C12ABD7B098B37D10BB88B63BC5E3CD49E85494BCF650C9A52C3A95F21E43415D231FB049A80138855720A4BAADCA8A5D570BBB2A25ED378722038D6FBE874F6B645DB36FB638A64566AE30B967EB1F36F958640E50E5BAA6CC7364DBEFAC85C3298280D553A879BAB18DA445B66A88041A8117398A0FD144653BEB6DCBB63F27F4AFCF5B518754369C26FE4396FA539A8DC17E07475E8F6EF88303C22C7CE7559F14A925644D7DE518D971617C7717437E34FAD9E69A5DD6EEA6AC1740029534F6D4C6ECF295DD2D61561CACAFDC9BF8858C29E73C54724E3B3EA4437845C03ABE8912E31B254CF5C383BD50C11B039DC6AE3C11C75B2383E21044F97EA6DBE2D02F80434887496EBD904EF99C10ECCFC7C0CA49692E89D41587B4604352C9B4C0717C48ED8631E608F8DDE85F56FBD9952F9934446856DCD03B2DAA5A26951E69B3AF470D76201CC7EAE77FEB4F8623CBD5C7E6D2A61D3FEF6EB2A43FA90AF9B62E0AEBBB9AD04845F8E803AA9F2C135E19B3DA0471DB8306F575733C38CE882A2D5A6EE9D6188673328FA453874085F35375710B2B16207910A7C6BFED365BF886841B8861B240626F45C7D542B4E74E202F46AC75CDB8D2A4153B8C7796D19E12736057EDB7581C513A415E4B4F7B156F9E4D0D2FE48200851E23CC3ED3295795AF84D13DF95F8F22214639D6AC48AE4176B8DB0E9926164C18EB7A152B14D1F2290D8E7D38D63759E30E2F8C4CF5B456F8B06DA8C3D768B22B864C89E1A7A3A1146AF37ADE19DA4A64B7C32D5790F287AFB88F3F110570373ABE8877D2847CBB96A84D6AB67FD90C25CF51AFA84EE0E4849C4A9BB0D66534DEDE64620BA7D6E20DD3E41E00B6798565DA910189DB3BE4BA9860894A53B9CDA0918F71684156CF631280BECD77883B477E387956D66E496218B8510894D07126785D43F486129A514435F5D3456E6DB4F10FF02BD0D3FAF705E32A432D27DE1453D495DB3EFDF1F25B0F52178F5A31D59548DDF0BA0F3A6182622ADEE0C2F9D5CC6EA248BC8F3E4A9BF0C019B433766DC8D63DB4DFD02C61C11B08C25FC30069FF545AE0E10A1379213D437DF597B5BC17050D28B3A4BF790B7BDC7458E45D508D1DE6D224407667E13DF33095E5985E3B2CA59EB613CE30249BFB072271DEDBF7E274DBE3B82D9CA652EDD0BA47C01D922ABF26A53B61350B1C1C4017398A092ED179929A5D6BD935F04948A5488AC8468967832A2C5D200035583584D8A7B7D7B8D98F1B330A7ACE2B6FA4E99157FBB988798D376D353B4E4E2670DFFD12B1850592AD7BB563D089385D155EA7B2CA31E0F60337C79500365AE9561B2046F54E3A4B2070965FB393DEFD5A50A882DA23D3F443D909EB58ADD9F12F5468A65286B1795F0925A3C01D729AB9256C860EF0505DC14F386376BBF588CD1A13AC0A95C3B0B7118C9013A8C1CB9B93EFC5A07BEBFDD2754DB6A2C0A089D17F028E78C40B172524C3835E1A44CDFE00EE3C48E87B61BC74F975E412A8AF1363162731C7FA5038C29F94B82B92C7731F824F910CF51D2006EAC09EC7F545886C93A65208E946CDF6FA6126559A0D4AF6FB48B7F754E31851111CC5B054A830F94B22856BBC9866812C49DFDC7F04322D90FBC0770751ADC155008DA28B2954209822AAE05AC882DE03BDA2E9D22CA0C974FFDCD176E373386E138DEE4A726F5403EDD3698CF8C4ECBC36D9418332A00F932CF66A809C9C4E89F47C5D2012A5CB3BD78A3714D202454533B7DA5C2E92C54CA247542F99E3A6D49825C8FA3688AE5091E2EACF22AE8FA5A4CDAE0B131F72A6B687544CE27280678CB4371AC190D6A13566C5B7BE108C07E04A10C26F008229CA00B89BE7FFD70E71E365457EBAD77AF9E2DD10401EAE6FC8D3213BA4BCB0BAD7986A94EB333F88940B640B7B0A6CDB2835C9A0EF3A5241774080DED89C9C31E4B3B7712D99F8DD1493A5AB7CDE8E493A08784794806F08383F3524DE856792FCACF108FC1C98B22BBF73C452D2EB5EC449D279785792274ED0119B67B5AA6A5158EE119DA181613F375203ED8E7D089B11059174BADADFB285D07148F7DE01B41AED70CD1AE270AACB25C43515DF9D8806E6B7EEB2AEBAC3AD70D9B8894B14F2EE058DBA9A30E5852A6D8EA122B04E5F03DDC6DE4ED8D3C5B593648CF930754FE985CEDE0BAC5AA107498C34808AC02AEC8033B95A40F7890ECD450BF13F9DCC6EA215EB0A167A98D726A726AF076CD83676EB8EA6EF6273AADC179CFFDE5BB79EAAD8FEAD7DFA0AAA3B78D887D3BACA022734C5CA856EF9DB6C041E85627DC21B93CBC6F6DE4533EE0C6A63D53ECA9AE9543D4C4A8F39D700288304DBB434EFCA3465E73047DDC138E59DC09F541C12F231CC3CC52FC454BFC489A4E0AC023596F306BEB658DB7481ED4C7665959A33E96476BBD0EB6E12B11E7E1C2F161F7FCFFEFA5C6C893C2849D994504FBEFAC908182AF541CA4BFFD9FC5879BF023F807420B455DFF15A3B3B3C31D98B046520A06D81117C4528903E2DFE431AFEBEA679B3D39A06265570490897D32AEC1EB91BE453987BFB0D96ADFD8199703DBD2F5EEB0C5B3EC37F79735B0F52178F5A31D59548DDF0BA0F3A617FA7DC55811EBE5BA6072440B2EFF51C47A53EA888AD57BF23793E671E6D495631BEF7704D01576F6ED6B1021A22F064CC69D2D157D182F57902B968C57986DCEA2605CC04271C14B269CAABDBC46585C645273D4F8D5A02A0940BEC17CC0A7D68DEFD5059CD66A112EF30F11929E95C80FEDA4E527B210AC6805F7CF1B5F327686AB7F210039B3E28B057D5E453F2A2BEF2881628216E0F3C5E6BBFC1A3D1B4A95B7088F598D07BA9AA2B05A751FE5A4514850F937B2139AE394BD7EDC4D4D98BCF8A573F2CBCB7E2CC288ECF7FE72B99A93CD708F380B443EC4AD28344C3E34F2FF1D7CA058C807521B1ACFF55175177AE2073EC3351734D8278AE66BFD8E68D39197FD11759CEEEE718D7CB0A20F0570DFE6C68F065829A7B7123D9F1E2E734BCFDE476CDD3C5108D6E801C821D9D9B11B6FBD79D4AA9CF4421BA0C6AF8CCB652786DC8D17C788E78EEE76738DA1199A898FF18C20F4D56E0BB9C6981A299D9F294F13A902A7736D7A8EF125B0BAAB2C06F1CE1F93BDA12ECE709FC7BC09D82ECC0BA28C95BF795B5580395CA01E7B916E4C63556BBCD7ADA11F6210278BAE02ECEC8E0F8497C882EC46E6BEB9D6F239D5593AC2C5ED9233E12545254FC78021594D825B8B0228296EA7D83C618A46617046C8139C5DFDF65571924186B7743769FCCAB5088003CD0E0D13A84A720D807A1C8275AF42A0F1E38CEBA9E89CFD066DD43143BA8CB2BDDCB70E0EA9C3D050DAC06B957C3FD42A92B17733A9669CC8825EA050F0897BFB8654CF73FD3103D8E2C58A58200ECD94761960CFD1A0CA735D67779341890F7888D5D0D3EAF58F7BF2D1CDC34837FB2DE4CE5917744F501A61CC88C8B2DDA88922AE71DA36A0F4435F5D3456E6DB4F10FF02BD0D3FAF71D813B7ACCE8E62EE036FEB59A615A85C48DFE1E60717DD1252497031EA5BA921A23E25B7759A6945327AADF2DD88214AE516BE150ED58AE2588E9E60094D7048FFE0F79EF021564D032E21446D125C719E9F92579157E46C49EFC03F2BBF46364D076BBCE9EB7C4D0E9817C58DD2441C865F7D47AB655C4E4A9D44F6F6F0DC1E928D9919BB223FF7DC2EED56A9EB6A9427629FB1F2ACA6BD8694D3915A5EBD8C6727D76F62E0ED33025CB0A96C13FB8358E4E4BFE720ED34AEB93CA3A2737D81586B6137F7449CB865BD9DCF5B007D59DC462B1F21A05374AD945E7892F084A670F0AEFFAB2230848108DAECFC19A5EB942B4505905296716388EEDF0AE0046CEA6F33B6E1ADAD9A4FEA22075DE973CFD3602175F2E21730C0A2A2EED60E08F326A35CCF51DA5C2859688F5E1F5DB16DB9188061D7279652BB5F2256BC1F538B026739142481952090A0034BA90190127C76D7CCAF353EF305B45C4E73E0A4B9B2D09D5BB07C43CA57844AF742957A2E20A6721F060A8B75A9FB5F72996637A507316C08D4C0A5DD0517832AE2CE4DE6A0D6EFEA98D1A2D10BF7A767F7EBFACE7F1730AB32D79EB96A8AF011B94CD69234B9846714C72ACA1D33D60647CC411DA5C2E92C54CA247542F99E3A6D49825C8FA3688AE5091E2EACF22AE8FA5A4CD48ECD595B525FB58E27E72490485BFDD6204C544522CA980EB41E8CED6912D75F57C23E0C19AA7A1A27E34B24E3279AEA289924F6E23640D7D2176D686C68539A1350FFEC701C2B233B14E09496C937EA6D457FCC1FB1FACF10C2B7F14FE1D2B2167F159E227FE8D85D1F305413086E863783E3A3D803312512FBBA240298A425B0F52178F5A31D59548DDF0BA0F3A617630D9B9740C169D8B4656DF6008E82664ABD2A15AF8006EB29485D159B6B9C36E982A4D6B76BF9EA05B300E2470C8F472F8FD627B49930D1C818B5D298CBD2F90E144C6B6F19F93E6AEEC0189B8946CF8C20613CD78024D3306C32BF6B74B61E05AFDD34FBDAF51C2F812C62DF2DA2FB787132026B705FC10D9760DFFB0DEB064CF1CEB156C8E1AE632F49906B1E1EA3475BB1BB36E9AD906CD8CF36559A2D8046FD36FA255D44A1F7C8E9DD49B57C7769A0947A5C2ED31055A465A5E8D3841BFC34E9DE955C79ECC5BD0EDAD29F427C32C4400D24E24F9EFE247D997C539019DA222E611379869AD081ECFDE5823C789AA97651399F8687572A5DF369E446C1C984FA7A917CECBA539AF7876F498F548374647CEA76FC7A51CE0DF25054BBF64D2BF3C4AE3D53E5969DEFFCC63D320848F94DEA596BEEA61D3DAE7ED2713AC63DAE331812F6BD3C6D75B795D96CBFF121AC3C56ED8DEB4719E47833B745267754A4C481C18DD50A161CCB03D8A067FBF93C4ACDAE0EFE39DFB12DD21CEA7C5C29441C7100F3C60878950202F95EA7EDD5367A3792298562FA882F34BB97C4976F74FF7A2E7715D2D03A633AAEF37B6027C66F78001BD6AEF522EF5EA68134C48CBC6A5AAFB7E6947F396A89DAC4857DED3EBA406908C3EE0A859A6573932409D841638D34583573978281343DF9C3070E023BC7653A1F9365FA620A0DA1B2EB4D366D0467EBC26DD04A76D07CA2FF57D285B0CEDF8FF40AE385DE1B5DE891AF68DDDB0AD8063D9C4EF8D416A6E378C60EC3367260CAD219209FD8589A6608D215E2CD27B56E4D2E94994233D78DCD479AACF3695B5EDAA77ED01260D7A5265DA5C2E92C54CA247542F99E3A6D49825C8FA3688AE5091E2EACF22AE8FA5A4CDAE0B131F72A6B687544CE27280678CB4371AC190D6A13566C5B7BE108C07E04A10C26F008229CA00B89BE7FFD70E71E365457EBAD77AF9E2DD10401EAE6FC8D3DD80F93EFE8261CEF47DEF66072ADFA08C4F39C61414EA2550ECE080444DF2A0213BA4BCB0BAD7986A94EB333F88940B640B7B0A6CDB2835C9A0EF3A524177408A046EE75B6739A7A2DCC6F3AD8E9EC7931518157EFABE2D82755B7CC4600A4EF8DEF8A95AA63D95B2B79067729A2322C2A7C8EED97FAB7A8E8735A57AB36154B3315E219681F77F05A8631D62FAFE55445F4447A0A91F1A23324C0C24E11A1D7E41D9758D5F016E4F5066371247CA28EF371D5708E10B714F4A38853D9D8E432A693AC2E157DB08FF30FB46B8B877A38A4297ED5649E4EFA63886F97BE49EE9B498C3322A9B946C06C5CE0E5CC9AB1FB95EDC53FD6E522BDE9057A2DDEC95942FFEA57A48827C8B74D2ABA4F065D1E6F48EBA8FD77CED033270409D9618F9086A56D4BAAA0E666F5D680DBD228EF82DCDFF67BC1A014E2244B99CEAC5CF3E83781BEEEA39C6291E6F16C692B6836541C4FF058620F17D8CDDDCEAA2F85D37255C1484BD3CD22EF2AB90D67067BCA6197036D99F18228A7DC2B6AF02FA4721357F95F736E121944711125C933C4F357814E6CC29C1918468D10B73B902CB05C196AA1BFF2EA2FFCC32E443EEE7F35853436B632DC8650E4C0D8BB8B99696FDC4EDD9FB35D048760FFAD4714247BE142E2891DD3ECFB11B511BB85ED29908FDF16E36BE1808C866067F87D9C9287AB88D6D440F547256240EBC9EC611391AC64DFCE9309C150B13A3970D58CA61B1831580FD6877AAF5AE5B9ABBEB8E624CEBBEBE7EDF3A2681A47EB0172347D42638B40CA4020BF1197919F7BB33E99F5FDF45945797E786D619935CEE90EB58D3B959BA8FD973BACAF2A32011B6A531C419C9F0A65E1E76607F0CAFD06D2BD87B0CC7D0B5E1B77F7C78665B5D325C43515DF9D8806E6B7EEB2AEBAC3AD70D9B8894B14F2EE058DBA9A30E5852A6317EBA7F3A8C28C5474BBEF6E4C71B24B17267AF12567255495AEFDAE3F3749E8336BFA373B9FD1C19D2F8F3955F5D830310F2043B718B4D57D689ACE1F41DD0BC91413973F1D3A4B173B02ACF433F863C55FCBC951BA1F770E25E8600C8131880FE9D37F7D00047EF6CDB9EBD9CFAEEC6DD840A89D6FA8D9DDFAF764255519A99CA040A869923FD43ABF31EEF7E9279EC27736687C42807DF5E4551AB551C05DAE114B8BA1A9F1A2DA26B7B1455B1E2B121D208F36A1F69109894F04580169A9D6793B0FD223CEED13A1FB69844E7DE8CEAF168E331D6D1830701F914A26656A800B525F777E2F96FBCA95A590FE8BB74D1AC98D9D158ECD57B03BFEF8CD823B7BA04100AFEE82B76CF2B9FBA1D1B06BAD069B4C4D08819B9F02417C4E72F00CAFB228C3806E81352733AEFC910DA48AA96705B2E05E68FCB314433D99AA0BC0D7DCC01E337840060B7B48939B816E2B68EE76AE01EC52257429211EF7BFFC68D3E8C4F4735D77661B1F85355990DDDE63233E2EBB17C11B8180EDA9A89C0482A5AD263A7097436D01742E1CE9986466E974CE29BACB0B4FD66D7BF6039B1ED9F294F13A902A7736D7A8EF125B0BAA944FC1A4C5CC3E0DB9A8481485D8528689CC0B8A9FDD4E7B570CE3B4FEC6246C97B4A3601BB42AC1378FBB68BD395534AF4E5C13FFE1207755A2895A9B8EB0774838529E781022A1C80EFB9A4ECA12D20AD938DE4CC808CD99ECC0F389F2E6CEB9B3A107733B86AE2D695912FC51D4E601511B05AA0B6E75F11938C8AD6C38371275F17A3D727417F102A4AD2B1F87D79DCE910FC2CD36C575F33143D1907F852B61FF138FFAD6AE8B58BCED4A1FDAB82A433AF2390CB56BA14CF55D0EC52DBCFDB55D49F4531E822C2B25A09F48A59C01CBE1E6C21188CF2DBE0AD7EC96C5735DD641CC5E591EF327B10568F07C2C35C28B783097178556424C4531BA4B602C439975C682ECD87C21E65AC8BEB0A5E978AD57EAEBBB1FD89D2A90CD2D17A1639B774CFB632AC8D754D6E5EE2D23F9471EA927A331815EEDCE538AF03B7DA13449692E89D41587B4604352C9B4C0717C79F19F146E372DD214F8451590DC5D2FB01C75FDA21747B15E7E98733C320D31FC123EF7DF9DC9CF9D22E96637EF378987598E649BA0FFC8C1816541B4C5CF8D5E06094ED40AF35AFFC4C92CCE7378D32487B1546CDCB27A53DB5257BE243B58559E383B34B922080268B98D91CC0982EC8B0AB75B3FC3E41577A712CA6D320320BCF3472C5EA86E94ED1BDC211A50252EDA4017C5EF9BE3811BE77A221B0E9A4A0C5F36AF4AB4F39AF51D575A3BF06BF2F9C2D17A98776A1394FFCC0DC7BB9ACC6C13A7F20A1403C9A57958DC53A0421F4E6ADB60CF94D46ED28094A96639F119807E43D844B84482070858B89B9D43089CD65AAF33E33EC7DE3F14DD59F309FB8C37B5446223ED392C9749FB62429E56FE066BCC427AF926C3E9F72DB65F1951ADBB5E7EF8051DF2785994D9D08744FB3893FA40AD05974777EF96FABA3BA6E99368DB582B51966E470E17621AA4B0C23EB7FB26B147BDB4776F15E3D187767634819F59BBBAC98BF65873C48B7C253DB025A4A7BA35DB3D172868CFF12EEE83E78120391A6F69C0605BD818EC7FD7FEAC8D57F20E856CC111587553AA0E67D06B0FF484DF6FF7ECEA4F665F7BF03C39BB3428ECB4EAFB8CF06B1F65DF4FE0C245BA22CD9C64B8A69572B7BE140A68746AC94DE3B5AA81160D326ACDED65958625B8D871CD4D52E9D71D6037B3DBE96BF0527FFFDF646D4347B9B6D633958CC23EB7FB26B147BDB4776F15E3D187766AF6B69824855FCA7782ED76717D96A74AB0680AC4387D390079F45049E67634557B39879DAE397B9119C03162BCA7AF9160845FA656C910A87D4E5A0DF8FFC20D5BA860AB6C2BBA04BA28E818D119A87D8556E35CABF6E2DFF1D75F4FEAF5EA12FA6AC19938058926C1E4D4AD3D1305288BC9DD983F5FDD839ABBE82B4FF21DBF9328B99C16A3C212D0532181A061A4263826C808ADC10DC8177852077C3D95737832884AB788888F3C9ABFBCAF9AD139BB3428ECB4EAFB8CF06B1F65DF4FE06DEAA2B49B3CE7A26101FE4B8F695F948177B2220888C07A889503F8875AF2859BC094266BCD7A6BB265B974AF7141B0D4D528B339D99F2C8A7BBB5D3CFB5630E1CF67D1E8B8586B6BF17EAEF0187950529F1496A9E4A01496C7EF9700804FEF6EB51C4A5C1BCC2921CA8D947F2724DB9F010F62F081828AC896028AE6B9FF2EE4A05EDFDAD29949A6416D93D973DA149F010F62F081828AC896028AE6B9FF2E43FE421CB812C6736ED449E05EA0AA7D39BB3428ECB4EAFB8CF06B1F65DF4FE0520A8316264FC2464483945B0B567E1CA16CAE87DC30A142EE104940FE2A1FFC06CD5E8F056262AB1C3290DD82ADA1E2BB102E6C96196299C036F93B0E9C9BCEDC1EDC7C415AC0D44BBDC5923294C473A3166DC2F3A0C338281A095FC9003318DDBA64189E9F39F65E203D59729FFE06B9B3A107733B86AE2D695912FC51D4E65CF6560695989E6307948549F7A404C537C8A0BA2A10BC084EC9C41E13C8CFC8C5589ED209CD1E02830DC6DCDF2957F90D72285B261D97AAAFFB29F3D3017B0AE31599C8361179CAACC680DDC60DAE5FF90E202A70A8860FE4BEB50404D32952EB1F6D1F4BA5A3AB489BE92A87C5BC9C659D8FCBFA632FAD238E874009F6F579B5AE3E6CA44F68104DCD6DF61869959AC6278154A07ED3CCBF1CFE879C7F59C0FE672F5065AE00668C41EA9A5FB8F4EE7F4D0D0949CBF5E8533862B7FD198582A1C8F247CC7CB780C54D658AEAE7365F5C31432438C46DB7E73994CE33B356182BD4859DFEA352845DDDD367EA48622DFD806D55C9F4E20F12B7EBF3F1BA8C5DF56493465EF98E516179F96A34B2DB0AE5A57729FE89EF4F55AB9DBB6C6C849ADF63B229FBBE3755952AF53975A5419CBDFC05728A042C281821E3B48676F718E3F1B8DE4062B86058CF16E12B3DF98E1D0363094C08A40AE9F0923242665674C4B693F0C789F0677B1FB1DF0321DDAA3BAA356C7C13F38D35B4E4FA53E6D37A19807E43D844B84482070858B89B9D434CD33EE6838BCEAD9E4725D585517082E589EEF6554FA5D57BF2C2B8B51A111E2680EC36750175BD9CBF09788D58E8F294B1B40D3340C0997722398FBEFF26BDE99368DB582B51966E470E17621AA4B0357C6C35A118DD8078374FB16D775625BD71502C091747F2837EB8233BA040675F56EE92C9C21F4FA3D566B0F58AEEB4BB4E91101A62F845CF8CFE867C5676FC589FCDA2C9E3C7B4449E2E2034EDB517D7506664B389CD225C0E5ADD4337A0BDD8A0349F2CD4D07C3B5B20A9C94E4A9EE39CEC37EDAF82480550BA7979D4A6596A022F5747C7767398E3DCEA56CEF37483A18EE239E82D6E949E27E39C5F8DD1BAD4E847E6FEA479120E5D4CE50C069FD0E118B176DF018C2E9560F8B8E7B545DAC8D8719E2C9E4F65E6290E694F86F2E4CE7AB3F52A354E142EEFE1F6DB9BD6552447933A5D328C2DDF4F75005EE359D54D1FAFCB3FFBC0E0E57492E7A29569357C6C35A118DD8078374FB16D7756257916BED14DC892F03CE6D89AAE35C5EA937538D53FB8B1B998DE89E2C3D0261FC022426E0EB711DCA89DD46D69369595E57D53C03E55C8F18725E07CFFE6442E5E32AA05B15F503B403059A9DD9651FD27D2B885DA5C522505E1F5FBB09C17FFD82BBFDCC430D63758DCDFD8C5247D644C3D559108EC85A32E9B724E2AC15143F02D7AF19FFBEFE70D75BACCC199752EE4CE7AB3F52A354E142EEFE1F6DB9BD66A888DAFBDF4ED7893361461F9E6F43BE155D81DD267940C1D2386488E0744089B6768CB0BCAA826AF28A33DF5B227903F12863ABD8702969DFE677244090B7B4E2063B7EF13AC6AA0E45C5AF22DD3216DE0B4B6B5532C75F2368A65C4482DDEB7D53137CE0A99A949618DCA0976EE96AB4FA47D42DF231CF3440CAA39FF7781AF4E26F76DAD47E2C296FB8A972F272137FE5328C16CE73F89CC149BB188545CFDC8923185FD01E1DEE40BF0A070AB5DEB8313DD2833211216BE343433DEA39FEEF18EC756A90DE38F63899AB05EF5881075859E3E6A91ACE9E0A408E0757FEEF04A74EE84B37B2E508C5C8FD67D8C6F6B8E3D6F1A6A955835314EE0B5289890FB910BD0C8AFE1A00306D862A9D3732C42C2D0EDE3FBA1443AF2F0B733D0C487E5D93B10B0C45217D6989CE274A83479CCA64E201E984BD5F4B111D689895A39E2583BEE800C9D0C1C4F74697CF6BFC20D723F7A221693D33AF007E4FF4C3967DE9AFAFBCD4A8D348E7D3C53D8B096BFE155D81DD267940C1D2386488E0744089B6768CB0BCAA826AF28A33DF5B227903F12863ABD8702969DFE677244090B7B9AC0812071D2F23539D5E0895219298A26E4F0C7F389341C9594E71A12B684EFC825072E503ECED440C1634BF31123CBB02BD3A06B1070452AFAEC843D0E54487E041DBBB23E56EDF37EFD7B133E88339C1BD4B4266271634AB43F61C17978553AA857E0173A4118001559480F5F9DC3B179944B79C9FA2491CAFE41C56D21DF9557A2658A0FD171C50495797D0ADB0DF13FF09F5FC2F4122F712DFE999A5F8119A52B444BCABCF8AAADF0D9C2F9A64E23A41F2720D95ECBE9FFBFCC0A5F593E2CAB7F0BC7F4A276777E19B7B4C09FF1589EE720F2132921A49A9A29698838F658E1B69E0F738F47A1EED119A916B538CC328FDE0E19FB158EE9D04ACE2286A6A716AC52E292FA20F57B5BF723717215F683698A3217B0880AA8766AF605D5BC58F6C9451549A1516E5E2CA37ECE1F9A289433DB28A8D06127C516335EC910B20EE3D9D8F9BE786D1CAA957D8A32A2955653F3CE8026F3D7AAFB85B738428732E45ED1A95CD900A3EB18603B5027766B9860894A53B9CDA0918F71684156CF637ACE4A690E6D52F687DB850D3BC970B7C20DA783D64AED8D98655B15807D03C77B3DE3E23431A700F19B9907933147F8F85A3BAD3537AA3CABE5D9720730A2E3B86D4D6FCA28F12BAA49D3BD93BDBF5F516F6C02F69E6064FDD5521333EFCB21AE59977C874F2C2B01DA361922FE6477CE5929FE39750363EA0A812451704DC646132035F5B13784E4169351DB8CC05285BAD843FB04097BFF444B1DAD1C56E82658297B26C51434569814B76882CFAECC9149BE5B15FA8CD666E5DF693C6ED665637A0C01B88753DCDD949DD4F4AF02D8C48CE7DC2F912400916BD4D8B921C806508E37843709568FF38810A68A6874F990860D7234811D2E8EF98951248F557F2375DD8E3172472876273C48CFB58FA65A4BAEDFA04AAEE677475D538192DEE941E51ABD98559633AEC8CF482236E94B0DDFDA785D4C730E61D330EEEA33364F7CF47EAC5D5560ABC35B95E76A45C1147E920968DCB6F912DFE114D6D40CF28051BB15D0ED44CD93BBB508A7D79DCF2F033461E32B0876A0EB74649492CE53F8A273635B09A4A46383CF5C7FDCF737CC010C03DC3C869F913CF0735E04C6941610E54B727056F19D7E92FB5ED9206B49DD67032DB094CB4B131082A1D1BE021EEB9E115D894301DE9C9BCB27B60F732FC5DA09AF7DCD7C5C4262C0E5EC37E97934526A32BFFBF3ACCEC4DBDE5B2D54320BB9275B196E1DC41EC5A7961C48D5283E8369F1FE554CDD06F4AF0D139EBEE665A0900F0453F6F976A07B01F6E4BF06E66656C7F2097F3C232EB4234A699F016499EFC1734D340E6655771D5A3400FF5B9108079986D4E18D261B110FAA41F7BA85485F95452A247B541EC2A206CF2593C9E618B892BFD5E4740502054CE2F4D14D0B7842D88B844AAE362A7BA4B4C5B95D1BEE3BF94A8A5F2171019E9E6467006479DF15F36DE3D32A2B113EC05FE09970542DADC30D964CB1A6E2BEF2EAC6EC558B2781E0A73642F24AC2EB76A82E7B7E67F5E7B09E42978833B205CD1C5D28861F0CDE688F8482E9B236B937984146610D081830806CCFAFA1FA0602A27388E6ED178B8EEBB71BDD62056E30609C84D16BF611CB6D456FC9EDB3D5EDEC6132B757DB24FFD46DD96C6762C2A6B6E548D5EFD5B510003DAFB191803F64D1641BC1D246464935C9641E6B27F73210589C98DEC2C76ACE1D0722D35E333AD903ED41398B57D253FCFD6BF0DFBC47F448339AD805D31D117EA82209E74F1CB840B7D9F5F5C55C735C1591085117A0E83F19804CBCE3D0BA73E5AE87B50804398899A34DD32E859C546BFF71B32DDBA1A1D2F1E58F75946D3F369FDC303E294A0926413A3C9BE63700CF89866B72B442FBF4FF9C5864D949FFECB4EB2A73315A3EA61E9D6E61041819AF06131C40B2D9097DA6DDA5C45ADD1DB5363B61448E48216D8A9C50FD1464353B8356A0EF5689BBEB4F475AD703E8B164237CD904D8096AA753DA37527F27154AFFA9C7859600C6B4764E01E5B2B4E7947A1433A2A0D8C9EB2CA0629646C3E24322728B1D41E2F3194FC14274A204C031353C09A71A2003BF18E5659FE623674BEB3BF766671905AB6251BEFFA1B4756C12DD43371696B62C07E31464AD8197844A6C5F0BDB5AB13937C6810896CAD5E606C3408FDB1A4F04E19AEE1C5BD68369EEFD0DEA288D33338E78D7F9783215D5A6042F64379923573D60C85012706E578569CF07B14E6A48E823C9CBA2D54452082BDC5EB5FD11BDD769C4DFCDB06955CAB1559F95EB5B0F52178F5A31D59548DDF0BA0F3A617E865FC8DFA8C90AC15ED1FFC7869D119E2BADCB0582A88447ABCE80973ADED9DEB2DFB6E9CCC63341F54C0583966797026BD11F61D5051CD526DAFECA49B06AEE6EF2CAB3393A22A4E095CAA967327F5E57EA09B31681F0A6C02C18A171C3ECB13937C6810896CAD5E606C3408FDB1AE7A7A7C9041588772C3789671A075C6E75DA896840452C98BD8754B7BEBDBBFD2C9457BDB274F6010C265A366C7A1D105B0F52178F5A31D59548DDF0BA0F3A61DD80F93EFE8261CEF47DEF66072ADFA0C5035AE2DA56D416D9BFDF8F82FCCE1E164AB97D42603A7A0719187406FD3216FC53101E213F9AC47327637241C978475AE512BAB58FFDC1B61B363D361C03DA2A7ADE6057A013DDEE663F903D5B25874ABD7DFE15B25A944931B8A48D335677E7DE8ADD1A3BDFB07E9B4C8A71F786DE5B0F52178F5A31D59548DDF0BA0F3A616C93BF1A92B7478876BD48267CE8EC1E5B0F52178F5A31D59548DDF0BA0F3A61CC137901241434AC46AAD19EDF470B3971331C29645F2E7C637DDC7EB28864354ABD7DFE15B25A944931B8A48D33567743C32FC557519ABC4C8C5C90F258A7F90897D32AEC1EB91BE453987BFB0D96ADE180E52CF4549D0752C27EF3E5ED492F3CFE1848B1019E4C80F376242A11765638B22524E619EE4005C4FE4C0D6571FA49692E89D41587B4604352C9B4C0717CF3DA6677831B83EC31BACC85D19F66BD498C34808AC02AEC8033B95A40F7890ECD450BF13F9DCC6EA215EB0A167A98D7411035971DF9F4FDA3DB14593DC3F9A27C474C9D5815A0FFB575D7779B9F295B351F40544A4C66C524961B3C3E7AF0C24D2E75ADFA99E4765985112CB45160C990DF84F86DB775A51C0C20EC935519727ABBF5B20C57306C768DFDB524987F4234C1A78416F176C1FC6ED2DE39575A079144EC82A0278020A4834972034A9EEE72F6795DECC1A76CB2FF432D4DD66B25A58933850E097D8BD741426BC67EF0B84153C8E0A557599FA5D44019A311763988A7C37E73922A0757471BEF52B8C0FE587B6B116070E137B7C3F444FBA96F8942588CA53E29954EC6A18F24D0AE3D50B33125E4FEA5B0F1973752CC1E0BB8156F3CA33EFFF18D377E83C0655D33C435895AFD46EEAA55EC0BE894E9567B47D7D2DE8A816EB20A431EC61B1AA311BE8F2B1C0E8135E3A422E7D3372AF62B79E2F1EF75954DC101F1BF2E87D106AEA2092C4B311A95C519012D27C5004BA1E09102A7F0F7DDA87844833D947F991E1561BE22B480A097570A57544216A50917ED3A77B2BBA3140B7EC3EE4A03031CDBDA0DDF90083D988475BBF4F76B109E83D313644E33B2E5B76B98D9D9838AAED6ADAAA8B9C747F48092B5C7BF97CE9B9E7F4FA0C5857076FA21470F1E2233C69D43EC7D1BD9FB1C541DB5C9148BD3D164647232C5F004BEEFB0BA3F1B00128A434B1815147BD00A61822348EB3E3FB1083EC7BDD459CAACD236016DF3B69CDD5561B30121FDF3F8D4FC0B09711ADD854BF42A2BC64329D4E0DC1E1AF326C81A6FB8EE83A4746731CFA14B885D1376AC92EC184D62697CBBCD79D4130FFA13B0E2AC8C5781490FD0A990FAFE6DCDE96C0D279AE47BEA96FED2C4BF8821CFB03FEED5498C34808AC02AEC8033B95A40F7890ECD450BF13F9DCC6EA215EB0A167A98D7FF49DB02A17E7977BEBF2FCCEB999D7FDD80F93EFE8261CEF47DEF66072ADFA0892F05AB9C52EF597BA187677A8C8F8B1A44CDFE00EE3C48E87B61BC74F975E43BAA356C7C13F38D35B4E4FA53E6D37A4910916848DAF5D8F3CC1662D330D1E8D2AF06983C79B7D467C3AD941229E9D8E2583BEE800C9D0C1C4F74697CF6BFC2F2C4DAE3B7CB2966A56D1DE064B0CE3FAF4E779C6E735887E27F6A31BA82C53E4ABD7DFE15B25A944931B8A48D33567709A1B3821FF0C4C61A08C634D48DD040A04031707A3E82175A95E6D68E4B424DBF1586B714E432F5654A760846B0DF596ED6905F4DFF281D9607AEC42AF8E3F2B8F339A0FF7C003EADD0F46D58D80D56228969748593DF6E05A1B6C03CC3E91BD72D8F820785B5A457B2BF44480E74A59A387A77E23C212A2EEA5189A3C565D3C737C11B24F26A0FBC84F2CD94EEC34CC4BE08034AD58EFE1535FD6F32A1EAB77B9C68D417D237A2EA62C0A170470A3133C3511C6D238D1FED5FFDFB745B78963177CEF8FE908D4B42D9326673B22576A1DF589D8A78921D1C2A8A89C6F4942F68FCECD4AA7B0DF998934B7EE5B6072536A468566A60572174C563F215DA9FA450D5757C3C87424C73B63AFBC4C6AC50106F71F9BCB94E5DD2E7590F915EEBF5EA0D81DB8CB15B9EF5A5C221C0AF2847945CF25F939FE9BA9311BF3CF89BB32142ADC618F8B5C37B678AD7D3D95AD6A220EEE3F696EF784CD6E0C2A6E5E46487D2AF06983C79B7D467C3AD941229E9D8BA4167D00D2B2F03E2A24DB16DEBF145124542D7F69C51864391AA980B17C7927D34476364808BC45A0C842A49A7AB7B1D7A1B62F36D79F1A6B8915F176D9FA8E162B662B9CD0FF9203AB4086902DE90EEB37E936F856657FB7A04B84507B692DD80F93EFE8261CEF47DEF66072ADFA07EE7969AE7683C92AADF892326662AAA6ABED20462DE540B6CF0A7D8F4DDE089AFC3F7B8FE713764C127E13859A80668A3A7263672D76B941900C1345BBE3448C9232D1858CEE18B956E46EA9FB7B16ED23C3D577E3B396689553316A161A822D7EE69FB365139BEFF4C17634D729B6EDB4FD3FB0572A7FAE7814459975A0726209B859875385DB62E5E84B45BDADEDCFFBDD2498226587AD0A97E0379B6FEC7BBA9106D82F166A6D3E8FAFE3B3B1F7E3A12C32DE46CDC9F3B761CB440FCC336B997A1BD08E7FB34C44B98BEEED7B7958EC14FB29ED98D953151E362F47260C2CD04BE2ED2D9CD563FBF5C070669743EFF3B168AEEDE001ABE4BB9D6230E86780814713C95889D42144740EE33D521ABF3682F499A5CC231E09CB5482E3EB3226551767B1DD7A899E1C47E616DBAC4729FE1AF9001A123F6A2187999144D6CF17A6B7C986B025BFB1086B5A505088CD61275F17A3D727417F102A4AD2B1F87D79DCE910FC2CD36C575F33143D1907F8530A4A04B3010F9E7D1DF18AC0AAA3B8176C539F0B9EDFB5C0AA1E7CE9F6618E52091CD504B163786BD94349A46B9F58F44AC6276F63C4CFEC6F45665043D7CA2CAEDCD037E43D7B09A547A9B5D2E6A7F666283055A9B5FA04E6A13A8F9F547FE1FC1F809A42DBB7059443C9FB1FBE910E97AFDB841285E1CCA2E9FE974CAF499297045C85D59467FEF392EDBCE5375B7563A923ABDE3F8E93430907BE71187605B0F52178F5A31D59548DDF0BA0F3A61DEAB8101ED96D01E176FA19ADBE613ADD62F17C8D560E8CF2EF0C1C533CBA86AE8F774A4CE3307C4F8065D100712D65FB997A1BD08E7FB34C44B98BEEED7B79550B1204EBC9BB0E030A12488E2F56ABA659326B5351DF401CBC66D55A1F2EBAE37561E7648C56DF095962B8683289E6FB02EBC4B7D30D718B8A4B85677DC618243E7D9F44C8EEE6F036C847C7CA21EA07AF3261856EBF2E6F02C0D3AD6F0C466001168D584F92E641D14308B07515FA67F85B46363E9EA8E795771AD9211F42AB520AAE83ED7A60A34BCCEC6B98EBB05D77BA7CEA2F8D5C69B9DEBA71DEC1018164AB97D42603A7A0719187406FD32169DF703A4136A53466C4EF680EF3B1C3FDD80F93EFE8261CEF47DEF66072ADFA01D156AB733D6965B33EFC0774B4E70B26E68D72DA7B7270F72890003CC526930FB318C02285D8D02E0402BB2211C40B235CE955BF175FC56276D400D15CBFC7E1B2023A8C3C3EE7C781BBB33CF7A256850AC6768F0D1F5CC8BA97DB6270D4BCFC9EB2CA0629646C3E24322728B1D41E27F5BB1D5B7F00F03E1C290B2883F165419914B95BCAC91FCE2F6D67C561F0F21C700E3C74FCC167FD790ED747253F13EB63CBE5FE6AE782BBE6165BD294CFD06944FC1A4C5CC3E0DB9A8481485D8528690D9FD59E32749CB68BC1CCEE6DC672CB2D9B9380698F04661E0A278DE308BB3A62C33A68F66ED09E95D7ED37EA51212C761FF39FF07CA1074E4EF94378D6E62DFE08468FD6B20B7DB0D368210F5F48C0943E4C35E89390AF250169D3CB0F2CA00AD7E738BFC7889C83804EB7685B3453BAA356C7C13F38D35B4E4FA53E6D37A9F62C5892688B3F6DA6C72C17D442F4A0BAE48F3E792CB1B210022B0719F4A130211BBA8E2F26F6C29F352B6063A0E31942D0CB0FFFEB58844CC0BBAA24F871359ADFDC741F537AD656F04659791C4961C1C8B10A1A1AAC92F8705BE1E544EB85B0F52178F5A31D59548DDF0BA0F3A613FE694CB63C78984437C15F82DE65D85DD74B5E0F7AB512BCECEF0AFB9F587468C722F2C94DBC7631BBDE2D3C85C9AF0F38284F4C50AFEFCA3B594E2A5A106D3EA06716A8E450B953AAE90CD83DFA63C5B0F52178F5A31D59548DDF0BA0F3A61D53E381CF1442E2748DC2AC2919D3C53B6B9D234B01046454C6F53AD92A243372AF030E83B497BA576DA6767AAB2428273DDEAC46653026CB5E9C641151702AE00E8174E841C88EE28F353C2604FA7B70FC0C44D60350AFB7999DE88624185E923276034DC7796253D4560A0F841DFDB016BD3CDD13D6561CE0A69E415CD30CEBBA9106D82F166A6D3E8FAFE3B3B1F7E3A12C32DE46CDC9F3B761CB440FCC3365B0F52178F5A31D59548DDF0BA0F3A610E3543CD4840ADA8B7896603E2783D39E928D9919BB223FF7DC2EED56A9EB6A924E91523DF0B71F56337F1C61E2D9D9120D48C6CA5594F713B704535183807880DB60ED2FEA32964A78D91D26C505813512DCE47F9C39BFA579529609120E762A7DBE5ACD3E4E7547C51FC3C5D1F52D9EDEE6DF859F96B4C3DB8C6385DA0A4FD5B0F52178F5A31D59548DDF0BA0F3A615D0F434D5B36C0201402A9550A730D3DB1F9A78D34ECFC7733AAC4033A4494977105CFEF8BDAA379F7CD88457C5DCCADCD95DCF427051F37A01A4824913869054ABD7DFE15B25A944931B8A48D335677D0B184973D766720CC921BD9D3AD7DA0124542D7F69C51864391AA980B17C7927D34476364808BC45A0C842A49A7AB7B4ABD7DFE15B25A944931B8A48D335677C317E3E5A8F0A31EC1E20336EBCDF1E07A3084ABD06F2F799616BAA890461B111D5E409BE3720F51CE50674C5CE75F64648B420BD31B9B71507A1E4A2ABEB6E250FF55DB3711AE9BF962E7BA41C8739ED3F1FB96C62347341AC1807F45DEBA1960100825F3142BC9CB23C5DE6D5CC5D478E9D2491C6C1C9A414E5D6175D5FA0E5B0F52178F5A31D59548DDF0BA0F3A6126F652A1C2E8594F22872DD443DC84E84441A36CA09AD779FF85E85181DA9DE8BC50398EFDE8C90487488002BE1105690CE3EC5C6632E98CAB4ED73AFD7FAFEC3CFE1848B1019E4C80F376242A117656EE383AF12A2A70F0C38E9D2298FDF98536E3B295652F30153A37428C4C49218C9F05240782EBD0B97AF4ACF8233FF366B520AAE83ED7A60A34BCCEC6B98EBB05D77BA7CEA2F8D5C69B9DEBA71DEC101818C17CC66C403E2C1C212035EEF9901F195CDDD775E02245891B2011E38AC3B8E7F5DB7A1EEE624B145AAA974A76D2D6DACB16F00DB95E55939EB81597017B0134446856DCD03B2DAA5A26951E69B3AF3C8D6641EA16EC1CD7AB03C4BB6B4A1D3265F59DB1591ED51E61DB5A5D1A2F87553EADA174C3540E2D9540D4EC66D04A80D00F46646D66B3A859B159D6A50D4B5A19B45AA6353DD06BF85606A78093743DE1513AC19E8F612180371AC979C2FB02EBA99FF4153DE80E589AE2442695EDFB0C312C53D166EC2AE1D8CAF351C149AD49829054A899C200C92EB6BA747CD1103209767A86A7032AB168C2DFC59C784140E825A57EFD37501B2D29BB397A2F45DEEA614FDEA1436CDCBB5D2627175F50F1D9B7DBD8DAF7F63D3979C20528E6EC12D51F057B0C5DFF73450CA1F0A24DDC54DDD2F3B9E32019C0A5AFBB831FF99C0E0458E86D8F42D25B9F881D631C6370D0D3E59F522F6656170AE14F9F8E6DAAB9C88DFE07A6F61FACAC3EEA42A392210F06AA6CB0356254D374C28452C62542C211FC4BC31B47E5882266AD153BD7AB2265DB85D57320BBF6D59C3BD29AC4B744EB2E7D627D1806DD47477E332615693AFF192BDDAE8B775F702EACC0FAC789F6487FF9A4253BF23CAB5F7DA582E62A096C0BFBFAE46800601113BE6D19B2935E022CA71446B64094F75EA08B440982CF95BDED70FDB019C97A1B39208473FB42515FA65673E3FE7F491A73F8C112178F0942C96A4EA7B5E30FD87C11180977491AF3721A13D83890A3ADE53D753D8DD104A536A2E182965645EE362837DD1AE5F727EB45348AC939204DAC4A68E126E71E33E592CD0BD4EBF2D8331A4BBBBCFDF824206EC00D213B42C85ABDD8DAB8BDCCF2EBCE33CC9C8D20DB219A7D7CE3B57E9ADF82F20CBF65F1713D2D8D8413229567ADCD6406C402E09CE512D7C2EA5805BFDB335751A2DCBA8A00E57FA88356272C378DEBC61830C677BBA90B47361F0B0C25BD974685501B1A9F65F712006417C43123F4A48034654A69865091B79DDC82844A17CD1007CAECBA47AE34C3C682B02F5A766FA34248F7988CC0D24AC68D8565FD52F468A43D2EE000EE4192EA47D306588E0C36A568EA7A0752BF2AAE151EF528ABC3AC39CF9B6AE7A5B5DC017FE207C6B033BE57E3F321B1EF0173C7577A73C475CAF3D792E9C47E6533C7F6C5F0CB06C7CBB52EB31405E70231824F7FC0F9F64EA32802F114CF8A6B27DBE6C260201DAB6278A8FA05452F2FB0E60B1B527936DBC64F83D2A4DB65E5209D02A3C1EE4EC8B86E26852F0106D38933E3D862CA185771DE79AC31EB8034C0CDF9EA0163DB4EED20344B99E1DA0D47801D9849760DEC4BFEA8B771C5E102C66564BAC5534C7D1A43D47A7A17C7325BE732D70177BA8D4FC6232D0D6E5598C01BB493054E8F288D30D0FFD54E1B22EA4336D8F6599164F75B1D20CFE7E477EB5AA83E427D5407FDAA25349981AE48D2D3BE8707BD6FABDB620E9CF031B88FCB74F8A9723C70A401584D939F99F44DB4EDE558C86E827C8FF63E55376903651147E33BA5C0972A666B6CCE1B9C62DAA84252A1E9F880CE89946E9439B6D4B60972CCFD3E5624236858DFB874E3F53557A30AB3FB6EA7243B9B1EFCEC35EA4617D8B42BA54408832AED90683E4E22758A915D0EBB5223982F805F955FC68C2EAFDE2DD99E13A8D9E37B531053E980D81E3CB5E995D67F44398FA853E179D953E21036260B8D514379AB95625B447A42502E2D8AFC990314B504BD4E3413321686ADEA7FFE5864F8683291744A79D8003C961E701BA8DE060AED2DE23FA32C8475C3AEEC0014CF5ECB401463E4A47F06C5EC63309F1F57A2F1699D00B75525722E8BF451297D27AEEAB76782385F1E0A95051D543B4807D417E19AD2F332FFAA57F6727B801AF8F0487CA111FFC07C81F96F911AD1E75916CE6D37EEE631A6A2D8D585346703B261917C7DCFA178E55F45ECCEF116246AAF05E4A6F0527AE4FBCCDABE4287F73FB46B05849D920ADC00E611A7BF6CC4A65F1FB371ED68862CE0964DD44E81AB64EEADC571EBBD5225BE78DFFC5B65EC3B62BB55493AA0FB8796B0EE28D884F8C0E6B2DD2327B5F62D6615A28F8E2393FA185A982C15F679439B99E981BFD99A66CAEAC46FFDF2A665AE537BE34DCD020DC6C994E7CF310A57F807E209AC156A16318E2DF9B9E7114602CBC749CF5D0DA747B22B176DCA1546B774DC2785FE38C1B182BF5438807EA41B8E31159967D4C926F50F359569F521BBF17A42DE6E749617458AC223F5DFECD40D384CB447381F945D16D38E55F329FB9FB06AAD61D1F57B8BE021897CB9D539ABA6C5453FF323B5D8B26D47FA061DBD6098256F5669DB566717C2457AADB8BC487A085B5DCB1A87C2C25D743EF44FB174B66B6675F14C77FDB9B28FBAD23BF3B0DB0991F1FA1BB343063A9E8A961D3D4E47CB4C41F1CE18C4097BB71A4193186B76694A4C1D67825D2FD826D1D00711B21E51F147883BC33C19ED427878ADBDAC3BC7F59BB0E0056BAAD24E35D9C523587C235EF7E399CBDDA77D10F05F7F1C9FD34957EEB30DB6BA17BCC7DE0983C89B9AC539394740355437537666A77413C0A1F2E4B2257D66BBF948B6C3D88095AA3A2E1B3EE4A0834132ECF15756C5F19AD45059AFF07B43C3B307083AF349A1CD2048D52E2E74A0715ED7074FF74066CA5274FD226D29E8F9A5BE22CD317772FD0AE65CF74A6F671C5064D91FD3145A752DBDFA26C53521585345F5A31A1AFBF31AC2DB702F28FACA51FCD577FEC7397B2405400057B44C5A0512785377B081C75F12EFD67EF3739BF7C53D736E4CB13CE5D58EAB0A5D575588A32CBEB301BB516021DFF09E8D16EDC2E3CA5F7A766DE5AF412867F65786CBBACE0551E98A25A3ACC07EB1A3E2A08E337F72BCBFDC18225ACCE32AF7F266818DA10BBCE85BC042A76BCF5481DCEDBC9BD13F0986086EB0E741CBA5116401AA08336F73B5AAE77758A72601A03CD94600197726825C838B3B9F2045AD2D5342ED9380FC714B9F5FE9C45CE9393BDE2B3CC0FD3D77F16557BA60535432ADB5E8791C495B60A45EC042378DBF3992BD3E40AAA8BF66EA9ECF735EB67B1B2A5A5CA2CEDBE06068423D62D572255CFFD3D01A235DA5A5BDC2EC1449B3B9F3FF232CB09D384358DA197FFDB27ACA8D6003C2C261108823F383FE3DFD4EC0E295AAFE4DF8537EE883B3513AB6AF4C4AFD6C05A12EDA51C92B8FC466B478FC9B31A6C4E3B541C99881EB248DC13E6E8751B46D96ECE34F40EEB449014CD59074FFBFCEFF66591C52E4F6B04535C2F134B1197B99869C8030DFD15D84B7CAD57DF7EE134C91C3B6AA5454185348DA517A3BDAC735B33F0D2A7DE032373E52D5FC0AF626B882BAB7F2EF093DBC776E1822A7CE2EE6639B9A2F833DDBBB629237B29A2E935004D215C51D025042F886DBC5077A029B095214E8FC7854670B3600743D1F1B3594F047AC77048A1C1B2668B59C67AE95D567707C5EDC3EFC4866879E12EDF53D29BF1C183D84CADAE03318FA8277C5816658F6B425AF427C75B754EF9C38907C74EAF44912A9BE463A4D4E6458CDFFD8ED6763F25C3D9590622D4E793023EA06337F0AD985431463FFDEDFE446B26929B4A6530781BA584532E4C2BA14627C9F0B7CCE3150B4F5851E10D5F3FA9F6A42E03146A1A10A627DD92A2444C17D9BDE40E8ADC6BBE617BBB0996D315CF43AD16CB64B8FA24F1E07A0E4CCE6A1300EE436B8E3EF3279EFD142A75F131FA3279512C6ABC0F28D84A1B2C0EDEC6FFCFEAC19F5F6C94E2528883E4AF3EDF3A297E0235F47F18A17EAD1051800652B767C4BF0AFD56FBA6428B7217E764F435FEF41D7A3B621E20E0CF69221337BCAC379E44FE43FD00DD5CA5908A0B9FBDAE01783672E29CBBD1B7F276144DBA9B8B6129520B693808A9E7C76A68FFD111931284C77F0AB8418D55F91ACBA03F44593856C77C7F473417F250A2FEAAAC16D259EADB31D27171440407949B1F2912A6CAF58F9955F8FE99713491092B9479AE850A2EC7B7C5A130EE9B23A1AC56D2BEDF632B75D3424A01CF1FACC903C744212D93F044E22019106C0C662726C52DC92C8ADE5D9BA91B58F5439751ABC638E65D6939DD8ED65A947DF54BD35E4C3CD188B6288390B1421BCC92661703DA704AF78C05DC054176B9A115614525D84A05411C44B183FEBD7A860CDC09467F8E409134681460FD45FFF21A4EF4716D1546284BF8AC32F96899D76E391F3050D6643C1C32EE49BB4D0CE850A246D585032D58F9A677A614E98614AA53B7356C5B4044057ECEC7A8AAAC312676257C3B86498298E665E2EC2DF97BAB727273E63545EEE701E02035CD63253DACF7CBC08B27690D8F85A64E72076517832EA5D2B3939F118050D89A7B17AD464A615AD1459106D48EB3C2BEAD6D9BBEB1044FF296763CF5519C19BC5AD8A6E808B80BC0C14DE982A7100C77CBD08AA57E6ECC2363969FA0D03C0A70334E0D891EFED98A1B935D0ABC4ADAF5382F630796250C7AB6ED5C653A9DBE7770955BF3A03A473EC1224AF8ECA0ABF92FF07A7A8C4E91DF8684C96CA5FA6C528F61D1D5E3C2E74CE982B0C18C241CF6E18A049B477FA52E6BEE354F79CD6FB8EBCE876E01FFC8A72777D558CA88E2E3D376B7788F254BFA1672F8DEC36E35037FDB72E4761E0814C02F59098DA1976B4EF18C3C95DA30BB36C14CDFC9DD1C9775C0CC6A80CACB777271438829F4F6F87BEE68D48A875EAEB2207DC849A60BD036DD4A7EDCECAEEF5F06743754BD166F12DE4CAE05A669E5A5153E90A0448935E2C692C4485E78E6E5A73D764405812551089C87C36492A2E34738F895FD4D57DAF324F563B69DE5F373F4F723434B605FDC221B491621D0214FB9512BD584203C29DDA800DD08F107160F53659D8B755F2FC49F1FA8B2C47283985A5260BF622052D0B7920EF23F7776CC1E7D3118D07867C0BD20CA80A60D928EF0D64268F1DB2FEF8DB116D65F0B1EE7DB6D66608EAE6B9D573C964D0F69ED8674A4AA1C567D8EAE3EBC53DA2B7369E349F36EF7C4DD34AEA701F3C876FA314706C6ECD371B106CB1F1BE02483F9AC50CC8BCE7E39FF84510BFCF5A4DA44399E86EF902F3DDE79C67AF35F3BC3934AAF510307AD8B6CFF9FF5B63235D57F8903B98DA013C741C3428B56C046739B6CC0EFA0C03C5E4953D50D26C12E8E62E6F13C6639FA949723FDB6D56FCEF39FCE897D7102A8C43BFCCA4C258152B325D1EC0A59334089F7BD63F15C5BEB99068B240D7E5FE892F0597B4732C94A14B39C3C435A01D31AD8311E857FF8C47C576ED7BEB030A0264A67CBDE7C2211CE2B5CD736C6B656F314A70ED909ABC4E1C32E1B0A09827166B4E2E8835539C3EB777F63A9360066962637D660173C2BA9451FE2AF3F6F7FFF5AFF7EFE6F41D157776078119E375ED5D6C73711E3B9B387ECD8A06570AA6B6C0EDAB12775763250EC72AE936570950851D7EF303CA26EB17D55E55CAD97CD00109E80DB720971C9A8EFF7767CEBC81C68003F5282A8DAD68536831342E75C3A03CBBF48E22EDE3755F34F059B15F879A35F757505FBF08AD8655392B0D8E539F4C53DB9CCFE8138FC268F42AF408E3185FF07E8F61B1EAA6FA46924A16E65551913911C0C705D26658FF42227DF851A7404C3A0082BAC3F0504C8E8254EFEBF046C7508EECF2183430985F381F9A39FE531482A728683BD221182415FFA1E9AFB70D6708B511325BC21C623AC530E45E514F5F389CDC32CD0D2A65FB01E39AE339519D3848A47192D5BEC78E5881795B2C18037703D79A2EAB9BE5BB06474F23ADBDD42171E899BED9EC44ACCD96719262DC787F6C4CFDFA6284207502C12152DC25FA060E7C2BC90A55228C26DA74A94DD69E1DA78B97B7E72CE22D07EA33EB83FBA0F1BDC65AFC4559C9D7A4B826657FF22AA584BE89DEBE40E4FC69489A16BD98842F27E7CED00E5C7864673FA3383B5FD38353230AD205519AFECBB4EF009CB6EEAA912E7E8A73D6F0EA9E1AC743CA050EBA10115E5A1FFCF3F27E072F98134776A0D3F0BED9667BCABD9E68EB6BF4F46270833D34C4A875E1F17C4CA0F8B6615B2DBE9B2FCF1252E2A528BB5F5B63960AE4B7174C9CBD99ED1665E24446C93C549276A1A48C336D22208A7234FABF3B984574AD550C030D60DD8E2850915871093F6534D60B392667428BFE76AF04A4D34D7737405AD8274A514540925720C873A212F25D63F2B7A181BB6FE266D01000E527C5134994B99F630B81DEC3371E5B1771B745B0F369411EE1BB53422D753168B7F055413C08221EFB76A63CF09CD9167040A8B961065D8F9BD1BB75411CE7DBCE4671D812A603D8A9CF932BD070D966A69923CCB3203343F233AA3FDE52078B17F53ABFC22E73D515A63A3BE56616FC138ADD84D6E2E3AD1F1BE1DF698F8CF4E72B1E3C3ADEADCDA90FD9A2B6C424516AD28DEF9D96BA82B0835E0716B80AE3BF78D7F0B9DAB584C51C540342D89268C316931851EC580C7F6A2AB5BA05F98582E19DBE167B9DEAE57B78DFF7D4F6D322D8BC138DABCC44B4FC97FB514F2F4AD0E3BCC7FB6DD1C08638BBEE1C5AFB722B385CC7EAD522E5D78B9F02F21AA53079B499E70F5D450C58CC9BC4C79624DE65BD4BA8799089A7A32456DEA32393C6753EEE364F81A0196EC18EFAD4E21914A446EAF8CAD124F1E2A4EEB54F3B60B7A99D50D9414F488DA8F2F87ABFC79FBBE3F204A6D61870D46B3B2F4DF5ACFE088A6B4D3DD966F8A35954FE1EF07713D6BD849D64366F67711FFBE2217A177F6F28115E82BFEEB6F2F007083BB2B75A2D72526A9DAF638A94B714E4DF066744CE1619D977E20F1E490FDFD2E3976F650DC58D5D7B1052D31F35B95D7ABBE7DCD59B876AC99F0D162ABD467EDE78ADFFEA4D1ACE20E949641520FE75D5C1CF14EC21067A2B27DA8F989BD0ADD15047886AC273C7DAB8C1BA563346EE26009667414631E71B3564AAC840847A22DBAC0DA87A208CC81CC22D2E0032F62D62AB77E2299C2CB44DC9761067A9C083D4292907919C85F0E8EC9394497F2B9965C1455C0091D3AB8146A4D0664C5B24D0DC5F8FD23DEC1BF7D6D6203693D3C8F447B754C9CCDBE957863F534F69D4A1365A5A18648442CD5A53322EC1AF72287ABD92FD82B1510FD84017C0496C0C643D4E457C2FE492E2FE3F4D7A16389078FC93737B8A97D5046FC941EA9D291752DEF205A17A9761573F9FDFE232EDB3F60292A8AC3E23D873DC1A88C0712DEDD80265575AA92AF1AE787EEF161CE164B5B9DF9D7A2AF8AC605BDEEF0C11E4345C3823E86B63B7CE5D7A4B88A2E2346FD9FCA6FD90BC83E536F2765FE3A625CB4F147C834700044CF2DB7872EC8884F808FDCEE5D1D6748FE545E7ED3D8E473C4BC2EAFD4216BB7C5038072334B4F63526903802EDEFBB056B0FB76A768D785CC4CA29A206E32961ABFE55ABD5BB0DB605004F2B364B09EB48B68962F13512533EADC6FFC65EE25535426332F928D8C30499C51624825DCFE28DCC31BB6A68FBB22CD4F0967BA1B361C081AA1E9B73E8FCA6610445861BD3F0B37DC3BBB19A36E726D46207F3FAA4F1708049055926633A441FD9E624642E4586812986615477D6FCEFBD1EBB5D0E052918836CA5DFBF1AD147AD9AC297318F74F22E07F3157C4B7DD311A2F3F93D66E335BF5E2F78BC1BC8F4967C92467889D76226F5E92A6177906E7D6ECA48692AA3CD5358970E54719886BCC1C394601E8D4F439E3B8C01EC73AE2DDC576DFB57C5F5BE1A5C52257461E9F17056878B49DD4723F16FB3A9F8624E5F5A4DDAF0847E41F815A8817CBB42D606BE9A184B4059D77EE30C64DFF6A8F27A7FD2E878B70D9BA63C5398BDAFA5A3B1FC2BCBA6EF9051E12936C7B3647B2E1C48FEBF6A7CA1287472F0F4F5A274D0266B275943DD48E1FBBFB41A967DB119C1DBB9B99BB1D93B2BF55CCCF83FD17B8DBA7D1BEFF995D67ABABD7FF4B51477E651FD8E1EE7E650C6E160E8E3184F9AFA3CD2B7D293D25D831C6518F40B264849C74226EA8048C79F786379BFBF1BF97384FE6DD2324924DE2678FE5A4036F45E0B813FDAF968A523817F921AF4C94B6611C04E41BE91ACDE367FEF119742B0322AC0516A1C270E2D7831FED91776F1904C81877B74D93BFA6051F1FAD2C303A37A1B4611FDC1E57F96075B37AE6A5295BE842161115052BFECC8E9B69266455C914994822423BAD5791EDDDF4C81C05FC7458AFE17C4F6B5FC9E9A7659500F582593A34525D56D5C3966EDF25BEB2A4B0E54440643705C02E6B96381E4A21E8DD797443A5F4BCE60D31191FC6372921C2C6815562B8E7B81AE1A827A1AE2FFFC6BA7CB9F61399A91F37101C1DB157FBAEF6F20A569C2BE79608D2E426DF0929E4B9ABC8019BAA5F276B83FE05F923D3CDD9B45B229151B20E5FC011A6254B8DCA42CED3198C4B453D1C43B386106F40007C05047DC1884719D07BD9729ABE87B0B847D95845AA31AD177124EBAD08E5A935801862A7413F1241C7FCB5C24E3D204A6B982E6D86198552597C9E35CAD46CD668AA4087CDE901C6DEB630E92FBA1DBF06B5415AA776BE410400FEF562D86267ECEE07106981614EE78FDD3342E1003DB418546FA84AA682A2BCF2001B3F4D5D94707A4B4600141BFDDBE6BA9D704F331EDBE9BE3486BC5C3FDF94BEE51099989F10F08115E29E6DC8C2C6F9C06278CF8550B8E0AD0BA79BB6ADBF3BF11A883E41B54BD588298F9EE03ACE70CA38E9FAD11A403D143A34534F266CED15D32C85509D5394689D715A66305A26231E2860157B479B36AC47138EA96A75ADBDB01D115B820B310DD013B81C0CB7E2553CD2694DEC474DB5A468C260E5C21A9C2311414354F5810E6E34867D9129787E4C64AED7EC64CC556D16CA6C96C2B4264C5ED6ADE8461AF305F40793978DA2F99178EF33D7D7599423E1161D0F0959A6B5CE7248462D9A16E15C6CA67CFA9DE9D977D8FF9B24C52F991077E34DEC41767D6FE22A5B5D9DDC0DD2CAF294FB3CCE958652B6250E2A8EE1319158B38B21252B467DD5522E2D7E68F9EB94169794DD7C514A29CEEE2FF507937F62EE8FB90BCA1B911D1BA06EA1C8A1AAF598C0C81388E4FD0D2310F4AB98C56987B620F97853B02AEDC3F2CF3081D2674862D754F96D0E1FAD2796C3310D84AB76D512403BFDE5C8141C5660E2FF42D2E89DD99D3C364017C031B917694122792D91443DA5C556C2D927C53664D63B17C8EC8C63D8B45CA3D74D0B7CD9B57D7DBC591D86F001DE976764410EEBB57151C31887490DDA396B81C49B5203FA8BE424B36770A361648DE5610D24AD85FF0E8BFA76A48BDADA9D99ED220EB1F190D56A41DB7CA1684C55F9FDED8F2FD672998571954B9ED81DB3C8CD5E71DAFF453E87EBA89F3BAD615505592B4C2EAFBD5D912DD8FBFEAD94F200805064160A34111AA2C43FBE66E973D27D5CC3E0F2035EAEF6B186AC52A2512CAF788071FDEF03E348B42EBEC6263896928E498280F58B99083CA3B10A19DCD283EC94D74EA3FC2CD37AB5A4983914ECD4DDC2DC80AB8FA6A95C945A7CCE4885367939085C9E97965B160635723C2A6EBD15852CCB84763BFE22E0D87202024A824BEE0E9E164FAA0D0F473324B2597486B9E27C010C90C5D113163B0A9CF2B29C909CE0951850424BE2DD4CD21B502536C462A55ABB4A3153D0A86B7232B8CA0DA55443F1DF4BC9240F80DD34789176421AE067E556346296FCCFE47DDA106BDE6E469C9B7B88285B4376EBE4BD777C93DC16858B8C1AE51D9BB8C8603D66570B7F63885FE41A03FD0C14B908A83F8A463CB38D3E02468966F1D62A9AA76063F627E72659C0593F76212BA283BF65B84A100943B08AE7AC6BB1A718EA2D17DBE0C2C387FC43ECF7C60BABAE526EF7BAF7C3AF1DA32909AF9E575359219A96FDA6533462689C2D177D4A9C2BCBB23603387D55C70333098C529FF92ECF72E525CF43E24FDFDBD1E909EF188DF48906B2145472AF71B461FB2A7132D5CF6FAD6E109FB1A7A48F966B0CAEB6242351F6367AA96AA4C71F50DF33FAB9669CED4FC01AC733E16B46F6FA303183784F8AA9C61E679C7EC09CCC29A5BFBCB671630E14DC60D467F0C05EDD74D307FBA09CFE3B2114E9263F50DE50309BA45156D428A72B7F49DC4168CBF72D41686D6A3F4943917F46787B879071E6C00BF2160E44EC5505A9DE52862786F7B80C2553200013F3211C3D936D675566AD37148AB96B62CFB40EB928D4385CAFDA3AE87183539DCC366697ED0F04C2FEEE86BDA8D256935CA0DDE2E30D26C91FA92216928B1E2896FF29D8EADE611DD5F21EEA0D6B6F7A57DCCBE56C51A74F61E8FD242917EADD4149290E9ADA2361845C4BCD4814D0245BE4CC17B84F4D6C70ED07C2C579D08B782B6D0D68BF460D3214E320FCF4777F5B21DECDBC2FAF9E0F5087F7A683BED41273C21561F4C2D1D7C7D2053D168899B94EA83AD51BD706956B1D6685BC6317C32C26960980B9FFF3D2131F691D7A70113C23F82F61A4BA74F06068DD609C0D64E38DB0D279693E8131ACCD8F1F185C4EB988067DCB4AB4755030FB552A25E294EA9EDFC2EB29662AADC5172231EFA9F928022023582AADB16A57BB182806D6190997217B1120F1F0425BAB2273C4EE65B666283055A9B5FA04E6A13A8F9F547FEE7DE8ADD1A3BDFB07E9B4C8A71F786DE7CCB74B39FD5F31AD5733F0281B448EF7F8B6F643176623C532348D0923DE10C23C3D9C05BC6D40F3A25A6D0B10456D2E93677C783E525BC5E4D4E72A041A02A65E9A5F32FFB69B9CF3EBE13CF4A0CE9BF05C0BB49675172843C61905D28AE89ADBD2AB587BA15695AB7011B230FE0A5A33DA46A3DE53F838C0D9F98283978A2066A350788D5DF3592E92D87FCBC9799C439E32FE0F467B0C49E8B06661805D117908BE3A2502958E3CF4F31DB1EEA12F93CD0303E9B69479986EC54309FC84831DCF9F71850796E6F02D733E52000DB469D00D8F3C9C77B37BD9626693683D97B4E4D21213EFB93A4C48305063B03C574C76E79AE443CCAE87961970E6FF9AB389C54FC8A3016A273237BC5D45720B7D82651F8A6148A28BB931FFE32D3CFE9FD0C95E1CEB614820857BA3AEA8693CC976AA7AFCDDA684DDFC6C1FD08165159A3A54D1E6C784CE7B1D8EA359F2175EB9AF696EDEE12172448CF3248566FC65731B335F97F81032BB658BC486D9B7D598025E8B45F5C70D00DB2D66465C54D1A16A5C49560622C851308526C0EFDC116205C39C6310B0912C5E179AB6DDDA6721D33F11218C5AC587D038336DDA3CC8325C8E0912AAE814AC734AADD65964A0BABF81F7E98ABAEA8DFF2D080490668C123A5F92425252D9E7FDFFAA91B86A9B6700999DF83469793E5A3955C16555B7FB133E7F6982BD53FD7FB293FC5AF3F89F92317705480A6C8F881FED1CD1FE1622DA6097F302AE13D95D3352461A7BDFCEF892EAEA58D7768C99D675871ADA78A46BB558B34BC7442ADF5E72878F7F39B124FE510167EBD74E95FF1BA1AFC4E71CD98B96987AB1318B1FB5551ED295D6614287156BFD3E153E01688DAB135CE6370064664B8265E604020CE973DB77D2AC4462237371A0893D8A7A3D188A2F226B57E6411B4720474986A7A60F01AE0BBBCCE9BAD9DF6B0580F211AB3919247589A14D4BBF245F5D84D8145B20C31B030C491B8814007DA2ADD59E84FF5FFE027E54A683C509C8A9A5F8B3527D2AD6A5EDAAE349041A369AFCB7DE463A668C8F6D4CCCE7D09770E39E61959B6C21F543B416BF354B802D432F364CD40340BB14B4EEC95F0930D156BB99A47C2F5838FC871387051BD93B1973E375A84090A0279BEB6B476F26C47DE1171A3AE91E77039BFD9BA1EFD79CE655DB6A6ADA3465131D28523C10B0B345E982096EAE1B390587EFBEC4735C5D6B28DD12B45824B13EB2A26D4BCF134A594E46C3E899D94312554DD97D87BAA1D89B7492798FFB9234D2C92BE548C82FABD61F381EB69B97C5C7B1CFB9CD4BDF9B15B6186D4C6C71A53C7AE533F0425773138C8617CA9A49399F33F4C799E2797FFAF07A1710ABA2ED3ADDD848218825634D3FD38DD2F68B6BB3A1F3BDC6312FB890FB3033D028E6621013F7A0E53FD5B21A62D99D39AD3386BC8AD9E4A97D8A7CC6E3E735506ABA84705AAB1E668A63CE3D330E4AE4583926EF3ECC5B9C02DBD11E3948051D7B35E7D0B29DA21655D336D7A24D5E8BD81C12C927B43653AEF54F6C21EC6015D2C440E5175AD2B44F3CD493B853D91790C8887E50175B2D15169D34FED5BD5249F6F4975FF87488126DB51BD212A404373C7959715947E365C911DAE00F81FDE7498C7AA27BEE03B89725E9B9F57AACC33F575E1B6ABC470AE9F089BA2622A0D9D33311D55AEA0BBE4783E95DD5633F2DF8B1A8A8AA5B85A736F51635830A6C72D66FA2D9A7EDEA0E0B114A2E5085025198D3C09E7DD414CC63EB742E7F79A716CF1E86CAE5C7174778343EC56A5B96D9CDD32E2A5F0B072D799B77008C1FE51C06848ABFEFB3ECD360AA6B00F4C16261F1BC713EB0EEF6173E3090FDBE444A2414B259BB93B16163258C1C5905181B09C7229C65080E4E1C54C94E208CF5A96DF2FFB1ADCDD95A76C83DE4CA2CEB066FF2677A46C3FD70DB72C4ED1F8AF78A58AE0DCB7F5BC46B8CDF1C279B7894D4548ACBBA6367B190B9B1ED65048790A8B81A1C18E3D6E16D9BA6A8B435DD6C523034E72F410B5DC600A82AF2A6F9D51FE23A7912D3221D320CD6E557A9B195AFD8AD81ABA2012F3E3BBEB6FC5C2871E53DBD8DCD708092E1BF7C1F85D4A6C759B3F85BD6854EEBB03865AC1A6C5D659E34078BA0FD85FF71BD2F40059B955FFE075B69D875CED443C8A0E16A1D3ED8C21684A2A7BA78A99F00CF3CD1A9362AC16C6B6D8D5489ECD4D0EF02B645901C9A7B93B43D28523C10B0B345E982096EAE1B390587EFBEC4735C5D6B28DD12B45824B13EB2A26D4BCF134A594E46C3E899D94312581488CA1CDECE76006A0DA2BE63059BA0C98D76B2DD92957C6F6C780C25A3DCAEE4E78A5C7F53F79D92329D76D6BAFEEA4579FB9D4E57DE35D4A84CD50C982AF89CBD30512E4C04E9587BB6F8FFCD78D290FDCFFF1F1F7C11E0476175A5200CA59E75EDB8DDAB8D47E372995D6E1AF200648BA22E2D995C79D9FB32FBB0EA94FA66CA231EAA20106C625B77798256EC470F98A78773760038ED39AB71B19D5DB3EFD3B77E206A5B95C4E9CD12C5D5F696B7FC7CFACAF4495982232F8F94B2969F0A774B67FE1CCB5BE470D7C156D0350318FBAAD273FE5AC8DE1AA20F43438B6A3B408DF01072694CEF830025623E304AF3B62E1C48120E144407E7221035D32F7BFD5E3508455538DA1D12E0EB2344BD5DAC76110ED53961A65AD381BC365EFC785EEF542B91B40C685DE0A0580AA9A7394FE39D1DA3D0CFB207875F4408E851EE361BEBD533627DDF4657B10FCD25737B608E27B0C2D70924E596AAFA5596C2165C1CF2CF536A2C071CDFFF3A1F44CE51861294690272B9D7829A99A9C3C918AE2BA194EC567F088AF2948A2DC2A3EEFB95D3B2D7EECFE96C14087A55A3C21234D35F7606016CA79CD65A767E42646C31D91786A3F6A6073DA31393C64529453B930010D0731087F99DA4228D626D2789E371A9812F12397F35A9BD01759AA533DDC1198E07FC8FB00DF6CD9D7AFA85086FDC9515CA5CE5C1FF2411585C15CA3B03C4E7EA3B3276EC6768DA77F460E5489265C3C023DA7B3C992FE08F90CA38C4F6C058B09BFC3EBAD4689D0BB5FC5EF395BD8204C8447D3B993A137B0A05E9800F97CC7AA290D4D519EF8D7221B7D44850714142BFCFBC2EA44D35E942524C981763076086D3C457745B5F4A73D6740B8F7AA92CCB5A5809DC411B50FF0E7E3DA8775BEC7CD683F4FCEB2300D09265E5387E67EC193B8D4DCB33C5A0F89575B9E54DDC49845A38F4BCE0125EF1AF735C38448C9C4FAB3D92F80137094A7B0F92BE205C6BBBC9816E1E9BB1E6B500AA377A91EE3FAE7CD4ADBE13AEAC7101F65AB03920B471C451904C8B6BFE41FD5EF395BD8204C8447D3B993A137B0A05E9800F97CC7AA290D4D519EF8D7221B7D46A0B1C2B89D0CC160D61784E98A2C1AC981763076086D3C457745B5F4A73D67185327668E388C1CFA1F5E9B5605FF3A4555E75EBC3ACC2034F97F17D7972692D5DAEDB47CD4E91B3E34E055CEED26A6633D0F0A1CA9D3081B65AED250C648128B299FD97AFED5087B52DC541C38D5556713333168845DEC8BA4B19DA49857904FCE7E3776D73CFBAE75F584289BBEA2179B9F21B46D1088AE2E36E2C7AF474BE103B591DB11D01EDD54B71527C661A7084AA9098E7F9134D256791F9FC5F649C8CAA30A2A640D63975FE3031F6092666D05981C85415ADF569AF793F147AD7DD2C54EC1245BCC2BF127D2BB95B1694FBCEC3FEE1CFF277FA034FB3398ECA4329447E00D6286DA0645CE08319CF8C83C595BEBD034FAF7B37C04CEC3DDB8BD74EB3ABCD78425C0518B004D1B650DE65E64AC1315B983A64F6EF560CB48A49286DAE9BFA28FC8BB1C84DB12A6D1B0188DF6CEF0AA558731D53BF82607C82014747EDAE6DF11D6AD59037FE7F2C9718BC9CB5DB73555086A93EB9CD5DBF867090AC107966DBB61BECA17184A4E8D0191AC4A665AD1FF7413A4C07D72A0E28712A86A7AD3DE6E3EA5CD42D6200CEC38E3D92D1C6B6C101B620BE98DBD64685E7337771974746EBC25CF6F0BC2B447689D6C25E140425A7CFC81C29B6864EFC0FCA8A228393446DB215F975917118BB850BF09F5B69F6EF0AA475A5AF36D29415DA0CA7DDABC9DD77532CD72ED31436CD3A25B6CBEBF886E75BB545313772BB84D969E740331149AF9DD0CD2178A97C1EA7B49F9ED3423BF220E2E232F5A95495C9D135F399F6F35A1EDA6E2A187FF427B92D650B0517C90D8BD0E8D2B1C9C27AD2156917CD7A6CEE705742BC44142B8553BC7F59E5C8D0365EBB8BFAFF6B9486DFEBB6DFEE586C14CD04DC913110CAA15BF8FC1B21098AAF5A52BD10BAB0BFA34564BAD68B5569BBE811907895657042DE014C02F79A07C93440C2D1A0BEF048FB5D470F858E79F3115CAA7E4C9F59E7D7486BFB1BF8EF2EF264F9BE77FCC8F41F5B803C2A70B80E6A7565F9D3B1123137BF6A27E8FED2D5EA5DD86EDC8CED518571E00B679A0F5909CC12A88D8F16D5C10623B572ADB922D7665D1868E309E747CB1A9F948439352ACB73262D29FD03FBDDB9B287F83B1BD9BD2E63BB180887BEFE255BD185D4488F4643AE682F5DE1B518E018AEF407D1AE64F03F91127F1CB92381B3B02A511C5853A9AAAD2DCB59B1BCEF314E1AF5719B5F28789AB75A4DD67512D446F4205D121903FCC086EC0A2C4BCF650C9A52C3A95F21E43415D231FB0B3693B1DCCC34B85B83C7AC395429AD6F752D9919CE9BE8164B5659A6F9D6E56F5437A2E93AD7223D9FDE9AB90855E8CCC0EE28C1F2107B295FFED3A96D35D1D8B7F2433EF91F62E7F585B9ED1D60AEC14941D21723E7EDFDDB46F923E9DAA08061357F371498C531E0562104CF007C68A770A51B6FC61DBAA3CD81F1FC7F99E579FCB6DE1862E72C4AA12FAFF71B3AB248D2B1FE10325FD4AA8B63BB537B08CFB70CE8E350B10535ECDD41DFB2557014AB0FDF8555131E27F73C6E0FAF3A5BAA1743B65B8F48CB063AD55C78BFA843A105360C9723693E8879A7C52AFF19F6E6925FC33BE1FD55A067E69998D396C89E151172B9BB13A88A4452090EC222483E969C2DA200B207F307B375532EECBAEF7E95C62BD28FAA5AD0B52643586F46E0CE72F17BD318768490FB55C3054AF111485C375895D6E7986347BC95DABF00A18470374F646FDBB46E0F1E3C1B4500B41CB7AEA5A2CF3DD5D24F613C341922A741D0041D647BEC77DE5A2C9DCDF8521D9171123737621FBDC7FE810F1E2FFDD7223A07F61977D3424667435361FA15A6FCD0B7B6F7D140A977D7268D77D3E8D8D2A55D0F10739ABD4851B0637A350550F6B893627D592BCA6796010586753DBF9FE729B8D67CC769961AC127216DEF591DAD59764050F5DB6B55E151DF2B7D748D7F27677FDA8782659D536CCBD790C700B143066A932E5F6CC30D027077B7501A2B3C5D77AE79B9D78E685266295F5E106C0EE76ADEA857B04B5DD6EE37897540A34FF40A9BE08FD4523576155D02484BC8E08717A6C14C6EEFDF01B9587805B92E44F99363BAB198549
\ No newline at end of file
+EFE643AF98362E004A0B709FC1212F80BAB72360DC142D08F4004331133594E20668B50E06A5B790C162021C4BA45A5150DDD680E8AA307A3BCAE59F8EDAE2F3F3BE296208BF7BABEAEAEDE0CE8792AFBE8A31AD3BAA5F06C5F6EF7962292BEBEF612077D2C54BF73609030AFA17C3DF7D78119051188791EBB4D79F2FD9488E81061B730D1F58F0054A00880AE7604B8CA1145F2690D2F3EAA18F933258BC3923C608BD8C16DFA2992BD82C9FDE1628C94D31A8B3D3F98CD71665FCB0AE232FEB47447B8ABE33344078508644FD8BDBCC177176D506F77609B94A8AA1558BF53F365DFA4234C7DEA81A08D9A578058B28D2ECED0A902CC0666D001BBA6E441A56A5A430E0F2EFFED4515B1EC7032739BAA30F57868E734BF72594331E00EAD996AA23D50A59A2D4151B4B041E9400D595CAEE695F68298535F14B29271C1C54CC26B74DFB34B311B3620001A4BB13D3773F250616F48D2548F5C24222BB073C50336CB9A87481CE86B59D3377E99B2306459D775DD67DA3EE957C3740B6F777D198B88A27CE86CB795FD742350A7F39F5FE058B3A382D1B8FE121EF236415EFFDEB739B19A6EF285262C1F0C845C9A7B1FADABA3E2E87AE3175A1C610FFDCAA148B32D726D741F7DBB8AC0D0E4D8BCDA02F6F44F1A2171999237D22EBD42977D2C4CF4E1C8069E7E7056B7A9157AEFBE82B4DE2655C6E75C8BB68A9AE2AA2F97E66B30B14F9C79C3D192AD03376859365CDD172CF03EECD2D99AA720EB15EA176F757009C01525768919D35D71FBC6F807BEC94482214C91FC07F2AA22F31C56C750A0F88DE5C67A312BEFF4DD509798ED7E030492A4EC1ADA3052442845FE367871E2D52B4595016F1F8375788BF6C3816DFC8567C5B8106CCB8DED71D8C2E216FD5B2E9E4C74CC1E835239156FE6A580B57B8C279556345B70A0683BD6CF046039D1D5F3D98383B3DDFDB43DC1394ADF3C401FA87D11AA011DB68CA3C6FEC41538D807C94D7CE8EDA12A5C734543227D9522683C155B54ACE43FB50B2A7559E4783F5F5F796504B389210B8A304B7F615522AC2A27EC188F5569B0FCB2AE006B22B1DD0FD8FA24FE43F24B62371F795752D026CC5CBE80133BA8DD60B2585ED3CC823C34568EFB7C669117FE8520B21FE4B66640EB747BAB87AD132DBCCAA1142E82CEAABD687A457E800D2DE96D43047C165B71DEF5FEC951EE192414667E370585895303C3606EBA44F97315F2EB2B3B95A0235060BE892C0B3FD7EAEFFB3A9E04568162B0ACC8BCBE37B201CD3CE326745FFB4668943C2CEF294512381BD15565F799477B0CF15BFE9A60630006705661079639C81CF5A0F6966831DC548D5EA19282A980BCE863F35720BA54104F7D0CBD8D7909C06DFBA397021DC816DC1AE686E5736B88F0B6D690B95E538F0383F8E85E2B1F8B47C569E751F5F597136AB1364DCD069722037D084688E54325B3D4D54C52A8B7286A581B72644F2B549974DDA1FB0439DE1C52427F6B1CA847BB206C761A2F3A3CE20847DB98F74F49FDA0FDBE907F54E60D5081148609905E4B2E09EF4350FA0362AF990D14AE43D2CBA05AC537DAE102498B52B4F0ED2FA0F43CCDA991BD4BA62BF1DBD7F460B39DC225BCEED3203BCCCD276F037C15B39408E07A7A37302F266DD3CBA633CD602828E512B0C5DA5ACC5209048FB92AEE387DF95C3C6F05242DB2227129AA235D569360A31E2BAC02865DEE3960400830C56AEBC052CE37C76D5824A84EAC91081D5ECE718839E4066AF477750308FF8E8B783A035AD99EE7F2EFF0753B9555DC13127AA3298373DCC394164176BB991E9FDDB7602058E53AF995C7CAD3D2EAA1B80FAF63FC240735B0CA6B9BC4ACB3C40A37A3F3CDAC9E3B1381ED9F21F7CE334D87887A0BDECD8F1F231830CB580E5DC301B03018D899514B93787BE604D7B9B5B41E13EF492A8886C50B01791154071DC11252127EED15348AF2AC9A3A1C66CBAFA68E709A2E0B1F32B2DAA5D21E7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291D1BF086753B46B24865EB05E5C5AFD7498F949E92413D905EF9564FB09373391AA0475E2BA9AD6CAD5F316CA79096C59660B2941DBCA200F25E344DCF2B71298766892EAB62E3E72B47778FA80334D4093C2E5BE133B9C13E1754C16C3C31EA17AC5B1E9D6A82A84CE7537F2C16870AD6DB7EF435BD027D255F04F074283E759DA2452CBE19E99BADF3A0D6D50E32F36A61B05DA1C8DA466B39282E142E69A00B871C872FAD02993D2468CBDD3AC7FF7283996C8AB9FE864DD783D3529AD101AA7FB8A4178CCE6861C980508A847FBE06051F7852187CA86C14373BBCA898A8E937453884F5DB723646B9152689B4E2E18164B5B793DC6F15B3FD4191B1462E9FC9B19759D534CB09F6F125C4E33CE208C94E43AE4FC4D051CE15EE294B52F5028266CE310FD83F504DA7C0ECE14FC8D1E3E4A89C6A7D638FB4D68354A92546B5C7C4636C0D635A520FAD72C8AA97BC1EBA2895FCBB3FCDEB62246A3D9F386928F97EBDE09A8743B4505492FF3E90ABAB32654959880E4A291F010B2DBF6EBA8E64952DB68AFED3774D563F9925D368F6EE0F94EE3337EF9EF80931AEE947C115718A1148111D2E69CFBB9518FF48368698C089AE59BFD38F9B69F4492B81FFAD9BCE4FAF291E08AFD68C828E30F692E613BEC38EF52F0B4E855DE72DC964B0D49D3414B3B67092AE1E8A862BE39B890F427833BA4ED53D42C1EFDC329CB3062BA3EDFD921240D304BA96D3348DF612CDD24AF7E4A85972CD448AD0A44B00814B9578DA2EC0BE52D0F8305EBA9DCF2486186F0F930E10A2976A942DE435344893548872117EF5215673695784460B9942C9549B6833E7630FD5B8ECDD8C15F0D8EB42664BFD471A00BD2C73B50119ABB0E2B3C9997BE136AD5495D18933B802F5D9CC21A9D02081A622524D1AF44AD3C36FF281F317A16683D35320769632AE5D7BE73D9CE8E2D4A04677D521C0C3BEB2DEBDDEF1500A91DA3BF261B8F3E450691E602BB4EE704E2B16BBABCCD35E06131E894A53C41DFBCC4A46434F616A109DC664FED07E6FE8FA0C6FF0B7A11DE2AB65446633DE634B9588073C905809BAD32DF3676866F23F6CB9DE77A83E8FCA52F012E56A7764FE69A0A84ACBE85F549FBBC4E8DA632FB7E70C2035C772ABD5296AB4C872DE25843CF93EF8A502938480C323822EEADDAEE431DF3711F7043AD4DDBB4704D243B6DFCD7EB629267AA43894A11085F07645EB03A32B61FE29527CD222994A21BE8F108F7672E220EC3BDE02F7FCB0A65591941489CD7727B981A9F46637789CC40EDB0608DAC79947DEAFBE2CE39EAC9A9C0D4895C0FF0E5E7588125C03B9CC6741950FFB209CC38024489C4CB41A52A2551F649D742D781270544ECF2171DF580F62E3085FA1C8AAF44EB05C4BED224BDC08E52B8E699CAE7B5902F7FCB0A65591941489CD7727B981A9D81E01481AA205D1287903F849507EFA77D0B39D1C198B0838604DE94148E3EE9CF098D5AAFF3A4270CF5E4251AE2C324D3C39E648D55ED4C77139E5BEDA260CD6BC67D1048DE879B19DCF56E4363973402A6B18DA8CC744AA90A843767BC4359BBC152EDF0D61406BC69F8B63B934FA08AF925BAD881B25B104B8CA928C154513A1E59DF691CB46F76FB75CB277F3CCBCD85F97B44B97DA63B68DED02A86F7602F7FCB0A65591941489CD7727B981A96252FA784009C02A59C68ECBBEE349E20A96B9E399049DB5F2A4DF8B498EAB0657AD7C2D2C0FFCDD5FF44B93C94DA8277AE570EF93EF0BAE0B417B89A2D5ED8DE9ADDAADF40D3E576D532B4D3267B5FE02F7FCB0A65591941489CD7727B981A98CC207739970C8F2937B4A07FC77ACA384F054A17C2A6BCD0418379393223D743C06564982B14D753CCB7829F134E6F09557B191B95F66E76426762CBEE31889FEF3E74932D04119DA3EC992D336C36502F7FCB0A65591941489CD7727B981A9FA91688618D3A422FACE6FC0018B3DF108AF925BAD881B25B104B8CA928C154520576A4A462BA3A96C90BCCB76ED3A560C8A762C9188D02E07C5E9AB26C6364D02F7FCB0A65591941489CD7727B981A942D4B8309F970B5496F9B3C2864F6E3CD68BC9C6EF87278FB4BE5016989260D002F7FCB0A65591941489CD7727B981A96DE46850C2E498000B9AF897171AB98902F7FCB0A65591941489CD7727B981A9B44EA8F4AC8C08E6A854AAE0FDD94D980D76D0C12A318268690089B241AECA731F51D75BAA8EDBD39EF13D490C2C257C18236FFED80489848B2BEEA20111F24102F7FCB0A65591941489CD7727B981A9FD99A4410D814A6DD9761FFD09D55DAF8129619707A564D8947C1293221E826E4D2BC8C70583C5E744C74D0FB141AAC502F7FCB0A65591941489CD7727B981A9F691A50DF3653EEB0987909E1E355858FD055BCB1D3D5DFBF739AF033715740CEDB7B27D96D6FAB084CC5A592F5D345A02F7FCB0A65591941489CD7727B981A94E237E414F7DDD7D613C1F731458453CC83250B907675C7C8257D07CC03DCAEF1B263AA437DBE5C2B9E8490CD26F3C2FD277625A9B58528E9D31E7921B0B443536574806CFEC4EA6090F072E480AC37381A75E6954C0171573D728FFD4370AA6D642848B685185EC81127A19F4664AF570E43631628876CDBA595103A7FAD5BCD6BC67D1048DE879B19DCF56E43639738A1B8C7453FC349723B7BA45A241F5BADC4C71D1CDF742B73545888CDDE215B4B89F905EEB0BBDA8B4C4FF093A132C42AB967CD8487A1F3DCEB8F530E3BC735894A11085F07645EB03A32B61FE29527C90ABA4377743B0F3FA6B76B5BCCAA102899D4B0352F1DEE1FACB4DC4F2E62952E863996D5DF73058CF3CF153708A99271DB3B6B3467639B93051FA0A53D82355F256C402AFFEF6C3A2C807CE4A3975D5FCB522AA2323C3CEFF53D8F63E92F7169D4932D319D430247BE60465D34A53F27C276B9A5F12A4121791F16F3369FAA0DB08DD4F8E8C27A3EA3CF7C6310EED53DEDB4D0ED7E211FBBBC602054E2701211BD15565F799477B0CF15BFE9A6063006B2C2CF5AB7F8B43666153A8A16EFB52B045BFBD7EAB60B9AB0C518140E3C2AAA6F35613C6D8F3BAFBBABAE48EFBDE5D299BFAE30FD8DB6EA8DBE1117195673A057B467F1A80F6C2CC818324FECFE8ED21B93FF1DC1DBC1D457779EA74E50EF14E6D1A3F30DB024233330AB14B2D061FB02C848E91CC16E5D887850ABCF458B2EA4325ADF366592A8A67410392F4F256D179FFA511FD1C44FAD45611C5D573EC2C4E1AD9D9EF734A89D91D64860DAE91D5161E440E4E7212B69C621E6B24F46499B5511134793476AA5DF9C1E5D5461422692AD80A82565452591AFED50F5513CC67B0C106F8D24F45C46F751F5C9E878A158E4B50B86495F2CF37D80C726BC46D10A41408E34868F8CE0F7852C6A50C5F79DD02A76EE733D478FE4C91B5B0EB1876E1E58C4F8597C421D5BE7FC859D13B849398FDF4A45F9DA57DFB698ABDED94A11085F07645EB03A32B61FE29527C9E4AE53B099CB8513CB5F2E9D5DF254E02F7FCB0A65591941489CD7727B981A9D5DB5F056BF83545055AC63A2E9564661876E1E58C4F8597C421D5BE7FC859D186117924E6E576EB0C4704CBA69E6E3952AC346432C704FE09A657BFBC896CCC02F7FCB0A65591941489CD7727B981A9BC677745E2182B983D9D63DB0C08DB778BEB4DBAA246D99247108D9FA08154ACC14502F8A717D3A09F24E3AB1383CE0E50D6C3C414568EE3FC2902DD64E654FB0A49F2C7A668C8445947C917A3271D633BA68F7C47EFD7A2C079A992264A504D249657EB6706E569D6702616961217CB669E97C474E6BAE9AA66A6114EDDF7CC4CB0ACB61CF24AB11AF0940E03D210A32226CEFE79AA6831C46A0C5B8710326B23D9711328161C20B46E9299A8919063A82D5ACE11E3B94FCEBD37480870FFEE9FE0482B2506DA714EC6D18AED572D3D85A1262D45D1A93B7464C5EB833B6FEBC8653C56085C3B9F12FEE612188FB8BA6559A5749F531BD56EEB34F9F12E6440EF844E42553AE6590C6ACCD31D2F840F56565D69B2FB38A43D3505DDED4B49477F53024252E555EA80ECB52381AB5869D6400DACB4778E1D9F306F542601AE68285EA143512C9F84D51DA724D7D4E44D30BAD85D73FDB52E0225A942788E393A77955519B971B0E52939A55A6EAAA7440BC24EDDEF1A50ED8DEC7BFA5C7C0F63C336423B75D125BE0363318B8B433B3624EA3AA0D06A78282C7F4199D45A41147A778CB2B4DB69A9D7052CEE172F17435BA495D8DA92E29776B11C80D8437B993C0558CECAC7FA1ECC861913757886D20420C3E9EA2EC7B5DC78FD036C61BC9860EB91492799F32AFC13CE89F4701C444B0D53E212F2B9A3AB1789DF8120CC1B00BC89BBE3FB70554914D1029A51A47B896936AC1DA446756B502F2E6B9CF2175F1531600B24D5106E8A29A3EBB7D4D4737EC1FF30AEBCB175570B5F59F8AE55A74259944F350A37E4B6153B4A1C24C7EBB93EE80FD5E24A08801F5BD981A5AB34B3CC236F59EFA5A8F5263A440E52F919D7851B0C81C09DF6232D731774FAA90D0A9379536DE15C568A8D5D304C529CA886FD8841BBCA1DDBA389F1DA9D7B098A5DD1DD34E4B65D550BEEDD00CA0B7D9D55F41768F0130E8A3BC03914F9BCF5FA6BCFAC72EFD777F56F812D30FBC8B576DF5729B028426EF39A7D9595393AB794F3080ABBE44F197BC6AC77542D4FF7E82C5F3DD0936266DA4BFD82E3A0F54B9FDC2C3E73D1DF7796527DACA91366B2299427CE395BD8FE561B3C37C321318C2C4E1AD9D9EF734A89D91D64860DAE91D5161E440E4E7212B69C621E6B24F464A8873832843774C6DDBB76147C010E017E5EE54257287CAB02086170A792205A277E2A18F9C2A7E37A3FE01722BAF063981B1986594FC52D86E778B53FF61206E04487125BE2900FED0C8044B40B69E7AFA1D07194123D66D2225C2B975DE8BF09A6849FAAE7DDE1440139C20801C391F49906ED4504FBDC80CC3BA5FFDB4CFAED5C688BD7697ECD7417FB5791F3608DBFB465606A80AF120377ECB30E8B5CFF31B8CA83B73FCA2716590305314429A79B53AAED5DA007C7B3D96BF99A296CFA05B5B4661DF78B131A4BBA57B64ADDF2BF30FB867541D12B91BE54A25AA27E47FD6EFF63849D92EDEDAB03FD065D25CFA7F97BA269F0909F02DB614BD573414602F7FCB0A65591941489CD7727B981A996FC994205128AD0071D6661C193FB2C438ACB246D7CB7F7DB7484AF0526696A99FBA6AE8C33252E187AB9F7A84ED0AD2428290CA197A9DB90D8256D7A5BC26704A1EA860D075A6D4C35E5F9B05A85F3A6E76812EA801DA832AA17CFEFC0FF6E65C063A09B87553D0A35E4E48D6FC2CF26D916425BD03DE883AE3D2F865D96D294A11085F07645EB03A32B61FE29527CF3C710DD7CD27247A79485B3692E9EABB3998040859B9933D0D4FB173ED7AF272B6B72894FA2A2D9CF38C70E3FFCC129AD1DD14429DCBED050431F990B6688554535F6E7BAFFD64C909C3ED96AED4AAEC3047E2BE71372CF3EF076AD49F5336C438ACB246D7CB7F7DB7484AF0526696ABB37F81AA73A9F1ED2BBF0AD03040EC880AAC9E1C43379236F4B8718EE45149E591F4B965BB384215160546E6E329140CFE0F1C2157DB5372A8E44D501C6D1BE3820973D39B9E9DC47B1AC43440B8F510C614075670898E8A29713A939B6F62937B939A13321B466D47CA080BD7452CB10355739F83EE47FF1D15516C6F0787DBC3BE0D039713A4C4ECF9EA1E29CD611B014E0C208460FAAC757ECC1C16728A99C7E1618BD00EDF037C4938ED14E2057B15F0392A16DF0F9DD894F945453C0EC06E3096811662E5309858D89F3B49FCEC8016021E2DD868BEA5DC0EC892F81041221E8AF1EF3C27D7192D096F7E323235F1B62DC2D3ACC91BCCD742B6527400153E5E0FA106F47CC113F796BA0A499090DDFA5A3401C1551D21A3F24986EFEBF08AF925BAD881B25B104B8CA928C15457DC1EB66C2EB0332B720AA4B5C3FF1DFBF2CD353DC8307DCFB935C1B6C34048604491390F6568FC034D99D4127F14426A20EC2137E4BD7F317F90334A6F50A61DBA243109A2368AF7229B724D84A00C377955519B971B0E52939A55A6EAAA744C1DF3E31FFD083D6BD59DE4919E99B4BC1E42D9FB041D119BD39FA38369BDB6B9EFCE417184364814CD45A8369AD3FDFFDF4D784EF483E1F0FDF81FCAF59C378DBA5BC2639F83B230A23F41CA4B2D52617E0F237EEB29DC76303AB6FA05DA83602C0C17B921537DA0FAAB07872F80BE4905D42FFCDDF9A3E2CC27C20F764229B77955519B971B0E52939A55A6EAAA74490DEFDF99D1833F60B7BD3EB1D7669680BF43F0D598A85C25483108E21CD1002F96BB9CDAF8F5F948BC8CC10803AAD47AAA1524C1DA0811957CD156EF83F30108ED854495BDB982A734BA01D8B963C44E2921F622A9479F347299C9456146979889E9A1E78E66627806EAFED304CD9B412A505F9DC3014EFA2E85AB377FE8C293F60BD0714165D33E435E4A3D9AC66DC6E7ED54A766716CF5BDE0DA614A4EAEBD68B804CED4F1F64D870F1B34EFC5060D4C7931B4DB876A2EDBFAE7C5454D47C277E2A18F9C2A7E37A3FE01722BAF0633F40ACA29BAE89F1BF78C883C244A806B77DF4E34506962C94CAE54A7C6CD6BB7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291DC7FBDF6F37D58726E208D9258B06BE2D142E451DB92BD6ADC3014A4E3B900B59F18016A1C132ACE7C9FCC05E42D8689A9E20653A9918A036B9A74E7723CA0A63C37E622674864DA026C1A6BE275B801FE9F3D83F051AED7DEF71BCD798615FCCD7FB1C9A337CBEFBBF750D586B8CC22C67A298CE2E3828ED8D3A97F00235D8CBD1FAAF0088EF29C3C878DCA87969DFAB3F514A8E265D39F0615AB9ED3508510FF217B431737C2CE217656571914DE975F4D5540CB8690E5493DFA60D7B6A97ACE6AC4A1BB61FFCD44BFCFE093930C861B5D28F4D14D1D640FF2B10F8939E262DDD6D403F9CFF4E6A6CBB9DBBD307BC03FA76A6902C8D56BC553A5C12CE1F0B4485F91488AA86B269EB03BBD16664786F24BDC7B8A959C2297FE059D713FB6971BD325C19A4B1E85D46E043778F4306814597174436C5EB2D8BE05DB17276814FFE495C0FF57DD462853AD61961CB449963ACF54F8FD896CB2D2090DA246D71C977955519B971B0E52939A55A6EAAA744E8C4F3B23A7F4D179B5FB1B52404501707690BF8240081EED3019CD109FA3B5D54EC8C6F9D15EAFD84BF72C93366F3BB387052BA9101D9C1444197BBFE1688195AD746666A27258CBCA7746F6B7B2D4DB09136F5F2ED5EA9D48B6355B5982B6594A11085F07645EB03A32B61FE29527C30734FA275F5601A6E7964A5F8EA2A3EAB3B078D56021BA54E0EF60B00EE3C556AC666BB20DE57E1F899389CD636F418A110F832C18A27929D4FB532C13EB740928EEEB0487263A6FDD4EA63C9959F81FE3C7C1F7DE0DB338A706B010E7C857577955519B971B0E52939A55A6EAAA744EE26DFB48EDF8E5D0999EA64FB807E02EAA7A897CF05A01D81537459BD2CC419AFBF67032353567AF1875E195FF996BFE53E85D5508F70E9F79158397D9B70E48604C35CB285A24758A5BAB173C3A7A31A8489015AF8E740BD6F152C01EB250023FE5823AF84C65744942B71DFD42F657D08E877659143AD61DFF1F4268FA374A82509151427E743557B9F8D56262D29A18AFE294133F60F336D1949320D05E871A4E6C86A0F08CC13E0C9CEA8E2D5EFF6C7618382BA3BF9271D53DDF8837E918F5C0EAF12D293C6BDA9502268502587C10FB1B064C0040F69F42D91EF5971B067452FA91D314E709EA7DCEDBC0DEA29B5CF12C3E84E1D09FF855AB1328BCDE724B03D50287A9B52656D9B5FC4368D8BD68E8A2632EF2B2B7B3ADAB00A912AEDB4789FF4EBE69F0B3800A6D92DD6EBFE6802B73AB166A70F811FCDB939D97498FA428487CDFAD5F3CC1E180FAC5CC7A7D5CC5F44031C99030AB0311F3AD20EC6416C64F13E8D6AB3C657D59D1ACAC9FF667B575AAEE7465520E45DDBE275A2518157C0C655659FA6E529A1E117A128651C0C427C4F432291D628116C2A709AFD68C4B0319F429AFF99D83AC7AF81713D1B1C463B83CFD3EB16B3DE367AFADA404628ECF5DC2728BEA13FD86D9803DCDABC200175214D3942F20F43BC9FA8A678EE547F599C634E04C0F34653FF1B8856DB98752CB4410A386BFE3AA01107400FA934FB393A8DF3F78710467D53BA62FFEF8DCF365D54715FD7A1B6DB23E854614F49FDA0FDBE907F54E60D5081148609905E4B2E09EF4350FA0362AF990D14AE94D98580354019DFF27240CF4D35355B63D4F6BA33AA91AEE2677BB4A38AC9E932BC5511B334A4DF6E88ECD47434E7201747BB3C09BE4440BC47642B08F86FB7AA0A8A319136321D46793984483F887368C4B0319F429AFF99D83AC7AF81713D77955519B971B0E52939A55A6EAAA7442CAD5D698776A2EE9B20F1F34873C3FD20932811169CECC7F3C85495CBFDF40D02F7FCB0A65591941489CD7727B981A9015AEFCDAB2E93E71574C7015E643F7A07690BF8240081EED3019CD109FA3B5D5965E6AD14F81B950EC08A7F1B65EDB0557EE36F7A520B06F90CED8A61C9DC4177955519B971B0E52939A55A6EAAA744E937588583F30F0A4B989077D740C528114EFBF4AC8FA3D928A360474DDE632671AB84C90C2DDAFA48EE69ECEBA987BDFFC351C2199CEF4DCBAF7DEFFBA22D24C9CF29C6B4E460D470C32339359D40C9C40A37A3F3CDAC9E3B1381ED9F21F7CE78A84A1027654278EA3A8217EAC2330E00D79AE2D9FD36B483C27C2D98FC12534CC52CBE0843C0586873BD80538EF3D8531A89906BDB07A5112B4E290673749C653C077FD85E70F718F40FF91F15FF9BD7BD30E051C723EF617B6A8F2BDA143C49D468E58DFCD265E9310DE1E7F377F7E5B35557960DDDD73ACD1940BB1A65C4B32FA9890263339E88512EE5C2900DD468D6934A90C05A6CA7844D7423E7B4A7AD304BDD5D8CF00EC5040030DFDB8B286B5C249CBB7E342FD45EFF6621F5121D1DCA6DE016CA4A124C09CCB8A486233594A11085F07645EB03A32B61FE29527C6F18957EC6A3EA46135A12E91C751CC51747BB3C09BE4440BC47642B08F86FB7DEEFDDB809EE0DEF230B0E238417FBE8AED58521F5C44D171F0B299E2FEB6A9A02F7FCB0A65591941489CD7727B981A9F7BC328FB0A0FDDCE8CC8A4202E7EF8A94A11085F07645EB03A32B61FE29527CA6FE94BFBABB8A21EFE55FBE761DFA03BED52DCBFB01C68F417D70B65CC31F9FD9330203DBC29F316EF1A4E35E3C2A8092D86C2D178B8361A92276FCC8197A2D0520E2E2800E7E5D257DC0CC6AF39F0CFB9B5EC47A19A6DC2D95C76BFE20B9B03202707DC779D7DD4049528135B6741D5C00FB2F706B64A84E96B0EA4D9104F7098D29E303513CD55FAA868D43DD04377AFD502374153ED7883F4B1AE7DCDDB7E216703A22A30EB12DCE6FDEB63729F54C7DAFFB652D2E48D8F041030961E81224BDC7B8A959C2297FE059D713FB6971BD325C19A4B1E85D46E043778F4306814597174436C5EB2D8BE05DB17276814FFE495C0FF57DD462853AD61961CB4499CE467EFEECA3EC033AB96B0556BD307A3981E5E7597FE270C982E93E5C6BF3E008AF925BAD881B25B104B8CA928C15458AC0BC7469FFA16B384556F5D45160F677955519B971B0E52939A55A6EAAA744A01BF36EC12D71E1FDC25820C53A697594A11085F07645EB03A32B61FE29527C394D636C8236ABCA0D24733C92C703662ACEA44489EC6158F99B3E88B960E90EC6886467C203FC948FD48220398229C116FAD82E69BC1C7E0FCBF6565B448F024CB0ACB61CF24AB11AF0940E03D210A3B2B3430C919F1792C033470000B76C6E09AE97095E2F539FF174CFC77517F4AC4B727628A1D2113E7004D02856647A9D97856A7AB3B798E2DD8DF93AEB69F3909D34983E64B67603EA58F56CF7895F2DDAA9C0EEABB040412ECD8AD9D686EDB186EEF992F24AF9F4E0BBB48EC1260AFD86F05F48783456D28C6FC72303BA1291D098D7A475CD49C0FFD839EEAFD92F93330595D7DA040B8EFFDD27E70743598FC510C3FF75F4C7665F153EBA393626E4F11E6C0EE7D481CEBF7016039B6F37B9918B9315EA8A5FBD5D1DD0D380C0AC8CB6FB5BB68239F07D9D9296B0F57BB5954BFE3846C46CFDCA0154CF9E59F7483395B1B20F79C224D7F409106AB4EC78FC0D883A73C619CDE930F4B5B45EB20A0F29C6BF53FFF16010EE0E9917DE15B3B0624C553EBEB82D87F460F9A573ABB4E5C5E53D66C6AC5A7742BB34AAED558AAF68ECFD0E7B313F69D92B9455EB7FB8934B73B06B9F56B57A9E6249FA3421430E8B7DE0E3B6EA0B38ED84E6433C624474F88D088770CB3A270F93738A8660EED28F7B26C33DEA14269F6E5CA79333107EC336423B75D125BE0363318B8B433B362CD3AE62F42CA809C23F529BF43C6ED07B0D8196B4B9B66975305A3226C5CC4C2E7F4145F6E5B20A590FE2B9D42629A95E06ADCD84272841F18303F474B054B8FE3399251F7DA19FEEF2E9BF5F533219B91BAF2656C4B0FA17659B11E114D6C2747533BBDEE382C00F881EF03700D38E0C9B564B5025548B6055FE60C035C85594A11085F07645EB03A32B61FE29527CFDD06961DD0F313C4B64A4E7B616F12BABD90B3851942445DF2E8DDA4D2C9E92A526F33DE27808D086F797AAE5F8B26BCE02CE050555B48621F7C453FABD0BA1C403F561B8D99992E3E0F03E6179291D14762DCEDBAF5B00049803F5308712777F16F61C25F85BB79CD4C6AF9B657119E970DE64C6AD6C7FE7F1B14745EA2ED1BF056F333584FD98D883F0F68CE0B397F304A4C33BDE9E21F1C8D21E1E370BE177955519B971B0E52939A55A6EAAA744F7B03B6636B85B4C227C2AD90F28455502F7FCB0A65591941489CD7727B981A9B32B69113650BAE4EC2753C54C01614E7EC3B1C968DF606368608EEE9AFAA0F7DB06625E64BE0609C490726F2DA291F7F49906ED4504FBDC80CC3BA5FFDB4CFAAE7C06E18856A48CE62AA0F5CCE999513C0DA2E91755A089DD189AA4D61DF8C72D68BC823CFD9B5106F1A2CBE6E2704A646F403C5D4FBD31B24984E1D357BD9E3BFB8A919F4B4B12FBDF7CBCC91263480AEE3934D757EE43A3C86BE482A49BD8127573B57BDCA4EEBFB759C3A40A40C5411409CEC072F643B804C0D4C339D5E6BCF421CBAC85AB9B81FA802C91E902F30AFE8B736F3931EC11C6DB30D926CBD18BB012AE427493EF4A0754FBE891CA99AF30A8E12F28BEC0E61CA3B9B99D59228040B5EE1C9DE64D1B1B66239D6C1C6BB4335340D681B35D05534EA15B482CB35949514358ADA32009C3AE92A6D20F5BFE79A3147026318E10225D2C9D356B85BB1E200FBFE9DD30A3F160FD25D91FCC0513986060CC0B785A55D12C36EAFCE8DC0EED4FB88F9FA4972CED5D79C090ECE407CECC087F9D62B778F9532E63298BCC37478A4264CF16FAFF6ED661D3AFE602F7FCB0A65591941489CD7727B981A9EA4E7422AD5D258E4C40411C9B709257CEAA4FAB862DBE2677C4B06D7BA161C58BD9E8A3A9C2D961CAE4E1E266A46749F74A26D9AF2CF144E949D0F09AB61DB802F7FCB0A65591941489CD7727B981A9320A13E6C31A435F446B87754955978C7BA5103570240FA4242D8C1E77BA99D894A11085F07645EB03A32B61FE29527C872D4BF6D24FAEF3449A7DE7E999DB59F4A348A1255C7BFDFC26F49C68713F4294A11085F07645EB03A32B61FE29527CFB27FFA7003BE08F96F6A40B7623AF1F86C216F21CBE5FCF9C91A334A1EA9EB0AF47E40A0B417A1ACBD0B1D1D1A2DF91A06594D8423336350E6A8C76D029C4D3AF47E40A0B417A1ACBD0B1D1D1A2DF91516D57FA491921516CBAEF605BD08090E863996D5DF73058CF3CF153708A9927C40A37A3F3CDAC9E3B1381ED9F21F7CEFCF4B5966E8001E796CFC9A898FD1932B3E29D662540AFB704900F2AE81CEA704684C9388A68F182A0CC0002248D52CB11C37FC03395050550AA37A2616DEDAE2E0042386789C8FDA45D48597ED23A1F949B25747B0DEC43F605DA11796480DFE4613D47BE536FCB57BF2A5F07FC8A3A142E451DB92BD6ADC3014A4E3B900B599FC175084E735F135F18467DB19BF397A1719B8089078CA3F247E87EE23C9D008C713CE7B0AEF1999AEC58AAD334F1188379653CEC1964D8FED2A907B196E7C194A11085F07645EB03A32B61FE29527CCB0E38140D1B74DF0D9B332E79F7ACB45996C1C6E206A2258FD169E24A8E8CE19A0D233653C9F5D962F49A415A9C690D40BED0CCA9BBD5AA2883E8796AD932E90EBB81CBFB39BB02E08AC24FD9B4AEB85BE67491C504D91026B2A67F770DC8C594A11085F07645EB03A32B61FE29527C8045FFBF27F9C4F3C37C2F348499D20894A11085F07645EB03A32B61FE29527CDD3A9E07D5A46CFFE45ACA668FDA27C194A11085F07645EB03A32B61FE29527C7C084B295332A48406892597430A101394A11085F07645EB03A32B61FE29527CCF24B3BCEBCA5BF6D6D7AC1F37E97BA373ED797A94949BD144F20A913A7A2C9D0562303813636F18280E99B8632F399EFE891A8B10F21BD2F1D8EBF665325D49A41D286D4C5CFB6B3D88131BB7AFEEA5CF4116DD5C3914608335792CDB3B7169E3841454D79C59B9A5606B37098E979C11BA3D25210285B09539743E8FC6DA8900AC8FF5CF0B5D838C532FB804211FCA5BC7C93E0803C0E49FCB0312A883C3E069E8169AA98303884CB6C3FDC7D9153157A1D4D1BFF387B57CD1555F7A0C72F4FB7F0DB5EAA8FF791F635863FDB7BD671FFCED925272D4D35F284F37E4A4E3357FD34A01B379DDAF209E2D4CF5ED3D4DBB6FEC3BA80D0EB4807FEC1F1BA3CB5CEC2B4A776732A7E36F8DDA12ADD28473CBE6E7539A0155CF70E7CDA0B0F6BB08F99E0161BC8B1566B319400B0E119AAA57138B26B0CFBBB0FED8FDF26D8FC3BC7A899B60F371FF4154192854D9CAC31AEE0793C8498D64BC8CB06FA021E0FB865D323ABA26DB5A6A742871FC1EEF443D7179B325352E5AC4788481B2A6E1FBBEC02370B22E4E649D6542AAE25C270F1A74C078502270C88F0D19309B97705230969609CF7B711DDD4D515CDB8153ADD6A418AE8D1223559D56D4957117FBEBA67324DB52A67C4B57B00D935C6CAE79705FA8317592E1405AE491840338BCC62B02F7FCB0A65591941489CD7727B981A9E01561CA2391BF8E34F2646DD263ADEBA674091AEDD376CA674B457A8AACA61ACAA188178680E5194C9B7FA52E4262DCF0FEE50EBC63B2C8A1B12F5C5359F322AD566BBA51B253A8170E26EE97D684E9CFC97514A385EB93DD989E1AA1E0C4621F4181E85935E26DA85202530B6AF3BC3DE4221930CFF59813C889BC239EF77FC84999CC5B2E62311CC4415DC7510AEAB26209B994B55BD6EB89CF8ECB87A2CDD5C42E0344629B7DF0C599819307E1B3240E86B6BAFB44B8868894B344E958E9257C246B5E07D9B06AEF3ED62562F2753F22692F1ADC582DE6D5ADB0C291164F9A95ADC280FB835898236EEEF254054D5D5ADBC0B8228CE8508F06311632A776478F2B7044DE266AF9CF8B6EE777E95A721D775CDC1D0007E187C6562F9EABC936AA03540422B3CFD2E458F1FA0D170F82A637ACC809922C9837C6D298995133BB326F17755F47BF7C59D2AEA5094FADBB07F2F9B6D409A0EE17C406025BEE4186287EBA1A5B4DB347B1C5B5FB1CE188396CEE1F774EC4895CA9F4FD7B1CF269394F8583064EF15DFDF443170DD0C2C9A1BD5BFFD82A5A8AA9D64B1B742BEA8E845D805A82AB369D6E253A71D5EE1DE10B0EFD5412C04749E511EAB080F83A67C1A3C8EE9C89DEE11541F6A2285E936EDA2E6CF8804DC1E9407D15D364F4829DD41EA71D19BF2FE9390EFB100A67E600E361370F87415AFA7C5D8DD3C252B9F20AC3E4149AE9B6AF9160BA4B9E04E83AC81F9AE1F1341511C0474D04222873F3498EDF5A54BC69F035E618E1C6AEB5ACEA76431B117825202D954A60872B3F661BFEC2F78526260010FC41C36CB381B6827831DDFD9D0EABC84769EAE8ADCCAD92A08ADFA74FF1DAE16C03079378955A6E39022E6A13EDCB0E5CEBCE8E52672120B45282B3DD8D2469BAEBD5A46F9541AD2B1C9CF542C066E3824364E48CFC47B202943631FAB79BA379EF7DA3B2936FE27BB19467A0C5AF90420095E6E18129458C30C879D1794D3C00EC17BDD26C6BCEE23BD88F3C100BBF1AC6874F60C1CFFA3D48031584A89FC3FFF09D5D63F675496A96604B2DD6DEA46B40DAAD887E19DB42EF62F9283AFDDBC48FDA99CAE5F1D41112096DABD90B3851942445DF2E8DDA4D2C9E9221CDAC11EA02A1A133A2650541AF724F0BB0BD2A4D427CAA857DFE82645BEF1DF5B935B1B57F9A686A54EFFA95E28B8510D009B57782E0845E10B99B9FD7A46545D0B8156FB7C5464014FF41F49E681C9F86E480AED2C88D667EE8225B03A390D47BDE505A99114EBCA79D59D56BBC4755109ABBD01EACE19186F857C2A8C03C51BB34A980C4CE79FD9919D14D74ED9A5107BEABB42780621CEF4385D09CE105354D1A035F0C6B75E31D2E78767BF848FC5242FF30EFC7B6DA05BDA2D1392FBE923EDB3A4E4B055A7171D96336A130D303EBBDC710D0BD8F42D6AF10CAEC2E1A86A0462DBFC732ECB85CB44309000A2732B7AAF0390EF6E65A2337ACBFFCA69B39021196DED7AFA1B03DD7E83A023623424E5A71CEFEA4AE86A0B1DB314669FA3B2634629F01C7A15A03108084C2BFF335E7ACFA0681219AD8B7DFDDE63C80B5B3D9FE83B6B03F63AD9AC4C732617D0EBF4B362F945E82CAC9D399448C28C7A69727E3569224741DF56D26DF00DB17ADEC07EB2BDECA872E90178838AFA552200571B958FB17D57DBBA721EE1830659D8F66CC4AF8DA1AAD23DDA7AD1461F01D3B03FB9698A28DF0A5D09144331ADD9C5D909B8F9A511A2FA3837ADEC42C25D7052F1F3BF0DC47768BA87634A36CFB7567642A5BDE90D39928FD610EF6CF7553AD365F0B2612F8BED1E2261676B6863514097D309EB6734BB1ED45F6EC261AC5D0EB0BB31DA966BF39CA58795E36C0B328B4F44E7206F2A604A80D25F49AA6D24A67622F593A01172C5F639C877339E46A800354A14BA1FB1038E9A637D5502AAED88DB00BEBC4D33221C0F938317209B4B413BED072290489D09189C63B7F92AF3D3EF93D122A6B0409C5CD5206B2F567A9037F46003DBB10EE21B5B34D3DDCA937E4D838EEFE3D5FADDBE575668181048B2D366E13FFB8C48FE47E8A3505CA6F27F2C00ED92A89AC74E3725B325F3A0BD2289F3FA57D5213F8B549D94381DFE4668FA7BFA882F7599A2AF6A6FDD962A2F53BF7D4C5C43456DFFE9A8CF9BBEB313976E9650F5C72EC46AD81A9C3146621A52A4BBEB9A0F4FD6D2D0F5665A6101210853E25E188C09D80AFD1C2C7FAB268270AB2AAF0A7D6E40918F2EFE5D2BAA18AFE294133F60F336D1949320D05E8B4D1094CC8D43D5778B5933266CC43FA41DB18D3E60057E7D7424433FEF0A7A7125016B1CB289CFE641BEC566385259807690BF8240081EED3019CD109FA3B5D3F0C0A2DFF28F9BD8779399B5B97C6F37140E0CD88E56D1D4F4E365A874281FC0EF4DB1A154DF8766F16633F5D501580A3A69161A027F983BF9F9EA42E0FB2ED84B1CD1A09C849E268A80A47F8E1BF5935F0407D997E54F731EFE2EA0FA997B8D0B69324BE2F93BF55ABDC488E0088F89606347464978F68FE62B8845C15DAEECCF58405389877F0B6EE840606E557907CA8E60F1CCA3F46B0EA6D0995BEB51BA57B03D9DD0626A49F8AB1288E2079FA0F0C5131D9756C8C9356DB1CC675D37A7DF1CA3831BAF1FD5945762180BA52A910D8D9AC89746F816BC4D3B697B3159A68E1A0928D6C2C4F985C5CAA1C861BE19A0D233653C9F5D962F49A415A9C690DF08C4842A2108CBDAD961C40B8D0FC811FCB0555053A333E905FA1D27C4796BAB6194E2E5C85C1864BD0A70F9C3300F6207678318CCBAD5FD55DF927CADEFD370EF4DB1A154DF8766F16633F5D5015807FC63E529DF0EB8B8D5E09FAFA2FA3A702F7FCB0A65591941489CD7727B981A91321FB1F424BA934386F6852CF705B1621F703C34EF202029A329A2679E560D383F5EC836F9C30A78AAD5F45665C5C311286653F8682979E00DF3D8DE9D3E761D9330203DBC29F316EF1A4E35E3C2A805B3F843A3A3BD25A5A680047E0B4655FE73147B3121F93F6B60407892D4A99ADC3265FD6CE6D4086DB260EF1DDC031B422B365698E0D264DA76B977E0BD0CCFBAA80F426229C53A7ACCAF834674CC0D5B833AE1A8B6AB8C6270B30302A1D1A0B9BEA926C9D58AF4171E5C62725F6E9F83CBED7FAA7B47A2C014F3CDF9FB3E5C12E0042386789C8FDA45D48597ED23A1FAE4401EE188D83D32D1C4935464193D47161B838FC9A901A04C481D933C8DD6F8FDBDB54A8834467532741C75D264860EA5F7456395233A1E5A0EE93290503B628E140462C699C68F0ED0C1DDC94D9DA2AA2D6F8403BC16F03B45DB889E3C57C8801D6153218F9E9CFF4A46EB3C470BE0A6734249275DFB3D6B47813548441B1D2D04B20C9F9E4D7932C14F4CDE8EF53E76D193EB0CF134E9C843A826CE361F9A49E712DBC4F36F9F78A9CB250B9032D35822ECDE1217AF26822304C44B12062216F750E18AA6609A132E96AF44A776546E431F3181563557C7E9632CF1031D33EF833D7E51A8A8A4A2CFFF32192C52DFB1C2ACA30F7EC5B0DB51B03840C2BB966C7E9BB5A824F789533E6CB9E16425DDA580F77B747F9DB25DCBBBCCEC2A6D90EF4DB1A154DF8766F16633F5D5015806BE6BEB287D5297B1BBCE463946A195CDCE76CDCFB0FFEA5B2A3CC889AE54AD3D8B9254327E5FDA6CC43562898F861D21298EC7EB7DCF1523348B82B055A055F1DD55B0497AE6860F07BF2DB7AB5B99FC336423B75D125BE0363318B8B433B36EC0D287E805DEF355F30193060DCB9FF1BD15565F799477B0CF15BFE9A6063000314EC0EDE977039CB2BBA790C0A9B53876C8D4EE140DFB2C12EAE54A2725225ABF968223AF4489DF2AD94635A55E1DC5267D80BE8691AC7933976DB26F72FF8E21F795CC085397040077A6E7EC97013E5564DFCAD048CD678661EF08AE6AE028E4E7AB7CDBFEFE5D8CA97C5B1FD9DEA7C7205911DEA120C5328E5610A0F62BC8FF03633D8E1B38CAF05E20ADB40AB3A187DF321EB68556D0B9AC60DA842590DE913B94B4A69D9772F58FEFD86AA4B2265C37F653DCC935E683D30C31A78F8DC89E88B2FB93C364CBE0B5E9F76B3C9AD1DB3B6B3467639B93051FA0A53D82355FD6EFF63849D92EDEDAB03FD065D25CF64DF8B2439EF36A03927E54C2FC545D3C83329BD658FB39B2B6CCAD2DEB0E458CED581CF1AAD07602092B32BAE60F3713652E6CB0F6E8D1E2172FF7A307CCE7FCA3F0B3018EB970028D83FACFB0949A53FED00FE3ADBC6AC58A7E86985A6543BCF108582463FC12784CDAF58FBEC76F03A2752C13EB82742AF0C6F6E197AC8D3C336423B75D125BE0363318B8B433B36D4F220B8345D7464A5268456D3C3CF050DA49437333BA4E66CD76147F46336DA4657191A302FCD04546D262F66D200A1C97C86150C6CB051D744A2D2D7F7EC8EE6148E895D5CD2FFC21E208F6E676C452C8CA1A41B063246A595D6D82F3B68D0AAE2B8B16EED703FC881B71C1EE06A83385EECBA6DF391F892B2368EC2FB59CA6601AD5F821DB53BC08EEA8F1DBEE9B233B57EF4941FF46A41299D8AEE52400043E4AA1DBCB1650529262DB4796BE48F9014EE0798321439BC552B42559B7588CC28E8E255669F33F375D26FF98806654632C4A661D3EA3866E00F9C23CD51E31729476347748879FDD8B7704F80420FFCA749AD9DD6BB9F80A0D9AA953E9B03F17E479D7E92EBB7DB60C93D4B1A26FDC8E0812694CE0A8A5C8C2305E6D5519865265E776528B944CBA67F283858154981FB5AEE9F8057581065C8A8F75886964C3BB5311ED21E173B3EC11FBD0171946C86A77C290F55D27D6B23915837BEE67E2D4498715CB4E4BC4AB2CAA43A4555A874C6B60800E4972901ADA61226C287505E87D216DB31FA6524B4A8629F95D88C35DEEC70E63BAEF917B7119BCDA924D076BD339ACF3054217DCB011973D0A664D8A6C38B654A4CF37336DAF2A9E45DD81E01481AA205D1287903F849507EFA63ACF54F8FD896CB2D2090DA246D71C9C3EBA3A06FD856BCFFD6F4B75BF7BCAA3FED00FE3ADBC6AC58A7E86985A6543BEF6CDB8AE75E457610359445BD83EC95D26A76C43B5AA04C7F6BD7350BD14CECCC28E8E255669F33F375D26FF98806654632C4A661D3EA3866E00F9C23CD51E3BD532BC8CE0E52794E132AD97A65FE95D502C649953A58FD8B9AAE7C233FCAF092A35E278F83BFC662EE5CA1D0EF258B2072D38E7CD182B208CD0DB1CD3F5EF6467B4C621C54C095AE7840AD4DC084981D5057A473C1A1326389CD7883761192999CB5779DEED8C9BBE8A0BA9CF2644B83735091CBD6B99CB62F80A175F767AF17DBCAFDCA8026E0ABB380AE9938E8DA9C0DC802B4168A2F5F24483830D3B31203677B4A035E7B0D828EC76A68DEED70974142781EB8709CABDBA967E0D9750AF5423C4F219BA82DA61169F0937215FB9EBB97C192032072A01292E7A88B0F8368C4B0319F429AFF99D83AC7AF81713DAA43E7EA6823A13E3C445080644B8D4D5A4FFC05CF3C7CD93273C287BC3C7B61D8ADB7FD648D75B5179516DF792006A70F0E510C2E8CE00A5EA084F3CDC5ADC97ACB3316730C31658425314471FB57BF852279589A9CA273CE2FD5C56136B11C7B7DF38E5B0FE09BAAD132D105B395DE1D94076D707EB8A970BC3F291C5CA784B2CA51BA8C7FD32BB0A26A0AD45C811E9BAA30F57868E734BF72594331E00EAD746AC1450601CE95C29C5293279C89C13999996E7298372D17F2DC5697F2242F0F6A26AD61F67F60678151671562797CC30076D7C3433F6FEBEE789B0DF739EA61A1A8D884B0A4CD64D87E2A9062B99357F58759716C07692DE093D90338E1D9E61923917DDE422B536AFA6580D87D2F745265C6BA8099C5DB51C8BEAA5E2CF5D974143D5EFBE4EBA42A941BAC54749095033E3D31B2EF8E2B41DA36A7D61325B50D39E7CE91F0CA3B6F422A6B813DA4667B79376E820BE711A34F6DA54A6B921B1A30B3FF22CFB32A83CA5EE0F3F94FA0D03E58ABE36BEC05260CC4E5A77C83015BB04ABB1A7641A9B0298B791F7E28371BAE546B6162975D938737DC5A3DC6316204F7F51D3ABEA111E62462A887FB4B746100A707D9D5C6E300E903CDB227F28CA6FF40ED0A658A5020E1D89052A4C2C9F2382035FAD667FFB5C2BFBA6BC9A2A11DFAAD5C2679DF3A230E6C90879D11FA136A38228ADCE2D7A56A1C194175E6D7EBC310DE31DE4C327E5E7B2D1F57F7C3E9D04838D25B04A68862A94EA076B844A6635835B435A2AB68751714D263A92C673F7CAD73C02F5DBB040037885751E81127218AB7A69E5403A1060B5A6AE6CF7E04F82B9DFB5A093D13F827BD8E4F1B758E9764FA921BEBBAAF9F39B7C3DB08DD4F8E8C27A3EA3CF7C6310EED53D005BA3B8E8AF82D74964A6D88207F8FF654F1162A9CF206F6139F60369397DC2FD18B9EC99A512B49474805B842B5071C3F962DDD801E9291E553A93D9AD0AEA6EDE03806D980BF308113A210C91F935579296900B5B1AA95530153B691FEC9F3863CFCDA88F976DD111F77992A3DA12CD01F6814B91162205D8EBA4535D2DEBD2183983A0B27F59604082ABE597041C1F2E858735FF382BD3D0E239450DECA635535F5356BDBC4D76644F307485352089DA33B82779791B6EED268B034E76DBE5E850595FFE0A346DAACA1A3BEBFC75BE1564A6A9E8094D7605E8021EA20649601B98361E793C62BD2ACC6A5D6E3C52025CB35EBB425AD3B001CD6FAA542D8432BAE0148D0A9EF8C4ACEEB5D2A640A4C5EDD01695EEA92D40B0664FC1EA05D64BFA378884E1F7EA43E7B3BBFC52F480E7231ED64EBC994F0CBC2C937B5D6FD74311F7ABF7A81ED042276B525E5B2C47D3CA2D856E61DB0BD364A66D10F5C9152EA6EAE3C2AACA0DE40EAE1C30722A06A38884EECF9CE95B4C7721E3572C47F782A5B5C75A5D4D374395C8F2DBA59E00BD2289F3FA57D5213F8B549D94381DF64633A491780A9A50C950A59ADF990D844E42ED80D05BA26A38D2623190984C44014BE89A7F8F6A88EB527B24FBCFE607BBCCE735E2E0D8047969A3BFF25128B6599DCD6FCFB219082DAB7D57CD16A6D584D3F3ACBF333C892AF9E69A3543319F0F0983D2DF69F2DC06BCD24B4BF0A4604D6AC865698491C06DD6E28B99077823D5DCC28EA18224587995A116C5DB8D6580C5C528C9EB4A6A944EDEBE8F5029EB590D4B67C39027EF147E955AD9C2641355DD3F1BF90F69CBED42AA6C9653025B874AB32040BFEDAA511202D4F8B46D307A3B7C6AAED4D9BCD89BB35C1DD0C14ADF9E56E84788B6D7EF98CC9A9C82701B0DBDFAD92CFC867FED418B370605C6102F7FCB0A65591941489CD7727B981A9C84BAA75457502D397CB71241EE3EB49C20B9857352667E6004DE64BC9D6806002F7FCB0A65591941489CD7727B981A906B08985CA1CD5646D2208AA5163C8A557D1764112717D26803D541217330C5B0414561040BBF6A5E7BF077E850B55BC4AAA4E20568474253187F30D9C1C099C850DA4F2F41D90D6547DB2A53DD16CFCEB42664BFD471A00BD2C73B50119ABB0B1941DC74E2EE9DAE7729CA4DFD56C1D67CDCD14247C1670ACA4DDF3C9B6B9665FBCF95EFF25D69070F897009D80D4B502F7FCB0A65591941489CD7727B981A9596EA4721A298975C3D4371EB5B8E7BD0A8A92640422425196615C8C53C443CE8AA5E34FBD6ED314376A2743932A9D87544ECABEF060E9ECAEB58EB06C6584429A0D233653C9F5D962F49A415A9C690DF08C4842A2108CBDAD961C40B8D0FC81AA3FD14D8D828B03CA96893A3D19671F3025F8417168F7088CE70B7B5A52069330A1E0937752A7D2A7E4B0945313A0E7FA6A2D3EC998E68662AC037FBFFAF0DDCED581CF1AAD07602092B32BAE60F371E21E4ACBDE363EF2FE9C194EC71E48C95D8DC03AA012CBD583BA44BF0E5444F172DD47E5A6ADA03B40D884D0D54671681B263AA437DBE5C2B9E8490CD26F3C2FEF46FEC3F626AA32831BECF9BC3F16568BFA798E95052DCA90A804FE79CAA02895453CB17AE8433576C1A9AF05F83FAC25FB0E941CD8F09AE927F37D70B0F28D02F7FCB0A65591941489CD7727B981A9C01CB65ECF4338777517367B9D76E81177955519B971B0E52939A55A6EAAA7446954D35688780F09BA71914D9E70D18EDD7B2E149B83028A6CB318DEB18946BDCBFAC860D5148FB84B57CEBE9DEEE4EE7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291D834BC4D7A85C55690850636BF57DA46A403CD181F58AF86CD70EF98BB7DFEBBB416B58E66F3DEF2A340F714017D6439F4422E0025A6F6F3FE937306DDB7C25B2A6A91896CA241736C0651268E1884565F8C54D39CF395714A0816595E73E5C008DB304D5B74D8A988261E52AD0DDBF688A865AC3B974CBA8BFBE516589971E02758718B86D6C098908EC64CF691E049C8540EC519C0F6230D50F7D5590AFC1B7CC3C0C1B07782B631138F021EFAFBA684B1D3E516EDAAF0398656B1FC4B88B34E4418691DC72379280FC4ADB805F007E1CEAB838534BA40D61619F15FBA5C875D4B8F5420377E7A22A88B78298FC29DDB485874B12F40A1634A0DCE789448ABE99FCEFF58456453A89D306E21469C2B374D684F75194B457EA825EC19F72F8A672A92AE6FE40B7D586EAA6AD522AF5065863627AC79B81DEBD12E71116177E0F3BE82AAAAA63C06FC282C023210BFCC84AFD474E64D27639488D35AF21C526FB40316EFA4FFE8422B38EF5943D5E96FB7386C39AD98B8D10B99C6F9B25A233B35A9164AC35D42B1152D4F42D071AA8820CA133E2A5D7257E1538165CE0F2686D7D4DE8AAB63446258DACA3AD1F15294EB5E15FD22B73C2F73E001D1B293DC1F770B6B9617AF5851C0232376D42506E661A72C13D03B78AEE93A7EAAA0CFE6935769CDCF1995AFFBEA094F2621453985F5D5BA281C74227D6BAF8AD822C45E3B0A9A65C9F995AE40B7BAD2A969BA31B0BF791BCF50B34349BEB07B922DEDC5982BE5AACB0D2E2391629DA0C3EB6AE3854EFC3795DCB7AF7EA43A64D1B2C0742BFB6DBA7A62AB01DC9F4A2FB795C369E8E4EBD84378E28BC13B92BB15806D2754B7C4831ACDCBFCDC80F27A29F30731039C403F561B8D99992E3E0F03E6179291D6507794B2505E84EE8013E40612EC5AA52FC73F152A7F2E2C9B9DF47B8A2D98C907CDD2061EB77713B1F99942207D92F64217523B2B73DD89ABC13C7B26492A3ABEBC0067F39DDFB94C114A5B00EF2089EDB8B9FC7BE43B8D0546913FC32EFF2CA3F0B3018EB970028D83FACFB0949A53FED00FE3ADBC6AC58A7E86985A6543B1291127B80244FEC574B94FCACB514A2CDC95FB8FAFD18EFC14AD1D29D30AD8172EF771830CD80D1EC1CEFA21270F4208EE37F4AE53A5B9EAEFD0C824D6F0AFB1D20E4F359A8FCB0DC7A1508952C1B0C045C449805F6A0552053F24AA1727C6B8E6899815687D5D03E1B4F4BE57AD5766A770B5A2EB9B8D61DDFD326B26162EBB5399F3837611F4FB0C1F1C915EBAC205E06ADCD84272841F18303F474B054B86DF05272F7C882ECD6808C61AD403597E22AFA59E41277D19F75BE7D734503013F54FFB8E91ED4F1C66690B132A6F95765F98FEC6317BC679E026BC1F894B37586494B4A6382578698EBDF7AE26D740CBBF063F0AB9D5ECB0509D10F668B83F254F731E4ED3730E75420416988077CB75BFFBFC1B25ED615C8BB3134FD69346000F5DCF08121D16B950F53112D5B5770A836B458CA037FC5B9A6A0FA7D0E0DD894A11085F07645EB03A32B61FE29527C4A5064DD2A10B96A59ADA8C33989EAA21A84314A4FA3CFA267B8CB75FDC4D3EBBE78DD60015A76B91B9D96F3EF2FAAC65A4E9413C36B093FE577F50598421619C481817A0675F36E1B90DB899FE2269FBE7B9CAB9E215508383BD9369205719FD76D93FFD3F25AEED04A87D2B4D46CC79CCBDECD48E2EF637707DC593A1E11D9F691A50DF3653EEB0987909E1E3558580C47F44AFAEB4CB61FB37CBFC05DE5D417A90F6AD49C5121892D5661E290256152FC73F152A7F2E2C9B9DF47B8A2D98CDC6DB0FBCF4168E65F0B433E8BE2886EF030DA36FF62BBCFB93D49CE60CE5CB0013BB4EA2F31256957238CE41305D595F65BE655D76C7F104EFD12289AE3EBCFA2DE16164DF46159DDCD399B7AC373D527E77B6871B7D5E4F7653E426861C8ECB5D571D4581BC90219FE0B1C7EDCBCE9BCAEF232AFF3E9D801EA418F5B4E77B4C24EEB7657A69009F9C8B7AA5C3F6755D8E845B1A04686F27CE3721AD4A901BC8341FDEBDE4B9ED0AB6C4002A3386462C2A534C5148AA8F8F663B23D8F9D85FDD6BC67D1048DE879B19DCF56E43639731751BAAF5F36005A432CC7B5174652E41B80747A93FB375ED9641883E71CC5ACE13BA04643BADE35B0C4ABABB8ADACA0A7918C31EAD8D2D839C35BBD0879636EB337E3549227A9780CE27D7888769B1DBA26BE2B6DD7C7B8918E9C52A6EF5F37BC081A56EF8F01AB93E9E0001BB29D292654419B5D313BBCA6B7620AD14AC364B37BB5F15AE07681EA720937380C294C3422EE8838FDC0CE0FF4043D8023C8B38ED854495BDB982A734BA01D8B963C442A0F0EE3B18E327DB06AA22E06B2FDA115E05550314077D3CF405B0B770950A794FF8D6C44B99EFCEB51998CEED8052BF012E56A7764FE69A0A84ACBE85F549FBBC4E8DA632FB7E70C2035C772ABD52954E6680242CFA8E85D0AC9B3C228D026AA3FD14D8D828B03CA96893A3D19671FD335FBC1D6372ADF051A9C1ED622E6AC3C79DEEFC0CAD6BC738ECFBEC86D845ED968C8F707DD1CA34A3679A692A9BA1D8AAA208BE2511F6CD6B9B24E59BF342D00A3F5D52FB1DD1A8F1D63865D7499F57C000298103D6312187A2FE57D6C91F1DED437C5DAD50EF1BDAF94D7F94745F177955519B971B0E52939A55A6EAAA74423A9685B43C4874F983F92658086CC6046F7B3EFBC3675DBB71F9127A360C4BC22C33833F3846A413AC79412E984BD2413A1E59DF691CB46F76FB75CB277F3CCA35154AB51FB65E64B5D181A25BCA532D6BC67D1048DE879B19DCF56E4363973B4AF7280D43926E10C924283585461AF00CBAD34A70B81C3D1A03472021A24B1B89F905EEB0BBDA8B4C4FF093A132C42AB967CD8487A1F3DCEB8F530E3BC735894A11085F07645EB03A32B61FE29527C0E1F9BD9B2BE9A774A69B1A31BBC6A4CD4DE9145319FA2EE4C0BA3364D3A2D10D7B22248F3F95CB4EE8284A7674833835A624A231E490DFBA3E7A553AE1C9A07D73A7279C10BA978FA9ABCF789D29C851286653F8682979E00DF3D8DE9D3E7611DD46D476140E3472F522914100365BF282DD2935220B3A9CE6057DC86F9CC331B019AF36EE99D8C8FA942AE7469F335B3F5B83A073A318CE695F3986DEA103FF6A7880C4EB5C08817DE703ECAD3F10FA9DC1225D1D5AE0A1BCC7D9FF7F3BB0B21ED55ED599CF936BBD88A6A63EAB3808156E0F1490442D8A40390FA1E0678FB48C7F12B8ADD9C5CC5E8118A8A61DC1602F7FCB0A65591941489CD7727B981A9FBC6AAB8C3AC54ABDDD455544C21CC0E355577E8E53A9BA703D57B83015EECFAB327F89BC4EA2F40E5EA554518E2F3BE294DEFB114FDB6A1FB6F2A33A2BB1340423BE56A6D1AEC04E92801C143755136920A920683432455D6F4B13EF828A6D402F7FCB0A65591941489CD7727B981A90A9B7EFB4CB7BF37CA0B4D505FA04251F1B620BB07C5CBA3691FF15F7A57A17AD4A43883B21B3C6FEFB8DC11123B4B4A02F7FCB0A65591941489CD7727B981A923A9685B43C4874F983F92658086CC6025B793FBDFBA572090556B432181AB57B387D76B90C57F8E9D8AB35144801B3C5D8DC03AA012CBD583BA44BF0E5444F1A3BF213671B9548EC2D4E9A885F1A4870C01A44D99A0F1BFC3ECFCB2DAB0C5533D9B44F5B64224E65F2B6233351DDFFA8814C110F85746FFA7C84B73CE66C3CEA06594D8423336350E6A8C76D029C4D3FAFE16444D4D940D940B696200629F5DB521CD444DAFC01B9DBF89641DC5741883A0C40DD62BE48EC878E4133772F2125DAA48676F047999067583C9C6722B7156462817D1E13CFEEF314229ECCAE38602F7FCB0A65591941489CD7727B981A98CC207739970C8F2937B4A07FC77ACA384F054A17C2A6BCD0418379393223D743C06564982B14D753CCB7829F134E6F09557B191B95F66E76426762CBEE31889FEF3E74932D04119DA3EC992D336C365D6BC67D1048DE879B19DCF56E43639739EA1F4E096DE9FED3F7E27E77D5C59EB02F7FCB0A65591941489CD7727B981A9D3F3FEEA2A9DC17A268BA148D5D835025B4DC7120E7465416BB44F2B5858818C4D367C712CD1B829EA1F9C4C848AE583F317157D32303D2BC584D6A0CE67357E5E61994EE68BB0D56500008D776134575878FFB80D412327651A3EDBFF4BC6B5125016B1CB289CFE641BEC566385259802F7FCB0A65591941489CD7727B981A92A0CF474606B19AF455B0FE76A74577DC9E786D0B6B4F42D54050680EDD032F420DF431912079BBC9B1A1A5873BF7AD259264E5132BD8218A6E21B83D3DF3937B250E21B3F7DC4D8232066990765E989898B0251FC925DB20A5899FCD65AD45B811F5370F1038A6A48BA678ABF5DD0383B18C7D7295C19FFEDABF798E5E8BA255B8B8E52DAB9BF0FDF5977E50D366E9B99D524A0F4C618ADAA0E9CB9D1A002F26523E108BFA77E3EE98BB2A45F2B31C577955519B971B0E52939A55A6EAAA744D7BEF2E2BF0730268D6346C36A7EAF803B980CAF1454D8CF356DBF8AAC8C06B78090BF49A48F81B5A893426FE297CE2B7AE570EF93EF0BAE0B417B89A2D5ED8DE9ADDAADF40D3E576D532B4D3267B5FE1B263AA437DBE5C2B9E8490CD26F3C2FD277625A9B58528E9D31E7921B0B443536574806CFEC4EA6090F072E480AC37381A75E6954C0171573D728FFD4370AA6D642848B685185EC81127A19F4664AF570E43631628876CDBA595103A7FAD5BC02A139A981E0FC14819AD97794432B354D94996A23ACB2CBBD3008A6B852003D22039F09B8FDDB60D427FA655DCD5E95CA26D3F99B538662A40320CA1E4A264F75AAE24B3DA2946EDC1782C6133CEEB458E14049410B8F094BC50C70BA3FC6591F3E9E02294C5B383BE6A55FCB0964F08B98DFC25C73799ECFD0D52EFD15C96040D659F73FBE9F4A8AD34DFAF3C1705F1DCA6DE016CA4A124C09CCB8A48623354CAA7C7C9AFC5E4BE64A5D1CBFCF07FEDA0CF68C859E2427EDB5B2F89FD79F24C470425C8F828EA6458CBF747B7562E97223B2B2C1FE9274AE04AEEFEFB6B9676E83FF646A1DAC29C61BAE6B17274A74DCABBEB4F46AAC46D0D59B4063752DCE4531DF3991BD51F378FA87F1BC0D8F60656A928DE314FCDB764FE306503FCF2BC45A8DE0AE36852B5DFBDF63D60E7397148939FD667DEF1D11D4485D0DE5DC15423BC4A62B48C292E92F65378BF39DF1EEBD6A3BB3058472C2F817CB29EEB3F7A2EFEFC3FF2D7A688E52894C5F7365F758E4122B1380F9C047E028896682378A1853E343F055566996CB5D6C60EADB5C92C7D480467437DD5620DCB7A7AA40331BCEA497260414E5EB6E174FE606D3BA8977E94D46DA4A779359A7A0F1761DC7FE471CBCB6506BD4A5E6B3C9B5CCA33979568574FB49E2A9CB8197A4E206E5CD55CFCA35AE6363B9A1EFC6F0F8C41D1080C2C7BC90F881582C51A7DEBBC418D9E337C27E72EB838608E281291E4EF69C7EDB305C896D98DF94AEC31AB35276CFB4A3D5E3A11878E51A3645C592D26988A6CA14A8438A84FC022E38E34FA15B2653EF129813B1777AB7236B6F5B603405C0C56ED91EB34921B15DA78AAF024D1A726C1539B4675AF8260D12C1CD211C06EC2FE76A6F6E6BE636D211442E3FF8775B07E63394A05E44E82E28AABF695E691725426E4F57C3AD7F102571DFEB169B1ECB64B9DBD14AF2422FA7369409A4D37E1D824DC18ADD3A67B086CA7DC05BC6F1DBF507D1B6DAE06582173315949523C56843E93F3662B0496BA8AA1C1917AD50589A1F766C72E4446BF8FB72AF5B8DD92EF721616B942B893C6DDA9C4C8B637572696DCDD81BB042A8F9CD2ACAC557FD4A450B74F84F54530B63A110694CC13AF1A248EA501304CCBAD1BF299EE112C8F0ED5CA8EAE2648B13689FC3223612C8D608D5B34740A25CAE922DE1CE5A6A0331B59E9B07E2AE35D05DA3DE49EE6217A08439859E6E33141E6BEEE308A39C668D0613CA8CD402721F039DC24A66389F3CB5E9380EBCE93DAEF0FAA6EFBD918CD3DF53090E4AFFD6B7EB3BDA93232C697BA6914D26EEB2B64B5C8939CE94FCAF5323244205DD5FDD2352142810274B9D31BE9FA99FF27DBD6502A4AE5F1D05BB8175570702C16D0DC3AF7F2CAE6BA85E09FC500AD177AD4B1BB53A8CF0CD3A6B5F5397CC445246A20F2D042E2CF5A8095AB988DC3100FFBED813248831560C6CAE7C6A067714DC3AC53D57DA86F68F09DB0E789285D98CC386860F07D80CB91F253265E64C4784E46E2B74CA1C8C6A896936AC1DA446756B502F2E6B9CF2178D339066C9BE085EE8C7EB9A92AA9393000F455F163C270E8E756183079874C5B61D1965E5087B7E527764DAF84353CA9CF263BD248F9603FFDCE2C0D95A007D525993BD1D9944D69EC4172836DC41A9D65CD7C2E24BAEA04B04AEE61889995FBACB55E240E2D29577766AD592B56B0789BDD7FD5B55CAC161D167653EE425818A5F795E62DA6125BAB6156777713BAB9773ADD664D74ECA8942FB37C99F85F0B24573C35E4390C00B56BB63F58D01EBD94BE76D8EE8848805126A723424A4F5846B6C9B040F82C82B1A8E24A5634271782A5B5C75A5D4D374395C8F2DBA59E072B6049CD9851FEE8ED4DFA2658D92FC948726C56B257B831A7571371BE1489682FB1DD1B0438D881F7F8EB7B35A22E7125016B1CB289CFE641BEC5663852598D1B9AF693490AC2D38F2E52B15780F2827120EEB0F36F9256A71C5F94E0485EBE9215E33B05F05946D161B579602DF463FE0338EE27F0D800C66C07ECA9A4230C336423B75D125BE0363318B8B433B36D335C8B9C9271F5E10EB40514874ED72DEF03250AF00B20A426E7028E821F536F16979CC0877708DE98FCD06901DCFBC954978D859CAEBA4C45767703B87D26407231540794FE71F782061D7BA81D097D79369E061B8E8373C7D09E3ACF500135D8A61E5B75533015399D7EC74CE8DBD24721BBB1DDC2D8ED198078FDEB842B3E25F792AA8CC44D1D6C8664EAC1CE2370BFD182B97EF270F6FAE61B7FD2F16403F1B124D71679103E66E9E8DB9573DD96443D2FE51678CDE250C9E644AE7A290EA75F57905716439F31B7E13F1FB0BB3E7C35C783067222ECC3B617BD67BCCA6C57F3AB6BC6B061FB32C487D90369A1639F6D50DF26D7C53351A26843AADFE5D87B30C1A948832AA058D2044F1B01DF1338A7C290BCCB42295FA9794C0C20AEF9BA5B707B7E2437F3264166B1AC7EA803B8F34C7DC2C177AEF41301584C0EE8F7B40D68F36256F3F957B65B967A71A7B6982B40BDD7855D11AB391EBEAB0E578D181D57C645BD43965156C2D779882A8C5577B3CB86ADCCED447B2BE74A97F7C64AD8F900D806ED6C6B3DEB749DCF91B6210A5D6ACAB1C48050B4BDF2BECB4308EBF12D07CB59610B24C84B9737E4E8AA76EF9F50C25ED1A9B2DC46F57FBB8216210A5D6ACAB1C48050B4BDF2BECB430E16EC610D14D53B1EA2BEA843E7C68ACA4D1493B494221D5BBAD78C1204C4CEE45A0054CF560CA3DEB3BC51ECDDFE99250D580A80E1FE6D07F2A33445232CA5F7BBCCE735E2E0D8047969A3BFF25128B4AAD70FD27C9B44D99A525F334194718385FE416805AD86832D9E6EA50BE32C3D579085BB7DD98B6493C25E0A289686B0DE2323A1365EDCBB5F7D4BFFE7A7591343AEA7D3ACB208D208DE8D2CACA0E5B3AA036489299EEABD2219A746165B60883AD764072B0645213ED78FCC5DF68E325AE5DD8CDAAF3A8CD0CFB1340AEB238005299251E9AC31D119C4A955A58CE9576245C44B638CD1E5BF58792BF80421C98AE2E701FA218C1A0AFA308499812D7CCB2AC2049DBE4AEFF5326EC53459653E86696C1965551EF9B00EDA3C698A00245541FFBA45CDA334551C5D791BA2A194F374FE2003EEDC5F5F4A2A078CB21F7F32C71ADBCC9A50EE7ACED604E74C815DECE98DDCF70DA73316E23391C4C76135DC301B03018D899514B93787BE604D70B5892CEFE1679B32DAE02D595F5AEF9FF263230C2C83A98A79AC4F74F292A63BC12DCFF0CE8D73244282D7C3582B745DCD241F10C375F9F765D1F41492FCD0116DC1AE686E5736B88F0B6D690B95E53F86EE35EE18D7AD24A0BC517E5119557C6EDCB559D2562BCDEAD98E63D7E406A5397D5951EBB5841659DAA03061DCED256B409F338F7319341513AAAAF611FC0AE9A233345E02C4F682E18E95CD7ECA7AF6282D4D2D9E8A9C36C95FFDFB947D102A139A981E0FC14819AD97794432B35452414759272796CD27CE6492C6B36400E9CB297A50A1A114D244246CC302C0064871352B45558A10DCD3660F0FD8AAB4FF91B3F2D1606E201930B6D2AA3C74608F5DEBFB67E1AA1F60A4EA0913C764660C0FA64B8D1D0B3F39FBCE6E54D97D26F3CB82EE26853CF2355F628A0B0CE9A015562B9805B94941345BEF64CDC69BDA04789FECE538292322FD7C3B9EA13855E602ED45DA7AF96ABCB880D6CDA6A108808A6625F3EFD2D5B7FC2063134F1E85C5633D81C37450E9A91C9403DA58740FD49E596B8DE72123D1DA81BEF10CD5B427B6175ABBE13CA534D7407BCCF3AC3179D262CEE73E7F8C5712EC4285F2B5B04536AB0454465BB3FD3A3570C77ABDF78A4B4B746E9605160073EFAF2F095CEB8600FFDFCCEA5F9CE1B9CBDD96F814AEAD4C74D0B162B200437DEA981561FF849A0C289E3BB640760235EADA017274A0E793A1782363369CFC3D1127B234E2EF0164987FC41BDC6E926EE671DF0F6AF17CB58D91EF453F5EE4CCBA0A6AC13F61B2FFB4AB9C6049E8B904B9FE468DD1484F7848BF729349A4C66442308F007AB66FC8A10E8D8D586BAD4A8B81B6B43AA6CC48E48D0EFC8865F984E33856742FB418B6776AF92A37A354341E0A1C2C62C27A76541799A4F15E90FF1452001EC58E26E14FC018F43F83AE1564557565555CFC49F4AA76F016606A12CFC91D935F165999C68DABA4651C1AF808278997EDE9C0EDA30185F4844573F10F0D9D297520F522657C3B42C784535CADBEAC69C219F7CF1E412A26E24BCD15AF604BA112DD5E22F644244C348F437C87AE31EC481C861CE582B59B3407DFA00CA2F94ED0EC0B5827CD1ACDC03EDB1D86E687CBE69D033EB4C36CCEA2B7CD881EBB0E0AE7402C02EBD00620AAB063213152456600E4A078FB4CED01BC671B851854EE2FB92F3C29798571BA34AD601F962DD450B07F8B4935F06734A6558664EB65BCCD6473D209D788B0181803FFBCF1FC53651C1945167998770E914F9FD6A9E6D20E7AD714A3C66D937275CB08E1B1122DD4A19390AEDB25CB3A4401E7B77D2B66BD9B2F34711FB756DBA8DB7D3365826AF8CDB12C6FFB775EC5E628FC4074B7FA5C5EEB5F566220B40CD32B9A8F360673F9480CF2E76910B2FE47EA7C364BCBD158833E35860C887C279CFC1E350EDBE1373888C9CA0FD1576869C92159FBE97178294A40A4FA4BFE980011DBD0F05BFC30C84091E8B10736F359C041B03850A5F7EDE25EA8725C7F3E3C64FA9A3433DDFA6FE9E266018B997B36B84A0E73F827DB6C08C93E86BE28344777D2AFFD238132AB8835D574CE9A1EF5BCB80BE9F56F7B03A215BB437166A0CD2A967A409256CA75D86E942BE48C1160279BFFE459EC93EE3C7538B3E7AE8A166F1B01DCF63FD89206CAAF56FE454B9D6D5D51ADD64EAEA6EE5FB89C554944DE9FCCC8173DB52E1E2736975CC251248629E98500BEDDC316C8C1DE9290466C1CF069C6C39EB80885AC5E0C8C7759D4FD2E06CFE1A389E2988EE2CD07F6161A232B5D69AAC893AFBD15C8EC5E1AAA3D8407C6D9CFC9DD1027476D89A4CB4F82C7E6005E3B3BE1A651832E6D3F0B47DAB9F8600A74C8E34A0B17EA74162A19F68705904E060A41046FFE711A090D2C92C95EE33024F9635CC61C6BEFD20AD64F5B4B968D3DA3BF9FC1B5DD69AAAE2F89E66E3D9A3C7E76BDCC209BB46716819662BF1C084BCBA0A237B518BA8145B0EE249A0136CEF181E112A9AE621F078613E7E7B8D5CE1E952F9E5F425300E22B9C62D0AAC3A7BDB7D0CE497D158B8802F10ACA99B2DF9691FE3185127B64D4081E11E27299BCF88B8DD3B64A921B0F24A09CC571005B41C76F8BF4F0D13F9C28F0DCDFA7D05309FA8E6B1E419C472EFA785A4E44A3F3719955B0331F7207D174CC9987F487049AF927301802B12667057E260F53CE5EF4F8CC845CACBE86E3AD6573EE36BF2625442A59BC57B0AD82AE28D0E29846F3CD9DE0A1E77EE99491D9E198146FC4F02CC45424803155F536015D698FB092E7AAD38891926E2279139C906DBA59CEE4E741C1B3C1BC5E00FB75233705B63934B7B4DCE5101C6D2E40D14755F356E4AEC3563B944F4D1D741C3747AC185043BA18B102B698E95CADB19226861BE181F3274223F9F23BD175E90DA8FE2193012478AEE0EC6C708CA7E0DA540D6A3D0F6B1B037E07DFF58A0E4564B2F311C0FEC16F2C1849F005D5A2A138D88F4C6D5064AE021A3DE96EBD8DA09D8311630AE0CA6C7D8508F7CAB060F8C7DBB0B36644453A2881CD6A7B5DB7C193B977AA7014A4C331C754D21F205E62923E22ECDAFDF5058942EE34AD9971F6EB0567949E00F23DAD36A531B1546894317D32702B9BECA963457606F59E68926F0CE72B0A9633F16147935C02C449F9F959755DDB45B114C574C90172F513C5093AD3D35CC3A3151E65B9946B8B5288A89E24CB3B02C030844F593B682AD283D6DF8C343B5A98177EDB44E2E56C4A6CCFB929F7B7163285DB7001FAC759DEC5EFB6104BCA8EA50E97ADCD094AC08379F75D39B88F3DDDF578041996E0AC12FC998B1C22D3B00770FD1B8B6F34AC2233E9688A437183101CCBDFDB51EDE666F89004938E1BDD4C4369058FD7B993B90E9C483AA9C42AA3091E1FFDE2A69C8CB96C39ED2586FD26772D8C54DE25BA7290272AAF946A903B078CBB4D14B517F209F9AD7164A0BD31E02612D3D342B879D4B4C03EA196D6F26A059F375108654842E33EA84C3DACBFE75B6C8EE2C7AC69492DE261CAFA8E677C1B27C3DD88C350B0833A9887E4DE9A4CC38F72F2A6E71DF5038E1EBB7ABB6CABD7ED458CA00BD452855C02F517AC999BF94282CF334713DCB7273E6C8F077A35D9212525C6E1BEC78E7103A00182D5EFD0B1292A179527E25F705FA7662E554AA0D684843D87675CB47CA12350F841E10855DCBACFE083AE39BA5E071BEE5174233C1CF8A703A8F2D737C02E3938C6EE1932A312ADCC08CA489F1E6261480EF79DBB8E78DBC50397F01D90D8810FCB3DB2C5AE1C8089B5A1BEDCFAB6E29A23F28B6F2B593B7CFDAEE43329E8F90C2281FC9D38EF1456D1C0601A50844462F4A0F9EAEEBF8989961EC25C8E48946690D2610E2EF0245B766BE00835ED230B86B71000C3A9515E25D95ADCC076F85D0F0783F557F479878328AB8E685B0C6E98A7BBBC97DB6AD9FCC3200C71A4B496EEA6E796DDE701A66206273F8B19D8E689F2A6FF1BB6203837415C038757C65D06A9158D069B08585FB6B6895F38A2B5E8045AE88D55E0E702722E9141BFCB6581F834C369D1F3DD7C4ECE254848D2B507D500C04FA9A644B184782159EC80354FD2FD724F531198CC782A1E34C0C1F5F001EC232F7364979FF1632497FD6C9FE806D024DDA77E92B9D5CD8FF0591E60C939F4F526837DF3E311D67E4CFE1DA8D505116DF401EAFCC86783A4B954823BA9BD089EB45EAC381968781D09EB214955C6F5305AB209E61A2593A31E282F3FE2C04C6FB0D738FB968458D1EA267F99BFBF6B280FA2568DD1D6A2D80C3A3D021F5940004D20A38F1E85C0DCF0B3D289AFC834956E41E50490F41BC41C6E0958447E1C3DD07D6ADA4CB2BF4AC11443F5698588DA27239EB2C01627398C8252403603AA224843928DB26D783347822707BDD5087B9CAD63C84A1E05E74D40D2C1BC324AE951C59A26F55A9A1022C5C76281CE4BF5B96EAB67063F5F1E02B5CE96AEA9033C949CCA87E8701C5E1D4AF8943E9040C0F1380E801DDEB679D356EAA1C9184564AD94E8AACD98E45163F03F2AEED789F7FBC00761415AAE2A331569853778CCBFF134671AF7A8C015628326BD20ECE436C126AFD5A73F9A649E0651B25959CEA30CDAA5B9222940203AD0DD25F9C6FE5FAE5E1AA4EB277678F0B6EE9EAD96195E1A443953664C02DD871A050370FFBB2AC9571744064225391309919913851A3BD1799B8C0333F22BFBDE47B05DA3BE3801B91CAAF95258BD1F743D39E6C6F11B2F363019F224BCFBC967CA677474A25EACFD7540D0759E2072699A657F621F25BBD25A95402CB3951A876FE114947DCAA035D6352349C7AF97194DCFC188847F8794EEAC4475CAAC4BE7921455979775669B51F0489643AAE52D8AC16CAD92B26EC9C0CCFD16FE0D207CC77A68449C971CDBD999FB21448312FA62A08A50545FFB9BE392F79C37CBE2D7F93E33D7AA4B4AA806309396F2F4DDEC53361FC11D874140C34592D6AAF3ED7659C6CC3394D5EF943F5F5A9016C90CA0BBC4B5F51E55BD0A1E2EB0AD44E624002CA7D8CB195A4E78C9FEF90BA83E613E4B1D563376DD12CCF257D0512BA9B7B9AFBADA306D0E34CFF6C16F3F9CB5581946AE746434067AC9D97A37D4CEAAC65FBBBD605B6555678FEAD1845C8A95B458373014CCC0599939CB50D74C4EA0C87B85D0515CC4D55228BB2928A6D59892ECAAA26006FC924F528AC42FD273379927AE472299D3CA24C71D531BA2DF833FBF5C4B404C178819789C430353EE2A2A3FCE8815F5F640650E7BE540D28817156F8C301B0F45C3373FDBC43A615B83987EAE6C722D7D1141E26F67D7C9698F4D8DC7EDD5E1CB128E2027F1DCE2219562E857F44B508AF20347483302FA7CFB086821CF4DA534504FAC4C3FB6B2A8F5342916C08D65B1AC04E30B16F5CDCD5678B339734D1FCD6EE0FBDE39060E08053390BFEC0DFC4E06454954093182538A42A9B098E7ADA41A51175DD8353D117E3B4A969643C186B8AF071266F8B0CEECFAF0AB76A8853D79C216524E4776F5B45A35ADBE1D526B9D93A425360A52AC08B4792A89251F1265801DC2EFD2D4B9B460FB615B6EAC6C0C5E6B5F2CD0C1DF0D20EAE796B8BB25B3DF4A639A95392B80EBA2F3AAD054C74A1884DB8A5347AFE1B9FF33CBC33CE4D20FFCA2BB0C7F4A131C85F0A0A091E26F99CDA40789B9906C890B90D55CC9589FA360AC35F66DB9A6FC8974FA836F30A3EFB935803A7847E324E6F1ECF54161055689160BCF07A0D0F83EF7422533E2FC340F553DF0F968BA5D5D339E70BFCEB41A6A2A17523C6C6F586A7D506442186D839F64D63AF74D93AABC4BAC05B751D683669E47CEC57A873DF7A31D2ED18712A9CBB98B8E35FB739A4F4CF2072E45F8A2885BF278BD0EFA275250B6901328AF2DBE07EB36AF1A17B622438A2A14B84A17E5AF049064EB2EC5791E0221D95B8DEB057E778812D095063036E0EF9392FBF11792ACAC14892F84E5D0990B727EE9EE58DB88B6CBAC22FF24D3F443D6F73792A41F87AB88332C40B61B3A4288FC88D8DCCD7FDAA042C62CA74D734294FECDE53EDDF59FAE9A7FE651565802CC957C8CC6D1709AA7C6D236605400AE4BDFE19C5BB9BB38F6B990A9F57F17253E623990905244E373EBD5D70A8106CCB68B3CF0326D92916F5B0F5A6CD00F7F13C060129E9272A4544351A073D307E990F627FD99E164108991AE89C7017190EABF0572747BA2673F7CFF9BACEF0A5E73E66AA66AD9C605375D122499E7A60981DCDB7544AA4ADDBB9D2806A35CDE65FC44DE0ED40576CA79023B6E4D996DA6A4823BC2EB933FB27A7C239E00B742209A7056E7982668D06F19AE0ABEFD44FC3EC15A4DF7BCD4F5BEA60802DADA0E8F72EEE72C005603749F3A9A3A675E7660C21640D647FB7A2F68E0280A43C2F4E16C0B62C1335B6DD9CD22A431215E7F1736C3FA887C3023969234B05F57749D721CA5E06A4022033D3A93B071287743AE370D560B3B05FC92B7328BAF1C81D72351CA05EF5EF230CE59D3FF7EAC2124E9720E78F4C286B592DB1B4536BF502C77B8F868582A2D059B8C4E5499480DC74B1581AF3C847D99CAABC7A277963A5397F0F0E3E1A5161134ADAF6BFF2719641394DAAA656478FDAC8337BBBB5F694C9650170D26F200537127A26CE5AA66E525BDB774CA62088FCC42FD2D700DF13440FD1F05BAE3FFBA5098F1B7CC28120639569AD1B4DE726BEF0EA6453EC3930F87A612EAECCF9BEDEAB231920D62916A22489A924E52A18BC66BEF7F125D4BA54F064F4C1F1090A0A1F3DA56BF843815B59DF8C8F6ED4CA3A2226F3DADFDAF64DD01189A98BA951D6EAAFE009694A51A86EDE9BBEFFC2F3157EA077BF3148C669E0D2BE4AD439629B469941ECEE71AE5686A850963FACD34B594029B8DE939D97E73AF9CB396D0CE8A5DEE1E142876B9ED482B8487CAC7AD5367510DD4F531C6C4E1418A1B1031EBED7E3A356771608C6A91DB9AFBBA55997B1959B815B344B465CA4C1D2ADE976F3AC6B764F4BAE21DCBED51D2F5BD16AE309FF92996399FB1E50BC2AE521D6EC2ACF1F93EFCD511A66CCFB2B0C8B9445FF5FD8E774E409C970610379AC3C22443EF82EF87758759A506796179D72F227911DD942E9C00AD8C37C7DC7811A545373EF103059C72A9D1A3D6CF3FFC6C64C77CE6EA687FD14AA8BA6B052E3FC07FB8C39BF7045076B5993487E9F4D25E2D1FD82D0A51FE7895E4D0DCC27698ED42F6BC56F6AECD2A3979A141275EDEE8CC02D2F829F3AB3F4F6C71B9BAC2DAF401996E613293BEB634DC4ED8F206D4F23ECC67954DB3BFBE041158C0B5FF055E51FC087150632FA40B18CDC41B715502CD0071FC98E660532C44340528B7D8252FAEF8B333EB8B46998F5DB67EF7A93AE400F3210F4FD6C3E3220CB35F9703AAB17847223A9BD8BAD1FB9BD049494100557F5EC90CCFA99A95C695BA9DC2888FD9F3DD1F3FA9908E699F02F8E34149E22963B8235B60ECFDF86DC7A03D9AFBDD9A7B55BE142AA9B54D68CCDF647AA441B115E70218C32006CE55AD91A2915D33317E8134F49FEA1DD6F4EFA0110B4862A7C18425AD3EB2ECEBCED908E4F13F9AEE7C9AD53300E0F01542BF7B7E5654D133C43CADE22DCF0257DF572E89B5F953325EE58646D8E2FB5A928400F767FDD794484E0A3483ED34EC6D9CF835F898910527A0003BD3D7699CD22F61E4479737247CBF1D91EEB0ADB38C7E6595C10045437090A3B20D3AD3A36BDB9AF75CCF6CD6453CD7665645D176C3895628C269DEEA0C18B0F0A78A5AD2CD1935835A62A9D53E49F00E31B4B9ADC7F7A48148657C441CF49E0CA57FAB3B6F4508CEC57B3BC42A3F04B076020D40D896BF3E0604237E4A7E661B7BDADA2E7B55DB294E88810C369739D3AE502405B5BF819315FA69B7B1FCE5A1C2C292BFF64639D0CA2D517D91DBB0F3F8A92D89AA3A315EE2BAF5E26DDE82AA332142AB0D5919DC75880DCA8F69E113DDABC635165C933285F118C7CBB8C1A9F71D7E2ADCC5CE52604731CBD6E6ABE886AF1F38E3EC54E21CA4E5F2D73D39DC9A76F1F8A2529AFC20088EFB3AD3DBB2CC00F609B56D4BA2D4C692D6320940B172A946C02329820FB99CD61AD1C938C96E1E88E8C7885D288B5D35BC0701E1FEDECC61808D486C90ABF38109EE0D3133D4EC2B50F0762BE8778B8D9CB9E8BC93AA16131B5722AC9E2E8CC92E1B461301EE73CAB9290F5564D6CA567A15FE408EB63330E6E71C68139F34F9BEE5AA43C09D4586E8ED13D88584225CFFB3DC636BAD330A14F628D406F16B15D8B34C4B66570684F1186C4D77EFE0A1B15B7723B2DEE59722F8239469B3C7AEA53FDFF2ADDF7348349795F5BBE2485FD1466D5ADE2265D6AF775DD03481B4B8D645DE335D3562E93A93CFEF1F1DA7E6B964EC6382912F1FEEE36053582960B13CF36BC20CBC31BB4406E7DED085006FED5D91B7AB2A684A0939325302B10652E4A4F29D19B629E65DC0B495970419237FABEBBF313CF0D3F90F1DCE2B6BE18DF96F362ACD78B23A156529891E0526BC351566FB135F3461AC0C46C91B23331C8FAFC886A5DFC27EBF8B8D8BE733398B894A1CA4F2C1B09610E1EAB2B5CFF674AFF27A80D63F4329D79A18579E2B873C300DB9CF226BB89925591B79DF9C2CF87886FD7898C3D545C6DDF38B8628D565E08CCF92040D0A261A430818C68DE1F1D65296D8AEE79BF7A3C00DDE2DD1215BF2F03E732FA4E92B9721A2CA29B284EFE07EDEE8462EFD997403A1D4DB6A6672199AFB870DB2BA46958055C508FFBF13C77A8FF93A88F18C78E692771EC7F3AAFBC9C9720ECD883ED3EB4DEC66BFBE3B83EE27DC9EA3DB6AD83030B826A1C74C67450B7726BD358EDB53B97461AC81ED299296668731E73E76BA3F65ECB46F23E57B4897027A2CBC030FC3546FD950DE96C75CF1F052EBB36A8EEBF48119E87C5995AD0E84A6815B7C903B2FAB897475478499ED821C972AA305EB3778D957AB11600D331C90682C3D07669622B05492940DCB194844E155603D45A0A791FB2C9ECAC176DE2B78BDC8C838C113E338D673848CBF55E8781829957487643275AF62C9E6B630B9B21CAFA507361D8BD39D0F5E32BE3B0D2EB820F4D06B67A1819DDF3142912E48F685B75583755982FDB530BCF29A1E2EE58CAB1594FA5E931CDC52B4FBD94F55972B44D123D6E26AAB1F60AC9167D579EB3810619765E13157BFA39AC2AC0BE772CA0EDD82F561CE893167ED4A4E61808F878B8CE364D36E4B3D1538B7DEDED012787609161EFD16AE65B389B39552DD1ACD3BC55904DB90FBCC807BA468A9A7941F861A317D958D089DE00BF376711295D4C96B6964C6870AA2B5FB78F726693E5220AA311C7AD24BF1D0FC50C7EEBA0B286CBAA1D3511326D76E4934322E6ED26F268E03E4306AB8D670FBD1D304B64209DE3F267E2996B732C07032E6787E5636F9409E9502C5B1B32C267D5997AE87AD6903F38BE9ECB0EC6D0F2E495502BBDBB9A4CBE12DAB09356D3C69EB074FB648AD1C54C277FDE4069D43C6ABBE5EA5E6AD483C16B6C3222EB499E053C77206F9C220C51338E31EE28A98A219FC1DF57DB399763883E6895DFC3C7A832DAC4A43F6D531ACE173740520C6A42936B21234948B31FBBD5A58F1B8ADAF8540F0E428C73676D4E74DD131D8A8B2369129AB146E364375290A1686E2A4A865C5D24ABF6658FEB50F18C3E45C0139D35AAFC523D95E0E06FC06613A7A764347318E1552E7C3868269B7C1697ED0148376F1F7B070BAC5B0E9ACC3A90EEB234124EBBF1D19C73447F7DA0A302BCEF9604281ABFDBBDE857683FD4B6EF613DF24154D34FA40F25837B471C3EB4EAF6DEFF1CBCB765F11D846BB684E816D93B2ECD85ACB3E9D1333EA84D8D224E88A78F6E67468341B7B0F23AD5C80FC7C72157EE732A4398AB95F395A63D5015787552F548A11DFA9BE245F1EE813CC7850A09EE035203FFA3366F0BC70F00367C85C695290A134BE6BA1EABBDCD1C9B4E0C14177BB0541DE87033699B0DEDFE5523CB9DDB331AEEA5F6BCF4BFACD9866D569AE43BC4C2D18C685C4FD132ED5920959279EC65ABE2B23B68FF349912D568EC3CC4AF6EDA4FC3561C9185BF40156B22E5A0CF195C8FC891C43F560BEC196FD760FF8964D332CC6572E91AFA9498E78E8ED43E4248B7EBA31952F7E7799D647A1BACBF106E0DFEAE953189DF61B1C940BB65AE1B70D1D9A510BD8432E9AE6025D3F531B6AA2EA77CBC49186BAC7237A288FEBF02304EF0B2EBF6273AAC3895802FB0E614B5C9E73167ABC2E833CCFE885E4129663F23E9A7ECF3D62F2583BCE67304812DA64234137BF67C4678B4E7FC10D5BFBF478BA29C1729E64231ABE0F611BFD9D40B48B99C37678073BA402885ED58A9824663F8DCE9BFAA709C473CFA28136926CC395F675EA2F34E9EFEF527279DC72D1964AC1B1E45C7F0256AC6C7FB83BE783CDC4317C8C7BA70E02F072969C3AA6CBC0346DA6C3B100E3BF60D52A4AEABC809D9BF55B74A51DC018115790BFAA5AB9FDD5BBB7CB0BF3C47E9A4A9AECD21ECB8F0EBD5CE2C06F262EF2F082DEE76B1253010BE670FA67AFF89059088AC776D30C2A03BCC612A6AFE0CC9003F435A34987D36D1F9DFA105167918BDC0B12D007DD96B99156F518ECF92D99795B5E0CA7D58E977CE35F87E8F6EA57663F9638A32E8D94EFB242DDF5EA767BE5EFAE3C2C7FCE1F16C55060A7D3DA23212CE709BC337EBE6C4DEABF60F7CF6E3AAC49CC561BF1759136009A454A2A0E5E665194E0063B6E5FD3983A45CDFB10D7F8119853804A4C3740F578E83BE95329FD1778B169BC94DAF1FD10D5417FE70011D4329B615E34C72F32A4C85AFF4E90028444EC41DDC9FE1E3C7964E1307A9457FE4A14DEFFCD14324C11BB3592529367C0CAA7AFA9874B0BA51140040316EFA4FFE8422B38EF5943D5E96FBA920CA7BB76BF7278DD9E9E95378E77F9AC079095032FF70414B97FB3D795B2B769CDCF1995AFFBEA094F2621453985F4DA2EC2D4F1E5F14D5D938C5E85B78F8B479943F3D93E66CB464536D2F35560448A7DFBC8D824BB2723B6EF271A681D85BBE0DF3433E93708A17EC56831ABCE174FE260C99E49C01FB11503B6327A8DD2E202429AC480392C0642E3A4ADD2DF6D3FB7D7622A8E23F9D082B6F2816A53E5F03614BE7665C093C9F9391563ACF934DAAC84F1C6C908CA83DB9D67C349869AFB3B6AE5384AA3E04E522874FA18D13266563482F795570FFD1443EFFE14AF86391442186FB7D4AA45EC5F9569C3D6EE38B35BF95E7354E8E5F40D62E35E815714F8730EFCBD9B064437B96E4322AB96570E225E45309A237B57BA7EDD37E73AB49FDA7820AC10DDFF2DE47BCD7960F64E9B2403BE63D50347C8D89A66A090C05DCFE7892F87D3984B64906934ADF36E3DDC3B664B350E2AF9157584F09B0506901226F2C566B85342F4BD1AE96446F40AE873BE92BC66A0643DD8C9286ACC8655B4C767377098B2EFA2D11382C0FD6CD83E57C7204F5A2BE5C7172DA69EBE79033DD7A30448C28B4AE78449A041FDC9F3381BA5E7A2FBD48F6743F487BA59C55F4FEE2504AE6D0DFA241801DFE79EAF470EFFDD4795E75F061DB6C53F97CCE537BE0ACDE2DBB4858C2F62A4313251D7502C145CEBC430BABC8922ECD5D1C2B78CD08820C8AA619FE98A1B15228323A392F523F1C7C448CF025CA57B58B532F6ABA0948AE3BE921CB0985C8A0394F6D8998E271F7E3BE9E707F4F43219CF3527008B126F4DB85983E83414919FB1882FAC4516CC276CF5F67D6E048170726F78BBCE782F6162043573FA8F3E3D6177173C9FD9052441503629C4D4EFCE68F6E3E967CC19D92923206E49590C20E4E5A38A4BF71992953447E27FD8FB4928E09FB3A9E04568162B0ACC8BCBE37B201CDB699E9E1F2269283B3B93FE2BAF621E4CC434C1DFA6EBCB58268958344D684CD40316EFA4FFE8422B38EF5943D5E96FBA920CA7BB76BF7278DD9E9E95378E77F9AC079095032FF70414B97FB3D795B2BBF811C9A99ACB8B32A9F904AEC602FF1E7FE4DDFB85F737F3E6BAC095E6E30D30FFB58CEE8C00A2E20B4BA4A1C6C057C6C634A675B9A542D5FDB862F92AF0F2A3DB5E63E6A747990B39898F4EBDC9DE7C649C45E1D0FC0098EC64726E929CE620A875B4B98539CBF6EFCA8EF192CB90FB65F9196AAC1D8A99CE268EA960B211D9A694B308C4EB02680C19212769CEB109E71628D4F9442FD076A1AED785263DA0885D0C7C1EA93D2C1475C402352F1317088507E0E4216F79CBE4A83E02456287D1400208A9EE8E1472508DC2715E028508FDDCAABE0563F3C036A75B42969F37C0C3D4C29F5553AEBA773F20D5112EA447E390667294F39EB328155010513111C044FB066263AFA6107F3C069F981A95C8DAC20A4E8E40E86B3135DDA286BF6EDE2392A7E71FD027122E2BC3EC5BCFAB833DEB56E77FBAD9F738F7032C6921C51657260C2CF05F3D1358587FC56EAAFA63ED0D2394D2B69FBC6C5B0F34DA7FA6092CC5C318705050C7EB7ED9E158E9599C53B36500027FEDAF2A241C530F7866DB36A0BDFFAEB74504EB0363FC783DE998103C3421172B4C40CC7B01607EB22E47C24D13A0A3BCF0739E38F359813808EF71255E01B90A0AFC619464BEACD0AA8969A2248B2D738B059FBA4643784E67221E6D0C6142A83048D7366E5D3D180ADE9E95A79EDFFDB2B892AB7B3A2F25DE0550EA4B52E9B1C5E2C4F65480B17797F28493C38FD23F3EEA21162E8297B86E49B5283477759DB53E9AD4FD869E7507C60876942968DAA8DF9B7808EC10F7F9C296F862038F8A1E77FF5E3D3A9309DDCF6BBA0660D19B292851FF123712D1E51E9D2F7616A8098D9DF00B0BCEBDD1E15BBFD68CB3C92707E190F7881BB9FCF928F8536F28C7804A00018AFA9BD1937F38BDD65B176BAB441D727C4D3071BDEFC170A84C615F8F53B0D42763519DDB491FF871AE4AC985C9647861FE883E2A0C5B24D02A52A639F8881E095FAF9067F57D4094BE5F2E0F191F7488CD3DD93CA1C5082B6956E6F62DE3061840D3FD8FC3CE5DBEC65E3989AE612D6796FF907F1C6A1891DE2235BB073CDDE9E47588FD4DCF6BBA0660D19B292851FF123712D1E771DF77A062186EDB5F7F030303B19D015BBFD68CB3C92707E190F7881BB9FCF26B2AEC7C1B95C2D2216CC6C134619176DC89CE3D25790BD0BE8E612220D607D52FD79CA26DAB4ECED9EBA35C3126E098FF81ACE1366037AB8D0C81FC87C6AF0C23627B5967B8CBBD27CC6C1A62EEF6DDBAF2F0CCB2CA2609AD9EF3C6EFAFD5416BD7EB16DCE8FC6E2FFBCB0CE080343C8F3E69A6C2C1E7C8FA67429E3B47A24E6CFC8476676A0EE5B9CD485A7752FB9653574640293B018BBEE15D1830C17D52E8401B67BE62F0B075BDDE27A922B45352ADA1D0A0292657CFF5B4E6BD6DAC617813C38D4A65A12C58CDD9FCC6A3953AD27274429EB34EDD58DCB0099E67F1B742EB7053B262155F1FD47E92B089A359E76C4D285AEFD0AF5B3CCD41BF7BA5DFD5CA9E29B212DFCFC02ECFBAA4775EBD5E697934CF243CD211E611FF9C54E2B43A21C8DDAA35E923E92F32CFC0F44A168E26E308F0D5C660DF601CFB6D9A35BBDCC16F5CA67ADF167F35313834A4CC8F7D2FA689C01C71D049E4856B1F10E79B35EBE3139CBED5AB4D1E685596BC92DCABF8DCD54852139AD03C811DF81F8176B417154C47F87EB13B5C783B0A1BEA70C6394F28DBC1C934F098FE167E1DCC7B695746C15E47E9DF2F390EB7ACBACE327EA0DC3E20A2D4E7F657D09E5D3CFAE463CC7CDDF7E38A978D5D5AF35B98C910DC2C79EB3A53B750C417C6C14AE6C16FD611B2A9A8BB91DF3418CE7EB7BA87F8B2C6FD26D1019E39DDF5DA802837457A98C9DEE2B6FB90AF4068DECA8F5E8B2AAF48645760584C602AD3BFAB4BD8369EB0D958EBC89C0FF2C4A73FE1CCAA802370863CD24ECB0A0A4933F2F02B5A707B5FBA9A778391055FC70CE6753DF36C2D62D49C91F62DF6E42DDA7303387E463C2C382A8A1B430A6262BD6C9D9838DA67F3631E7A8EB41E360F0CA190DA43C3AF195727B41AC51DAB4B8E2D6C58D242BF388B7738FC09194DCDDAF1F859558FD973721FB9F6FBFF748650CE4F2D12BCBE241C5AAFD717A20B80F6C5E53D3A5F50B8463A57AC39657B13D410BF975D5D65494648AB8826448E3053038D475CE42F72F27BEF2E36033F12F96AE8F719B1F31CE6AA346AFA23537D743DF5C430E96E8CD1F6CEB50E75174FA04A7AE8948EB89D46FC9BA233BA4AD8B9C57E7B357B06A7ACD29C8AB7D702F7BF18B990FECD15A3BB2AFA7B415EB09A3F48C341BBF7EEDE24B339C8515010E0C4CCAFCFBB2813EFA9A84FC466991FAE52715EC4C26A7E0E0063917E5BCFD96AE966AF846F25EE04CD6174E649CA7B8A52B803D3B4C26A14D4AA544CBE1D12020FF078947879C1B6D553545CEF2BF28C1807EF7216BB6DB3388F97A8DE80A5B921AFAA5D0EF8462A9F6B064E1186D3AC5EB012C28C10FAD0B58CFCAED362E6B9B6C47A7993602876E780F4A08665F65DD3A4C6B7BD24EF38EE86430A80820338ABA932A22AAEFE25D7BE2E2DC0C7D1ABF5055C7F52B63A2D9FAB474CC49C5F886890A9E90C094505635EE7E4F65C1C14B0410D1A14527679F0C88C11ED4EB528C3C7930B1D093F43CE6E5562A14F5CF151174AE14B98E90D2A8115BDA20174856B71406C627492190E8F8CB8346D5796C0BE39A19396A62521F19A76A36C0D7A0816AD5ED717B33EB742904C1E980BD425B3C936B3AAC9BF0FEC84369C8EB3ABF1072FF63AF5E6E8CADD00F0336624AFB714ACD524C0594F3080ABBE44F197BC6AC77542D4FF7EB10092227615640A3C03258794D96936AAA34CF32394EF04E29EDCCE2186081421BF595FAD4E7BC9725F4E9789C09E067C8C6F2F0C80F13FE43764CC3EE9A0D813F4107CE388CD20CB76298693F6D4D6CE65BBA32DF9B80F6FD32B8D53975A2B20C96151C63EEFE7EE3458E32942DE4FC775C3AE4BCF7AF90BD6028E5AA9BDAE803DB6C023589F664903EB889A8EF1BF27EEF271DAEEA0E398F68AF5078A9D33162503D240DBD16A8A8A7EE078D612857938A53E91DED56EBD9DC0E757F88FB48DEA48FF701406004461A9AB5125F189D882349F70774ACCB4D45D9DDD20329E4D856A77A5E644D73AA92585D2E286F41227B95AD050278E206477617DCE3DABBD72B81621D2BF3B8B44BC6FC55C99DBC610FD4630B9E868455ED5E69CCF18F48E90C6B2E613A06651769D0BB31A879A38C12A85138834043C6545A85A8E8317ACC7EBCC0BE492D7D6028E1BFD2BDBD1D515142FFA9B9BE42507DDF8CB202A2B9B6E8E13A61D11A13ED54326F73CE6A28BF1803B4E9758B07D19D9D30F3BFDEEEB79DD51B4D2C7A4D3C4187E8D402AF3B5F103411F992722B213362FA7A07619FC7A296EEA585382D1082C52E5C4EC703F3997DDB14745DAB7CBD9EEEFB4D0CE5F01FABDDFC31A9B0F0D7A8B2C791807440786E6D7E9A94EE6D67FCC70F40DCCBFEFB12951986159254BB422F86A54A5889BF871043222858E51CA4E41A8EC4487F5D41077DCB856E73B9410075D761E6613074AF1E00A9DFA7DB9146DB9C4833730800976C3AF55DCC50E70D52FDBDF082BE30BDA4AFF91F4FEF12C926BBA928B4F44E7206F2A604A80D25F49AA6D231FB0694AEF6DB4ACC8A6CC9B969581431CCE458B660F205CA117682050494324AE3EB758049F8EECF4A3073FB8FFEDF54C2420ADA9520BDC946112A64908D4A072394371341A42DFED1CCC2BB2BF55AD6138325F46FE8B8B61ABA0A7AB2679E3BBEE7CEB18E93FD5AD0710AD9B63548F268DE94E7A32D5BAF57F8E9AAD87017AB398FAF8CFEF856C4F376DB77B30F1E79E7E4F1D08DC72F0ADC6B8D79F7E1A9F262226758EBFF31E1011E02A1D3374B2C85DFD6D28A28984A84CAB3B36C07D589D48A1E59E0C0D4AE81B58EFD6C13D741A10F91D2FF77F33ADCE2653D96CE25A95C8340C1766D78E4A951C833D0F1F1C0C037248262EB18F4942D8F0EA40AB94A409C0854B3F8C078EAFA7E7DD6C2F4539B9076B150FBB4D8DE7D6E6D8AF0EA0AC821B1BFA57677FD1A2DB02AC05A1B306459D775DD67DA3EE957C3740B6F777D198B88A27CE86CB795FD742350A7F39F5FE058B3A382D1B8FE121EF236415EFFDEB739B19A6EF285262C1F0C845C9A7B1FADABA3E2E87AE3175A1C610FFDCAA148B32D726D741F7DBB8AC0D0E4D8BCDA02F6F44F1A2171999237D22EBD42977D2C4CF4E1C8069E7E7056B7A9157AEF4E0A3AA6B2673054ED50D7ABAE5D0052D08DEA4E7BC834DC440F3E5F2939DE72BEA396D9F4EDF8D588208271EF89199E28A74BEFBCEA0C66825FD6AD76A88D302E6C9716EA883101DC8CFE5AACE738A6C1F33B633C5E1869F7CCD3A26218965E407F661E3B589A2633F83EF46BCFA25785252710C7877DD8B93C9D0A28F1468AD3AF67C98FD20820AEFDF1842CA880390F22C7389D6676D77EF34203F024C4DFB539320869FD1B6214A697C5E9378B7E63B6F38A7D55CD9F5B5139A7B79AB6F3435DC2D7B432C3C325D604019E22CC16FCC52AE6E5C5784212309D5935C1DBC11B2BB22AAF7855B87131A2BD4FEDD6C921474CC89CDFCE7A8C91A8D49E7F892A78223E796A39C5132093A66BCD222E74B48CAD76A4A00551B6C5E1B3E9BDA986ABE914CDE65ED34389D4F601F73137A91F37EAFD91DA4F8BFD398ECFD423A930058CAF529D3BC7320EB6B6F7E18CF15C44986BA1CFDEE84049BAB3C1BC74851BD
\ No newline at end of file
diff --git "a/spider/catvod/\351\205\267\351\205\267[\345\256\230].js" "b/spider/catvod/\351\205\267\351\205\267[\345\256\230].js"
new file mode 100644
index 00000000..754e204f
--- /dev/null
+++ "b/spider/catvod/\351\205\267\351\205\267[\345\256\230].js"
@@ -0,0 +1,356 @@
+/**
+ * 优酷视频 - 猫影视/TVBox JS爬虫格式
+ * 调用壳子超级解析功能(壳子会自动读取json配置)
+ @header({
+ searchable: 1,
+ filterable: 1,
+ quickSearch: 1,
+ title: '酷酷[官]',
+ lang: 'cat'
+ })
+ */
+
+class Spider extends BaseSpider {
+
+ constructor() {
+ super();
+ this.host = 'https://www.youku.com';
+ this.sessionStore = {};
+
+ this.headers = {
+ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
+ 'Referer': 'https://www.youku.com',
+ 'Accept': 'application/json, text/plain, */*',
+ 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
+ 'Accept-Encoding': 'gzip, deflate, br',
+ 'Connection': 'keep-alive'
+ };
+ }
+
+ init(extend = '') {
+ return '';
+ }
+
+ getName() {
+ return '优酷视频';
+ }
+
+ isVideoFormat(url) {
+ return true;
+ }
+
+ manualVideoCheck() {
+ return false;
+ }
+
+ destroy() {
+ // 清理资源
+ }
+
+ homeContent(filter) {
+ const categories = '电视剧&电影&综艺&动漫&少儿&纪录片&文化&亲子&教育&搞笑&生活&体育&音乐&游戏'.split('&');
+
+ const result = {
+ class: categories.map(name => ({
+ type_id: name,
+ type_name: name
+ }))
+ };
+
+ return result;
+ }
+
+ homeVideoContent() {
+ return {list: []};
+ }
+
+ async categoryContent(tid, pg, filter, extend) {
+ try {
+ const page = parseInt(pg) || 1;
+ let filterObj = {};
+
+ if (extend && typeof extend === 'object') {
+ filterObj = extend;
+ }
+
+ filterObj.type = tid;
+ const paramsStr = JSON.stringify(filterObj);
+
+ let url = `https://www.youku.com/category/data?optionRefresh=1&pageNo=${page}¶ms=${encodeURIComponent(paramsStr)}`;
+
+ // 处理session
+ if (page > 1 && this.sessionStore[tid]) {
+ url = url.replace("optionRefresh=1", `session=${encodeURIComponent(this.sessionStore[tid])}`);
+ }
+
+ const response = await this.fetch(url, {}, this.headers);
+ const resData = response.data;
+
+ if (resData.data && resData.data.filterData && resData.data.filterData.session) {
+ this.sessionStore[tid] = JSON.stringify(resData.data.filterData.session);
+ }
+
+ const videos = [];
+ if (resData.data && resData.data.filterData && Array.isArray(resData.data.filterData.listData)) {
+ const lists = resData.data.filterData.listData;
+ for (const it of lists) {
+ let vid = "";
+ if (it.videoLink && it.videoLink.includes("id_")) {
+ vid = it.videoLink.split("id_")[1].split(".html")[0];
+ } else {
+ vid = "msearch:" + it.title;
+ }
+
+ videos.push({
+ vod_id: vid,
+ vod_name: it.title || '',
+ vod_pic: it.img || '',
+ vod_remarks: it.summary || '',
+ vod_content: it.subTitle || ''
+ });
+ }
+ }
+
+ return {
+ list: videos,
+ page: page,
+ pagecount: 9999,
+ limit: 20,
+ total: 999999
+ };
+
+ } catch (error) {
+ console.error(`categoryContent error: ${error.message}`);
+ return {
+ list: [],
+ page: pg,
+ pagecount: 0,
+ limit: 20,
+ total: 0
+ };
+ }
+ }
+
+ safeFixYoukuInitialData(rawStr) {
+ if (!rawStr) return '{}';
+ let s = rawStr
+ .replace(/^[\s\S]*?window\.__INITIAL_DATA__\s*[=:]\s*/, '')
+ .replace(/;[\s\S]*$/, '')
+ .replace(/\.{3,}[\s\S]*$/, '')
+ .replace(/,\s*$/, '')
+ .trim();
+
+ if (!s || s.length < 2 || !/^\{/.test(s)) {
+ return '{}';
+ }
+
+ let open = 0, close = 0;
+ for (let char of s) {
+ if (char === '{') open++;
+ if (char === '}') close++;
+ }
+
+ if (open > close) {
+ s += '}'.repeat(open - close);
+ }
+ if (!s.startsWith('{')) {
+ s = '{' + s;
+ }
+ if (!s.endsWith('}')) {
+ s += '}';
+ }
+
+ return s;
+ }
+
+ getSafe(obj, path, defaultValue = '') {
+ if (!obj || typeof obj !== 'object') return defaultValue;
+ try {
+ return path.split('.').reduce((o, key) => {
+ if (o == null) return defaultValue;
+ return o[key];
+ }, obj) ?? defaultValue;
+ } catch {
+ return defaultValue;
+ }
+ }
+
+ async detailContent(ids) {
+ try {
+ const id = ids[0];
+
+ // 获取剧集列表
+ const apiUrl = `https://search.youku.com/api/search?appScene=show_episode&showIds=${id}`;
+ const apiResponse = await this.fetch(apiUrl, {}, this.headers);
+ const jsonData = apiResponse.data;
+ const videoLists = jsonData.serisesList || [];
+
+ // 构建播放列表
+ const playUrls = [];
+ if (videoLists.length > 0) {
+ for (const item of videoLists) {
+ const title = item.showVideoStage?.replace("期", "集") ||
+ item.displayName ||
+ item.title ||
+ `第${item.index || '?'}集`;
+ const url = `https://v.youku.com/v_show/id_${item.videoId}.html`;
+ playUrls.push(`${title}$${url}`);
+ }
+ }
+
+ // 获取详情信息
+ let detailInfo = {
+ title: '',
+ cover: '',
+ category: '',
+ remarks: '',
+ desc: ''
+ };
+
+ try {
+ const detailUrl = `https://v.youku.com/v_show/id_${id}.html`;
+ const htmlResponse = await this.fetch(detailUrl, {
+ headers: {
+ ...this.headers,
+ 'Referer': 'https://v.youku.com/'
+ }
+ });
+ const html = htmlResponse.data;
+
+ // 检查是否触发人机验证
+ if (html.includes("人机验证") || html.includes("captcha") || html.includes("verify")) {
+ detailInfo.desc = "触发优酷人机验证,建议在浏览器中访问优酷官网解除限制后再重试";
+ } else if (html.includes("window.__INITIAL_DATA__ =")) {
+ let dataStr = html.split("window.__INITIAL_DATA__ =")[1]?.split(";")?.[0]?.trim() || '{}';
+ dataStr = this.safeFixYoukuInitialData(dataStr);
+
+ try {
+ const detailJson = JSON.parse(dataStr);
+ const item = this.getSafe(detailJson, 'moduleList.0.components.0.itemList.0', {});
+ const extra = this.getSafe(detailJson, 'pageMap.extra', {});
+
+ detailInfo.title = item.introTitle || extra.showName || videoLists[0]?.title || '';
+ detailInfo.cover = item.showImgV || extra.showImgV || extra.showImg || '';
+ detailInfo.category = item.showGenre || extra.videoCategory || '';
+ detailInfo.remarks = item.introSubTitle || extra.showSubtitle || item.mark?.text || '';
+ } catch (parseErr) {
+ console.error(`JSON解析失败: ${parseErr.message}`);
+ }
+ } else {
+ detailInfo.title = videoLists[0]?.title?.split(" ")[0] || '';
+ }
+ } catch (detailError) {
+ console.error(`获取详情失败: ${detailError.message}`);
+ }
+
+ const vod = {
+ vod_id: id,
+ vod_name: detailInfo.title || videoLists[0]?.title || '未知标题',
+ type_name: detailInfo.category || '',
+ vod_year: '',
+ vod_remarks: detailInfo.remarks || '',
+ vod_content: detailInfo.desc || (detailInfo.remarks ? `简介: ${detailInfo.remarks}` : '暂无简介'),
+ vod_play_from: playUrls.length > 0 ? '优酷视频' : '',
+ vod_play_url: playUrls.length > 0 ? playUrls.join('#') : ''
+ };
+
+ return {list: [vod]};
+
+ } catch (error) {
+ console.error(`detailContent error: ${error.message}`);
+ return {list: []};
+ }
+ }
+
+ async searchContent(key, quick, pg = '1') {
+ try {
+ const page = parseInt(pg) || 1;
+ const url = `https://search.youku.com/api/search?pg=${page}&keyword=${encodeURIComponent(key)}`;
+
+ const response = await this.fetch(url, {}, this.headers);
+ const data = response.data;
+
+ const videos = [];
+
+ if (data && Array.isArray(data.pageComponentList)) {
+ for (const item of data.pageComponentList) {
+ if (item.commonData) {
+ const common = item.commonData;
+ let vid = common.showId || '';
+
+ if (!vid && common.titleDTO && common.titleDTO.displayName) {
+ vid = `msearch:${common.titleDTO.displayName}`;
+ }
+
+ videos.push({
+ vod_id: vid,
+ vod_name: common.titleDTO?.displayName || '',
+ vod_pic: common.posterDTO?.vThumbUrl || '',
+ vod_remarks: common.stripeBottom || '',
+ vod_content: common.updateNotice || ''
+ });
+ }
+ }
+ }
+
+ return {
+ list: videos,
+ page: page,
+ pagecount: 9999,
+ limit: 20,
+ total: 999999
+ };
+
+ } catch (error) {
+ console.error(`searchContent error: ${error.message}`);
+ return {
+ list: [],
+ page: pg,
+ pagecount: 0,
+ limit: 20,
+ total: 0
+ };
+ }
+ }
+
+ async playerContent(flag, id, vipFlags) {
+ try {
+ // 关键:调用壳子超级解析
+ // 壳子会自动读取json配置中的解析规则
+ const playData = {
+ parse: 1, // 必须为1,表示需要解析
+ jx: 1, // 必须为1,启用解析
+ play_parse: true, // 启用播放解析
+ parse_type: '壳子超级解析',
+ parse_source: '优酷视频',
+ url: id, // 原始优酷链接
+ header: JSON.stringify({
+ 'User-Agent': this.headers['User-Agent'],
+ 'Referer': 'https://www.youku.com',
+ 'Origin': 'https://www.youku.com'
+ })
+ };
+
+ return playData;
+
+ } catch (error) {
+ console.error(`playerContent error: ${error.message}`);
+ // 即使出错也返回超级解析参数,让壳子处理
+ return {
+ parse: 1,
+ jx: 1,
+ play_parse: true,
+ parse_type: '壳子超级解析',
+ parse_source: '优酷视频',
+ url: id,
+ header: JSON.stringify(this.headers)
+ };
+ }
+ }
+
+ localProxy(param) {
+ return null;
+ }
+}
+
+export default new Spider();
\ No newline at end of file
diff --git "a/spider/catvod/\351\237\251\345\211\247\347\275\221.js" "b/spider/catvod/\351\237\251\345\211\247\347\275\221.js"
deleted file mode 100755
index e09b7dcd..00000000
--- "a/spider/catvod/\351\237\251\345\211\247\347\275\221.js"
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
-@header({
- searchable: 1,
- filterable: 1,
- quickSearch: 1,
- title: '韩剧网',
- lang: 'cat'
-})
-*/
-
-let host = 'https://hanju51.com';
-let headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
- "Referer": host + "/"
-};
-
-function extractVideos(html, limit = 0) {
- let videos = [];
- let liPattern = /([^<]+)<\/a>/) || [])[1] || "";
- let vod_pic = (item.match(/data-original="([^"]+)"/) || [])[1] || "";
- let vod_remarks = (item.match(/