【爬虫36例01】【已失效,订阅请谨慎】_signature参数分析

本文介绍了如何分析和解析PC端头条网页的_signature参数,包括遇到的问题、解决方法和完整sign.js文件的分析,涉及Python和JavaScript环境的设置与调试。
摘要由CSDN通过智能技术生成

【温馨提醒】

【环境】python 3.7, nodejs 12.18.2, windows 10 64位
【提醒】此文仅适用PC端头条web版本。不能用于tiktok、抖音!!订阅前请谨慎

【重点踩坑点】

① 【Cannot read property ‘sign’ of undefined】,sign未定义,下文有解决方式
在这里插入图片描述
② _signature加密传入的url需要添加二级域名 /toutiao,否则拿不到数据。
首页、用户页、详情页需要添加二级域名,其他接口不一定(比如文章发布接口就不需要加)

比如首页“推荐”栏目的url:
https://www.toutiao.com/api/pc/feed/?min_behot_time=0&category=__all__&utm_source=toutiao&widen=1&tadrequire=true
获取_signature时,要给sign.js传入加入二级域名的url
https://www.toutiao.com/toutiao/api/pc/feed/?min_behot_time=0&category=__all__&utm_source=toutiao&widen=1&tadrequire=true

③ python文件中的 useragent ,要与加密 sign.js 文件中 useragent 统一。
【如果不一致的话,生成的 _signature 拿不到数据】
【大家一定记得改自己的ua,js和python都要改】

url 分析

随便打开网页版一个界面,示例这里打开的是 “热点“ 分栏,https://www.toutiao.com/ch/news_hot/
我们向下滑动页面,不断加载出新的内容。
F12,打开 Network 的 XHR 标签,继续下滑头条网页,观察网页请求链接。
以下为三个示例链接,我们分析一下:

https://www.toutiao.com/api/pc/feed/?max_behot_time=1593976908&category=__all__&utm_source=toutiao&widen=1&tadrequire=true&_signature=_02B4Z6wo00d01zpHuZwAAIBCdwlrxaqqUH86Qr0AAJGcHAhZpQ3J5FlvtL7YPc7aHHkzMj8.4OCcbDzsZLdx9nyJFsORucCKvpjaNa7XZXlWKlGeT1Axyx3wjBwVHdSG-pNe9BUjC6ZDDLQ19d

https://www.toutiao.com/api/pc/feed/?max_behot_time=1593966482&category=__all__&utm_source=toutiao&widen=1&tadrequire=true&_signature=_02B4Z6wo00d013nPwKQAAIBCNIES.61rCDd5ysQAAIF5HAhZpQ3J5FlvtL7YPc7aHHkzMj8.4OCcbDzsZLdx9nyJFsORucCKvpjaNa7XZXlWKlGeT1Axyx3wjBwVHdSG-pNe9BUjC6ZDDLQ1f0

https://www.toutiao.com/api/pc/feed/?max_behot_time=1593958007&category=__all__&utm_source=toutiao&widen=1&tadrequire=true&_signature=_02B4Z6wo00d01cR.V4gAAIBAiTGF0ZJPBfXEelMAAC4gHAhZpQ3J5FlvtL7YPc7aHHkzMj8.4OCcbDzsZLdx9nyJFsORucCKvpjaNa7XZXlWKlGeT1Axyx3wjBwVHdSG-pNe9BUjC6ZDDLQ1e2

经过比较发现关键变量有:max_behot_time、_signature。

max_behot_time 分析

max_behot_time 的数值看似是时间戳,但是比较发现,并不是访问链接时的真实时间戳。
推断是由特定函数生成。
我们观察一下网页请求返回的 json 数据。发现除了返回的新闻内容之外,还有一个 next,包含 max_behot_time 的值。
在这里插入图片描述
通过比较发现,这个 next 中 max_behot_time 的值,正是页面下滑时,下一个请求 url 中 max_behot_time,充当 “页码”的作用。由于 next 的值可以直接获取,我们就不必分析其生成函数了。
【另外,第一次获取新闻列表时,没有 max_behot_time ,而是 min_behot_time = 0,请求成功后返回下一页的max_behot_time值】

_signature 分析

F12,打开 Sources 全局搜索 ”_signature“ 。
我们只看到1条结果。nice ~
格式化显示代码,定位到 ”_signature“ 位置,下图红色方框处。
在这里插入图片描述

在关键函数结尾行打断点,刷新页面。
点击 3 处的 “逐步执行” 按钮(因为头条会调用很多次加密函数,比如获取城市、获取天气等,我们要找到能获取到新闻文章的那次加密) 。
直到 4 处的 url 如下图所示。
此时 _signature 确实是我们要的数值,由变量 r 赋值。
变量 r 由函数 r = I (a, e) 生成,我们把鼠标放到 I (a, e),跳转到目标函数。(函数名可能不一致)
在这里插入图片描述
跳转到下图,我们在结尾打断点观察数值。
在这里插入图片描述
变量 c 就是 _signature 的值,由 window.byted_acrawler.sign(i) 生成,i 为待请求的url。
(注意url中间加了二级域名)
鼠标放在 a.sign 上,点击弹出的 f a(),跳转到目标函数。
在这里插入图片描述
跳转到这里,大概700行。

var glb;
(glb = "undefined" == typeof window ? global : window)._$jsvmprt = function(b, a, f) {
    function e() {
        if ("undefined" == typeof Reflect || !Reflect.construct)
            return !1;
        if (Reflect.construct.sham)
            return !1;
        if ("function" == typeof Proxy)
            return !0;
        try {
            return Date.prototype.toString.call(Reflect.construct(Date, [], (function() {}
            ))),
            !0
        } catch (b) {
            return !1
        }
    }
    
………………省略好几百行………………

function K(b, a, f, e, d, c, n, i) {
        var r, t;
        null == c && (c = this),
        d && !d.d && (d.d = 0,
        d.$0 = d,
        d[1] = {});
        var o = {}
          , l = o.d = d ? d.d + 1 : 0;
        for (o["$" + l] = o,
        t = 0; t < l; t++)
            o[r = "$" + t] = d[r];
        for (t = 0,
        l = o.length = e.length; t < l; t++)
            o[t] = e[t];
        return i && !B[a] && F(b, a, 2 * f),
        B[a] ? G(b, a, f, 0, o, c, null, 1)[1] : G(b, a, f, 0, o, c, null, 0)[1]
    }
}
,
(glb = "undefined" == typeof window ? global : window)._$jsvmprt(…………………………省略好多字符………………………………);

我们把上述代码保存为单独的文件,比如 sign.js。
在结尾加上两行代码测试一下输出:

