├── README.md
├── asyncDHT
├── README.md
├── dht.sql
├── downTorrent.py
├── example.py
├── getAddr.py
├── importTorrent.py
└── maga.py
├── freebuf_spider
├── README.md
├── async_spider.py
└── init.sql
├── index.html
├── javascripts
├── d3-3.5.12.min.js
└── jquery-2.1.4.min.js
├── lagou.com
├── README.md
├── demo.css
├── demo.js
├── demo_0.png
├── demo_1.png
├── index.html
├── tree.json
└── weight.html
├── params.json
├── stylesheets
├── github-light.css
├── normalize.css
└── stylesheet.css
└── telnet_wifi
├── README.md
├── main.py
└── wifi.sql
/README.md:
--------------------------------------------------------------------------------
1 |
2 | # 放一些爬虫类的脚本/资料
3 |
4 | ## freebuf_spider
5 |
6 | 文章 **[【Web爬虫:多线程、异步与动态代理初步 】](http://www.freebuf.com/articles/web/104732.html)** 相关的一些脚本
7 |
8 |
9 | ## asyncDHT
10 |
11 | 文章 **[【DHT爬虫:18.4GB种子分析小记】](http://www.freebuf.com/articles/database/101110.html)** 相关的一些脚本
12 |
13 |
14 | ## telnet_wifi
15 |
16 | 文章 **[【技术分享:如何扫描统计全国Telnet默认口令】](http://www.freebuf.com/articles/terminal/93851.html)** 相关的一些脚本
17 |
18 |
19 | ## lagou.com
20 |
21 | 爬取拉勾网招聘职位,按首页分类平均薪资统计,职位权重关键字TOP50。
--------------------------------------------------------------------------------
/asyncDHT/README.md:
--------------------------------------------------------------------------------
1 | ## asyncDHT
2 |
3 | DHT爬虫,脚本写得有点乱,使用请自行优化。
4 |
5 | - downTorrent.py
6 |
7 | 从`http://bt.box.n0808.com`上下载种子,`max_tasks`是同时处理任务的数量
8 |
9 | ```
10 | python3 downTorrent.py
11 | ```
12 |
13 |
14 | - importTorrent.py
15 |
16 | 将`torrent`文件下的种子解析导入数据库
17 |
18 | ```
19 | python3 importTorrent.py
20 | ```
21 |
22 | - getAddr.py
23 |
24 | 从`http://ip.taobao.com/service/getIpInfo.php?ip=`获取IP信息
25 |
26 | ```
27 | python3 getAddr.py
28 | ```
29 |
30 | - example.py
31 |
32 | 抓取info_hash脚本
33 |
34 | ```
35 | python3 example.py
36 | ```
37 |
38 | - maga.py
39 |
40 | 基于[Maga](https://github.com/whtsky/maga)修改了一些地方
41 |
42 | - dht.sql
43 |
44 | 数据表结构
--------------------------------------------------------------------------------
/asyncDHT/dht.sql:
--------------------------------------------------------------------------------
1 | -- phpMyAdmin SQL Dump
2 | -- version 4.5.3.1
3 | -- http://www.phpmyadmin.net
4 | --
5 | -- Host: localhost
6 | -- Generation Time: Apr 08, 2016 at 09:06 AM
7 | -- Server version: 5.6.28-1
8 | -- PHP Version: 5.6.19-2
9 |
10 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
11 | SET time_zone = "+00:00";
12 |
13 |
14 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
15 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
16 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
17 | /*!40101 SET NAMES utf8mb4 */;
18 |
19 | --
20 | -- Database: `dht`
21 | --
22 |
23 | -- --------------------------------------------------------
24 |
25 | --
26 | -- Table structure for table `announce_peer_0`
27 | --
28 |
29 | CREATE TABLE `announce_peer_0` (
30 | `info_hash` char(40) NOT NULL,
31 | `ip` varchar(50) NOT NULL,
32 | `port` varchar(10) NOT NULL,
33 | `name` varchar(500) NOT NULL,
34 | `status` int(2) DEFAULT '0'
35 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
36 |
37 | -- --------------------------------------------------------
38 |
39 | --
40 | -- Table structure for table `announce_peer_1`
41 | --
42 |
43 | CREATE TABLE `announce_peer_1` (
44 | `info_hash` char(40) NOT NULL,
45 | `ip` varchar(50) NOT NULL,
46 | `port` varchar(10) NOT NULL,
47 | `name` varchar(500) NOT NULL,
48 | `status` int(2) DEFAULT '0'
49 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
50 |
51 | -- --------------------------------------------------------
52 |
53 | --
54 | -- Table structure for table `announce_peer_2`
55 | --
56 |
57 | CREATE TABLE `announce_peer_2` (
58 | `info_hash` char(40) NOT NULL,
59 | `ip` varchar(50) NOT NULL,
60 | `port` varchar(10) NOT NULL,
61 | `name` varchar(500) NOT NULL,
62 | `status` int(2) DEFAULT '0'
63 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
64 |
65 | -- --------------------------------------------------------
66 |
67 | --
68 | -- Table structure for table `announce_peer_3`
69 | --
70 |
71 | CREATE TABLE `announce_peer_3` (
72 | `info_hash` char(40) NOT NULL,
73 | `ip` varchar(50) NOT NULL,
74 | `port` varchar(10) NOT NULL,
75 | `name` varchar(500) NOT NULL,
76 | `status` int(2) DEFAULT '0'
77 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
78 |
79 | -- --------------------------------------------------------
80 |
81 | --
82 | -- Table structure for table `announce_peer_4`
83 | --
84 |
85 | CREATE TABLE `announce_peer_4` (
86 | `info_hash` char(40) NOT NULL,
87 | `ip` varchar(50) NOT NULL,
88 | `port` varchar(10) NOT NULL,
89 | `name` varchar(500) NOT NULL,
90 | `status` int(2) DEFAULT '0'
91 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
92 |
93 | -- --------------------------------------------------------
94 |
95 | --
96 | -- Table structure for table `announce_peer_5`
97 | --
98 |
99 | CREATE TABLE `announce_peer_5` (
100 | `info_hash` char(40) NOT NULL,
101 | `ip` varchar(50) NOT NULL,
102 | `port` varchar(10) NOT NULL,
103 | `name` varchar(500) NOT NULL,
104 | `status` int(2) DEFAULT '0'
105 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
106 |
107 | -- --------------------------------------------------------
108 |
109 | --
110 | -- Table structure for table `announce_peer_6`
111 | --
112 |
113 | CREATE TABLE `announce_peer_6` (
114 | `info_hash` char(40) NOT NULL,
115 | `ip` varchar(50) NOT NULL,
116 | `port` varchar(10) NOT NULL,
117 | `name` varchar(500) NOT NULL,
118 | `status` int(2) DEFAULT '0'
119 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
120 |
121 | -- --------------------------------------------------------
122 |
123 | --
124 | -- Table structure for table `announce_peer_7`
125 | --
126 |
127 | CREATE TABLE `announce_peer_7` (
128 | `info_hash` char(40) NOT NULL,
129 | `ip` varchar(50) NOT NULL,
130 | `port` varchar(10) NOT NULL,
131 | `name` varchar(500) NOT NULL,
132 | `status` int(2) DEFAULT '0'
133 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
134 |
135 | -- --------------------------------------------------------
136 |
137 | --
138 | -- Table structure for table `announce_peer_8`
139 | --
140 |
141 | CREATE TABLE `announce_peer_8` (
142 | `info_hash` char(40) NOT NULL,
143 | `ip` varchar(50) NOT NULL,
144 | `port` varchar(10) NOT NULL,
145 | `name` varchar(500) NOT NULL,
146 | `status` int(2) DEFAULT '0'
147 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
148 |
149 | -- --------------------------------------------------------
150 |
151 | --
152 | -- Table structure for table `announce_peer_9`
153 | --
154 |
155 | CREATE TABLE `announce_peer_9` (
156 | `info_hash` char(40) NOT NULL,
157 | `ip` varchar(50) NOT NULL,
158 | `port` varchar(10) NOT NULL,
159 | `name` varchar(500) NOT NULL,
160 | `status` int(2) DEFAULT '0'
161 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
162 |
163 | -- --------------------------------------------------------
164 |
165 | --
166 | -- Table structure for table `announce_peer_a`
167 | --
168 |
169 | CREATE TABLE `announce_peer_a` (
170 | `info_hash` char(40) NOT NULL,
171 | `ip` varchar(50) NOT NULL,
172 | `port` varchar(10) NOT NULL,
173 | `name` varchar(500) NOT NULL,
174 | `status` int(2) DEFAULT '0'
175 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
176 |
177 | -- --------------------------------------------------------
178 |
179 | --
180 | -- Table structure for table `announce_peer_b`
181 | --
182 |
183 | CREATE TABLE `announce_peer_b` (
184 | `info_hash` char(40) NOT NULL,
185 | `ip` varchar(50) NOT NULL,
186 | `port` varchar(10) NOT NULL,
187 | `name` varchar(500) NOT NULL,
188 | `status` int(2) DEFAULT '0'
189 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
190 |
191 | -- --------------------------------------------------------
192 |
193 | --
194 | -- Table structure for table `announce_peer_c`
195 | --
196 |
197 | CREATE TABLE `announce_peer_c` (
198 | `info_hash` char(40) NOT NULL,
199 | `ip` varchar(50) NOT NULL,
200 | `port` varchar(10) NOT NULL,
201 | `name` varchar(500) NOT NULL,
202 | `status` int(2) DEFAULT '0'
203 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
204 |
205 | -- --------------------------------------------------------
206 |
207 | --
208 | -- Table structure for table `announce_peer_d`
209 | --
210 |
211 | CREATE TABLE `announce_peer_d` (
212 | `info_hash` char(40) NOT NULL,
213 | `ip` varchar(50) NOT NULL,
214 | `port` varchar(10) NOT NULL,
215 | `name` varchar(500) NOT NULL,
216 | `status` int(2) DEFAULT '0'
217 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
218 |
219 | -- --------------------------------------------------------
220 |
221 | --
222 | -- Table structure for table `announce_peer_e`
223 | --
224 |
225 | CREATE TABLE `announce_peer_e` (
226 | `info_hash` char(40) NOT NULL,
227 | `ip` varchar(50) NOT NULL,
228 | `port` varchar(10) NOT NULL,
229 | `name` varchar(500) NOT NULL,
230 | `status` int(2) DEFAULT '0'
231 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
232 |
233 | -- --------------------------------------------------------
234 |
235 | --
236 | -- Table structure for table `announce_peer_f`
237 | --
238 |
239 | CREATE TABLE `announce_peer_f` (
240 | `info_hash` char(40) NOT NULL,
241 | `ip` varchar(50) NOT NULL,
242 | `port` varchar(10) NOT NULL,
243 | `name` varchar(500) NOT NULL,
244 | `status` int(2) DEFAULT '0'
245 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
246 |
247 | -- --------------------------------------------------------
248 |
249 | --
250 | -- Table structure for table `get_peers_0`
251 | --
252 |
253 | CREATE TABLE `get_peers_0` (
254 | `info_hash` char(40) NOT NULL,
255 | `status` int(2) DEFAULT '0'
256 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
257 |
258 | -- --------------------------------------------------------
259 |
260 | --
261 | -- Table structure for table `get_peers_1`
262 | --
263 |
264 | CREATE TABLE `get_peers_1` (
265 | `info_hash` char(40) NOT NULL,
266 | `status` int(2) DEFAULT '0'
267 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
268 |
269 | -- --------------------------------------------------------
270 |
271 | --
272 | -- Table structure for table `get_peers_2`
273 | --
274 |
275 | CREATE TABLE `get_peers_2` (
276 | `info_hash` char(40) NOT NULL,
277 | `status` int(2) DEFAULT '0'
278 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
279 |
280 | -- --------------------------------------------------------
281 |
282 | --
283 | -- Table structure for table `get_peers_3`
284 | --
285 |
286 | CREATE TABLE `get_peers_3` (
287 | `info_hash` char(40) NOT NULL,
288 | `status` int(2) DEFAULT '0'
289 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
290 |
291 | -- --------------------------------------------------------
292 |
293 | --
294 | -- Table structure for table `get_peers_4`
295 | --
296 |
297 | CREATE TABLE `get_peers_4` (
298 | `info_hash` char(40) NOT NULL,
299 | `status` int(2) DEFAULT '0'
300 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
301 |
302 | -- --------------------------------------------------------
303 |
304 | --
305 | -- Table structure for table `get_peers_5`
306 | --
307 |
308 | CREATE TABLE `get_peers_5` (
309 | `info_hash` char(40) NOT NULL,
310 | `status` int(2) DEFAULT '0'
311 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
312 |
313 | -- --------------------------------------------------------
314 |
315 | --
316 | -- Table structure for table `get_peers_6`
317 | --
318 |
319 | CREATE TABLE `get_peers_6` (
320 | `info_hash` char(40) NOT NULL,
321 | `status` int(2) DEFAULT '0'
322 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
323 |
324 | -- --------------------------------------------------------
325 |
326 | --
327 | -- Table structure for table `get_peers_7`
328 | --
329 |
330 | CREATE TABLE `get_peers_7` (
331 | `info_hash` char(40) NOT NULL,
332 | `status` int(2) DEFAULT '0'
333 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
334 |
335 | -- --------------------------------------------------------
336 |
337 | --
338 | -- Table structure for table `get_peers_8`
339 | --
340 |
341 | CREATE TABLE `get_peers_8` (
342 | `info_hash` char(40) NOT NULL,
343 | `status` int(2) DEFAULT '0'
344 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
345 |
346 | -- --------------------------------------------------------
347 |
348 | --
349 | -- Table structure for table `get_peers_9`
350 | --
351 |
352 | CREATE TABLE `get_peers_9` (
353 | `info_hash` char(40) NOT NULL,
354 | `status` int(2) DEFAULT '0'
355 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
356 |
357 | -- --------------------------------------------------------
358 |
359 | --
360 | -- Table structure for table `get_peers_a`
361 | --
362 |
363 | CREATE TABLE `get_peers_a` (
364 | `info_hash` char(40) NOT NULL,
365 | `status` int(2) DEFAULT '0'
366 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
367 |
368 | -- --------------------------------------------------------
369 |
370 | --
371 | -- Table structure for table `get_peers_b`
372 | --
373 |
374 | CREATE TABLE `get_peers_b` (
375 | `info_hash` char(40) NOT NULL,
376 | `status` int(2) DEFAULT '0'
377 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
378 |
379 | -- --------------------------------------------------------
380 |
381 | --
382 | -- Table structure for table `get_peers_c`
383 | --
384 |
385 | CREATE TABLE `get_peers_c` (
386 | `info_hash` char(40) NOT NULL,
387 | `status` int(2) DEFAULT '0'
388 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
389 |
390 | -- --------------------------------------------------------
391 |
392 | --
393 | -- Table structure for table `get_peers_d`
394 | --
395 |
396 | CREATE TABLE `get_peers_d` (
397 | `info_hash` char(40) NOT NULL,
398 | `status` int(2) DEFAULT '0'
399 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
400 |
401 | -- --------------------------------------------------------
402 |
403 | --
404 | -- Table structure for table `get_peers_e`
405 | --
406 |
407 | CREATE TABLE `get_peers_e` (
408 | `info_hash` char(40) NOT NULL,
409 | `status` int(2) DEFAULT '0'
410 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
411 |
412 | -- --------------------------------------------------------
413 |
414 | --
415 | -- Table structure for table `get_peers_f`
416 | --
417 |
418 | CREATE TABLE `get_peers_f` (
419 | `info_hash` char(40) NOT NULL,
420 | `status` int(2) DEFAULT '0'
421 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
422 |
423 | -- --------------------------------------------------------
424 |
425 | --
426 | -- Table structure for table `torrent_addr`
427 | --
428 |
429 | CREATE TABLE `torrent_addr` (
430 | `aid` int(11) NOT NULL,
431 | `ip` varchar(100) NOT NULL,
432 | `port` int(11) NOT NULL,
433 | `country` varchar(100) NOT NULL,
434 | `country_id` varchar(50) NOT NULL,
435 | `area` varchar(100) NOT NULL,
436 | `area_id` varchar(50) NOT NULL,
437 | `region` varchar(100) NOT NULL,
438 | `region_id` varchar(50) NOT NULL,
439 | `city` varchar(100) NOT NULL,
440 | `city_id` varchar(50) NOT NULL,
441 | `county` varchar(100) NOT NULL,
442 | `county_id` varchar(50) NOT NULL,
443 | `isp` varchar(50) NOT NULL,
444 | `isp_id` varchar(50) NOT NULL
445 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
446 |
447 | -- --------------------------------------------------------
448 |
449 | --
450 | -- Table structure for table `torrent_files_0`
451 | --
452 |
453 | CREATE TABLE `torrent_files_0` (
454 | `tid` int(11) NOT NULL,
455 | `file_path` varchar(1000) DEFAULT NULL,
456 | `file_size` bigint(20) NOT NULL,
457 | `file_ext` varchar(500) DEFAULT NULL
458 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
459 |
460 | -- --------------------------------------------------------
461 |
462 | --
463 | -- Table structure for table `torrent_files_1`
464 | --
465 |
466 | CREATE TABLE `torrent_files_1` (
467 | `tid` int(11) NOT NULL,
468 | `file_path` varchar(1000) DEFAULT NULL,
469 | `file_size` bigint(20) NOT NULL,
470 | `file_ext` varchar(500) DEFAULT NULL
471 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
472 |
473 | -- --------------------------------------------------------
474 |
475 | --
476 | -- Table structure for table `torrent_files_2`
477 | --
478 |
479 | CREATE TABLE `torrent_files_2` (
480 | `tid` int(11) NOT NULL,
481 | `file_path` varchar(1000) DEFAULT NULL,
482 | `file_size` bigint(20) NOT NULL,
483 | `file_ext` varchar(500) DEFAULT NULL
484 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
485 |
486 | -- --------------------------------------------------------
487 |
488 | --
489 | -- Table structure for table `torrent_files_3`
490 | --
491 |
492 | CREATE TABLE `torrent_files_3` (
493 | `tid` int(11) NOT NULL,
494 | `file_path` varchar(1000) DEFAULT NULL,
495 | `file_size` bigint(20) NOT NULL,
496 | `file_ext` varchar(500) DEFAULT NULL
497 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
498 |
499 | -- --------------------------------------------------------
500 |
501 | --
502 | -- Table structure for table `torrent_files_4`
503 | --
504 |
505 | CREATE TABLE `torrent_files_4` (
506 | `tid` int(11) NOT NULL,
507 | `file_path` varchar(1000) DEFAULT NULL,
508 | `file_size` bigint(20) NOT NULL,
509 | `file_ext` varchar(500) DEFAULT NULL
510 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
511 |
512 | -- --------------------------------------------------------
513 |
514 | --
515 | -- Table structure for table `torrent_files_5`
516 | --
517 |
518 | CREATE TABLE `torrent_files_5` (
519 | `tid` int(11) NOT NULL,
520 | `file_path` varchar(1000) DEFAULT NULL,
521 | `file_size` bigint(20) NOT NULL,
522 | `file_ext` varchar(500) DEFAULT NULL
523 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
524 |
525 | -- --------------------------------------------------------
526 |
527 | --
528 | -- Table structure for table `torrent_files_6`
529 | --
530 |
531 | CREATE TABLE `torrent_files_6` (
532 | `tid` int(11) NOT NULL,
533 | `file_path` varchar(1000) DEFAULT NULL,
534 | `file_size` bigint(20) NOT NULL,
535 | `file_ext` varchar(500) DEFAULT NULL
536 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
537 |
538 | -- --------------------------------------------------------
539 |
540 | --
541 | -- Table structure for table `torrent_files_7`
542 | --
543 |
544 | CREATE TABLE `torrent_files_7` (
545 | `tid` int(11) NOT NULL,
546 | `file_path` varchar(1000) DEFAULT NULL,
547 | `file_size` bigint(20) NOT NULL,
548 | `file_ext` varchar(500) DEFAULT NULL
549 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
550 |
551 | -- --------------------------------------------------------
552 |
553 | --
554 | -- Table structure for table `torrent_files_8`
555 | --
556 |
557 | CREATE TABLE `torrent_files_8` (
558 | `tid` int(11) NOT NULL,
559 | `file_path` varchar(1000) DEFAULT NULL,
560 | `file_size` bigint(20) NOT NULL,
561 | `file_ext` varchar(500) DEFAULT NULL
562 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
563 |
564 | -- --------------------------------------------------------
565 |
566 | --
567 | -- Table structure for table `torrent_files_9`
568 | --
569 |
570 | CREATE TABLE `torrent_files_9` (
571 | `tid` int(11) NOT NULL,
572 | `file_path` varchar(1000) DEFAULT NULL,
573 | `file_size` bigint(20) NOT NULL,
574 | `file_ext` varchar(500) DEFAULT NULL
575 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
576 |
577 | -- --------------------------------------------------------
578 |
579 | --
580 | -- Table structure for table `torrent_files_a`
581 | --
582 |
583 | CREATE TABLE `torrent_files_a` (
584 | `tid` int(11) NOT NULL,
585 | `file_path` varchar(1000) DEFAULT NULL,
586 | `file_size` bigint(20) NOT NULL,
587 | `file_ext` varchar(500) DEFAULT NULL
588 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
589 |
590 | -- --------------------------------------------------------
591 |
592 | --
593 | -- Table structure for table `torrent_files_b`
594 | --
595 |
596 | CREATE TABLE `torrent_files_b` (
597 | `tid` int(11) NOT NULL,
598 | `file_path` varchar(1000) DEFAULT NULL,
599 | `file_size` bigint(20) NOT NULL,
600 | `file_ext` varchar(500) DEFAULT NULL
601 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
602 |
603 | -- --------------------------------------------------------
604 |
605 | --
606 | -- Table structure for table `torrent_files_c`
607 | --
608 |
609 | CREATE TABLE `torrent_files_c` (
610 | `tid` int(11) NOT NULL,
611 | `file_path` varchar(1000) DEFAULT NULL,
612 | `file_size` bigint(20) NOT NULL,
613 | `file_ext` varchar(500) DEFAULT NULL
614 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
615 |
616 | -- --------------------------------------------------------
617 |
618 | --
619 | -- Table structure for table `torrent_files_d`
620 | --
621 |
622 | CREATE TABLE `torrent_files_d` (
623 | `tid` int(11) NOT NULL,
624 | `file_path` varchar(1000) DEFAULT NULL,
625 | `file_size` bigint(20) NOT NULL,
626 | `file_ext` varchar(500) DEFAULT NULL
627 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
628 |
629 | -- --------------------------------------------------------
630 |
631 | --
632 | -- Table structure for table `torrent_files_e`
633 | --
634 |
635 | CREATE TABLE `torrent_files_e` (
636 | `tid` int(11) NOT NULL,
637 | `file_path` varchar(1000) DEFAULT NULL,
638 | `file_size` bigint(20) NOT NULL,
639 | `file_ext` varchar(500) DEFAULT NULL
640 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
641 |
642 | -- --------------------------------------------------------
643 |
644 | --
645 | -- Table structure for table `torrent_files_f`
646 | --
647 |
648 | CREATE TABLE `torrent_files_f` (
649 | `tid` int(11) NOT NULL,
650 | `file_path` varchar(1000) DEFAULT NULL,
651 | `file_size` bigint(20) NOT NULL,
652 | `file_ext` varchar(500) DEFAULT NULL
653 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
654 |
655 | -- --------------------------------------------------------
656 |
657 | --
658 | -- Table structure for table `torrent_info`
659 | --
660 |
661 | CREATE TABLE `torrent_info` (
662 | `tid` int(11) NOT NULL,
663 | `info_hash` char(40) NOT NULL,
664 | `name` varchar(1000) DEFAULT NULL,
665 | `total_size` bigint(20) NOT NULL,
666 | `num_files` int(11) NOT NULL,
667 | `status` int(2) NOT NULL DEFAULT '0'
668 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
669 |
670 | -- --------------------------------------------------------
671 |
672 | --
673 | -- Table structure for table `torrent_trackers`
674 | --
675 |
676 | CREATE TABLE `torrent_trackers` (
677 | `tid` int(11) NOT NULL,
678 | `url` varchar(1000) DEFAULT NULL
679 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
680 |
681 | --
682 | -- Indexes for dumped tables
683 | --
684 |
685 | --
686 | -- Indexes for table `announce_peer_0`
687 | --
688 | ALTER TABLE `announce_peer_0`
689 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
690 |
691 | --
692 | -- Indexes for table `announce_peer_1`
693 | --
694 | ALTER TABLE `announce_peer_1`
695 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
696 |
697 | --
698 | -- Indexes for table `announce_peer_2`
699 | --
700 | ALTER TABLE `announce_peer_2`
701 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
702 |
703 | --
704 | -- Indexes for table `announce_peer_3`
705 | --
706 | ALTER TABLE `announce_peer_3`
707 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
708 |
709 | --
710 | -- Indexes for table `announce_peer_4`
711 | --
712 | ALTER TABLE `announce_peer_4`
713 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
714 |
715 | --
716 | -- Indexes for table `announce_peer_5`
717 | --
718 | ALTER TABLE `announce_peer_5`
719 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
720 |
721 | --
722 | -- Indexes for table `announce_peer_6`
723 | --
724 | ALTER TABLE `announce_peer_6`
725 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
726 |
727 | --
728 | -- Indexes for table `announce_peer_7`
729 | --
730 | ALTER TABLE `announce_peer_7`
731 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
732 |
733 | --
734 | -- Indexes for table `announce_peer_8`
735 | --
736 | ALTER TABLE `announce_peer_8`
737 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
738 |
739 | --
740 | -- Indexes for table `announce_peer_9`
741 | --
742 | ALTER TABLE `announce_peer_9`
743 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
744 |
745 | --
746 | -- Indexes for table `announce_peer_a`
747 | --
748 | ALTER TABLE `announce_peer_a`
749 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
750 |
751 | --
752 | -- Indexes for table `announce_peer_b`
753 | --
754 | ALTER TABLE `announce_peer_b`
755 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
756 |
757 | --
758 | -- Indexes for table `announce_peer_c`
759 | --
760 | ALTER TABLE `announce_peer_c`
761 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
762 |
763 | --
764 | -- Indexes for table `announce_peer_d`
765 | --
766 | ALTER TABLE `announce_peer_d`
767 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
768 |
769 | --
770 | -- Indexes for table `announce_peer_e`
771 | --
772 | ALTER TABLE `announce_peer_e`
773 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
774 |
775 | --
776 | -- Indexes for table `announce_peer_f`
777 | --
778 | ALTER TABLE `announce_peer_f`
779 | ADD KEY `ids` (`info_hash`,`ip`,`port`);
780 |
781 | --
782 | -- Indexes for table `get_peers_0`
783 | --
784 | ALTER TABLE `get_peers_0`
785 | ADD KEY `ids` (`info_hash`);
786 |
787 | --
788 | -- Indexes for table `get_peers_1`
789 | --
790 | ALTER TABLE `get_peers_1`
791 | ADD KEY `ids` (`info_hash`);
792 |
793 | --
794 | -- Indexes for table `get_peers_2`
795 | --
796 | ALTER TABLE `get_peers_2`
797 | ADD KEY `ids` (`info_hash`);
798 |
799 | --
800 | -- Indexes for table `get_peers_3`
801 | --
802 | ALTER TABLE `get_peers_3`
803 | ADD KEY `ids` (`info_hash`);
804 |
805 | --
806 | -- Indexes for table `get_peers_4`
807 | --
808 | ALTER TABLE `get_peers_4`
809 | ADD KEY `ids` (`info_hash`);
810 |
811 | --
812 | -- Indexes for table `get_peers_5`
813 | --
814 | ALTER TABLE `get_peers_5`
815 | ADD KEY `ids` (`info_hash`);
816 |
817 | --
818 | -- Indexes for table `get_peers_6`
819 | --
820 | ALTER TABLE `get_peers_6`
821 | ADD KEY `ids` (`info_hash`);
822 |
823 | --
824 | -- Indexes for table `get_peers_7`
825 | --
826 | ALTER TABLE `get_peers_7`
827 | ADD KEY `ids` (`info_hash`);
828 |
829 | --
830 | -- Indexes for table `get_peers_8`
831 | --
832 | ALTER TABLE `get_peers_8`
833 | ADD KEY `ids` (`info_hash`);
834 |
835 | --
836 | -- Indexes for table `get_peers_9`
837 | --
838 | ALTER TABLE `get_peers_9`
839 | ADD KEY `ids` (`info_hash`);
840 |
841 | --
842 | -- Indexes for table `get_peers_a`
843 | --
844 | ALTER TABLE `get_peers_a`
845 | ADD KEY `ids` (`info_hash`);
846 |
847 | --
848 | -- Indexes for table `get_peers_b`
849 | --
850 | ALTER TABLE `get_peers_b`
851 | ADD KEY `ids` (`info_hash`);
852 |
853 | --
854 | -- Indexes for table `get_peers_c`
855 | --
856 | ALTER TABLE `get_peers_c`
857 | ADD KEY `ids` (`info_hash`);
858 |
859 | --
860 | -- Indexes for table `get_peers_d`
861 | --
862 | ALTER TABLE `get_peers_d`
863 | ADD KEY `ids` (`info_hash`);
864 |
865 | --
866 | -- Indexes for table `get_peers_e`
867 | --
868 | ALTER TABLE `get_peers_e`
869 | ADD KEY `ids` (`info_hash`);
870 |
871 | --
872 | -- Indexes for table `get_peers_f`
873 | --
874 | ALTER TABLE `get_peers_f`
875 | ADD KEY `ids` (`info_hash`);
876 |
877 | --
878 | -- Indexes for table `torrent_addr`
879 | --
880 | ALTER TABLE `torrent_addr`
881 | ADD PRIMARY KEY (`aid`),
882 | ADD KEY `ip` (`ip`);
883 |
884 | --
885 | -- Indexes for table `torrent_info`
886 | --
887 | ALTER TABLE `torrent_info`
888 | ADD PRIMARY KEY (`tid`);
889 |
890 | --
891 | -- AUTO_INCREMENT for dumped tables
892 | --
893 |
894 | --
895 | -- AUTO_INCREMENT for table `torrent_addr`
896 | --
897 | ALTER TABLE `torrent_addr`
898 | MODIFY `aid` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1199609;
899 | --
900 | -- AUTO_INCREMENT for table `torrent_info`
901 | --
902 | ALTER TABLE `torrent_info`
903 | MODIFY `tid` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=509140;
904 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
905 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
906 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
907 |
--------------------------------------------------------------------------------
/asyncDHT/downTorrent.py:
--------------------------------------------------------------------------------
1 | #! /usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | import os
5 | import asyncio, aiohttp, aiomysql
6 | from asyncio import Queue
7 |
8 | class Crawler:
9 | def __init__(self, max_tasks=32):
10 | self.url = 'http://bt.box.n0808.com/{}/{}/{}.torrent'
11 | self.pool = None
12 | self.max_tasks = max_tasks
13 | self.hash_queue = Queue()
14 |
15 |
16 | async def create_pool(self):
17 | self.pool = await aiomysql.create_pool(db='dht'
18 | ,host='127.0.0.1'
19 | ,user='dht'
20 | ,password='dht'
21 | ,charset='utf8'
22 | ,unix_socket='/var/run/mysqld/mysqld.sock'
23 | # ,loop=loop
24 | ,minsize=1
25 | ,maxsize=20)
26 |
27 |
28 | async def query(self, sql):
29 | with (await self.pool) as conn:
30 | cur = await conn.cursor()
31 | await cur.execute(sql)
32 | await cur.close()
33 | await conn.commit()
34 |
35 |
36 | async def find(self, sql):
37 | with (await self.pool) as conn:
38 | cur = await conn.cursor()
39 | await cur.execute(sql)
40 | res = await cur.fetchall()
41 | return res
42 |
43 |
44 | async def update(self, info_hash, code):
45 | sql = 'update announce_peer_{} set status={} where info_hash="{}";'.format(info_hash[:1].lower(),code,info_hash.lower())
46 | await self.query(sql)
47 |
48 |
49 | async def get_torrent(self, info_hash):
50 | url = self.url.format(info_hash[:2],info_hash[-2:],info_hash)
51 | try:
52 | with aiohttp.Timeout(300):
53 | async with aiohttp.get(url) as response:
54 | try:
55 | assert response.status == 200
56 | print('[+][{}]{}'.format(response.status, response.url))
57 | return await response.read()
58 | except:
59 | if response.status==404:
60 | await self.update(info_hash, 2)
61 | elif response.status==403:
62 | await self.update(info_hash, 3)
63 | print('[-][{}]{}'.format(response.status, response.url))
64 | except:
65 | print('[!][000]{}'.format(url))
66 |
67 |
68 | async def down(self, info_hash):
69 | torrent = await self.get_torrent(info_hash)
70 | if torrent:
71 | with open('./torrent/{}.torrent'.format(info_hash), 'wb') as f:
72 | f.write(torrent)
73 | await self.update(info_hash, 1)
74 |
75 |
76 | async def fetch_worker(self):
77 | while True:
78 | info_hash = await self.hash_queue.get()
79 | try:
80 | await self.down(info_hash)
81 | finally:
82 | self.hash_queue.task_done()
83 |
84 |
85 | async def run(self):
86 | await self.create_pool()
87 |
88 | table = list('0123456789abcdef')
89 | while len(table)>0:
90 | for t in table:
91 | sql = 'select distinct info_hash from announce_peer_{} where status=0;'.format(t)
92 | res_hash = await self.find(sql)
93 |
94 | if res_hash>0:
95 | await asyncio.wait([self.hash_queue.put(i[0].upper()) for i in res_hash])
96 | tasks = [asyncio.ensure_future(self.fetch_worker()) for _ in range(self.max_tasks)]
97 | await self.hash_queue.join()
98 |
99 | for task in tasks:
100 | task.cancel()
101 | else:
102 | table.remove(t)
103 |
104 | self.pool.close()
105 | await self.pool.wait_closed()
106 |
107 |
108 | if __name__ == '__main__':
109 |
110 | max_tasks = 512
111 | path = './torrent'
112 | if not os.path.exists(path):
113 | os.makedirs(path)
114 |
115 | loop = asyncio.get_event_loop()
116 | crawler = Crawler(max_tasks=max_tasks)
117 | loop.run_until_complete(crawler.run())
118 | loop.close()
119 |
--------------------------------------------------------------------------------
/asyncDHT/example.py:
--------------------------------------------------------------------------------
1 | #! /usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | import logging
5 | import aiomysql
6 | from maga import Maga
7 |
8 | logging.basicConfig(filename='/root/infohash.log', level=logging.INFO)
9 |
10 | class Crawler(Maga):
11 | async def handler(self, info):
12 |
13 | # 这里建议写成连接池,每次都连接很没效率
14 | conn = await aiomysql.connect(db='dht',
15 | user='dht',
16 | password='dht',
17 | host='127.0.0.1',
18 | charset='utf8',
19 | unix_socket='/var/run/mysqld/mysqld.sock')
20 |
21 | cur = await conn.cursor()
22 | info_hash = info['info_hash'].lower()
23 |
24 | if info['q_type']=='get_peers':
25 | sql = 'Select 1 From `get_peers_%s` Where `info_hash`="%s";' % (info_hash[:1], info_hash)
26 | await cur.execute(sql)
27 | ret = await cur.fetchone()
28 | if ret is None or len(ret)<1:
29 | sql = 'Insert Into `get_peers_%s` (`info_hash`) Values ("%s");' % (info_hash[:1], info_hash)
30 | await cur.execute(sql)
31 | await conn.commit()
32 |
33 | if info['q_type']=='announce_peer':
34 | sql = 'Select 1 From `announce_peer_%s` Where `info_hash`="%s" And `ip`="%s" And `port`="%s";' % (info_hash[:1], info_hash, info['ip'], info['port'])
35 | await cur.execute(sql)
36 | ret = await cur.fetchone()
37 | if ret is None or len(ret)<1:
38 | sql = 'Insert Into `announce_peer_%s` (`info_hash`,`ip`,`port`,`name`) Values ("%s","%s","%s","%s");' % (info_hash[:1], info_hash, info['ip'], info['port'],aiomysql.escape_string(info['name']))
39 | await cur.execute(sql)
40 | await conn.commit()
41 |
42 | logging.info(info_hash)
43 | await cur.close()
44 | conn.close()
45 |
46 |
47 | if __name__=='__main__':
48 | crawler = Crawler()
49 | crawler.run()
50 |
--------------------------------------------------------------------------------
/asyncDHT/getAddr.py:
--------------------------------------------------------------------------------
1 | #! /usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | import os, json, logging
5 | import asyncio, aiohttp, aiomysql
6 | from asyncio import Queue
7 |
8 | logging.basicConfig(filename='ip_json.log', level=logging.INFO)
9 |
10 | class Crawler:
11 | def __init__(self, max_tasks=32):
12 | self.url = 'http://ip.taobao.com/service/getIpInfo.php?ip={}'
13 | self.pool = None
14 | self.max_tasks = max_tasks
15 | self.ip_queue = Queue()
16 |
17 |
18 | async def create_pool(self):
19 | self.pool = await aiomysql.create_pool(db='dht'
20 | ,host='127.0.0.1'
21 | ,user='dht'
22 | ,password='dht'
23 | ,charset='utf8'
24 | ,unix_socket='/var/run/mysqld/mysqld.sock'
25 | # ,loop=loop
26 | ,minsize=1
27 | ,maxsize=20)
28 |
29 |
30 | async def query(self, sql):
31 | with (await self.pool) as conn:
32 | cur = await conn.cursor()
33 | await cur.execute(sql)
34 | await cur.close()
35 | await conn.commit()
36 |
37 |
38 | async def find(self, sql):
39 | with (await self.pool) as conn:
40 | cur = await conn.cursor()
41 | await cur.execute(sql)
42 | res = await cur.fetchall()
43 | return res
44 |
45 | def escape_string(self, name):
46 | name = aiomysql.escape_string(name)
47 | return '' if name is None else name
48 |
49 | async def get_info(self, ip):
50 | url = self.url.format(ip)
51 | try:
52 | with aiohttp.Timeout(3000):
53 | async with aiohttp.get(url) as response:
54 | try:
55 | assert response.status == 200
56 | print('[+][{}]{}'.format(response.status, response.url))
57 | return await response.read()
58 | except:
59 | print('[-][{}]{}'.format(response.status, response.url))
60 | except:
61 | print('[!][000]{}'.format(url))
62 |
63 |
64 | async def get(self, ip):
65 | json_data = await self.get_info(ip)
66 | if json_data:
67 | logging.info(json_data)
68 | json_data = json.loads(json_data.decode('utf8'))
69 | if str(json_data['code'])=='0':
70 | ip_info = json_data['data']
71 | sql = 'update torrent_addr set country="{}",country_id="{}",area="{}",area_id="{}",region="{}",region_id="{}",city="{}",city_id="{}",county="{}",county_id="{}",isp="{}",isp_id="{}" where ip="{}"; '.format(self.escape_string(ip_info['country'])
72 | ,self.escape_string(ip_info['country_id'])
73 | ,self.escape_string(ip_info['area'])
74 | ,self.escape_string(ip_info['area_id'])
75 | ,self.escape_string(ip_info['region'])
76 | ,self.escape_string(ip_info['region_id'])
77 | ,self.escape_string(ip_info['city'])
78 | ,self.escape_string(ip_info['city_id'])
79 | ,self.escape_string(ip_info['county'])
80 | ,self.escape_string(ip_info['county_id'])
81 | ,self.escape_string(ip_info['isp'])
82 | ,self.escape_string(ip_info['isp_id'])
83 | ,ip_info['ip'])
84 | await self.query(sql)
85 |
86 |
87 | async def fetch_worker(self):
88 | while True:
89 | ip = await self.ip_queue.get()
90 | try:
91 | await self.get(ip)
92 | finally:
93 | self.ip_queue.task_done()
94 |
95 |
96 | async def run(self):
97 | await self.create_pool()
98 |
99 | sql = 'select distinct ip from torrent_addr where country="";'
100 | res = await self.find(sql)
101 | if res:
102 | await asyncio.wait([self.ip_queue.put(r[0]) for r in res])
103 | tasks = [asyncio.ensure_future(self.fetch_worker()) for _ in range(self.max_tasks)]
104 |
105 | await self.ip_queue.join()
106 |
107 | for task in tasks:
108 | task.cancel()
109 |
110 | self.pool.close()
111 | await self.pool.wait_closed()
112 |
113 |
114 | if __name__ == '__main__':
115 |
116 | max_tasks = 1024
117 | loop = asyncio.get_event_loop()
118 | crawler = Crawler(max_tasks=max_tasks)
119 | loop.run_until_complete(crawler.run())
120 | loop.close()
121 |
--------------------------------------------------------------------------------
/asyncDHT/importTorrent.py:
--------------------------------------------------------------------------------
1 | #! /usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | import os
5 | import logging
6 | import asyncio
7 | import aiomysql
8 | import libtorrent as lt
9 | from asyncio import Queue
10 |
11 | pool = None
12 | torrent_queue = Queue()
13 | TORRENT_DIR = './torrent/'
14 | logging.basicConfig(filename='faild_torrent.log', level=logging.INFO)
15 |
16 |
17 | def get_extend(name):
18 | name = name.lower()
19 | if name.rfind('.')>0:
20 | return name.rsplit('.',1)[-1]
21 | return ''
22 |
23 |
24 | def escape_string(name):
25 | return '' if not name else aiomysql.escape_string(name)
26 |
27 |
28 | async def create_pool():
29 | global pool
30 | pool = await aiomysql.create_pool(db='dht'
31 | ,host='127.0.0.1'
32 | ,user='dht'
33 | ,password='dht'
34 | ,charset='utf8'
35 | ,unix_socket='/var/run/mysqld/mysqld.sock'
36 | # ,loop=loop
37 | ,minsize=1
38 | ,maxsize=20)
39 |
40 |
41 | async def query(sql):
42 | with (await pool) as conn:
43 | cur = await conn.cursor()
44 | await cur.execute(sql)
45 | await cur.close()
46 | await conn.commit()
47 |
48 |
49 | async def find(sql):
50 | with (await pool) as conn:
51 | cur = await conn.cursor()
52 | await cur.execute(sql)
53 | res = await cur.fetchall()
54 | return res
55 |
56 | async def get_info(torrent):
57 | try:
58 | info = lt.torrent_info('{}{}'.format(TORRENT_DIR,torrent))
59 | except:
60 | logging.warning(torrent)
61 | return None
62 |
63 | name = escape_string(info.name())
64 | info_hash = str(info.info_hash())
65 | num_files = info.num_files()
66 | total_size = info.total_size()
67 |
68 | if '{}.torrent'.format(info_hash.upper())!=torrent:
69 | os.rename('{}{}'.format(TORRENT_DIR,torrent),
70 | '{}{}.torrent'.format(TORRENT_DIR,info_hash.upper()))
71 |
72 | sql = '''Insert Into torrent_info (info_hash
73 | ,name
74 | ,total_size
75 | ,num_files)
76 | Values ("{}","{}",{},{});
77 | '''.format(info_hash
78 | ,name
79 | ,total_size
80 | ,num_files)
81 | await query(sql)
82 |
83 | sql = 'Select tid From torrent_info Where info_hash="{}";'.format(info_hash)
84 | res = await find(sql)
85 | if res is None:return
86 |
87 | tid = res[0][0]
88 | tid_list = [t[0] for t in res]
89 | if len(tid_list)>1:
90 | tid_list[0] = 0
91 | sql = 'Delete From torrent_info Where tid In {};'.format(str(tuple(tid_list)))
92 | await query(sql)
93 |
94 | sql = '''Insert Into torrent_files_{} (tid
95 | ,file_path
96 | ,file_size
97 | ,file_ext) Values '''.format(info_hash[:1])
98 | for i in info.files():
99 | path = escape_string(i.path.strip())
100 | sql += '({},"{}",{},"{}"),'.format(tid,path,i.size,get_extend(path))
101 | sql = sql[:-1]+';'
102 | await query(sql)
103 |
104 | row = 0
105 | sql = 'Insert Into torrent_trackers (tid,url) Values '
106 | for i in info.trackers():
107 | try:
108 | url = escape_string(i.url.strip())
109 | except:
110 | continue
111 | sql += '({},"{}"),'.format(tid,url)
112 | row = row + 1
113 | if row>0:
114 | sql = sql[:-1]+';'
115 | await query(sql)
116 |
117 | sql = 'Update torrent_info Set status=1 Where tid={};'.format(tid)
118 | await query(sql)
119 |
120 | print('[{}]>> {}'.format(tid,info_hash))
121 |
122 |
123 | async def fetch_worker():
124 | while True:
125 | torrent = await torrent_queue.get()
126 | try:
127 | await get_info(torrent)
128 | finally:
129 | torrent_queue.task_done()
130 |
131 |
132 | async def main():
133 | await create_pool()
134 |
135 | sql = 'Select tid From torrent_info Where status=0;'
136 | res = await find(sql)
137 | if res:
138 | tid_list = [0]
139 | for i in res:
140 | tid_list.append(i[0])
141 |
142 | tid_in = str(tuple(tid_list))
143 | sql = 'Delete From torrent_trackers Where tid In {};'.format(tid_in)
144 | await query(sql)
145 | for j in '0123456789abcdef':
146 | sql = 'Delete From torrent_files_{} Where tid In {};'.format(j,tid_in)
147 | await query(sql)
148 | sql = 'Delete From torrent_info Where tid In {};'.format(tid_in)
149 | await query(sql)
150 |
151 | torr_set = set([t for t in os.listdir(TORRENT_DIR) if t.endswith('.torrent')])
152 | hash_set = set()
153 |
154 | sql = 'Select info_hash From torrent_info Where status=1;'
155 | res = await find(sql)
156 | if res:
157 | for i in res:
158 | hash_set.add('{}.torrent'.format(i[0].upper()))
159 |
160 | task_list = list(torr_set - hash_set)
161 |
162 | print(len(torr_set),len(hash_set),len(task_list))
163 |
164 | await asyncio.wait([torrent_queue.put(t) for t in task_list])
165 | tasks = [asyncio.ensure_future(fetch_worker()) for _ in range(1024)]
166 |
167 | await torrent_queue.join()
168 | for task in tasks:
169 | task.cancel()
170 |
171 | pool.close()
172 | await pool.wait_closed()
173 |
174 |
175 | if __name__=='__main__':
176 | loop = asyncio.get_event_loop()
177 | loop.run_until_complete(main())
178 | loop.close()
179 |
--------------------------------------------------------------------------------
/asyncDHT/maga.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | import asyncio
4 | import binascii
5 | import os
6 | import signal
7 |
8 | from socket import inet_ntoa
9 | from struct import unpack
10 |
11 | import bencoder
12 |
13 |
14 | def bytes2string(info):
15 | if isinstance(info, bytes):
16 | # Convert bytes to hex
17 | info = info.decode('utf-8', 'ignore')
18 | return info
19 |
20 | def proper_infohash(infohash):
21 | if isinstance(infohash, bytes):
22 | # Convert bytes to hex
23 | infohash = binascii.hexlify(infohash).decode('utf-8')
24 | return infohash.upper()
25 |
26 |
27 | def random_node_id(size=20):
28 | return os.urandom(size)
29 |
30 |
31 | def split_nodes(nodes):
32 | length = len(nodes)
33 | if (length % 26) != 0:
34 | return
35 |
36 | for i in range(0, length, 26):
37 | nid = nodes[i:i+20]
38 | ip = inet_ntoa(nodes[i+20:i+24])
39 | port = unpack('!H', nodes[i+24:i+26])[0]
40 | yield nid, ip, port
41 |
42 |
43 | __version__ = '1.1.0'
44 |
45 |
46 | BOOTSTRAP_NODES = (
47 | ('router.bittorrent.com', 6881),
48 | ('dht.transmissionbt.com', 6881),
49 | ('router.utorrent.com', 6881)
50 | )
51 |
52 |
53 | class Maga(asyncio.DatagramProtocol):
54 | def __init__(self, loop=None, bootstrap_nodes=BOOTSTRAP_NODES, interval=1):
55 | self.node_id = random_node_id()
56 | self.transport = None
57 | self.loop = loop or asyncio.get_event_loop()
58 | self.bootstrap_nodes = bootstrap_nodes
59 | self.__running = False
60 | self.interval = interval
61 |
62 | def stop(self):
63 | self.__running = False
64 | self.loop.call_later(self.interval, self.loop.stop)
65 |
66 | async def auto_find_nodes(self):
67 | self.__running = True
68 | while self.__running:
69 | await asyncio.sleep(self.interval)
70 | for node in self.bootstrap_nodes:
71 | self.find_node(addr=node)
72 |
73 | def run(self, port=6881):
74 | coro = self.loop.create_datagram_endpoint(
75 | lambda: self, local_addr=('0.0.0.0', port)
76 | )
77 | transport, _ = self.loop.run_until_complete(coro)
78 |
79 | for signame in ('SIGINT', 'SIGTERM'):
80 | self.loop.add_signal_handler(getattr(signal, signame), self.stop)
81 |
82 | for node in self.bootstrap_nodes:
83 | # Bootstrap
84 | self.find_node(addr=node, node_id=self.node_id)
85 |
86 | asyncio.ensure_future(self.auto_find_nodes(), loop=self.loop)
87 | self.loop.run_forever()
88 | self.loop.close()
89 |
90 | def datagram_received(self, data, addr):
91 | try:
92 | msg = bencoder.bdecode(data)
93 | except:
94 | return
95 | try:
96 | self.handle_message(msg, addr)
97 | except Exception as e:
98 | self.send_message(data={
99 | 't': msg['t'],
100 | 'y': 'e',
101 | 'e': [202, 'Server Error']
102 | }, addr=addr)
103 | raise e
104 |
105 | def handle_message(self, msg, addr):
106 | msg_type = msg.get(b'y', b'e')
107 |
108 | if msg_type == b'e':
109 | return
110 |
111 | if msg_type == b'r':
112 | return self.handle_response(msg, addr=addr)
113 |
114 | if msg_type == b'q':
115 | return asyncio.ensure_future(
116 | self.handle_query(msg, addr=addr), loop=self.loop
117 | )
118 |
119 | def handle_response(self, msg, addr):
120 | args = msg[b'r']
121 | if b'nodes' in args:
122 | for node_id, ip, port in split_nodes(args[b'nodes']):
123 | self.ping(addr=(ip, port))
124 |
125 | async def handle_query(self, msg, addr):
126 | args = msg[b'a']
127 | node_id = args[b'id']
128 | query_type = msg[b'q']
129 |
130 | if query_type == b'get_peers':
131 | infohash = proper_infohash(args[b'info_hash'])
132 | token = infohash[:2]
133 | self.send_message({
134 | 't': msg[b't'],
135 | 'y': 'r',
136 | 'r': {
137 | 'id': self.fake_node_id(node_id),
138 | 'nodes': '',
139 | 'token': token
140 | }
141 | }, addr=addr)
142 | await self.handler({'q_type':'get_peers'
143 | ,'info_hash':infohash})
144 | elif query_type == b'announce_peer':
145 | infohash = proper_infohash(args[b'info_hash'])
146 | tid = msg[b't']
147 | self.send_message({
148 | 't': tid,
149 | 'y': 'r',
150 | 'r': {
151 | 'id': self.fake_node_id(node_id)
152 | }
153 | }, addr=addr)
154 |
155 | ip = bytes2string(addr[0])
156 |
157 | try:
158 | name = bytes2string(args[b'name'])
159 | except:
160 | name =''
161 |
162 | if b'implied_port' in args and args[b'implied_port']!=b'0':
163 | port = bytes2string(addr[1])
164 | else:
165 | port = bytes2string(args[b'port'])
166 |
167 | await self.handler({'q_type':'announce_peer'
168 | ,'info_hash':infohash
169 | ,'name':name
170 | ,'ip':ip
171 | ,'port':port})
172 | elif query_type == b'find_node':
173 | tid = msg[b't']
174 | self.send_message({
175 | 't': tid,
176 | 'y': 'r',
177 | 'r': {
178 | 'id': self.fake_node_id(node_id),
179 | 'nodes': ''
180 | }
181 | }, addr=addr)
182 | elif query_type == b'ping':
183 | self.send_message({
184 | 't': b'tt',
185 | 'y': 'r',
186 | 'r': {
187 | 'id': self.fake_node_id(node_id)
188 | }
189 | }, addr=addr)
190 | self.find_node(addr=addr, node_id=node_id)
191 |
192 | def ping(self, addr, node_id=None):
193 | self.send_message({
194 | 'y': 'q',
195 | 't': 'pg',
196 | 'q': 'ping',
197 | 'a': {
198 | 'id': self.fake_node_id(node_id)
199 | }
200 | }, addr=addr)
201 |
202 | def connection_made(self, transport):
203 | self.transport = transport
204 |
205 | def connection_lost(self, exc):
206 | self.__running = False
207 | self.transport.close()
208 |
209 | def send_message(self, data, addr):
210 | data.setdefault('t', b'tt')
211 | self.transport.sendto(bencoder.bencode(data), addr)
212 |
213 | def fake_node_id(self, node_id=None):
214 | if node_id:
215 | return node_id[:-1]+self.node_id[-1:]
216 | return self.node_id
217 |
218 | def find_node(self, addr, node_id=None, target=None):
219 | if not target:
220 | target = random_node_id()
221 | self.send_message({
222 | 't': b'fn',
223 | 'y': 'q',
224 | 'q': 'find_node',
225 | 'a': {
226 | 'id': self.fake_node_id(node_id),
227 | 'target': target
228 | }
229 | }, addr=addr)
230 |
231 | async def handler(self, infohash):
232 | raise NotImplementedError()
233 |
--------------------------------------------------------------------------------
/freebuf_spider/README.md:
--------------------------------------------------------------------------------
1 |
2 | # 异步+多代理Demo
3 |
4 | ## async_spider.py
5 |
6 | 采集Freebuf.COM文章的脚本,为了减少代码量,很多都硬编码了。
7 |
8 | ## init.sql
9 |
10 | 数据表结构。
11 |
12 |
13 | > 有问题联系我,联系方式见首页。
--------------------------------------------------------------------------------
/freebuf_spider/async_spider.py:
--------------------------------------------------------------------------------
1 | #! /usr/bin/env python3
2 | # -*- coding: utf-8 -*-
3 |
4 | import os
5 | import logging
6 | import asyncio
7 | import aiohttp
8 | import aiomysql
9 | from bs4 import BeautifulSoup
10 |
11 |
12 | TIMEOUT = 60
13 | DIR_PATH = os.path.dirname(os.path.realpath(__file__))
14 | BAK_PATH = '{}/bak'.format(DIR_PATH)
15 | MIN_PROXY_SIZE = 350 # 代理数低于时,限制访问频率
16 |
17 | logging.basicConfig(
18 | filename = '{}/freebuf.log'.format(DIR_PATH)
19 | ,filemode = 'w'
20 | ,level = logging.DEBUG
21 | ,format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
22 |
23 | logger = logging.getLogger(__name__)
24 | loop = asyncio.get_event_loop()
25 |
26 |
27 | class Crawler:
28 | def __init__(self, max_pid, max_tasks=32):
29 | self.pool = None
30 | self.lock = asyncio.Lock()
31 | self.url = 'http://www.freebuf.com/?p={}&preview=true'
32 | self.test_url = 'http://www.freebuf.com/' # 测试连接
33 | self.test_txt = 'FreeBuf.COM | 关注黑客与极客' # 你认为返回内容中包含的文本
34 | self.max_pid = max_pid + 1
35 | self.max_tasks = max_tasks + 1
36 | self.pid_queue = asyncio.Queue()
37 | self.pxy_queue = asyncio.Queue()
38 | self.headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:45.0)'}
39 |
40 |
41 | # 数据库连接池
42 | async def create_pool(self):
43 | self.pool = await aiomysql.create_pool(host='127.0.0.1'
44 | ,db='freebuf.com'
45 | ,user='freebuf.com'
46 | ,password='freebuf.com'
47 | ,charset='utf8'
48 | ,unix_socket='/var/run/mysqld/mysqld.sock'
49 | ,loop=loop
50 | ,minsize=1
51 | ,maxsize=20)
52 |
53 | # 添加、更新、删除
54 | async def query(self, sql):
55 | with (await self.pool) as conn:
56 | cur = await conn.cursor()
57 | try:
58 | await cur.execute(sql)
59 | await cur.close()
60 | await conn.commit()
61 | except:
62 | logger.error(sql, exc_info=True)
63 |
64 |
65 | # 查询
66 | async def find(self, sql):
67 | with (await self.pool) as conn:
68 | cur = await conn.cursor(aiomysql.cursors.DictCursor)
69 | try:
70 | await cur.execute(sql)
71 | res = await cur.fetchall()
72 | return res
73 | except:
74 | logger.error(sql, exc_info=True)
75 |
76 |
77 | # 转义特殊字符
78 | async def escape_string(self, strs):
79 | return '' if not strs else aiomysql.escape_string(strs)
80 |
81 |
82 | # 代理抓取网页
83 | async def get_html(self, url, addr):
84 | data = {'status':999, 'html':''}
85 | try:
86 | conn = aiohttp.ProxyConnector(proxy=addr)
87 | session = aiohttp.ClientSession(connector=conn, headers=self.headers)
88 | with aiohttp.Timeout(TIMEOUT):
89 | async with session.get(url) as resp:
90 | data['status'] = resp.status
91 | if resp.status == 200:
92 | html = await resp.read()
93 | data['html'] = html.decode('utf8', 'ignore')
94 | except:
95 | pass
96 | finally:
97 | session.close()
98 |
99 | return data
100 |
101 |
102 | async def worker(self, pid, pxy):
103 |
104 | addr = '{}://{}:{}'.format(pxy['type'].lower(), pxy['ip'], pxy['port'])
105 | # 验证该代理是否能返回真实的数据
106 | if not pxy['test']:
107 | data = await self.get_html(self.test_url, addr)
108 | if data['status']==200 and self.test_txt in data['html']:
109 | await self.update_proxy('test', 1, pxy)
110 | else:
111 | await self.update_proxy('status', 9, pxy)
112 | return await asyncio.wait([self.pid_queue.put(pid)])
113 |
114 | url = self.url.format(pid)
115 | data = await self.get_html(url, addr)
116 |
117 | status = data['status']
118 | # 正常返回,排除该pid
119 | if status in (301, 302, 404):
120 | return await self.insert_temp(pid, status)
121 |
122 | # 一般为代理不能用或400,403,502由代理原因引起的,将文章pid填回任务队列
123 | if status != 200:
124 | await asyncio.wait([self.pid_queue.put(pid)])
125 | return await self.update_proxy('status', 'status+1', pxy)
126 |
127 | if not pxy['status']:
128 | await self.update_proxy('status', 0, pxy)
129 |
130 | html = data['html']
131 | soup = BeautifulSoup(html, 'lxml')
132 | arct = soup.find(class_='articlecontent')
133 |
134 | # 处理使用200正常返回的404
135 | if not arct:
136 | return await self.insert_temp(pid, status)
137 |
138 | # 保存副本
139 | bak_html = '{}/{}.html'.format(BAK_PATH, pid)
140 | with open(bak_html, 'wt') as f:
141 | f.write(html)
142 |
143 | head = arct.find(class_='title')
144 | title = head.find('h2').get_text().strip() # 文章标题
145 | content = str(arct.find(id='contenttxt')).strip() # 主题内容,HTML格式
146 |
147 | # 公告页之类的没有发布者
148 | if soup.find(class_='property'):
149 | name = head.find(class_='name').get_text().strip() # 作者名称
150 | rtime = head.find(class_='time').get_text().strip() # 发布时间
151 | rmb = 1 if head.find(title='现金奖励') else 0
152 | coin = 1 if head.find(title='金币奖励') else 0
153 | identity = 1 if head.find(title='认证作者') else 0
154 | identity = 2 if not identity and head.find(title='认证厂商') else identity
155 | tags = head.find(class_='tags').find_all('a')
156 | tags = ','.join([t.get_text().strip() for t in tags]) # 所属分类
157 | else:
158 | name, rtime, rmb, coin, identity, tags = '', '1970-01-01', 0, 0, 0, ''
159 |
160 | # 写入数据库
161 | sql = ('Insert Into posts (pid, title, name, rtime, rmb, coin, identity,'
162 | ' tags, content) Values ({pid}, "{title}", "{name}", "{rtime}",'
163 | '{rmb}, {coin}, {identity}, "{tags}", "{content}");').format(
164 | pid = pid, rmb = rmb, coin = coin, identity = identity
165 | ,title = await self.escape_string(title)
166 | ,name = await self.escape_string(name)
167 | ,rtime = await self.escape_string(rtime)
168 | ,tags = await self.escape_string(tags)
169 | ,content = await self.escape_string(content))
170 | await self.query(sql)
171 | print('{} {}'.format(rtime, title))
172 |
173 |
174 | # 添加临时表数据
175 | async def insert_temp(self, pid, status):
176 | sql = 'Insert Into temp (pid, status) Values ({}, {});'.format(pid, status)
177 | return await self.query(sql)
178 |
179 |
180 | # 更新代理状态
181 | async def update_proxy(self, field, value, pxy):
182 | sql = ('Update proxy Set {}={} where type="{}" And ip="{}" And port={};').format(
183 | field, value, pxy['type'], pxy['ip'], pxy['port'])
184 | return await self.query(sql)
185 |
186 |
187 | # 加载代理,如果没有,继续堵塞线程,xx秒检查一次
188 | async def load_proxy(self):
189 | sql = 'Select type, ip, port, status, test From proxy Where status<3;'
190 | res = await self.find(sql)
191 | logger.info('Loading proxy... size: {}'.format(len(res)))
192 |
193 | # 代理较少时,限制访问频率,无代理则堵塞等待
194 | if len(res) < MIN_PROXY_SIZE:
195 | await asyncio.sleep(10)
196 |
197 | for r in res:
198 | await self.pxy_queue.put(r)
199 |
200 |
201 | async def fetch_worker(self):
202 | while True:
203 | pid = await self.pid_queue.get()
204 |
205 | # 如果代理队列为空,堵塞当前线程,进行加载
206 | with (await self.lock):
207 | if self.pxy_queue.empty():
208 | await self.load_proxy()
209 |
210 | pxy = await self.pxy_queue.get()
211 |
212 | try:
213 | await self.worker(pid, pxy)
214 | finally:
215 | self.pid_queue.task_done()
216 |
217 |
218 | async def run(self):
219 | logger.info('Starting...')
220 |
221 | await self.create_pool()
222 |
223 | sql = 'Select pid From posts Union Select pid From temp;'
224 | res = await self.find(sql)
225 |
226 | pid_set = set([r['pid'] for r in res]) if res else set()
227 | task_set = set([r for r in range(1, self.max_pid)])
228 |
229 | # 取集合差为剩余任务pid
230 | task_set = task_set - pid_set
231 | if task_set:
232 | await asyncio.wait([self.pid_queue.put(s) for s in task_set])
233 | tasks = [asyncio.ensure_future(self.fetch_worker()) for _ in range(self.max_tasks)]
234 |
235 | await self.pid_queue.join()
236 |
237 | for task in tasks:
238 | task.cancel()
239 |
240 | self.pool.close()
241 | await self.pool.wait_closed()
242 |
243 | logger.info('Finishing...')
244 |
245 |
246 | if __name__ == '__main__':
247 | if not os.path.exists(BAK_PATH):
248 | os.makedirs(BAK_PATH)
249 |
250 | max_pid = 105000 # 文章最大pid
251 | max_tasks = 64 # 同时处理最大任务数
252 |
253 | crawler = Crawler(max_pid, max_tasks)
254 | loop.run_until_complete(crawler.run())
255 | loop.close()
--------------------------------------------------------------------------------
/freebuf_spider/init.sql:
--------------------------------------------------------------------------------
1 | -- phpMyAdmin SQL Dump
2 | -- version 4.5.3.1
3 | -- http://www.phpmyadmin.net
4 | --
5 | -- Host: localhost
6 | -- Generation Time: May 18, 2016 at 08:24 AM
7 | -- Server version: 5.6.30-1
8 | -- PHP Version: 7.0.6-1
9 |
10 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
11 | SET time_zone = "+00:00";
12 |
13 |
14 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
15 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
16 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
17 | /*!40101 SET NAMES utf8mb4 */;
18 |
19 | --
20 | -- Database: `freebuf.com`
21 | --
22 |
23 | -- --------------------------------------------------------
24 |
25 | --
26 | -- Table structure for table `posts`
27 | --
28 |
29 | CREATE TABLE `posts` (
30 | `pid` int(11) NOT NULL,
31 | `title` varchar(100) NOT NULL,
32 | `content` varchar(10000) NOT NULL,
33 | `name` varchar(50) NOT NULL,
34 | `rtime` varchar(50) DEFAULT NULL,
35 | `rmb` int(2) NOT NULL,
36 | `coin` int(2) NOT NULL,
37 | `identity` int(2) NOT NULL,
38 | `tags` varchar(100) NOT NULL
39 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
40 |
41 | -- --------------------------------------------------------
42 |
43 | --
44 | -- Table structure for table `proxy`
45 | --
46 |
47 | CREATE TABLE `proxy` (
48 | `type` varchar(50) NOT NULL,
49 | `ip` varchar(50) NOT NULL,
50 | `port` int(11) NOT NULL,
51 | `status` int(6) NOT NULL DEFAULT '0',
52 | `test` int(2) NOT NULL DEFAULT '0'
53 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
54 |
55 | -- --------------------------------------------------------
56 |
57 | --
58 | -- Table structure for table `temp`
59 | --
60 |
61 | CREATE TABLE `temp` (
62 | `pid` int(11) NOT NULL,
63 | `status` int(4) NOT NULL
64 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
65 |
66 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
67 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
68 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
69 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Spider by zrools
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
20 |
21 |
22 |
23 | Welcome to GitHub Pages.
24 |
25 | This automatic page generator is the easiest way to create beautiful pages for all of your projects. Author your page content here using GitHub Flavored Markdown , select a template crafted by a designer, and publish. After your page is generated, you can check out the new gh-pages
branch locally. If you’re using GitHub Desktop, simply sync your repository and you’ll see the new branch.
26 |
27 |
28 | Designer Templates
29 |
30 | We’ve crafted some handsome templates for you to use. Go ahead and click 'Continue to layouts' to browse through them. You can easily go back to edit your page before publishing. After publishing your page, you can revisit the page generator and switch to another theme. Your Page content will be preserved.
31 |
32 |
33 | Creating pages manually
34 |
35 | If you prefer to not use the automatic generator, push a branch named gh-pages
to your repository to create a page manually. In addition to supporting regular HTML content, GitHub Pages support Jekyll, a simple, blog aware static site generator. Jekyll makes it easy to create site-wide headers and footers without having to copy them across every page. It also offers intelligent blog support and other advanced templating features.
36 |
37 |
38 | Authors and Contributors
39 |
40 | You can @mention a GitHub username to generate a link to their profile. The resulting <a>
element will link to the contributor’s GitHub Profile. For example: In 2007, Chris Wanstrath (@defunkt ), PJ Hyett (@pjhyett ), and Tom Preston-Werner (@mojombo ) founded GitHub.
41 |
42 |
43 | Support or Contact
44 |
45 | Having trouble with Pages? Check out our documentation or contact support and we’ll help you sort it out.
46 |
47 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
--------------------------------------------------------------------------------
/javascripts/jquery-2.1.4.min.js:
--------------------------------------------------------------------------------
1 | /*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
2 | !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML=" ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML=" ","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML=" ",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){
3 | return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>$2>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("")).appendTo(b.documentElement),b=qa[0].contentDocument,b.write(),b.close(),c=sa(a,b),qa.detach()),ra[a]=c),c}var ua=/^margin/,va=new RegExp("^("+Q+")(?!px)[a-z%]+$","i"),wa=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)};function xa(a,b,c){var d,e,f,g,h=a.style;return c=c||wa(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),va.test(g)&&ua.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function ya(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d=l.documentElement,e=l.createElement("div"),f=l.createElement("div");if(f.style){f.style.backgroundClip="content-box",f.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===f.style.backgroundClip,e.style.cssText="border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;position:absolute",e.appendChild(f);function g(){f.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",f.innerHTML="",d.appendChild(e);var g=a.getComputedStyle(f,null);b="1%"!==g.top,c="4px"===g.width,d.removeChild(e)}a.getComputedStyle&&n.extend(k,{pixelPosition:function(){return g(),b},boxSizingReliable:function(){return null==c&&g(),c},reliableMarginRight:function(){var b,c=f.appendChild(l.createElement("div"));return c.style.cssText=f.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",f.style.width="1px",d.appendChild(e),b=!parseFloat(a.getComputedStyle(c,null).marginRight),d.removeChild(e),f.removeChild(c),b}})}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var za=/^(none|table(?!-c[ea]).+)/,Aa=new RegExp("^("+Q+")(.*)$","i"),Ba=new RegExp("^([+-])=("+Q+")","i"),Ca={position:"absolute",visibility:"hidden",display:"block"},Da={letterSpacing:"0",fontWeight:"400"},Ea=["Webkit","O","Moz","ms"];function Fa(a,b){if(b in a)return b;var c=b[0].toUpperCase()+b.slice(1),d=b,e=Ea.length;while(e--)if(b=Ea[e]+c,b in a)return b;return d}function Ga(a,b,c){var d=Aa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Ha(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+R[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+R[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+R[f]+"Width",!0,e))):(g+=n.css(a,"padding"+R[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+R[f]+"Width",!0,e)));return g}function Ia(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=wa(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=xa(a,b,f),(0>e||null==e)&&(e=a.style[b]),va.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Ha(a,b,c||(g?"border":"content"),d,f)+"px"}function Ja(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=L.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&S(d)&&(f[g]=L.access(d,"olddisplay",ta(d.nodeName)))):(e=S(d),"none"===c&&e||L.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=xa(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Fa(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=Ba.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Fa(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=xa(a,b,d)),"normal"===e&&b in Da&&(e=Da[b]),""===c||c?(f=parseFloat(e),c===!0||n.isNumeric(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?za.test(n.css(a,"display"))&&0===a.offsetWidth?n.swap(a,Ca,function(){return Ia(a,b,d)}):Ia(a,b,d):void 0},set:function(a,c,d){var e=d&&wa(a);return Ga(a,c,d?Ha(a,b,d,"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),n.cssHooks.marginRight=ya(k.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},xa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+R[d]+b]=f[d]||f[d-2]||f[0];return e}},ua.test(a)||(n.cssHooks[a+b].set=Ga)}),n.fn.extend({css:function(a,b){return J(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=wa(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Ja(this,!0)},hide:function(){return Ja(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){S(this)?n(this).show():n(this).hide()})}});function Ka(a,b,c,d,e){return new Ka.prototype.init(a,b,c,d,e)}n.Tween=Ka,Ka.prototype={constructor:Ka,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ka.propHooks[this.prop];return a&&a.get?a.get(this):Ka.propHooks._default.get(this)},run:function(a){var b,c=Ka.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ka.propHooks._default.set(this),this}},Ka.prototype.init.prototype=Ka.prototype,Ka.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Ka.propHooks.scrollTop=Ka.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=Ka.prototype.init,n.fx.step={};var La,Ma,Na=/^(?:toggle|show|hide)$/,Oa=new RegExp("^(?:([+-])=|)("+Q+")([a-z%]*)$","i"),Pa=/queueHooks$/,Qa=[Va],Ra={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=Oa.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&Oa.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function Sa(){return setTimeout(function(){La=void 0}),La=n.now()}function Ta(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=R[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ua(a,b,c){for(var d,e=(Ra[b]||[]).concat(Ra["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Va(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&S(a),q=L.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?L.get(a,"olddisplay")||ta(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Na.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?ta(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=L.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;L.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ua(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function Wa(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function Xa(a,b,c){var d,e,f=0,g=Qa.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=La||Sa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:La||Sa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(Wa(k,j.opts.specialEasing);g>f;f++)if(d=Qa[f].call(j,a,k,j.opts))return d;return n.map(k,Ua,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(Xa,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],Ra[c]=Ra[c]||[],Ra[c].unshift(b)},prefilter:function(a,b){b?Qa.unshift(a):Qa.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(S).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=Xa(this,n.extend({},a),f);(e||L.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=L.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Pa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=L.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Ta(b,!0),a,d,e)}}),n.each({slideDown:Ta("show"),slideUp:Ta("hide"),slideToggle:Ta("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(La=n.now();b1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===U?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?Za:Ya)),
4 | void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Za={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$a[b]||n.find.attr;$a[b]=function(a,b,d){var e,f;return d||(f=$a[b],$a[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,$a[b]=f),e}});var _a=/^(?:input|select|textarea|button)$/i;n.fn.extend({prop:function(a,b){return J(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){return a.hasAttribute("tabindex")||_a.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),k.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var ab=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0===arguments.length||"string"==typeof a&&a,i=0,j=this.length;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(E)||[];j>i;i++)if(c=this[i],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ab," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===U||"boolean"===c)&&(this.className&&L.set(this,"__className__",this.className),this.className=this.className||a===!1?"":L.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(ab," ").indexOf(b)>=0)return!0;return!1}});var bb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(bb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(d.value,f)>=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},k.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var cb=n.now(),db=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(d){b=void 0}return(!b||b.getElementsByTagName("parsererror").length)&&n.error("Invalid XML: "+a),b};var eb=/#.*$/,fb=/([?&])_=[^&]*/,gb=/^(.*?):[ \t]*([^\r\n]*)$/gm,hb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,ib=/^(?:GET|HEAD)$/,jb=/^\/\//,kb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,lb={},mb={},nb="*/".concat("*"),ob=a.location.href,pb=kb.exec(ob.toLowerCase())||[];function qb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function rb(a,b,c,d){var e={},f=a===mb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function sb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function tb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function ub(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ob,type:"GET",isLocal:hb.test(pb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":nb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?sb(sb(a,n.ajaxSettings),b):sb(n.ajaxSettings,a)},ajaxPrefilter:qb(lb),ajaxTransport:qb(mb),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!f){f={};while(b=gb.exec(e))f[b[1].toLowerCase()]=b[2]}b=f[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?e:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return c&&c.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||ob)+"").replace(eb,"").replace(jb,pb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(h=kb.exec(k.url.toLowerCase()),k.crossDomain=!(!h||h[1]===pb[1]&&h[2]===pb[2]&&(h[3]||("http:"===h[1]?"80":"443"))===(pb[3]||("http:"===pb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),rb(lb,k,b,v),2===t)return v;i=n.event&&k.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!ib.test(k.type),d=k.url,k.hasContent||(k.data&&(d=k.url+=(db.test(d)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=fb.test(d)?d.replace(fb,"$1_="+cb++):d+(db.test(d)?"&":"?")+"_="+cb++)),k.ifModified&&(n.lastModified[d]&&v.setRequestHeader("If-Modified-Since",n.lastModified[d]),n.etag[d]&&v.setRequestHeader("If-None-Match",n.etag[d])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+nb+"; q=0.01":""):k.accepts["*"]);for(j in k.headers)v.setRequestHeader(j,k.headers[j]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(j in{success:1,error:1,complete:1})v[j](k[j]);if(c=rb(mb,k,b,v)){v.readyState=1,i&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,c.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,f,h){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),c=void 0,e=h||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,f&&(u=tb(k,v,f)),u=ub(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[d]=w),w=v.getResponseHeader("etag"),w&&(n.etag[d]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,i&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),i&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var vb=/%20/g,wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&").replace(vb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!T.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Bb=0,Cb={},Db={0:200,1223:204},Eb=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Cb)Cb[a]()}),k.cors=!!Eb&&"withCredentials"in Eb,k.ajax=Eb=!!Eb,n.ajaxTransport(function(a){var b;return k.cors||Eb&&!a.crossDomain?{send:function(c,d){var e,f=a.xhr(),g=++Bb;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)f.setRequestHeader(e,c[e]);b=function(a){return function(){b&&(delete Cb[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Db[f.status]||f.status,f.statusText,"string"==typeof f.responseText?{text:f.responseText}:void 0,f.getAllResponseHeaders()))}},f.onload=b(),f.onerror=b("error"),b=Cb[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(h){if(b)throw h}},abort:function(){b&&b()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=n("
15 |
16 |