sign = window.byted_acrawler.sign({url:""https://www.toutiao.com/toutiao/api/pc/feed/?min_behot_time=0&category=__all__&utm_source=toutiao&widen=1&tadrequire=true""});
console.log(sign);

我是在 pycharm 中安装了 node.js 插件,所以可以在 pycharm 中直接运行。

真正的麻烦刚刚开始

我们运行之后发现一系列报错,需要添加一系列参数,下面一步一步来。
上述代码运行时报错如下:
在这里插入图片描述
【window is not defined】,那么我们需要补一下浏览器环境:

window = global;

运行一下,报错如下:
在这里插入图片描述
【Cannot read property ‘referrer’ of undefined】,referrer未定义,用头条主页补一下:

window.document = {referrer: "https://www.toutiao.com/"};

运行一下,报错如下:
在这里插入图片描述
【Cannot read property ‘sign’ of undefined】,sign未定义:

重点来了

经过多次调试、踩坑发现,我们只需要把 window.byted_acrawler.sign 加密函数的最后一行中
(glb = “undefined” == typeof window ? global : window)._$jsvmprt 后面得数组中,第三个参数 【“undefined” != typeof exports ? exports : void 0 】改成 【void 0】
在这里插入图片描述
更改后
在这里插入图片描述
更改后执行,报错如下:
在这里插入图片描述
【Cannot read property ‘href’ of undefined】,href未定义,补一下:
那么 href 在哪里呢?我们打开页面,F12打开控制台,输入 “window.location” 后回车,可见下图:
在这里插入图片描述

我们在 window.location 中添加 href 即可,为了更安全,我们把 location 中其他参数也添加进去。

var glb;
window = global;
window.document = {referrer: "https://www.toutiao.com/"}
window.location = {
    hash: "",
    host: "www.toutiao.com",
    hostname: "www.toutiao.com",
    href: "https://www.toutiao.com",
    origin: "https://www.toutiao.com",
    pathname: "/",
    port: "",
    protocol: "https:",
    search: "",
}

…………这里是复制的window.byted_acrawler.sign代码…………

sign = window.byted_acrawler.sign({url:"https://www.toutiao.com/toutiao/api/pc/feed/?min_behot_time=0&category=__all__&utm_source=toutiao&widen=1&tadrequire=true"});
console.log(sign);

运行一下,报错如下:
在这里插入图片描述
【Cannot read property ‘userAgent’ of undefined】,userAgent 未定义,补一下:
打开页面,F12打开控制台,输入 “window.navigator” 后回车,可见下图:
在这里插入图片描述

我们在 window.navigator 中添加 userAgent 即可,为了更安全,我们把 navigator 中其他参数也添加进去。

var glb;
window = global;
window.document = {referrer: "https://www.toutiao.com/"}
window.location = {
    hash: "",
    host: "www.toutiao.com",
    hostname: "www.toutiao.com",
    href: "https://www.toutiao.com",
    origin: "https://www.toutiao.com",
    pathname: "/",
    port: "",
    protocol: "https:",
    search: "",
}
window.navigator={
    appCodeName: "Mozilla",
    appName: "Netscape",
    appVersion: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36",
    cookieEnabled: true,
    deviceMemory: 8,
    doNotTrack: null,
    hardwareConcurrency: 4,
    language: "zh-CN",
    languages: ["zh-CN", "zh"],
    maxTouchPoints: 0,
    onLine: true,
    platform: "Win32",
    product: "Gecko",
    productSub: "20030107",
    userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36",
    vendor: "Google Inc.",
    vendorSub: "",
}

…………这里是复制的window.byted_acrawler.sign代码…………

sign = window.byted_acrawler.sign({url:"https://www.toutiao.com/toutiao/api/pc/feed/?min_behot_time=0&category=__all__&utm_source=toutiao&widen=1&tadrequire=true"});
console.log(sign);

我们运行一下,有结果了!!
在这里插入图片描述
但是,这只是 _signature 的一部分,还不是正常的长度。
多次踩坑才发现:真实网页是带 cookie 访问的,我们的模拟环境没有 cookie,接下来我们添加 cookie。

cookies = '…………your cookies…………'
for(let cookie of cookies.split(";")){
    tmp = cookie.split("=");
    _f3(tmp[0],tmp[1],1800)
}

运行一下,得到了完整的 _signature 值。
在这里插入图片描述
页面可以正常访问,也能获取到数据:
在这里插入图片描述

完整的 sign.js

var glb;
window = global;
window.document = {referrer: "https://www.toutiao.com/"}
window.location = {
    hash: "",
    host: "www.toutiao.com",
    hostname: "www.toutiao.com",
    href: "https://www.toutiao.com",
    origin: "https://www.toutiao.com",
    pathname: "/",
    port: "",
    protocol: "https:",
    search: "",
}
window.navigator={
    appCodeName: "Mozilla",
    appName: "Netscape",
    appVersion: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
    cookieEnabled: true,
    deviceMemory: 8,
    doNotTrack: null,
    hardwareConcurrency: 4,
    language: "zh-CN",
    languages: ["zh-CN", "zh"],
    maxTouchPoints: 0,
    onLine: true,
    platform: "Win32",
    product: "Gecko",
    productSub: "20030107",
    userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36",
    vendor: "Google Inc.",
    vendorSub: "",
}

window._$jsvmprt = function(b, a, f) {
    function e() {
        if ("undefined" == typeof Reflect || !Reflect.construct)
            return !1;
        if (Reflect.construct.sham)
            return !1;
        if ("function" == typeof Proxy)
            return !0;
        try {
            return Date.prototype.toString.call(Reflect.construct(Date, [], (function() {}
            ))),
            !0
        } catch (b) {
            return !1
        }
    }
    function d(b, a, f) {
        return (d = e() ? Reflect.construct : function(b, a, f) {
            var e = [null];
            e.push.apply(e, a);
            var d = new (Function.bind.apply(b, e));
            return f && c(d, f.prototype),
            d
        }
        ).apply(null, arguments)
    }
    function c(b, a) {
        return (c = Object.setPrototypeOf || function(b, a) {
            return b.__proto__ = a,
            b
        }
        )(b, a)
    }
    function n(b) {
        return function(b) {
            if (Array.isArray(b)) {
                for (var a = 0, f = new Array(b.length); a < b.length; a++)
                    f[a] = b[a];
                return f
            }
        }(b) || function(b) {
            if (Symbol.iterator in Object(b) || "[object Arguments]" === Object.prototype.toString.call(b))
                return Array.from(b)
        }(b) || function() {
            throw new TypeError("Invalid attempt to spread non-iterable instance")
        }()
    }
    for (var i = [], r = 0, t = [], o = 0, l = function(b, a) {
        var f = b[a++]
          , e = b[a]
          , d = parseInt("" + f + e, 16);
        if (d >> 7 == 0)
            return [1, d];
        if (d >> 6 == 2) {
            var c = parseInt("" + b[++a] + b[++a], 16);
            return d &= 63,
            [2, c = (d <<= 8) + c]
        }
        if (d >> 6 == 3) {
            var n = parseInt("" + b[++a] + b[++a], 16)
              , i = parseInt("" + b[++a] + b[++a], 16);
            return d &= 63,
            [3, i = (d <<= 16) + (n <<= 8) + i]
        }
    }, u = function(b, a) {
        var f = parseInt("" + b[a] + b[a + 1], 16);
        return f = f > 127 ? -256 + f : f
    }, s = function(b, a) {
        var f = parseInt("" + b[a] + b[a + 1] + b[a + 2] + b[a + 3], 16);
        return f = f > 32767 ? -65536 + f : f
    }, p = function(b, a) {
        var f = parseInt("" + b[a] + b[a + 1] + b[a + 2] + b[a + 3] + b[a + 4] + b[a + 5] + b[a + 6] + b[a + 7], 16);
        return f = f > 2147483647 ? 0 + f : f
    }, y = function(b, a) {
        return parseInt("" + b[a] + b[a + 1], 16)
    }, v = function(b, a) {
        return parseInt("" + b[a] + b[a + 1] + b[a + 2] + b[a + 3], 16)
    }, g = g || this || window, h = Object.keys || function(b) {
        var a = {}
          , f = 0;
        for (var e in b)
            a[f++] = e;
        return a.length = f,
        a
    }
    , m = (b.length,
    0), I = "", C = m; C < m + 16; C++) {
        var q = "" + b[C++] + b[C];
        q = parseInt(q, 16),
        I += String.fromCharCode(q)
    }
    if ("HNOJ@?RC" != I)
        throw new Error("error magic number " + I);
    m += 16;
    parseInt("" + b[m] + b[m + 1], 16);
    m += 8,
    r = 0;
    for (var w = 0; w < 4; w++) {
        var S = m + 2 * w
          , R = "" + b[S++] + b[S]
          , x = parseInt(R, 16);
        r += (3 & x) << 2 * w
    }
    m += 16,
    m += 8;
    var z = parseInt("" + b[m] + b[m + 1] + b[m + 2] + b[m + 3] + b[m + 4] + b[m + 5] + b[m + 6] + b[m + 7], 16)
      , O = z
      , E = m += 8
      , j = v(b, m += z);
    j[1];
    m += 4,
    i = {
        p: [],
        q: []
    };
    for (var A = 0; A < j; A++) {
        for (var D = l(b, m), T = m += 2 * D[0], $ = i.p.length, P = 0; P < D[1]; P++) {
            var U = l(b, T);
            i.p.push(U[1]),
            T += 2 * U[0]
        }
        m = T,
        i.q.push([$, i.p.length])
    }
    var _ = {
        5: 1,
        6: 1,
        70: 1,
        22: 1,
        23: 1,
        37: 1,
        73: 1
    }
      , k = {
        72: 1
    }
      , M = {
        74: 1
    }
      , H = {
        11: 1,
        12: 1,
        24: 1,
        26: 1,
        27: 1,
        31: 1
    }
      , J = {
        10: 1
    }
      , N = {
        2: 1,
        29: 1,
        30: 1,
        20: 1
    }
      , B = []
      , W = [];
    function F(b, a, f) {
        for (var e = a; e < a + f; ) {
            var d = y(b, e);
            B[e] = d,
            e += 2;
            k[d] ? (W[e] = u(b, e),
            e += 2) : _[d] ? (W[e] = s(b, e),
            e += 4) : M[d] ? (W[e] = p(b, e),
            e += 8) : H[d] ? (W[e] = y(b, e),
            e += 2) : J[d] ? (W[e] = v(b, e),
            e += 4) : N[d] && (W[e] = v(b, e),
            e += 4)
        }
    }
    return K(b, E, O / 2, [], a, f);
    function G(b, a, f, e, c, l, m, I) {
        null == l && (l = this);
        var C, q, w, S = [], R = 0;
        m && (C = m);
        var x, z, O = a, E = O + 2 * f;
        if (!I)
            for (; O < E; ) {
                var j = parseInt("" + b[O] + b[O + 1], 16);
                O += 2;
                var A = 3 & (x = 13 * j % 241);
                if (x >>= 2,
                A > 2) {
                    A = 3 & x;
                    if (x >>= 2,
                    A > 2)
                        (A = x) < 2 ? (C = S[R--],
                        S[R] = S[R] < C) : A < 9 ? (z = y(b, O),
                        O += 2,
                        S[R] = S[R][z]) : A < 11 ? S[++R] = !0 : A < 13 ? (C = S[R--],
                        S[R] = S[R] >>> C) : A < 15 && (S[++R] = p(b, O),
                        O += 8);
                    else if (A > 1) {
                        (A = x) < 6 || (A < 8 ? C = S[R--] : A < 10 ? (C = S[R--],
                        S[R] = S[R] ^ C) : A < 12 && (z = s(b, O),
                        t[++o] = [[O + 4, z - 3], 0, 0],
                        O += 2 * z - 2))
                    } else if (A > 0) {
                        if ((A = x) > 7)
                            C = S[R--],
                            S[R] = S[R]in C;
                        else if (A > 5)
                            S[R] = ++S[R];
                        else if (A > 3)
                            z = y(b, O),
                            O += 2,
                            C = c[z],
                            S[++R] = C;
                        else if (A > 1) {
                            var D = 0
                              , T = S[R].length
                              , $ = S[R];
                            S[++R] = function() {
                                var b = D < T;
                                if (b) {
                                    var a = $[D++];
                                    S[++R] = a
                                }
                                S[++R] = b
                            }
                        }
                    } else {
                        if ((A = x) < 2) {
                            for (z = v(b, O),
                            A = "",
                            P = i.q[z][0]; P < i.q[z][1]; P++)
                                A += String.fromCharCode(r ^ i.p[P]);
                            A = +A,
                            O += 4,
                            S[++R] = A
                        } else
                            A < 4 ? (C = S[R--],
                            S[R] = S[R] - C) : A < 6 ? (C = S[R--],
                            S[R] = S[R] === C) : A < 15 && (C = S[R],
                            S[R] = S[R - 1],
                            S[R - 1] = C)
                    }
                } else if (A > 1) {
                    A = 3 & x;
                    if (x >>= 2,
                    A > 2)
                        (A = x) > 7 ? (C = S[R--],
                        S[R] = S[R] | C) : A > 5 ? (z = y(b, O),
                        O += 2,
                        S[++R] = c["$" + z]) : A > 3 && (z = s(b, O),
                        t[o][0] && !t[o][2] ? t[o][1] = [O + 4, z - 3] : t[o++] = [0, [O + 4, z - 3], 0],
                        O += 2 * z - 2);
                    else if (A > 1) {
                        if ((A = x) > 13)
                            S[++R] = !1;
                        else if (A > 6)
                            C = S[R--],
                            S[R] = S[R]instanceof C;
                        else if (A > 4)
                            C = S[R--],
                            S[R] = S[R] % C;
                        else if (A > 2)
                            if (S[R--])
                                O += 4;
                            else {
                                if ((z = s(b, O)) < 0) {
                                    I = 1,
                                    F(b, a, 2 * f),
                                    O += 2 * z - 2;
                                    break
                                }
                                O += 2 * z - 2
                            }
                        else if (A > 0) {
                            for (z = v(b, O),
                            C = "",
                            P = i.q[z][0]; P < i.q[z][1]; P++)
                                C += String.fromCharCode(r ^ i.p[P]);
                            S[++R] = C,
                            O += 4
                        }
                    } else if (A > 0) {
                        (A = x) < 1 ? S[++R] = g : A < 3 ? (C = S[R--],
                        S[R] = S[R] + C) : A < 5 ? (C = S[R--],
                        S[R] = S[R] == C) : A < 14 && (C = S[R - 1],
                        q = S[R],
                        S[++R] = C,
                        S[++R] = q)
                    } else {
                        (A = x) < 2 ? (C = S[R--],
                        S[R] = S[R] > C) : A < 9 ? (z = v(b, O),
                        O += 4,
                        q = R + 1,
                        S[R -= z - 1] = z ? S.slice(R, q) : []) : A < 11 ? (z = y(b, O),
                        O += 2,
                        C = S[R--],
                        c[z] = C) : A < 13 ? (C = S[R--],
                        S[R] = S[R] >> C) : A < 15 && (S[++R] = s(b, O),
                        O += 4)
                    }
                } else if (A > 0) {
                    A = 3 & x;
                    if (x >>= 2,
                    A > 2)
                        if ((A = x) < 1)
                            S[R] = !S[R];
                        else if (A < 3) {
                            if ((z = s(b, O)) < 0) {
                                I = 1,
                                F(b, a, 2 * f),
                                O += 2 * z - 2;
                                break
                            }
                            O += 2 * z - 2
                        } else
                            A < 5 ? (C = S[R--],
                            S[R] = S[R] / C) : A < 7 ? (C = S[R--],
                            S[R] = S[R] !== C) : A < 14 && (S[++R] = l);
                    else if (A > 1) {
                        (A = x) < 2 ? S[++R] = C : A < 4 ? (C = S[R--],
                        S[R] = S[R] <= C) : A < 11 ? (C = S[R -= 2][S[R + 1]] = S[R + 2],
                        R--) : A < 13 && (C = S[R],
                        S[++R] = C)
                    } else if (A > 0) {
                        if ((A = x) < 8)
                            q = S[R--],
                            C = delete S[R--][q];
                        else if (A < 10) {
                            for (z = v(b, O),
                            A = "",
                            P = i.q[z][0]; P < i.q[z][1]; P++)
                                A += String.fromCharCode(r ^ i.p[P]);
                            O += 4,
                            S[R] = S[R][A]
                            //console.log(S[R]);
                            // if (S[R]) {
                            //     S[R] = S[R][A]
                            // };
                            //console.log("1");
                        } else
                            A < 12 ? (C = S[R--],
                            S[R] = S[R] << C) : A < 14 && (S[++R] = u(b, O),
                            O += 2)
                    } else {
                        if ((A = x) < 5) {
                            z = s(b, O);
                            try {
                                if (t[o][2] = 1,
                                1 == (C = G(b, O + 4, z - 3, [], c, l, null, 0))[0])
                                    return C
                            } catch (m) {
                                if (t[o] && t[o][1] && 1 == (C = G(b, t[o][1][0], t[o][1][1], [], c, l, m, 0))[0])
                                    return C
                            } finally {
                                if (t[o] && t[o][0] && 1 == (C = G(b, t[o][0][0], t[o][0][1], [], c, l, null, 0))[0])
                                    return C;
                                t[o] = 0,
                                o--
                            }
                            O += 2 * z - 2
                        } else
                            A < 7 ? (z = y(b, O),
                            O += 2,
                            S[R -= z] = 0 === z ? new S[R] : d(S[R], n(S.slice(R + 1, R + z + 1)))) : A < 9 && (C = S[R--],
                            S[R] = S[R] & C)
                    }
                } else {
                    A = 3 & x;
                    if (x >>= 2,
                    A < 1) {
                        if ((A = x) < 1)
                            return [1, S[R--]];
                        if (A < 5)
                            C = S[R--],
                            S[R] = S[R] * C;
                        else if (A < 7)
                            C = S[R--],
                            S[R] = S[R] != C;
                        else if (A < 14)
                            q = S[R--],
                            w = S[R--],
                            (A = S[R--]).x === G ? A.y >= 1 ? S[++R] = K(b, A.c, A.l, q, A.z, w, null, 1) : (S[++R] = K(b, A.c, A.l, q, A.z, w, null, 0),
                            A.y++) : S[++R] = A.apply(w, q);
                        else if (A < 16) {
                            z = s(b, O),
                            (U = function a() {
                                var f = arguments;
                                return a.y > 0 ? K(b, a.c, a.l, f, a.z, this, null, 0) : (a.y++,
                                K(b, a.c, a.l, f, a.z, this, null, 0))
                            }
                            ).c = O + 4,
                            U.l = z - 2,
                            U.x = G,
                            U.y = 0,
                            U.z = c,
                            S[R] = U,
                            O += 2 * z - 2
                        }
                    } else if (A < 2) {
                        (A = x) < 4 ? (q = S[R--],
                        (A = S[R]).x === G ? A.y >= 1 ? S[R] = K(b, A.c, A.l, [q], A.z, w, null, 1) : (S[R] = K(b, A.c, A.l, [q], A.z, w, null, 0),
                        A.y++) : S[R] = A(q)) : A < 6 ? S[R -= 1] = S[R][S[R + 1]] : A < 8 ? S[R] = --S[R] : A < 10 && (C = S[R--],
                        S[R] = typeof C)
                    } else if (A < 3) {
                        if ((A = x) < 7)
                            S[R] = h(S[R]);
                        else if (A < 9) {
                            for (C = S[R--],
                            z = v(b, O),
                            A = "",
                            P = i.q[z][0]; P < i.q[z][1]; P++)
                                A += String.fromCharCode(r ^ i.p[P]);
                            O += 4,
                            S[R--][A] = C
                        } else if (A < 13)
                            throw S[R--]
                    } else {
                        (A = x) < 1 ? S[++R] = null : A < 3 ? (C = S[R--],
                        S[R] = S[R] >= C) : A < 12 && (S[++R] = void 0)
                    }
                }
            }
        if (I)
            for (; O < E; ) {
                j = B[O];
                O += 2;
                A = 3 & (x = 13 * j % 241);
                if (x >>= 2,
                A > 2) {
                    A = 3 & x;
                    if (x >>= 2,
                    A < 1) {
                        if ((A = x) > 13)
                            C = S[R],
                            S[R] = S[R - 1],
                            S[R - 1] = C;
                        else if (A > 4)
                            C = S[R--],
                            S[R] = S[R] === C;
                        else if (A > 2)
                            C = S[R--],
                            S[R] = S[R] - C;
                        else if (A > 0) {
                            for (z = W[O],
                            A = "",
                            P = i.q[z][0]; P < i.q[z][1]; P++)
                                A += String.fromCharCode(r ^ i.p[P]);
                            A = +A,
                            O += 4,
                            S[++R] = A
                        }
                    } else if (A < 2) {
                        if ((A = x) > 7)
                            C = S[R--],
                            S[R] = S[R]in C;
                        else if (A > 5)
                            S[R] = ++S[R];
                        else if (A > 3)
                            z = W[O],
                            O += 2,
                            C = c[z],
                            S[++R] = C;
                        else if (A > 1) {
                            D = 0,
                            T = S[R].length,
                            $ = S[R];
                            S[++R] = function() {
                                var b = D < T;
                                if (b) {
                                    var a = $[D++];
                                    S[++R] = a
                                }
                                S[++R] = b
                            }
                        }
                    } else if (A < 3) {
                        (A = x) > 10 ? (z = W[O],
                        t[++o] = [[O + 4, z - 3], 0, 0],
                        O += 2 * z - 2) : A > 8 ? (C = S[R--],
                        S[R] = S[R] ^ C) : A > 6 && (C = S[R--])
                    } else {
                        (A = x) < 2 ? (C = S[R--],
                        S[R] = S[R] < C) : A < 9 ? (z = W[O],
                        O += 2,
                        S[R] = S[R][z]) : A < 11 ? S[++R] = !0 : A < 13 ? (C = S[R--],
                        S[R] = S[R] >>> C) : A < 15 && (S[++R] = W[O],
                        O += 8)
                    }
                } else if (A > 1) {
                    A = 3 & x;
                    if (x >>= 2,
                    A > 2)
                        (A = x) < 5 ? (z = W[O],
                        t[o][0] && !t[o][2] ? t[o][1] = [O + 4, z - 3] : t[o++] = [0, [O + 4, z - 3], 0],
                        O += 2 * z - 2) : A < 7 ? (z = W[O],
                        O += 2,
                        S[++R] = c["$" + z]) : A < 9 && (C = S[R--],
                        S[R] = S[R] | C);
                    else if (A > 1) {
                        if ((A = x) > 13)
                            S[++R] = !1;
                        else if (A > 6)
                            C = S[R--],
                            S[R] = S[R]instanceof C;
                        else if (A > 4)
                            C = S[R--],
                            S[R] = S[R] % C;
                        else if (A > 2)
                            S[R--] ? O += 4 : O += 2 * (z = W[O]) - 2;
                        else if (A > 0) {
                            for (z = W[O],
                            C = "",
                            P = i.q[z][0]; P < i.q[z][1]; P++)
                                C += String.fromCharCode(r ^ i.p[P]);
                            S[++R] = C,
                            O += 4
                        }
                    } else if (A > 0) {
                        (A = x) < 1 ? S[++R] = g : A < 3 ? (C = S[R--],
                        S[R] = S[R] + C) : A < 5 ? (C = S[R--],
                        S[R] = S[R] == C) : A < 14 && (C = S[R - 1],
                        q = S[R],
                        S[++R] = C,
                        S[++R] = q)
                    } else {
                        (A = x) > 13 ? (S[++R] = W[O],
                        O += 4) : A > 11 ? (C = S[R--],
                        S[R] = S[R] >> C) : A > 9 ? (z = W[O],
                        O += 2,
                        C = S[R--],
                        c[z] = C) : A > 7 ? (z = W[O],
                        O += 4,
                        q = R + 1,
                        S[R -= z - 1] = z ? S.slice(R, q) : []) : A > 0 && (C = S[R--],
                        S[R] = S[R] > C)
                    }
                } else if (A > 0) {
                    A = 3 & x;
                    if (x >>= 2,
                    A < 1)
                        if ((A = x) < 5) {
                            z = W[O];
                            try {
                                if (t[o][2] = 1,
                                1 == (C = G(b, O + 4, z - 3, [], c, l, null, 0))[0])
                                    return C
                            } catch (m) {
                                if (t[o] && t[o][1] && 1 == (C = G(b, t[o][1][0], t[o][1][1], [], c, l, m, 0))[0])
                                    return C
                            } finally {
                                if (t[o] && t[o][0] && 1 == (C = G(b, t[o][0][0], t[o][0][1], [], c, l, null, 0))[0])
                                    return C;
                                t[o] = 0,
                                o--
                            }
                            O += 2 * z - 2
                        } else
                            A < 7 ? (z = W[O],
                            O += 2,
                            S[R -= z] = 0 === z ? new S[R] : d(S[R], n(S.slice(R + 1, R + z + 1)))) : A < 9 && (C = S[R--],
                            S[R] = S[R] & C);
                    else if (A < 2) {
                        if ((A = x) > 12)
                            S[++R] = W[O],
                            O += 2;
                        else if (A > 10)
                            C = S[R--],
                            S[R] = S[R] << C;
                        else if (A > 8) {
                            for (z = W[O],
                            A = "",
                            P = i.q[z][0]; P < i.q[z][1]; P++)
                                A += String.fromCharCode(r ^ i.p[P]);
                            O += 4,
                            S[R] = S[R][A]
                        } else
                            A > 6 && (q = S[R--],
                            C = delete S[R--][q])
                    } else if (A < 3) {
                        (A = x) < 2 ? S[++R] = C : A < 4 ? (C = S[R--],
                        S[R] = S[R] <= C) : A < 11 ? (C = S[R -= 2][S[R + 1]] = S[R + 2],
                        R--) : A < 13 && (C = S[R],
                        S[++R] = C)
                    } else {
                        (A = x) > 12 ? S[++R] = l : A > 5 ? (C = S[R--],
                        S[R] = S[R] !== C) : A > 3 ? (C = S[R--],
                        S[R] = S[R] / C) : A > 1 ? O += 2 * (z = W[O]) - 2 : A > -1 && (S[R] = !S[R])
                    }
                } else {
                    A = 3 & x;
                    if (x >>= 2,
                    A > 2)
                        (A = x) < 1 ? S[++R] = null : A < 3 ? (C = S[R--],
                        S[R] = S[R] >= C) : A < 12 && (S[++R] = void 0);
                    else if (A > 1) {
                        if ((A = x) < 7)
                            S[R] = h(S[R]);
                        else if (A < 9) {
                            for (C = S[R--],
                            z = W[O],
                            A = "",
                            P = i.q[z][0]; P < i.q[z][1]; P++)
                                A += String.fromCharCode(r ^ i.p[P]);
                            O += 4,
                            S[R--][A] = C
                        } else if (A < 13)
                            throw S[R--]
                    } else if (A > 0) {
                        (A = x) > 8 ? (C = S[R--],
                        S[R] = typeof C) : A > 6 ? S[R] = --S[R] : A > 4 ? S[R -= 1] = S[R][S[R + 1]] : A > 2 && (q = S[R--],
                        (A = S[R]).x === G ? A.y >= 1 ? S[R] = K(b, A.c, A.l, [q], A.z, w, null, 1) : (S[R] = K(b, A.c, A.l, [q], A.z, w, null, 0),
                        A.y++) : S[R] = A(q))
                    } else {
                        var U;
                        if ((A = x) > 14)
                            z = W[O],
                            (U = function a() {
                                var f = arguments;
                                return a.y > 0 ? K(b, a.c, a.l, f, a.z, this, null, 0) : (a.y++,
                                K(b, a.c, a.l, f, a.z, this, null, 0))
                            }
                            ).c = O + 4,
                            U.l = z - 2,
                            U.x = G,
                            U.y = 0,
                            U.z = c,
                            S[R] = U,
                            O += 2 * z - 2;
                        else if (A > 12)
                            q = S[R--],
                            w = S[R--],
                            (A = S[R--]).x === G ? A.y >= 1 ? S[++R] = K(b, A.c, A.l, q, A.z, w, null, 1) : (S[++R] = K(b, A.c, A.l, q, A.z, w, null, 0),
                            A.y++) : S[++R] = A.apply(w, q);
                        else if (A > 5)
                            C = S[R--],
                            S[R] = S[R] != C;
                        else if (A > 3)
                            C = S[R--],
                            S[R] = S[R] * C;
                        else if (A > -1)
                            return [1, S[R--]]
                    }
                }
            }
        return [0, null]
    }
    function K(b, a, f, e, d, c, n, i) {
        var r, t;
        null == c && (c = this),
        d && !d.d && (d.d = 0,
        d.$0 = d,
        d[1] = {});
        var o = {}
          , l = o.d = d ? d.d + 1 : 0;
        for (o["$" + l] = o,
        t = 0; t < l; t++)
            o[r = "$" + t] = d[r];
        for (t = 0,
        l = o.length = e.length; t < l; t++)
            o[t] = e[t];
        return i && !B[a] && F(b, a, 2 * f),
        B[a] ? G(b, a, f, 0, o, c, null, 1)[1] : G(b, a, f, 0, o, c, null, 0)[1]
    }
}
,
window._$jsvmprt("484e4f4a403f52430029122496836dad4f4587d1000000000000aa54020000250074211b000b02430200013e2217000e1c211b000b03430200024017000e18011b000b02041c16004c211b000b04430200033e2217000b1c1b000b041e00041700181b000b04260200050a000118010a0002101c16001e180022011700051c131f0018011800131e00061a001d000727041c0026110200002554a802000825000d1b000b081e00090101001f0702000a25000e211b000b094302000240001f0802000b25005b131e000c02000d02000e1a02221e000f24131e00100a000110220117003c1c0200002500131800221e0011240a0000100200123e00131e001301220117001a1c211b000b0a43020002402217000b1c1b000b0a1e001404001f090200152500131b000b0b1a00221e0016240a000010001f0a020017250039211800430200023e22011700081c1800263e17000702000000211800430200183e170012180017000902001916000602001a001800001f0b02001b25005218010117000802001c1f010200001f0618001f0e180e480039170033180618011b000b0c221e001d241b000b0c221e001e240a00001018011e001f2a0a00011019281f06180e2e1f0e16ffcb1806001f0c0200202500df0200021f0621134318063e22011700121c13221e0011240a00001002002140220117001c1c1b000b051e00221e0011221e002324130a00011002002140220117000d1c211b000b084318063e22011700201c1b000b08221e0011240a000010221e0024240200250a00011048003a220117000d1c211b000b0d4318063e22011700151c1b000b0d221e0011240a00001002002640220117000d1c211b000b0e4318063e17000520001b020b07260a00001001170028211b000b0f4318063e22011700151c1b000b0f221e0011240a00001002002740170005200012001f0d0200282500a3211801430200294017000400180002002a281f061801221e002b24131e000c02002c0200001a020a0001101f0748001f12181218071e001f3a17006618071812191f081808221e002d2448000a00011002002e3e17001a1808221e002f24480118081e001f0a0002101f0816ffd81808221e00242418060a00011048003e1700191808221e002f2418061e001f18081e001f0a0002100018122d1f1216ff95001f0e02003025007146000306000a271f22020000000500600200001f06131e003117001c131e0031221e00322418000a0001101f061806170006180600131e003317001c131e0033221e00322418000a0001101f0618061700061806001b020b0e2618001b000b081e00340a0002101f0618060007001f0f02003525009c460003060006271f2205008f131e0031170015131e0031221e003624180018010a0002101c131e0033170015131e0033221e003624180018010a0002101c49016d48182a483c2a483c2a4903e82a1f061b000b081800020037281d00341b000b08180002002a28180128020038281b000b0b1b000b0b1a00221e0016240a0000101806281a01221e0039240a0000102802003a281d003407001f1002003b25004c460003060006271f1e05003f131e0031170013131e0031221e003c2418000a0001101c131e0033170013131e0033221e003c2418000a0001101c1b000b081800020037281d003407001f1102003d2500a31b000b101a001f061b000b05221e003e24180602003f131e00061a002202000025000c1b030b00201d0040001d00410a0003101c1b000b11221e00422402004318060a0002101c13221700081c131e00442217000b1c131e00441e00451700091800201d00401b020b08260a00001017003013221700221c131e0046131e00472948643922011700101c131e0048131e0049294864391700091800201d0040001f1302004a25002b211343020002402217001f1c1b000b051e00221e0011221e002324131e004b0a00011002004c3e001f1402004d2500611b020b07260a0000100117005202004e1b000b0d420122011700111c1b000b0d1e004e1b000b12410122011700091c02004f134222011700091c020050134222011700091c0200511342220117000f1c020052134202005313423a0012001f150200542501661b000b0d1e005517000520000200561b000b05421700431b000b05221e0056241b000b0d0a0001101f101810221e0024240200550a00011048003b22011700151c1810221e0024240200570a00011048003b170005200013221700081c131e00582217000b1c131e00581e00592217000e1c131e00581e00591e005a17002a460003060006271f9605001e131e00581e0059221e005a240a0000101b000b063e17000520000702005b02005c02005d02005e02005f0200600200610200620200630200640200650a000b1f060200660200670200680a00031f07180708031fc918c921041700181fc8180718c8191fca1318ca19170005200016ffe7180608031fc918c9210417001b1fc8180618c8191fca131e006918ca19170005200016ffe4131e006908031fc918c921041700341fc818c8221e006a24131e000c02006b0200001a020a0001102217000f1c131e006918c81902006c19170005200016ffcb12001f1602006d2500c71b020b08260a0000101700291b000b13221e006e2402000f0a0001101f06180602000025000c1b030b00201d006f001d00701b020b09260a00001017005b46000306002c271f1a181a1e00711b000b14020072193e2217000e1c131e00311e001f48003e1700091800201d006f050029131e0031221e0036240200730200000a0002101c131e0031221e003c240200730a0001101c071b020b07260a000010170024131e007401221700121c131e007522011700081c131e00761700091800201d006f001f170200772500b11b020b07260a000010011700a21b000b08221e0078240200790a0001101f0618061e007a221e0011240a000010221e007b24131e000c02007c02007d1a020200000a000210221e00242402007e0a00011048003a220117003b1c1b000b0d1e0011221e0011240a000010221e007b24131e000c02007c02007d1a020200000a000210221e00242402007e0a00011048003a22011700181c1b000b0d1e004e221e0011240a00001002007f400012001f18020080250075131e000c0200810200001a021f0613221700081c131e00822217000b1c131e00821e008317004c131e00821e00831f071807221e0024240200840a00011048003e22011700151c1807221e0024240200850a00011048003e22011700111c1806221e000f2418070a000110170005200012001f190200862500961b020b1a1e008717000b1b020b1a1e00870046000306000a271f1e020000000500731b000b08221e0078240200790a0001101f0c180c221e0088240200890a0001101f0d180d221e008a2402008b0a0001101f0e180d221e008c24180e02008d190a0001101f0f180d221e008c24180e02008e190a0001101f10180f02008f281810281f111b020b1a18111d008718110007001f1b0200902501270200001f061b020b1a1e009117000f1b020b1a1e00911f061600fb48051f0e0a00001f0f1b000b0d1e004e1f10181022011700071c0a00001f1148001f121812180e3a1700b7460003060006271f3f0500a318111812191f130a00001f1448001f16181618131e001f3a1700371813221e00922418160a00011017001f1814221e0093241813221e00922418160a0001101e00940a0001101c18162d1f1616ffc418131e0095020000281f1518131e0096170011181518131e009602000028281f15181518131e009702000028281f1518151814221e0098240200000a000110281f15180f221e00932418150a0001101c0718122d1f1216ff47180f221e0098240200990a0001101f061b020b1a18061d00911806221e009a2448004904000a000210001f1c02009b2504631b000b0d1e009c221e009d240a0000101f061b000b0d1e009e221e009d240a0000101f0748001f0848011f0948021f0a48031f0b48041f0c48051f0d180d1f0e02009f1f0f0200a01f100200a11f110200a21f120200a31f130200a41f140200a51f150200a61f161806221e0024240200a70a00011048003b22011700151c1806221e0024240200a80a00011048003b17000a180c1f0e1600f71806221e002424180f0a00011048003b17000a18081f0e1600dd1806221e00242418110a00011048003b17000a18091f0e1600c31806221e00242418120a00011048003b22011700151c1806221e0024240200a90a00011048003b22011700151c1806221e0024240200aa0a00011048003b17000a180a1f0e16007b1806221e00242418130a00011048003b22011700141c1806221e00242418140a00011048003b22011700141c1806221e00242418150a00011048003b22011700151c1806221e0024240200ab0a00011048003b22011700151c1806221e0024240200ac0a00011048003b17000a180b1f0e160007180d1f0e1807221e00242418100a00011048003b221700091c180e18084017000820001601521807221e00242418120a00011048003b22011700141c1807221e00242418110a00011048003b22011700151c1807221e0024240200ad0a00011048003b221700091c180e180a40221700091c180e18094017000820001600f91807221e00242418160a00011048003b22011700141c1807221e00242418140a00011048003b22011700141c1807221e00242418150a00011048003b22011700141c1807221e00242418130a00011048003b221700091c180e180c40221700091c180e180b40170008200016008b1807221e00242418100a00011048003a221700141c1807221e00242418120a00011048003a221700141c1807221e00242418160a00011048003a221700141c1807221e00242418130a00011048003a221700141c1807221e00242418140a00011048003a221700141c1807221e00242418150a00011048003a1f001800180e180d3e40170005200048001f1748011f1848021f1948041f1a48051f1b181b1f1c1806221e0024240200ae0a00011048003b17000a18191f1c1600861806221e0024240200af0a00011048003b22011700151c1806221e0024240200b00a00011048003b17000a18181f1c1600541806221e0024240200b10a00011048003b17000a18171f1c1600391806221e0024240200b20a00011048003b22011700151c1806221e0024240200b30a00011048003b17000a181a1f1c160007181b1f1c1b020b1c260a000010221e009d240a0000101f1d1b020b1b260a000010221e009d240a0000101f1e181c18173f221700091c181c18183f2217002d1c131e005822011700231c1b000b0d1e00b4221e0011240a000010221e0024240200b50a00011048003b1700052000181c18173f221700091c181c18183f221700151c181d221e0024240200580a00011048003b1700052000181c181a3e2217000a1c181e0200003f170005200012001f1d0200b62500da261f0646000306000f271f121b000b081e00b71f060500191b000b08221e00b8240200b90a0001104800191f06071806263e170004001b000b08221e0078240200ba0a0001101f070200bb1b000b15264927101b000b0c221e001e240a0000102a480a0a000210280200bb281b000b0b1a00221e0016240a000010281f0818000200bc180828281f00180718001d00bd1318080200002500311b030b011800041c460003060006271f0c05001c1b030b06221e00be241b030b070a0001101c131b030b080907000d1806221e00bf2418070a0001101c001f1e0200c02500be18001e001f1f0618064802331f07180117003018001806480129191f0818074804291f07180818074803293a22011700091c1808180739170005260018081f0748001f09180918063a17004a180018091b000b16221e00c12418001809194900ff2f18001809194808354900ff2f18001809194810354900ff2f18001809194818354900ff2f0a0004100d18092d1f0916ffb41800221e0098240200000a0001101f0a1801170013180a221e002f24480018070a00021000180a001f200200c225007f18001e001f1f0618064802341f07180648032f48004017000818072d1f07180117001a1b000b1718074801281a011f081808180718060d16000d1b000b1718071a011f0848001f09180918063a17002c1808180948023423191800221e00c32418090a000110180948032f48033333300d18092d1f0916ffd21808001f210200c425000a18001400c52f001f220200c6250030180248053518014802333118014803351802480433312818001801311805180348032f180431191802312831001f230200c725001818001e001f48043a17000a180048041d001f1800001f240200c82500d618001e001f1f0618064801291f0718001807191f0948001f0a1b000b0c221e001d244806483418062b280a0001104800301f0d180d4800391700981b020b22180a1b020b1f28041f0a180a48023548032f1f0b48001f0c180c18073a17003d1800180c480128191f081800180c1b020b221800180c191b020b2326180a18081809180c180b18010a00061028040d271f09180c2d1f0c16ffc118004800191f08180018071b020b2218001807191b020b2326180a180818091807180b18010a00061028040d271f09180d2e1f0d16ff661800001f250200c92500d818001e001f1f0618064801291f0718004800191f081b000b0c221e001d244806483418062b280a0001101f0d1b020b22180d1b020b1f2a041f0a180a480040170093180a48023548032f1f0b18071f0c180c48003917003d1800180c480129191f091800180c1b020b221800180c191b020b2326180a18081809180c180b18010a00061029040d271f08180c2e1f0c16ffc118001807191f09180048001b020b2218004800191b020b2326180a180818094800180b18010a00061029040d271f081b020b22180a1b020b1f29041f0a16ff6b1800001f260200ca2501ac131e000c0200cb0200001a02221e000f2418000a0001101700061800000a00001f0618001e001f1f0748001f0848001f09180818073a1701641800221e00c32418080a0001101f0a180a4900803a170018180618091800221e002d2418080a0001100d16012a180a4908003a17002a180618091b000b16221e00c1244900c0180a48063430490080180a483f2f300a0002100d1600fa180a4a0000d8003a220117000c1c180a4a0000dfff39170036180618091b000b16221e00c1244900e0180a480c3430490080180a480634483f2f30490080180a483f2f300a0003100d1600ae180848012818073a1700991800221e00c32418084801280a0001101f0b180a4a0000dc003a2217000c1c4a0000dc00180b3c2217000c1c180b4a0000dfff3c170062180a4903ff2f480a33180b4903ff2f304a00010000281f0c180618091b000b16221e00c1244900f0180c481234483f2f30490080180c480c34483f2f30490080180c480634483f2f30490080180c483f2f300a0004100d18082d1f0816000d1b000b180200cc1a014718082d1f0818092d1f0916fe9a1806221e0098240200000a000110001f270200cd25024e1b000b1718011a011f0648001f0748001f0818001e001f1f09180718013a221700091c180818093a1702051800221e00c3241808222d1f080a0001101f0a180a4804341f0c180c480040170061180c480140170059180c480240170051180c480340170049180c480440170041180c480540170039180c480640170031180c480740170029180c480c4017002b180c480d40170023180c480e40170055180c480f401700a216016816017d18061807180a0d160173180818093a17002818061807180a481f2f4806331800221e00c3241808222d1f080a000110483f2f300d16000d1b000b180200ce1a0147160139180848012818093a17004018061807180a480f2f480c331800221e00c3241808222d1f080a000110483f2f480633301800221e00c3241808222d1f080a000110483f2f300d16000d1b000b180200ce1a01471600e4180848022818093a1700b4180a48072f4812331800221e00c3241808222d1f080a000110483f2f480c33301800221e00c3241808222d1f080a000110483f2f480633301800221e00c3241808222d1f080a000110483f2f304a00010000291f0b4800180b3c2217000c1c180b4a000fffff3c17002f18061807222d1f07180b480a344903ff2f4a0000d800300d18061807180b4903ff2f4a0000dc00300d16001b1b000b180200cf180b221e00112448100a000110281a014716000d1b000b180200ce1a014716001b1b000b180200d0180a221e00112448100a000110281a014718072d1f0716fdef180718013a17000a180618071d001f1b000b161e00c11b000b16180610001f280200d12502aa0a00001f061b000b174a000080001a011f0748001f0848001f0918001e001f1f0a180818013a221700091c1809180a3a1702431800221e00c3241809222d1f090a0001101f0b180b4804341f0e180e480040170061180e480140170059180e480240170051180e480340170049180e480440170041180e480540170039180e480640170031180e480740170029180e480c4017002b180e480d40170023180e480e40170055180e480f401700a216016816017d18071808180b0d1601731809180a3a17002818071808180b481f2f4806331800221e00c3241809222d1f090a000110483f2f300d16000d1b000b180200ce1a01471601391809480128180a3a17004018071808180b480f2f480c331800221e00c3241809222d1f090a000110483f2f480633301800221e00c3241809222d1f090a000110483f2f300d16000d1b000b180200ce1a01471600e41809480228180a3a1700b4180b48072f4812331800221e00c3241809222d1f090a000110483f2f480c33301800221e00c3241809222d1f090a000110483f2f480633301800221e00c3241809222d1f090a000110483f2f304a00010000291f0c4800180c3c2217000c1c180c4a000fffff3c17002f18071808222d1f08180c480a344903ff2f4a0000d800300d18071808180c4903ff2f4a0000dc00300d16001b1b000b180200cf180c221e00112448100a000110281a014716000d1b000b180200ce1a014716001b1b000b180200d0180b221e00112448100a000110281a01471808497fff4801293b17003518084801281f0d1807180d1d001f180618061e001f1b000b161e00c11b000b161807100d1801180d291f0148004801291f0818082d1f0816fdb11808480039170020180718081d001f180618061e001f1b000b161e00c11b000b161807100d1806221e0098240200000a000110001f290200d22500b418011b000b063e22011700081c1801263e22011700091c180148003a17000a18001e001f1f01180148003e17000702000000131e000c0200cb0200001a02221e000f2418000a000110220117001c1c131e000c0200d30200001a02221e000f2418000a00011001170021180118001e001f3e1700061800001800221e00d424480018010a0002100018014a0000ffff3a1700131b020b2826180018010a0002101600101b020b2926180018010a000210001f2a0200d525006b18001b000b063e22011700081c1800263e220117000c1c18001e001f48003e1700061800001b020b271800041f001b020b271801041f011b020b20261b020b25261b020b21261800200a0002101b020b241b020b21261801120a000210040a000210120a000210001f2b0200d625006718001b000b063e22011700081c1800263e220117000c1c18001e001f48003e1700061800001b020b271801041f011b020b2a1b020b20261b020b26261b020b21261800120a0002101b020b241b020b21261801120a000210040a000210200a00021004001f2c0200d725019d0200d81f0602002a1f0718021700080200001f07180117000718011f060200001f0848001f0a18001e001f180a4803283b1700b31800221e00c324180a222d1f0a0a0001104900ff2f4810331800221e00c324180a222d1f0a0a0001104900ff2f480833301800221e00c324180a222d1f0a0a0001104900ff2f301f0918081806221e002d2418094a00fc00002f4812340a000110281f0818081806221e002d2418094a0003f0002f480c340a000110281f0818081806221e002d241809490fc02f4806340a000110281f0818081806221e002d241809483f2f0a000110281f0816ff4518001e001f180a294800391700a81800221e00c324180a222d1f0a0a0001104900ff2f48103318001e001f180a3917001a1800221e00c324180a0a0001104900ff2f4808331600054800301f0918081806221e002d2418094a00fc00002f4812340a000110281f0818081806221e002d2418094a0003f0002f480c340a000110281f08180818001e001f180a3917001a1806221e002d241809490fc02f4806340a0001101600051807281f0818081807281f081808001f2d0200d92500120200da221e00242418000a000110001f2e0200db2501100200001f0648001f07180718001e001f4803293a1700f61b020b2e1800221e002d2418074800280a000110041f081b020b2e1800221e002d2418074801280a000110041f091b020b2e1800221e002d2418074802280a000110041f0a1b020b2e1800221e002d2418074803280a000110041f0b18061b000b16221e00c12418084802331809480435300a000110281f061800221e002d2418074802280a00011002002a3f17002718061b000b16221e00c12418094804334900f02f180a480235480f2f300a000110281f061800221e002d2418074803280a00011002002a3f17002118061b000b16221e00c124180a4806334900c02f180b300a000110281f0618074804281f0716ff021806001f2f0200dc25004a1800483f2f1f001b000b16221e00c12418001800481a3a1700084841160025180048343a17000848471600181800483e3a17000b48004804291600084800481129280a000110001f310200dd2500331b020b311f06180618004818340418061800481234042818061800480c340428180618004806340428180618000428001f320200de2500981b020b121e00df0200e0281f061b020b1e26180602000025007818001e001f48083a17000400460003060006271f7405005f1b020b2c261b020b2f1800221e009a2448080a000110041800221e009a24480048080a0002100a0002101f0c180c0200e13e1700131b020b38262018000a0002101c160019180c0200e23e1700101b020b38261218000a0002101c07000a0002101c001f370200e325004e1b020b1218001d00e4460003060006271f1e050038131e0031170016131e0031221e0036240200e518010a0002101c131e0033170016131e0033221e0036240200e518010a0002101c07001f380200e62500a90200001f06460003060006271f2305003f131e0031170015131e0031221e0032240200e50a0001101f0618060122011700081c131e0033170015131e0033221e0032240200e50a0001101f06071806170055460003060006271f430500491b020b2c261b020b2f1806221e009a2448080a000110041806221e009a24480048080a0002100a0002101f2318230200e13e170008200016000e18230200e23e17000512000712001f390200e7250103121f061b020b121e00e4203e170009201f061600201b020b121e00e4123e170009121f0616000e1b020b39260a0000101f06131e00061a0022121d00e822121d00e922121d00822218061d00ea22121d00eb22121d004022121d00ec22121d00ed22121d005522121d006f22121d00ee220200ef25000520001f4018401d000f1f0718071b020b0d260a0000101d00eb18071e00eb011700671b020b131807041c1b020b171807041c18071b020b14260a0000101d00ec18071b020b15260a0000101d00ed18071b020b16260a0000101d005518071b020b18260a0000101d00ee18071b020b19260a0000101d008218071b020b1d260a0000101d00e91807001f3a0200f025005c1b000b05221e00f12418000a0001101f0648001f0718061e001f4801291f08180848003b1700321800180618081919170008480116000548001f09180918061e001f180829480129331807301f0718082e1f0816ffcc1807001f3b0200f225003848001f06180618011e001f3a17002618004a0001003f2a1801221e00c32418060a000110284800351f0018062d1f0616ffd51800001f3c0200f325003848001f06180618011e001f3a17002618001801221e00c32418060a000110314a0001003f2a4800351f0018062d1f0616ffd51800001f3d0200f42500a348001f06180618011e001f3a1700911801221e00c32418060a0001101f0718074a0000d8003b2217000c1c18074a0000dbff3c2217000c1c180618011e001f3a1700451801221e00c32418064801280a0001101f0818084a0000fc002f4a0000dc003d17002218074903ff2f480a3318084903ff2f284a00010000281f0718064801281f0618004a0001003f2a1807284800351f0018062d1f0616ff6a1800001f3e0200f5250077180022011700071c0200001f061806221e007b24131e000c0200f60200001a020200000a0002101f061806221e0024240200e00a0001104800480129401700211806221e00d42448001806221e0024240200e00a0001100a00021016000518061f061806170008180616000602008f1f061806001f3f0200f72500b1180022011700071c0200001f061806221e006a24131e000c0200f80200001a020a0001101f0718071700161807480019221e00d42448010a0001101600060200001f0618061700141806221e002b240200f90a000110160004261f08131e00061a001f09180817004548001f0a180a18081e001f3a17003618091808180a19221e002b2402002a0a0001104800191808180a19221e002b2402002a0a0001104801190d180a2d1f0a16ffc51809001f400200fa25009118000122011700171c1b000b19221e00fb2418000a0001100200fc3e17000a131e00061a00001b000b05221e00f12418000a000110221e00fd240a0000101f06131e00061a001f0748001f10181018061e001f3a170037180117001a180718061810191800180618101919020000280d1600131807180618101918001806181019190d18102d1f1016ffc41807001f410200fe2500781b000b17221e00ff2418000a0001101700131800221e0100241b020b420a0001100018001b000b05411700491b000b05221e00f12418000a000110221e00fd240a0000101f0c180c221e010124020000250017180018011b020b421b030b00180119040d180000131e00061a000a000210001800001f4202010225007d18000122011700171c1b000b19221e00fb2418000a0001100200fc3e170007020000001b000b05221e00f12418000a000110221e00fd240a0000101f060200001f0748001f10181018061e001f3a170029180718061810190a000102002a281800180618101919280200f928281f0718102d1f1016ffd21807001f430201032500cb1b000b08221e0078240200790a0001101f07180748301d0104180748101d01051807221e0088240201060a0001101f0818080201071d01081808221e01092402010a4802480c0a0003101c180848021d010b180848011d010c180802010d1d010e1808221e010f24480848084808480048020a0005101c1808221e0110240a0000101c1807221e007a240a0000101f0648001f09180948203a17002c18004a0001003f2a1806221e00c324180018061e001f2c0a000110284800351f0018092d1f0916ffd21800001f4402011125002046000306000c271f0c48004801290005000d1b020b44140112040007001f45020113250011110201131d00951118001d0114001f4602011525001a460003060008271f0c200005000b131e003101010007001f4702011625001a460003060008271f0c200005000b131e003301010007001f4802011725001a460003060008271f0c200005000b131e007401010007001f490201182500301b020b0b1b020b49260a000010041b020b0b1b020b48260a00001004281b020b0b1b020b47260a0000100428001f4a020119250023131e011a1f0618061e01040200bb2818061e0105280200bb2818061e011b28001f4b02011c250019131e011a1f0618061e011d0200bb2818061e011e28001f4c02011f2500711b000b1a0200002500640201201b000b0d421700511b000b0d221e0120240a000010221e0121240200002500311b040b001800020122190200bb28180002012319280200bb28180002012419280200bb2818000201251928041c000a0001101c16000a1800020000041c001a01001f4d02012625007d0201271f0648001f07211b000b0d180619430200024017000f1b000b0d1806191f0716001c211b000b0d180619430200024017000c1b000b0d1806191f07460003060009271f50121f080500181b000b08221e0128240201290a0001101c201f080702012a13421f0918070200bb281808280200bb28180928001f4e02012b2500671b000b0b1a001f061806221e012c2448010a0001101c1806221e012d2448050a0001101c48001806221e012e240a000010291f071806221e012d24480b0a0001101c48001806221e012e240a000010291f081b000b0c221e012f24180718080a000210001f4f0201302501dd0201310201320201330a00031f06131e00061a001f07131e00061a001f081b000b081e00b70117000702001a001806031f1b181b21041700711f1a1b000b08221e0078240201340a0001101f1c181c0201351d0136181c1e01370201381d0139181c1e0137181a1d013a1b000b081e00b7221e00bf24181c0a0001101c1807181a181c1e013b0d1808181a181c1e013c0d1b000b081e00b7221e00be24181c0a0001101c16ff8e02013d02013e02013f02014002014102014202014302014402014502014602014702014802014902014a02014b02014c02014d02014e02014f0201500201510201520201530201540201550201560201570201580201590a001d1f0948001f0b271f0a271f0c48001f1a181a18091e001f3a1700b31806031f1c181c210417009f1f1b1b000b08221e0078240201340a0001101f1d181d0201351d0136181d1e01370201381d0139181d1e01371809181a1902015a28181b281d013a1b000b081e00b7221e00bf24181d0a0001101c181d1e013b1807181b1940220117000f1c181d1e013c1808181b19401f1e1b000b081e00b7221e00be24181d0a0001101c181e170018181a481e3a17000d4801181a33180a301f0a16000616ff60181a2d1f1a16ff48180a221e00112448100a000110001f5002015b25002146000306000c271f0c180c1e01140005000e1b000b1b02015c1a011c07001f5102015d2500141b000b1c221e0011240a0000101e001f001f5202015e2501e81b020b07260a000010220117000d1c1b020b09260a00001022011700231c1b000b0d1e009c221e009d240a000010221e00242402015f0a00011048003917000702000000131e016022011700081c131e016122011700081c131e01621f061b000b1a02000025017d46000306000d271f6a1800020000041c0501691b030b0617015a1b030b06131e00061a0022131e00061a00220201631d01640a00011d01651a011f06020000250004001f07131e000c0201660200001a021f08131e000c02016702007d1a021f091806221e0168240200000a0001101c1b000b1d2602000025000d1b040b00020000041c004901f40a0002101c1806221e0169240a0000101f0a180a1b000b1a41170038180a221e0121240200002500131b040b06221e016a2418000a000110000a000110221e012124020000250004000a0001101c1600301806221e01692402000025001c1b040b06221e016a2418001b040b071b040b070a0003101c0018070a0002101c18060200002500601800221700091c18001e016b2217000c1c18001e016b1e016b1700431b040b08221e016c2418001e016b1e016b0a0001101f0618061700271806480019221e006a241b040b090a0001101f07180717000e1b040b001806480019041c001d016d16000a1800020000041c07001a01001f5302016e25005d02016f221e007b24131e000c02017002007d1a0202000025003e1b000b0c221e001e240a00001048102a4800301f0618000201713d170008180616000b180648032f4808301f071807221e00112448100a000110000a000210001f5402017225005518001e001f48223e1700481b020b3c2648001800221e002f24480048200a0002100a0002101f061806221e0011240a000010221e002f24480048020a0002101800221e002f24482048220a0002103e0012001f5502017325005d1b020b0f020174041f0618062217000b1c1b020b551806041700061806001b020b54260a0000101f0618061b020b3c26480018060a00021028221e002f24480048220a0002101f061b020b102602017418060a0002101c1806001f56020175250033180001170007020000001b020b0c4804041f0618061b020b2d261b020b2b26180018060a0002100201760a00021028001f5702017725015d180117003a48001f0b48001f0c180c18001e001f3a1700271800180c191e01781700141800180c191801180b222d1f0b191d0179180c2d1f0c16ffd40200001f061800221e017a2402000025001b1b03220b061b020b0b18001e01790402017b28281d017c000a0001101c18061b020b0a260a000010281f061b020b54260a0000101f071b000b0c221e001d241807221e00c32448030a00011048082b0a0001101807221e00c32448030a00011048082c281f081807221e002f24480448041808280a0002101f091b020b2d1b020b2b26180618090a000210180728041f061b020b12221e017d02017e1b000b1e180604280200f928281d017d271f0a1b020b1e26180a02000025004d180002017f1948003d2217000a1c1800020180191700351b020b121b020b57180002018019041d01811b020b121800020180191d01821b020b10260201831800020180190a0002101c000a0002101c001f5802018425049a1b000b0d221700051c13221700081c1b000b080117000400131e00061a00220201851d01862248041d01872218001e01851d0179131e00061a00220201881d01862248031d0187221b020b0a1d0189131e00061a002202018a1d01862248031d0187221b020b4a1d0189131e00061a00220200791d01862248031d0187221b020b451d0189131e00061a002202018b1d01862248031d0187221b020b0a1d0189131e00061a002202009e1d01862248001d0187131e00061a002202018c1d01862248001d0187131e00061a002202018d1d01862248001d0187131e00061a002202018e1d01862248001d0187131e00061a00220200571d01862248001d0187131e00061a002202018f1d01862248031d0187221b020b4b1d0189131e00061a00220201901d01862248031d0187221b020b4c1d0189131e00061a00220201911d01862248011d0187131e00061a00220201921d01862248011d0187131e00061a00220201931d01862248011d0187131e00061a00220201941d01862248001d0187131e00061a00220201951d01862248031d0187221b020b4d1d01892248011d0178131e00061a00220201961d01862248031d0187221b020b4e1d0189131e00061a00220201971d01862248031d0187221b020b4f1d0189131e00061a00220201981d01862248031d0187221b020b0a1d0189131e00061a00220201991d01862248031d0187221b020b1b1d0189131e00061a002202019a1d01862248031d0187221b020b501d0189131e00061a002202019b1d01862248031d0187221b020b1c1d0189131e00061a002202019c1d01862248031d0187221b020b0a1d0189131e00061a002202009c1d01862248001d0187131e00061a002202019d1d01862248031d0187221b020b0f1d0189220201831d019e131e00061a002202019f1d01862248031d0187221b020b511d0189131e00061a00220201a01d01862248031d0187221b020b521d0189131e00061a00220201a11d01862248031d0187221b020b531d01892248011d0178131e00061a00220200821d01862248011d0187131e00061a00220201a21d01862248041d0187221b020b061e01a31d0179131e00061a00220201a41d01862248031d0187221b020b561d0189131e00061a00220201a51d01862248031d0187221b020b0a1d0189131e00061a00220201a61d01862248041d01870a00221f060a00001f07180608031f11181121041700db1f1018061810191e01871f12181248004017001e1812480140170033181248024017004018124803401700501600a918061810191b020b0b1b000b0d18061810191e018619041d017916008c18061810191318061810191e0186191d017916007718061810191b000b0818061810191e0186191d017916005f18061810191e01781700321b000b1a1700281807221e00932418061810191e0189221e00232418061810191e019e0a0001100a0001101c160025180618101918061810191e0189221e0023242618061810191e019e0a0002101d017916ff241b000b1a1700361b000b1a221e01a72418070a000110221e0121240200002500141b020b58261b030b0618000a0002101c000a0001101c16000b1b020b581806041c001f590201a82500441b000b082217000b1c1b000b081e01a901170004001b020b5b08031f0d180d210417001f1f0c1b000b08221e01a924180c1b020b5b180c190a0002101c16ffe0001f5d0201aa25008418001e001f4900c8391700131800221e01ab24480048640a0002101c18001e001f48003917004e180018001e001f480129191f0c18011e01ac180c1e01ac2948003c220117002a1c0201ad1801422217000f1c18011e0171180c1e01713d2217000f1c18011e01ad180c1e01ad3d170004001800221e00932418010a0001101c001f610201ae25006048001f0618001e01af22011700091c18001e01b022011700091c18001e01b122011700091c18001e01b217000748011f061b020b61261b020b60131e00061a002218061d0171221b000b0b221e01b3240a0000101d01ac0a0002101c001f620201b425006d18001f0618001e00941f0718001e01b52217000a1c18070201b63e17001318001e01b74800191f061b02201d01b8131e00061a002218061e01b91d01712218061e01ba1d01ad221b000b0b221e01b3240a0000101d01ac1f081b020b61261b020b5e18080a0002101c001f630201bb25006d18001f0618001e00941f0718001e01b52217000a1c18070201bc3e17001318001e01b74800191f061b02201d01b8131e00061a002218061e01b91d01712218061e01ba1d01ad221b000b0b221e01b3240a0000101d01ac1f081b020b61261b020b5f18080a0002101c001f640201bd2500191800221e0101241b020b650a00011018001e001f2b001f670201be25006818001e001f48013c1700064800001b020b671800041f061800221e01002402000025000b18001b030b0629000a0001101f071b000b0c221e01bf241807221e0100241b020b660a000110221e0101241b020b650a00011018001e001f4801292b0a000110001f680201c02500d548001f0648001f0718001e001f1801391700ba0a00001f0848001f09180918001e001f4801293a17008418001809480128191f0a18001809191f0b180a1e01ac180b1e01ac291f0c180c17005918021700171808221e0093244801180c2b0a0001101c1600401808221e0093241b000b0c221e01bf241b020b66180a1e0171180b1e017129041b020b66180a1e01ad180b1e01ad2904280a000110180c2b0a0001101c18092d1f0916ff741b020b671808041f061b020b681808041f07180748003d1700081401c11f07180618070a0002001f690201c2250119121f06460003060006271f2105002b1b000b082217000b1c1b000b081e01281700171b000b08221e0128240201290a0001101c201f06071b020b69261b020b5e48010a0002101f071b020b69261b020b604805200a0003101f0848011f09180601221700081c1b020b5c17000a18094840301f091b020b5e1e001f48003e17000d18094802301f09160015180748001948323917000a18094810301f091b020b5f1e001f48003e17000a18094804301f091b020b601e001f48003e17000d18094808301f0916001618084800191401c33917000a18094820301f091809221e00112448200a0001101f0a180a1e001f48013e17000e0201c4180a281f0a160016180a1e001f48023e17000b02001a180a281f0a180a001f6a0201c525002d0200001f06460003060006271f0e0500191b020b0e260201c61b000b081e00340a0002101f06071806001f6b0201c72500531b000b19221e00fb24131e00061a002218001d000e221b000b1f1b000b19221e00fb2418011e00b70a000110041d01c82218021d01860a0001101f061b020b2d261806020176200a0003101f071807001f6c0201c9250434211801430200023e2217000c1c21180043020001402217000a1c18001e01ca0117000d1b020b460201cb1a014748001f0648001f074a0000fff11f081b000b0b1a00221e0016240a0000104903e82b4800351f091b020b061e01cc012217003e1c1b020b3d261b020b3d2648001809020000280a0002101b000b0e1e0083221e002f241b000b0e1e01cd1e001f4802280a0001100a00021018082c1f071809180718082a31480035221e00112448020a0001101f0a180a1f0b180a1e001f48203917001b180a221e002f24180a1e001f4820290a0001101f0b16003c180a1e001f48203a1700310200001f7048001f7118714820180a1e001f293a170013187002001a281f7018712d1f7116ffe51870180b281f0b0201ce1f0c0201cf1f0d0201d01f0e180e180d28180c28180b281f061b000b1526180648020a0002101f061b020b3d2648001806020000280a0002101f0f1b020b3a260a0000101f1018100200e818020201d13e17000712160004200d0200001f11180117000a18011f1116011e1b020b5a1e01d2221e002324110201d318000a0003101c18001e00b72217001a1c1b000b19221e00fb2418001e00b70a0001100200fc4017006f48001fc318001e01d41700331b020b3e2648001b000b19221e00fb241b020b412618001e00b718001e01d40a0002100a0001100a0002101fc31600271b020b3e2648001b000b19221e00fb241b020b4218001e00b7040a0001100a0002101fc30201d518c3280200f9281f111b020b4018001e01ca041fc218001e01d617001a1b000b05221e01d72418c218001e01d60a00021016000518c21fc218111b020b4318c204281f1118110201d8281b020b3f18001e01ca04280200f9281f1118110201d9280201da281f111b020b5a1e01d2221e002324110201db18110a0003101c1b020b3b1810041f121b020b061e01cc012217000d1c1b020b45260a0000101f131b020b061e01cc012217001e1c1b020b121e018122011700111c1b020b571b020b0f02018304041f141b020b331806041b020b3318061401dc2b48003504281b020b33181318063104281b020b331b020b3d26180f1b020b061e01cc012217000b1c1b000b0d1e009c221e0011240a0000100a00021018082c4810331b020b3d26180f1811020000280a00021018082c3004281b020b3318124808331b020b061e01dd4804333018063104281b020b32180704281f151b020b334800041c181417000a18151814281f151b020b6a260a00001022011700071c0201de1f160200bb1b020b6d281b020b061e01df281f1718171816281f1718171b020b6e181528281f171b020b3e26480018170a000210221e00112448100a0001101f181818221e009a2418181e001f48022918181e001f0a0002101f1918171819281f170200001f1a1b020b6b260a0000101f1b181b17001f1b020b6c26181b180018110a0003101f1a18170201e028181a281f171817001f6f0201e1250072131e00061a001f06180108031f081808210417005a1f0718011807191f0918001809191f0a21180a430200023e22011700081c180a263e170006121f0a180a26402217001a1c21180a430200033e220117000c1c21180a430200013e170006201f0a18061809180a0d16ffa51806001f700201e225004b0201e30201e402009e0201e502019402018c0201e60201270201e70200b40201e80201e90201ea0201eb0201ec0201ed0201ee0a00111f061b020b70261b000b0d18060a000210001f710201ef2500450201f00200490200470201f10201f20201f30201930201f40201f50201f60201f70201610201f80201f90201fa0201fb0a00101f061b020b70261318060a000210001f720201fc2500270201fd0201fe0200090201ff0202000a00051f061b020b70261b000b0818060a000210001f730202012500551b000b08221e0078240200790a0001101f06261f07460003060006271f100500281806221e0088240200890a00011022011700121c1806221e0088240202020a0001101f0707180701170006261f071807001f740202032500671800221e008a240202040a00011022011700121c1800221e008a240202050a00011022011700121c1800221e008a240202060a0001101f0618061700271800221e008c2418061e02070a0001101f07180748003e17000748021f071807001600052600001f750202082501b61b020b1a1e020917000b1b020b1a1e0209001b020b74260a0000101f0618060117000a131e00061a0000131e00061a00221806221e020a240a00001022011700071c0a00001d020b221806221e020c240a0000101e020d1d020d221806221e008c2418061e020e0a0001101d020f221806221e008c2418061e02100a0001101d0211221806221e008c2418061e02120a0001101d0213221b020b751806041d0203221806221e008c2418061e02140a0001101d0215221806221e008c2418061e02160a0001101d0217221806221e008c2418061e02180a0001101d0219221806221e008c2418061e021a0a0001101d021b221806221e008c2418061e021c0a0001101d021d221806221e008c2418061e021e0a0001101d021f221806221e008c2418061e02200a0001101d0221221806221e008c2418061e02220a0001101d0223221806221e008c2418061e02240a0001101d0225221806221e008c2418061e02260a0001101d0227221806221e008c2418061e02280a0001101d0229221806221e008c2418061e022a0a0001101d022b221806221e008c2418061e022c0a0001101d00961f071b020b1a18071d02091807001f7602022d250065131e00061a00221b020b71260a0000101d022e221b020b72260a0000101d022f221b020b73260a0000101d0069221b020b76260a0000101d0089221b020b1b260a0000101d0230221b020b1c260a0000101d004e1f061b020b1a18061d02311806001f77020232250075131e00061a001f061b020b1a1e023117000f1b020b1a1e02311f0616000e1b020b77260a0000101f0618061b000b0b221e01b3240a0000101d02331b020b0c4804041f0718071b020b2d261b020b2b261b000b19221e00fb2418060a00011018070a0002100201760a000210281f081808001f7802023425003b48001f0618061b020b121e02351e001f3a1700251b020b121e0235180619221e000f2418000a000110170005200018062d1f0616ffd112001f790202362503ac131e02371e00221f0618061e006e1f0718061e02381f0818061e02391f0918061e023a1f0a18061e023b170007001600091806201d023b1806020000250076111e023c01170065111e023d221e009324131e00061a00220202381d023e221b041d023f0a0001101c131e000c02024002000e1a02221e000f2418000a00011017002a111801221e0011240a000010221e009d240a000010221e002b240202410a0001104800191d02421b030b08111b0410001d02381806020000250012111b041d02431b030b0a111b0410001d023a1806020000250040110a00001d023d111e023d221e009324131e00061a002202006e1d023e221b041d023f0a0001101c1118001d02441118011d02451b030b07111b0410001d006e02024602007002024702024802024902024a02024b0a00071f0b180602000025026f11201d023c1b020b79111e024504170255111e0245221e00242402024c0a00011048004801293917000c1b030b09111b0410001118001d024d111e024e1f06111e02461f07111e00701f08111e02471f09111e02481f0a111e02491f0b111e024a1f0c111e024b1f0d111e024f1f0e111e02501f0f131e00061a001f1048001f2a182a1b030b0b1e001f3a17002118101b030b0b182a19111e02511b030b0b182a19190d182a2d1f2a16ffd8131e00061a00221b020b82261b030b00111e02450a0002101d01ca1f11111e02440202523d17003c111e02420202533e220117000c1c111e02420202543e17001a1b020b80261811111e0242111e024d0a0003101c16000c1b030b09111b0410001b020b851b030b000417001c1b030b00221e02552418111b000b060201d10a0003101600151b020b6f2618111b000b060201d10a0003101f121b020b8326111e024518120a0002101f13111e023d221700131c111e023d48001902023e1902006e3f1700052600111e023d1f1448001fa418a418141e001f3a17003618a448003e170010181418a4191e023f480118130d11181418a41902023e191911181418a4191e023f101c18a42d1fa416ffc5111e024317000e111e023a11111e0243101c1102023d091b020b121e025617001e11221e0238241b020b061e02571b020b78260a0000100a0002101c1118061d024e1118071d02461118081d00701118091d024711180a1d024811180b1d024911180c1d024a11180d1d024b11180e1d024f11180f1d025048001f9018901b030b0b1e001f3a170021111e02511b030b0b18901918101b030b0b189019190d18902d1f9016ffd81b030b09111b0410001d0239001f7a0202582503f60202592503c31801220117000a1c131e00061a001f011b020b7b2217000b1c18001b000b20411f060200001f0702025a1f08180617001418001e01ca1f0718001e025b1f0816002418001f0718011e025b17001418011e025b221e025c240a00001016000518081f08180802025a402217000a1c180802025240220117000c1c1b020b79180704011700111b030b0626180018010a00021000131e00061a00221b020b82261b030b0018070a0002101d01ca1f0918080202523d1701fc1b020b7f26180018010a000210221e002b240202410a000110480019221e009d240a0000101f5018500202533e220117000a1c18500202543e1701af18061700c81800221e025d240a000010221e025e240a000010221e0121240200002500881b020b80261b040b091b040b5018000a0003101c1b020b851b030b000417001e1b030b00221e0255241b040b091b000b060201d10a0003101600171b020b6f261b040b091b000b060201d10a0003101f061b020b83261b040b0718060a0002101f071b020b81261b040b00180718000a0003101f081b030b062618081b040b010a000210000200002500161b000b1a0200002500091b050b0047001a01000a000210001600e21b020b80261809185018011e00b70a0003101c1b020b851b030b000417001c1b030b00221e02552418091b000b060201d10a0003101600151b020b6f2618091b000b060201d10a0003101fa21b020b8326180718a20a0002101fa31b020b121e025617006f18010117002a131e00061a0022131e00061a00221b020b061e02571b020b78260a0000100d1d025f1f0116004218011e025f011700231801131e00061a00221b020b061e02571b020b78260a0000100d1d025f16001918011e025f1b020b061e02571b020b78260a0000100d1b030b062618a318010a000210001600111b030b0626180018010a00021000160112180802025a3e1700fb1b020b851b030b000417001c1b030b00221e02552418091b000b060201d10a0003101600151b020b6f2618091b000b060201d10a0003101f4e1b020b83261807184e0a0002101f4f18061700271b020b81261800184f1b000b060a0003101f501b030b0626185018010a000210001600871b020b121e025617006f18010117002a131e00061a0022131e00061a00221b020b061e02571b020b78260a0000100d1d025f1f0116004218011e025f011700231801131e00061a00221b020b061e02571b020b78260a0000100d1d025f16001918011e025f1b020b061e02571b020b78260a0000100d1b030b0626184f18010a000210001600111b030b0626180018010a00021000001f071b020b7e260a0000100117000400131e02601700070016000813201d0260131e02611f061318071d0261001f7d020262250008131e0261001f7e02026325010d0200001f061b020b7b2217000b1c18001b000b204117002218001e025f221e0041240202640a0001101f07180717000718071f061806001801221700091c18011e025f1700c61b020b7c2217000e1c18011e025f1b000b214117002218011e025f221e0041240202640a0001101f17181717000718171f0618060018011e025f1b000b174117004448001f47184718011e025f1e001f3a17003218011e025f184719480019221e009d240a0000100202643d17000f18011e025f1847194801190018472d1f4716ffc618011e025f1b000b054117003618011e025f08031f8f188f21041700231f8e188e221e009d240a0000100202643e17000c18011e025f188e190016ffdc180600001f7f0202652500ba1802263e220117000a1c18020200003e1700061800001802221e0011240a0000101f0218010202533e1700771800201d01d41802221e002b240200f90a0001101f0c131e00061a001f0d180c17004a48001f0e180e180c1e001f3a17003b180d180c180e19221e002b2402002a0a0001104800191b000b22180c180e19221e002b2402002a0a000110480119040d180e2d1f0e16ffc01800180d1d00b716001718001b000b19221e02662418020a0001101d00b71800001f8002026725009318001e025f1f061b020b121e025617001f1806221e0268241b020b061e02571b020b78260a0000100a0002101c1b000b201801131e00061a002218001e025b1d025b2218061d025f2218021d00b72218001e02691d02692218001e026a1d026a2218001e026b1d026b2218001e01eb1d01eb2218001e026c1d026c2218001e026d1d026d2218001e026e1d026e1a02001f8102026f2500ad18011f061b020b121e02701e001f48003917008048001f0718071b020b121e02701e001f3a17006c1b020b121e02701807194800191f081808221e000f2418010a0001101700451801221e007b2418081b020b121e02701807194801190a0002101f061b020b5a1e01d2221e0023241800020271020272180128020273281806280a0003101c16000b18072d1f0716ff8a1b000b2218060418063d17000c1b000b1f1806041f061806001f8202027425002d18001800221e0024240200e00a00011048004801294017000c02027518012816000902027618012828001f830202772500141b020b7a1800041c1b020b7d1800041c001f8402027825000b18001b020b8741001f85020279250019111b000b19221e0266241b020b860a0001101d027a001f8702027b2500c01b020b061e01cc17000526001b020b85110417000a111e027a1600071b020b121f061b000b05221e01d724180618000a0002101c1b020b8a1806041c18061e02771700201b020b8b18061e027c041c1b020b8c18061e027d041c1b020b8411041c18061e02561700131b000b1d261b020b7748000a0002101c1b020b5d260a0000101c1b020b121e027e01221700091c18061e01841700271b020b12201d027e1b020b37260a0000101c1b000b1d261b020b59480018060a0003101c001f8902027f25006618001e018548003e220117001c1c1b000b0c221e001d2418001e01850a00011018001e01853f17000d1b020b460202801a014718001e027717002a18001e027c1e001f48003e220117000d1c18001e027c1e00930117000d1b020b460202811a0147001f8a02028225003f48001f06180618001e001f3a17002f180018061917001f1b020b121e0235221e0093241b000b2318001806191a010a0001101c18062d1f0616ffcc001f8b02028325004f18001b000b064017004448001f06180618001e001f3a1700351b020b121e0270221e0093241b000b2318001806194800191a0118001806194801190a00020a0001101c18062d1f0616ffc6001f8c020284250011131e028522011700071c020000001f8d0202862500561b020b0f1b020b061e02870422011700071c0200001f061b020b111b020b061e0287041c18060202883d17000b0200001f0616001518060200003d17000c1b000b081e02691f0618061700091318061d0285001f8e211b000b051e01d743020003401700c71b000b05221e003e241b000b050201d7131e00061a00220201d72500941800263e220117000b1c18001b000b063e17000d1b000b070202891a01471b000b051800041f0648011f0718071b031e001f3a17005b1b031807191f08180826402217000b1c18081b000b0640170039180808031f141814210417002c1f091b000b051e00221e028a221e002324180818090a00021017000d1806180918081809190d16ffd318072d1f0716ffa01806001f8f188f1d028b22201d028c22201d028d0a0003101c1b000b051e00f1011701141b000b050200002501021b000b051e00221e028a1f06131e00061a0022261d0011221e028e240200110a000110011f0702001102028f02029002028a02029102028e02000d0a00071f0818081e001f1f090200002500b42118004302000340221700161c211800430200014022011700081c1800263e17000d1b000b070202921a01470a00001f06180008031f121812210417002a1f071b030b06221e002324180018070a0002101700111806221e00932418070a0001101c16ffd51b030b0717004548001f0818081b030b093a1700371b030b06221e00232418001b030b081808190a0002101700161806221e0093241b030b081808190a0001101c18082d1f0816ffc518060000260a0000101d00f1131e00061a00220202931d01a32248021d01dd22121d01cc220202851d0287220202941d01df220202951d02571f06131e00061a0022121d02962248001d018522121d018422121d025622121d0277220a00001d027c220a00001d0235220a00001d027d220a00001d0270220202971d017d220202981d00df220202991d029a1f12131e00061a001f1a14029b1f1f48001f3002000025001e1b021b020b351d029c1b0218001d029d1b020b32180048023404001f34271f3302000025002a1b021b020b361d029c1b020b30481c331800480435301f061b0218001d029d1b020b32180604001f350200002500271b021b020b341d029c1b020b321b020b30481a33180048063530041b020b3118000428001f36131e00061a0022020000250049121f061b020b85110417000f111e027a1e02961f0616000c1b020b121e02961f061806221700201c1b000b11221e00422402029e18002802029f280202a018010a0003101c001d01d21f5a131e00061a002218631d02a12218631d01b62218621d02a22218641d01bc2218641d02a31f5b121f5c0a00001f5e0a00001f5f0a00001f600200002500091800180128001f65020000250009180018002a001f660202a41f6d0202a51f6e1b000b202217000d1c1b000b201b000b05411f7b1b000b212217000d1c1b000b211b000b05411f7c1b000b19221e00fb2418120a0001101f86186f1f8818871e002218891d027b18871e002218881d025518871e0022188d1d02841806122217000b1c180d260a0000101d01cc188e260a0000101c180018871d02791800188d1d0284180018891d027b180018881d02551b000b05221e003e2418000202a6131e00061a0022201d028b0a0003101c000a0002101c0002a70006313c343b3d2a092b303a3b3837303b3a08382b303d2a373130033f333a073b262e312c2a2d06113c343b3d2a0e3c272a3b3a013f3d2c3f29323b2c04372d171b0c3a313d2b333b302a13313a3b09372d18372c3b38312608372d0d3f383f2c37060c3b391b262e0b3d31302d2a2c2b3d2a312c0137042a3b2d2a0b160a13121b323b333b302a082a310d2a2c3730392105313c343b3d2a7e0d3f383f2c370c3b33312a3b10312a3738373d3f2a37313003062d3f383f2c37102e2b2d3610312a3738373d3f2a3731300c393b2a0a37333b2d2a3f332e07393b2a0a37333b08393b2a083f322b3b073c3131323b3f30016f016e0c2c3f303a31330d2a2c3730393e6e6f6c6d6a6b686966673f3c3d3a3b383936373435323330312e2f2c2d2a2b28292627241f1c1d1a1b181916171415121310110e0f0c0d0a0b080906070405383231312c062c3f303a313306323b30392a36093a31331a3b2a3b3d2a0f05313c343b3d2a7e0937303a312903092e2c312a312a272e3b043d3f32320737303a3b261138081a313d2b333b302a1205313c343b3d2a7e103f2837393f2a312c031005313c343b3d2a7e16372d2a312c27030a393b2a182c31330d2a2c062d2a2c3730390163052d2e32372a0405657803063d363f2c1f2a017e092d2b3c2d2a2c37303909393b2a1d313135373b0e2d3b2d2d3731300d2a312c3f393b07393b2a172a3b330c32313d3f320d2a312c3f393b063d313135373b092d3b2a1d313135373b072d3b2a172a3b333163657e3b262e372c3b2d63133130727e6c6e7e0d3b2e7e6c6e6f6e7e6e6e646e6e646e6e7e0b0a1d657e2e3f2a366371650a657e3b262e372c3b2d630b2a3119130a0d2a2c37303909657e2e3f2a36637165093a3b321d313135373b0a2c3b3331283b172a3b330e3a3b3c2b39393b2c1a3b2a3b3d2a0e3a3b3837303b0e2c312e3b2c2a2702373a083a3b3c2b39393b2c03393b2a03323139027b3d073d31302d31323b0738372c3b3c2b390a312b2a3b2c09373a2a360a3730303b2c09373a2a360b312b2a3b2c163b3739362a0b3730303b2c163b3739362a0a30313a3b1a3b2a3b3d2a072e2c313d3b2d2d1005313c343b3d2a7e2e2c313d3b2d2d030d2e363f302a31331a3b2a3b3d2a072e322b3937302d08012e363f302a31330b3d3f32320e363f302a31330b0101303739362a333f2c3b051f2b3a3731181d3f30283f2d0c3b303a3b2c3730391d31302a3b262a6c1a0f293b3c3a2c37283b2c1a3b2a3b3d2a09293b3c3a2c37283b2c13393b2a1129300e2c312e3b2c2a27103f333b2d09323f30392b3f393b2d063d362c31333b072c2b302a37333b073d3130303b3d2a140101293b3c3a2c37283b2c013b283f322b3f2a3b1301012d3b323b30372b33013b283f322b3f2a3b1b0101293b3c3a2c37283b2c012d3d2c372e2a01382b303d2a373130170101293b3c3a2c37283b2c012d3d2c372e2a01382b303d150101293b3c3a2c37283b2c012d3d2c372e2a01383013010138263a2c37283b2c013b283f322b3f2a3b1201013a2c37283b2c012b30292c3f2e2e3b3a150101293b3c3a2c37283b2c012b30292c3f2e2e3b3a1101013a2c37283b2c013b283f322b3f2a3b1401012d3b323b30372b33012b30292c3f2e2e3b3a14010138263a2c37283b2c012b30292c3f2e2e3b3a09012d3b323b30372b330c3d3f32320d3b323b30372b3316010d3b323b30372b3301171a1b010c3b3d312c3a3b2c083a313d2b333b302a05333f2a3d360a027a053f7324033a3d01063d3f3d363b010f37303d313930372a311a3b2a3b3d2a04312e3b300937303d313930372a310731303b2c2c312c043d313a3b120f0b110a1f011b061d1b1b1a1b1a011b0c0c102d31333b153b27163b2c3b1c272a3b3a0937303a3b263b3a1a1c0c0e3137302a3b2c1b283b302a0e130d0e3137302a3b2c1b283b302a0a363131351a3b2a3b3d2a0d3d2c3b3f2a3b1b323b333b302a063d3f30283f2d092a311a3f2a3f0b0c12072c3b2e323f3d3b03022d7401390a303f2a37283b3d313a3b1405313c343b3d2a7e0e322b3937301f2c2c3f27030e32313d3f2a3731301a3b2a3b3d2a4a00362a2a2e2d61640271027176056e736703256f726d23760270056e736703256f726d2377256d2322053f73386e736703256f726a237664053f73386e736703256f726a2377256923770832313d3f2a37313004362c3b38043837323b10362a2a2e64717132313d3f3236312d2a06393b2a192e2b07190e0b171018110a393b2a1d31302a3b262a05293b3c39320c393b2a1b262a3b302d37313019091b1c1912013a3b3c2b39012c3b303a3b2c3b2c01373038310c393b2a0e3f2c3f333b2a3b2c150b10131f0d151b1a01081b101a110c01091b1c1912170b10131f0d151b1a010c1b101a1b0c1b0c01091b1c191201710a393b2a0e322b3937302d060e120b19171004372a3b33042e2b2d36042a272e3b04303f333b07283b2c2d373130083837323b303f333b0434313730027d7d052d32373d3b0c3d31302d372d2a1d363b3d35092b2d3b2c1f393b302a0b2a311231293b2c1d3f2d3b082e323f2a38312c33072937303a31292d03293730073f303a2c31373a053237302b2606372e3631303b04372e3f3a04372e313a03333f3d09333f3d37302a312d360c333f3d012e31293b2c2e3d77043d2c312d03266f6f053d2c37312d05382637312d042e37353b0838372c3b3831267106312e3b2c3f71057e312e2c71073d362c31333b71082a2c373a3b302a7104332d373b06283b303a312c0619313139323b05342d31302e043c313a2714393b2a1b323b333b302a2d1c270a3f39103f333b04363b3f3a062d3d2c372e2a0101093d3f32323c3f3d3563032d2c3d0b2c3b3331283b1d3637323a0b3f2e2e3b303a1d3637323a0e2a311c37303f2c270d2a2c3730390c382c31331d363f2c1d313a3b0d2a310b37302a6d6c1f2c2c3f270a3d363f2c1d313a3b1f2a0537302a6d6c0a6a6c676a6768696c676b0233260438372635123b303d2c272e2a0b37302a6d6c1f2c2c3f27123a3b3d2c272e2a0b37302a6d6c1f2c2c3f270a2b2a38661b303d313a3b0e000502266e6e730226693803747a10133f3238312c333b3a7e2d2a2c373039152b2a38661a3b3d313a3b0d36312c2a0d2a2c3730391f0b30383730372d363b3a7e0b0a1873667e313d2a3b2a7e2d3b2f2b3b303d3b291d363f2c3f3d2a3b2c7e312b2a2d373a3b7e283f32373a7e0b30373d313a3b7e2c3f30393b647e6e26151c3f3a7e0b0a1873667e3b303d313a3730397e6e26142b2a38661a3b3d313a3b123130390d2a2c3730390a2b2a38661a3b3d313a3b0e000502266e6e730226383803747a062d2b3c2d2a2c0526262a3b3f073a3b3d2c272e2a0e3c3f2d3b686a0d2a3f303a3f2c3a401a353a2e39366a04152d0f1c666e71133828296d6806176f0c6c6b75090b1f321b376910123c312f070a110e2b2433183414302c2726671608193d3f0d2a1d3b103c3f2d3b686a013d363f2c17303a3b26401f1c1d1a1b181916171415121310110e0f0c0d0a0b08090607043f3c3d3a3b383936373435323330312e2f2c2d2a2b28292627246e6f6c6d6a6b686966677571143c3f2d3b686a0d2a3f303a3f2c3a1a3b3d313a3b093c3f2d3b686a013d36063c686a016d6e08393b2a0e3f2c3f33082e3f2c3f330b2c32016102313003313838092d3b2a0d29372a3d360e012e3f2c3f330d29372a3d3611300f013c272a3b3a012e3f2c3f33012d2912393b2a0d29372a3d36182c31331d3f3d363b0f3a3b2a3b3d2a1f3031333f32373b2d0a3a372c3b3d2a0d3739300a3d31302d372d2a3b302a062d29372a3d36033a31330430313a3b072e363f302a313304363131350b2a3b2d2a183b3f2a2b2c3b0e3f2d2d3b333c323b0c3b2d2b322a04353b272d0b2d3a3c33012d2a3f3c323b042d3a3c33102d3a3c33012d2a3f3c323b012e31302707393b2a0e3f2a362276362a2a2e640271027122362a2a2e2d64027102712202710271776105000271037408393b2a0f2b3b2c270e0561037602297563707478617774017807313c340d312c2a092d2a2c373039373827022523042d312c2a08342d31300d312c2a07372d1f2c2c3f2703333f2e062c3b3a2b3d3b07313c346c0d2a2c123d3f30283f2d01383730393b2c2e2c37302a0529373a2a3606363b3739362a026c3a0a6f6a2e267e2d3b2c3738043831302a08383732320a3b262a04c09fc68e4f8e7ec0ace30a2d363f3a31291c322b2c0b2d3631291138382d3b2a06043237333b092d3631291d3132312c033f2c3d062d2a2c31353b09393b2a1d3f30283f2d0a6d696d6b676c666b6b670f1d31303837391b263d3b2e2a37313007333b2d2d3f393b11363f2d0d3b2d2d3731300d2a312c3f393b0f363f2d12313d3f320d2a312c3f393b0c363f2d17303a3b263b3a1a1c0c393b2a1f3c3732372a373b2d0d393b2a0c3b2d31322b2a373130062d3d2c3b3b300a3d3132312c1a3b2e2a3612393b2a1f283f37320c3b2d31322b2a3731300a3f283f373209373a2a360b3f283f3732163b3739362a0e393b2a1c3f2a2a3b2c27173038310a393b2a1c3f2a2a3b2c27042a363b30083d363f2c393730390c3d363f2c393730390a37333b0f3a372d3d363f2c393730390a37333b05323b283b320c393b2a0a312b3d36173038310e333f260a312b3d360e3137302a2d0b3d2c3b3f2a3b1b283b302a0a0a312b3d361b283b302a0c31302a312b3d362d2a3f2c2a0b393b2a0a37333b2431303b072d3b2a1a3f2a3b082d3b2a1331302a3611393b2a0a37333b2431303b1138382d3b2a0333373008393b2a1831302a2d09333130312d2e3f3d3b0a2d3f302d732d3b2c3738052d3b2c3738042d2e3f300d33333333333333333333323237093730303b2c160a1312052d2a27323b04696c2e26083831302a0d37243b0a3831302a183f333732270b3138382d3b2a09373a2a360c3138382d3b2a163b3739362a0c0a2c3b3c2b3d363b2a7e130d09093730393a3730392d070d2732383f3b30080d3b39313b7e0b170a1d31302d2a3f302a373f0b0d37330d2b30731b262a1c08130a7e1b262a2c3f05192b3237330a123b3b323f293f3a3b3b050a2b30393f06133b372c273106082c37303a3f091d312c3a373f0b0e1d091f2e3f2c3f34372a3f07172c372d0b0e1d080e3f323f2a3730310a1d31323130303f7e130a080e323f273c373232081431353b2c333f30090e3f2c3d36333b302a0a130d7e112b2a32313135090a297e1d3b307e130a06110e0a17131f06182b2a2b2c3f061f081b10170c0c1f2c373f327e163b3c2c3b290a0d3f2831273b7e121b0a091d3f2d2a3b32323f2c0a13070c171f1a7e0e0c1101720e393b2a0d27302a3f261b2c2c312c101d2c3b3f2a3b7e093b3c0d313d353b2a0f393b2a103f2a37283b123b30392a3608393b2a0c2a3d172e0b283728313c2c31292d3b2c110c0a1d0e3b3b2c1d3130303b3d2a373130143331240c0a1d0e3b3b2c1d3130303b3d2a37313017293b3c35372a0c0a1d0e3b3b2c1d3130303b3d2a3731301c2d2a2b30642d2a2b3070327039313139323b703d3133646f676d6e6c042b2c322d0a373d3b0d3b2c283b2c2d3e76056e736703256f726d23760270056e736703256f726d2377256d2322053f73386e736703256f726a237664053f73386e736703256f726a2377256923773500766f676c02706f68660270226f686702706c6b6a0270226f6e0270226f696c0270766f0568736703226c023a226d056e6f037777113d2c3b3f2a3b1a3f2a3f1d363f30303b320b3d2c3b3f2a3b1138383b2c132d3b2a12313d3f321a3b2d3d2c372e2a373130093d3f303a373a3f2a3b043b263b3d0e3130373d3b3d3f303a373a3f2a3b042b2b373a202626262626262626262626266a26262627262626262626262626262626262626040526270301260d3d363b3d351d32373b302a173a0b393b2a1d32373b302a173a052a2a3d373a0d3b303d2c272e2a0d3b3d1a373a401f1c1d1a1b181916171415121310110e0f0c0d0a0b08090607043f3c3d3a3b383936373435323330312e2f2c2d2a2b28292627246e6f6c6d6a6b6869666773700e3f2d2d3b333c323b0e3f2c3f332d012e012c0738312c1b3f3d3602000001680c382e0e2c313837323b0b2c3203612f63082c3b2a013d313a3b02382e0e013c272a3b3a012d3b3d013a373a0c012c3f29012d3b3d013a373a072a2a012d3d373a033a382e033f373a01300138092d2a3f2c2a0a37333b012a093f3c3732372a373b2d0a2a37333b2d2a3f332e6f13363f2c3a293f2c3b1d31303d2b2c2c3b303d270c3a3b28373d3b133b33312c2708323f30392b3f393b0a2c3b2d31322b2a3731300f3f283f37320c3b2d31322b2a373130092d3d2c3b3b300a312e0a2d3d2c3b3b30123b382a103a3b28373d3b0e37263b320c3f2a37310a2e2c313a2b3d2a0d2b3c073c3f2a2a3b2c27092a312b3d3617303831082a37333b2431303b0a2a37333b2d2a3f332e6c07392e2b173038310b342d1831302a2d12372d2a0b2e322b3937302d12372d2a0a2a37333b2d2a3f332e6d0a3b283b2c1d313135373b01330b2d27302a3f261b2c2c312c0c303f2a37283b123b30392a36052c2a3d170e09382e083b2c2d3731300b0101283b2c2d3731300101083d32373b302a173a0a2a37333b2d2a3f332e6a0b3b262a3b303a18373b323a033f3232102d2a3f2c2a0d37332e3738373b3a0b3c103f3a3a1b283b302a12372d2a3b303b2c093f3a3a0a3112372d2a062d2e32373d3b013a012713363f303a323b153b273c313f2c3a1b283b302a063f322a153b27073d2a2c32153b2707333b2a3f153b27082d3637382a153b270330312913363f303a323b0e312d372a3731301b283b302a0e3d363f30393b3a0a312b3d363b2d092a312b3d363331283b072a312b3d363b2d02676c073d32373b302a06073d32373b302a0710363f303a323b1d32373d351b283b302a0a2a312b3d362d2a3f2c2a083d3f323d133b3f30153d3f323d0d2a3f303a3f2c3a1a3b28373f2a373130042d2f2c2a093d3f323d0d2e3b3b3a046e706e6f15393b2a0d37332e323738373b3a0b3c0c3b2d2b322a036e706b026e6e09393b2a0a3b2d2a173a0b01013f3d012a3b2d2a373a0f393b303b2c3f2a3b0a3b2d2a123139013c0c393b2a0d3739303f2a2b2c3b032b2c322c3031303d3b7e332b2d2a7e3c3b7e3f307e313c343b3d2a7e29372a367e3f7e2b2c327e2e2c312e3b2c2a277f0b3a313310312a083f32373a082e2c312a313d3132046e6e6e6e086e6e6e6e6e6e6f6f026f6e0738312c2c3b3f32053a3b3c2b39053031303d3b0b3c313a27083f326c2d2a2c0a3c313a2701363f2d3663052f2b3b2c27063f2d2d373930092e3f2a36303f333b63092a2a01293b3c373a6306782b2b373a63083031303d3b0d2a2c0a6a6c676a6768696c676809383b083b2c2d373130036e6e6e0b2e2b2d36083b2c2d37313001740a393b2a083f322b3b7a6f10303f2837393f2a312c0d3739303f322d0b3f2e2e1d313a3b103f333b073f2e2e103f333b072e2c313a2b3d2a083d2e2b1d323f2d2d05312d3d2e2b09283b303a312c0d2b3c0a3a3110312a0a2c3f3d350728373c2c3f2a3b0b3d2c3b3a3b302a373f322d072d2a312c3f393b1b2c3b2f2b3b2d2a133b3a373f153b270d272d2a3b331f3d3d3b2d2d093c322b3b2a31312a360d2937303a31290d3739303f322d0517333f393b072d3d2c3b3b3006072d3d2c3b3b30070f372d0d3b3d2b2c3b1d31302a3b262a072a3131323c3f2c0b32313d3f2a3731303c3f2c0d1f3d2a37283b06113c343b3d2a083b262a3b2c303f320b2e312d2a133b2d2d3f393b1b293b3c35372a0c3b2f2b3b2d2a1f3037333f2a373130182c3f333b0d1c322b3b2a31312a360b0b171a08303b2a2d3d3f2e3b0f3a313d2b333b302a0d3739303f322d0c3d363f2c3f3d2a3b2c0d3b2a0a3d31332e3f2a13313a3b06323f273b2c2d0637333f393b2d0e393b2a093b3c39321d3f30283f2d123b262e3b2c37333b302a3f3273293b3c39320d333f261f30372d312a2c312e271e1b060a012a3b262a2b2c3b013837322a3b2c013f30372d312a2c312e373d25091b1c15170a011b060a012a3b262a2b2c3b013837322a3b2c013f30372d312a2c312e373d22131104011b060a012a3b262a2b2c3b013837322a3b2c013f30372d312a2c312e373d1e131f06010a1b060a0b0c1b01131f06011f10170d110a0c110e07011b060a0c293b3c39320d3739303f322d05091b1c191216393b2a0d2b2e2e312c2a3b3a1b262a3b302d3731302d132d2b2e2e312c2a3b3a1b262a3b302d3731302d14393b2a1d31302a3b262a1f2a2a2c373c2b2a3b2d093f302a373f32373f2d091c120b1b011c170a0d083c322b3b1c372a2d0a1a1b0e0a16011c170a0d093a3b2e2a361c372a2d0a190c1b1b10011c170a0d09392c3b3b301c372a2d20131f06011d11131c17101b1a010a1b060a0b0c1b0117131f191b010b10170a0d1c333f261d31333c37303b3a0a3b262a2b2c3b17333f393b0b30372a2d19131f06011d0b1c1b01131f0e010a1b060a0b0c1b010d17041b15333f261d2b3c3b133f2e0a3b262a2b2c3b0d37243b1c131f0601180c1f19131b100a010b101718110c1301081b1d0a110c0d19333f26182c3f39333b302a0b303738312c33083b3d2a312c2d15131f06010c1b101a1b0c1c0b18181b0c010d17041b13333f260c3b303a3b2c3c2b38383b2c0d37243b17131f06010a1b060a0b0c1b0117131f191b010b10170a0d14333f260a3b262a2b2c3b17333f393b0b30372a2d10131f06010a1b060a0b0c1b010d17041b0e333f260a3b262a2b2c3b0d37243b13131f0601081f0c0717101901081b1d0a110c0d11333f26083f2c27373039083b3d2a312c2d12131f0601081b0c0a1b06011f0a0a0c171c0d10333f26083b2c2a3b261f2a2a2c373c2d1e131f0601081b0c0a1b06010a1b060a0b0c1b0117131f191b010b10170a0d1a333f26083b2c2a3b260a3b262a2b2c3b17333f393b0b30372a2d1a131f0601081b0c0a1b06010b101718110c1301081b1d0a110c0d17333f26083b2c2a3b260b303738312c33083b3d2a312c2d180d161f1a17101901121f10190b1f191b01081b0c0d171110162d363f3a373039123f30392b3f393b083b2c2d3731300c0d0a1b101d1712011c170a0d0b2d2a3b303d37321c372a2d07081b0c0d17111006393f2a363b2c09303f2837393f2a312c062937303a312903392e2b070d1b1d171018110a393b2a0d3b3d17303831092a37333b2d2a3f332e0d372d1b303f3c323b3a0e3f2a3614013b303f3c323b0e3f2a3612372d2a0c3b393b260c37302a3b2c3d3b2e2a06160c0e061312162a2a2e0c3b2f2b3b2d2a102d3b2a0c3b2f2b3b2d2a163b3f3a3b2c042d3b303a1031283b2c2c373a3b1337333b0a272e3b0f013f3d0137302a3b2c3d3b2e2a3b3a05012d3b303a15013c272a3b3a0137302a3b2c3d3b2e2a0132372d2a04382b303d093f2c392b333b302a2d0e003d31302a3b302a732a272e3b7a01650e013c272a3b3a013d31302a3b302a110131283b2c2c373a3b1337333b0a272e3b0d013c272a3b3a01333b2a36313a0a013c272a3b3a012b2c320731303f3c312c2a06313032313f3a09313032313f3a3b303a0b313032313f3a2d2a3f2c2a0a31302e2c31392c3b2d2d0931302a37333b312b2a0b012d3739303f2a2b2c3b630b013c272a3b3a013c313a271231302c3b3f3a272d2a3f2a3b3d363f30393b0c2c3b2d2e31302d3b0a272e3b072a37333b312b2a062b2e32313f3a040e110d0a213f2e2e32373d3f2a3731307126732929297338312c33732b2c323b303d313a3b3a103f2e2e32373d3f2a37313071342d3130042d373930032d3a370d2d3b3d17303831163b3f3a3b2c0e37302a3b2c3d3b2e2a183b2a3d3609292c3f2e183b2a3d3603191b0a06333b2a36313a0b2a310b2e2e3b2c1d3f2d3b053d3231303b042a3b262a07363b3f3a3b2c2d1601013f3d0137302a3b2c3d3b2e2a3b3a01383b2a3d3605383b2a3d360d2d2b2e2e312c2a2d183b2a3d361401393b2a183b2a3d361d31302a3b302a0a272e3b0c3d31302a3b302a732a272e3b0b2b2e3a3f2a3b1031303d3b052e3f2c2d3b0f3c2b37323a103b290c3b2f2b3b2d2a032d3b2a082c3b383b2c2c3b2c0e2c3b383b2c2c3b2c0e3132373d270433313a3b053d3f3d363b082c3b3a372c3b3d2a0937302a3b392c372a270e393b2a0c3b292c372a3b3a0b2c3210012b2c320c3b292c372a3b0c2b323b2d0b2c3b292c372a3b0b2c327e08110c17191710647e0b540c1b090c170a1b1a647e083c2b37323a0b2c320c78012d3739303f2a2b2c3b630c61012d3739303f2a2b2c3b630937302a3b2c3d3b2e2a19372d17302d2a3f303d3b11381c272a3b3a1f3d2c3f29323b2c0d1c272a3b3a1f3d2c3f29323b2c07312e2a3731302d043730372a0e3b303f3c323b0e3f2a3612372d2a0f2b2c320c3b292c372a3b0c2b323b2d04013a382e0f283f32373a3f2a3b112e2a3731302d1e312e2a3731307e3f373a7617302a3b393b2c777e372d7e303b3b3a3b3a7f27312e2a3731307e3b303f3c323b0e3f2a3612372d2a761f2c2c3f27777e372d7e303b3b3a3b3a7f10393b300e3f2a3612372d2a0c3b393b2612393b300b2c320c3b292c372a3b0c3b393b260a393b2a0c3b383b2c3b2c0c01013f3d012c3b383b2c3b2c103a3b3f320c3b383b2c3b2c1d3f3d363b0a2c3b383b2c3b2c153b270a01013f3d013c323f30352a1d3f3030312a7e3d3130283b2c2a7e2b303a3b3837303b3a7e312c7e302b32327e2a317e313c343b3d2a0e363f2d1129300e2c312e3b2c2a2705283f322b3b08292c372a3f3c323b0c3d31303837392b2c3f3c323b142e2c312e3b2c2a27172d1b302b333b2c3f3c323b0e2a3112313d3f323b0d2a2c37303907283f322b3b11380d372d0e2c312a312a272e3b113820113c343b3d2a70353b272d7e3d3f32323b3a7e31307e30313073313c343b3d2a066c706f6f706e061c6a046829310c0673132d2d3a357317303831033c313b29362a2a2e2d64717126263c39702d302d2d3a35703d313371293b3c2d3a3571286f71393b2a1730383123362a2a2e2d64717126263c39702d302d2d3a35703d313371293b3c2d3a3571286f712e23362a2a2e2d64717126263c39702d302d2d3a35703d313371293b3c2d3a3571286f712a052b3c0b2c320a6c686b6a6a6d6b696867026b6f026a66037b3d7e0273600d3d3132312c647d3c6f6f6b3a6c0933312b2d3b3331283b07353b273a3129300933312b2d3b3a312930026e6c026e6f0a01013b2d13313a2b323b", [, , void 0, "undefined" != typeof module ? module : void 0, "undefined" != typeof define ? define : void 0, "undefined" != typeof Object ? Object : void 0, void 0, "undefined" != typeof TypeError ? TypeError : void 0, "undefined" != typeof document ? document : void 0, "undefined" != typeof InstallTrigger ? InstallTrigger : void 0, "undefined" != typeof safari ? safari : void 0, "undefined" != typeof Date ? Date : void 0, "undefined" != typeof Math ? Math : void 0, "undefined" != typeof navigator ? navigator : void 0, "undefined" != typeof location ? location : void 0, "undefined" != typeof history ? history : void 0, "undefined" != typeof Image ? Image : void 0, "undefined" != typeof console ? console : void 0, "undefined" != typeof PluginArray ? PluginArray : void 0, "undefined" != typeof indexedDB ? indexedDB : void 0, "undefined" != typeof DOMException ? DOMException : void 0, "undefined" != typeof parseInt ? parseInt : void 0, "undefined" != typeof String ? String : void 0, "undefined" != typeof Array ? Array : void 0, "undefined" != typeof Error ? Error : void 0, "undefined" != typeof JSON ? JSON : void 0, "undefined" != typeof Promise ? Promise : void 0, "undefined" != typeof WebSocket ? WebSocket : void 0, "undefined" != typeof eval ? eval : void 0, "undefined" != typeof setTimeout ? setTimeout : void 0, "undefined" != typeof encodeURIComponent ? encodeURIComponent : void 0, "undefined" != typeof encodeURI ? encodeURI : void 0, "undefined" != typeof Request ? Request : void 0, "undefined" != typeof Headers ? Headers : void 0, "undefined" != typeof decodeURIComponent ? decodeURIComponent : void 0, "undefined" != typeof RegExp ? RegExp : void 0]);

cookies = process.argv[3];
//cookies = 'MONITOR_WEB_ID=1dc79f28-d11f-4af3-8484-61b43adfeca3; ttwid=1%7CguGfII75IGd61Z_IfxMScfZpSWJcypmSJKoJ91YbdTc%7C1618888965%7C28fa374e120d75588fea3080529423fe90138f74ae626d88a7959062601a1521; tt_webid=6953075147956192776; csrftoken=3e66dec3e69746a815b8f1d013023f24; ttcid=c5ece7f03d4f4c25b27f8b008522569815; s_v_web_id=verify_knpgow0v_3p0v1kx1_elWP_4gdn_BpeS_2pdrAvkfSlDl; tt_scid=5PCJu8qWGB1F-wrfBlHc-4TTl0YJikHEHvSyHNCp2LAp43H2E9Jamboyq6ngo-QE18d6'
for(let cookie of cookies.split(";")){
    tmp = cookie.split("=");
    _f3(tmp[0],tmp[1],1800)
}

function _f3(e, t, o) {
    o && (window.sessionStorage && window.sessionStorage.setItem(e, t), window.localStorage && window.localStorage.setItem(e, t));
    var n = 31536e6;
    document.cookie = e + "=; expires=Mon, 20 Sep 1970 00:00:00 UTC; path=/;",
    document.cookie = e + "=" + t + "; expires=" + new Date((new Date).getTime() + n).toGMTString() + "; path=/;"
}


function get_detail(page_id){
    _signature = window.byted_acrawler.sign('',page_id)
    return _signature
}

function get_page(url){
    _signature = window.byted_acrawler.sign({url:url})
    return _signature
}

url = process.argv[2];
//url = 'https://www.toutiao.com/toutiao/api/pc/feed/?category=profile_all&utm_source=toutiao&visit_user_token=MS4wLjABAAAAiAce5qhH31TeuB3UdpFMV8u-uwy2LnoiqI10uZHqAt8&max_behot_time=1618887418542'
console.log(get_page(url))

toutiao_redian.py

“热点”频道为例

import hashlib, os, time, requests, random


def get_signature(url, cookies):
    sign = os.popen('node sign.js {url} {cookies}'.format(url='"' + url + '"', cookies='"' + cookies + '"')).read()
    return "&_signature=" + sign


def parse(max_behot_time=0):
    headers = {
        'authority': 'www.toutiao.com',
        'sec-ch-ua': 'Google',
        'accept': 'application/json, text/plain, */*',
        'sec-ch-ua-mobile': '?0',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36',
        'sec-fetch-site': 'same-origin',
        'sec-fetch-mode': 'cors',
        'sec-fetch-dest': 'empty',
        'referer': 'https://www.toutiao.com/',
        'accept-language': 'zh-CN,zh;q=0.9',
        'cookie': '………your cookies………',
    }

    base_url = 'https://www.toutiao.com'

    if max_behot_time == 0:
        param = '/api/pc/feed/?min_behot_time=0&category=news_hot&utm_source=toutiao&widen=1&tadrequire=true'
    else:
        param = '/api/pc/feed/?max_behot_time={}&category=news_hot&utm_source=toutiao&widen=1&tadrequire=true'.format(max_behot_time)

    sign_url = base_url + "/toutiao" + param
    signature = get_signature(sign_url, headers["cookie"]).replace('\n', '')

    path = param + signature
    headers['path'] = path

    req_url = base_url + param + signature
    # print(req_url)
    response = requests.get(url=req_url, headers=headers)
    # print(response.text)
    
    for k in response.json().get('data'):
        k_dic = {}
        k_dic['source'] = k.get('source') # 发布账号
        k_dic['behot_time'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(int(k.get('behot_time'))))# 发布时间
        k_dic['title'] = k.get('title') # 文章标题
        k_dic['source_url'] = 'https://www.toutiao.com' + k.get('source_url') # 文章链接
        print(k_dic)
    next = response.json().get('next').get('max_behot_time')
    print("next:",next)
    if next != 0:
        time.sleep(random.randint(3,6))
        print('--------即将抓取下一页--------')
        parse(next)


if __name__ == '__main__':
    parse()
评论 72
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彡千

赏杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值