├── .gitignore
├── cnki-downloader.crx
├── cnki-downloader
├── icons
│ ├── icon16.png
│ ├── icon19.png
│ ├── icon48.png
│ └── icon128.png
├── src
│ ├── helper
│ │ ├── redirect.html
│ │ └── redirect.js
│ ├── browser_action
│ │ └── browser_action.html
│ ├── content.js
│ ├── background.js
│ └── jquery.min.js
├── manifest.json
├── test
│ └── index.html
└── _locales
│ └── en
│ └── messages.json
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | cnki-downloader.pem
--------------------------------------------------------------------------------
/cnki-downloader.crx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tai7sy/cnki-downloader/HEAD/cnki-downloader.crx
--------------------------------------------------------------------------------
/cnki-downloader/icons/icon16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tai7sy/cnki-downloader/HEAD/cnki-downloader/icons/icon16.png
--------------------------------------------------------------------------------
/cnki-downloader/icons/icon19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tai7sy/cnki-downloader/HEAD/cnki-downloader/icons/icon19.png
--------------------------------------------------------------------------------
/cnki-downloader/icons/icon48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tai7sy/cnki-downloader/HEAD/cnki-downloader/icons/icon48.png
--------------------------------------------------------------------------------
/cnki-downloader/icons/icon128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tai7sy/cnki-downloader/HEAD/cnki-downloader/icons/icon128.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## About
2 |
3 | Just a javascript version of amyhaber's work
4 |
5 | ## Usage
6 |
7 | Install the crx, and enjoy it
8 |
9 | ## Known Bugs
10 |
11 | 1. Can't download journals
12 |
13 |
14 | ## 关于
15 |
16 | 参考了amyhaber的api账号, 写了这个chrome插件版本的
17 |
18 | ## 使用
19 |
20 | 安装crx插件, 在[文献搜索页面](http://kns.cnki.net/kns/brief/default_result.aspx) 点击文档名后的第一个下载按钮即可
21 |
22 | ## 已知bug
23 |
24 | 1. 无法下载期刊/报纸
25 |
--------------------------------------------------------------------------------
/cnki-downloader/src/helper/redirect.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Downloading...
5 |
6 |
7 | Downloading...
8 | This page will close in 5 seconds
9 |
10 |
12 |
13 |
--------------------------------------------------------------------------------
/cnki-downloader/src/browser_action/browser_action.html:
--------------------------------------------------------------------------------
1 |
2 |
13 |
14 |
15 |
16 | Just click the first download btn next to the filename in the result of search.
17 |
18 |
19 |
--------------------------------------------------------------------------------
/cnki-downloader/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cnki-downloader",
3 | "version": "0.0.2",
4 | "manifest_version": 2,
5 | "description": "cnki downloader",
6 | "homepage_url": "http://github.com/tai7sy/cnki-downloader",
7 | "icons": {
8 | "16": "icons/icon16.png",
9 | "48": "icons/icon48.png",
10 | "128": "icons/icon128.png"
11 | },
12 | "default_locale": "en",
13 | "content_scripts": [
14 | {
15 | "matches": ["*://kns.cnki.net/kns/brief/default_result.aspx*"],
16 | "js": [ "src/jquery.min.js", "src/content.js"]
17 | }
18 | ],
19 | "background": {
20 | "scripts": [
21 | "src/jquery.min.js",
22 | "src/background.js"
23 | ],
24 | "persistent": true
25 | },
26 | "externally_connectable": {
27 | "matches": [
28 | "*://kns.cnki.net/*"
29 | ]
30 | },
31 | "browser_action": {
32 | "default_icon": "icons/icon19.png",
33 | "default_title": "cnki downloader",
34 | "default_popup": "src/browser_action/browser_action.html"
35 | },
36 |
37 | "permissions": [
38 | "webRequest",
39 | "webRequestBlocking",
40 | "tabs",
41 | "activeTab",
42 | "cookies",
43 | ""
44 | ]
45 | }
46 |
--------------------------------------------------------------------------------
/cnki-downloader/src/content.js:
--------------------------------------------------------------------------------
1 | // if you checked "fancy-settings" in extensionizr.com, uncomment this lines
2 |
3 | // var settings = new Store("settings", {
4 | // "sample_setting": "This is how you use Store.js to remember values"
5 | // });
6 |
7 |
8 | // load button
9 | var insertBtn = function insertBtn () {
10 | if (typeof $ !== 'undefined' && window && window.frames && window.frames['iframeResult']) {
11 |
12 | var lines = $(window.frames['iframeResult'].document).find('.GridTableContent tr');
13 | lines.each(function () {
14 | if (!$(this).find('.fz14').length) return;
15 | var a = $(this).find('.fz14:first');
16 | if (a.attr('inserted') === '1') return;
17 | var url = a.attr('href');
18 | ///kns/detail/detail.aspx?QueryID=4&CurRec=1&recid=&FileName=1016009115.nh&DbName=CDFDLAST2017&DbCode=CDFD&yx=&pr=&URLID=
19 | if (!url || url.indexOf('FileName=') === -1) return;
20 | var fileName = url.match(/FileName=(.+?)&/)[1];
21 | var dbCode = url.match(/DbCode=(.+?)&/)[1];
22 | dbCode = {
23 | CLFQ: 'literatures', //文献
24 | //CJFQ: 'journals', //期刊
25 | CDFD: 'doctortheses', //博士
26 | CMFD: 'mastertheses', //硕士
27 | CCFD: 'conferences', //会议
28 | //CCND: 'newspapers', // 报纸
29 | //SCPD: '',//中国专利
30 | //CPFD: '',//中国会议
31 | }[dbCode];
32 | //a.before('');
33 |
34 | if(dbCode){
35 | var link_dom = document.createElement('a');
36 | link_dom.setAttribute('class', 'briefDl_Y');
37 | link_dom.addEventListener('click', function () {
38 |
39 | chrome.runtime.sendMessage(
40 | { action: 'download', dbCode: dbCode, fileName: fileName },
41 | function (response) {
42 | console.log('response', response);
43 | }
44 | );
45 |
46 |
47 | });
48 | var a_node = a.get(0);
49 | a_node.parentElement.insertBefore(link_dom, a_node);
50 | }
51 |
52 |
53 | a.attr('inserted', '1');
54 | console.log('btn inserted! ' + a.text());
55 | });
56 | }
57 | setTimeout(insertBtn, 1000);
58 | };
59 | insertBtn();
60 |
61 |
62 |
--------------------------------------------------------------------------------
/cnki-downloader/src/helper/redirect.js:
--------------------------------------------------------------------------------
1 | /**
2 | * According to Issue 91191, we can't modify form data in chrome extension now.
3 | * so we can post like this
4 | */
5 | var onMessageHandler = function (message) {
6 | // Ensure it is run only once, as we will try to message twice
7 | chrome.runtime.onMessage.removeListener(onMessageHandler);
8 |
9 | // code from https://stackoverflow.com/a/7404033/934239
10 | var form = document.createElement('form');
11 | form.style = 'position: absolute;width: 1;height: 1;display: block;overflow: hidden;';
12 | form.setAttribute('method', message.method);
13 | form.setAttribute('action', message.url);
14 |
15 | if (message.method.toLocaleLowerCase() === 'get') {
16 | location.href = message.url;
17 | return;
18 | }
19 |
20 | function appendString (name, val) {
21 | var field = document.createElement('input');
22 | field.setAttribute('type', 'text');
23 | field.setAttribute('name', name);
24 | field.setAttribute('value', val);
25 | form.appendChild(field);
26 | }
27 |
28 | function appendArray (name, val_arr) {
29 | for (var key in val_arr) {
30 | if (val_arr.hasOwnProperty(key)) {
31 | if (typeof val_arr[key] === 'object') {
32 | appendArray(name + '[]', val_arr[key]);
33 | } else {
34 | var field = document.createElement('input');
35 | field.setAttribute('type', 'checkbox');
36 | field.setAttribute('checked', 'true');
37 | field.setAttribute('name', name);
38 | field.setAttribute('value', val_arr[key]);
39 | form.appendChild(field);
40 | }
41 | }
42 | }
43 | }
44 |
45 | for (var key in message.data) {
46 | if (!message.data.hasOwnProperty(key)) continue;
47 | if (typeof message.data[key] === 'object') {
48 | appendArray(key + '[]', message.data[key]);
49 | } else {
50 | appendString(key, message.data[key]);
51 | }
52 | }
53 | document.body.appendChild(form);
54 | form.submit();
55 |
56 | /* TODO don't work
57 | chrome.runtime.sendMessage(
58 | 'cccdmmlingochekibhmehflapndcdmhf',
59 | { action: 'close', tabId: message.tabId}
60 | );
61 | chrome.runtime.sendMessage(
62 | { action: 'close', tabId: message.tabId}
63 | );
64 | */
65 | };
66 |
67 | chrome.runtime.onMessage.addListener(onMessageHandler);
68 |
--------------------------------------------------------------------------------
/cnki-downloader/test/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Test
4 |
5 |
6 |
7 | jQuery loaded
8 |
9 |
10 |
11 |
12 |
95 |
--------------------------------------------------------------------------------
/cnki-downloader/_locales/en/messages.json:
--------------------------------------------------------------------------------
1 | {
2 | "l10nTabName": {
3 | "message":"Localization"
4 | ,"description":"name of the localization tab"
5 | }
6 | ,"l10nHeader": {
7 | "message":"It does localization too! (this whole tab is, actually)"
8 | ,"description":"Header text for the localization section"
9 | }
10 | ,"l10nIntro": {
11 | "message":"'L10n' refers to 'Localization' - 'L' an 'n' are obvious, and 10 comes from the number of letters between those two. It is the process/whatever of displaying something in the language of choice. It uses 'I18n', 'Internationalization', which refers to the tools / framework supporting L10n. I.e., something is internationalized if it has I18n support, and can be localized. Something is localized for you if it is in your language / dialect."
12 | ,"description":"introduce the basic idea."
13 | }
14 | ,"l10nProd": {
15 | "message":"You are planning to allow localization, right? You have no idea who will be using your extension! You have no idea who will be translating it! At least support the basics, it's not hard, and having the framework in place will let you transition much more easily later on."
16 | ,"description":"drive the point home. It's good for you."
17 | }
18 | ,"l10nFirstParagraph": {
19 | "message":"When the options page loads, elements decorated with data-l10n will automatically be localized!"
20 | ,"description":"inform that elements will be localized on load"
21 | }
22 | ,"l10nSecondParagraph": {
23 | "message":"If you need more complex localization, you can also define data-l10n-args. This should contain $containerType$ filled with $dataType$, which will be passed into Chrome's i18n API as $functionArgs$. In fact, this paragraph does just that, and wraps the args in mono-space font. Easy!"
24 | ,"description":"introduce the data-l10n-args attribute. End on a lame note."
25 | ,"placeholders": {
26 | "containerType": {
27 | "content":"$1"
28 | ,"example":"'array', 'list', or something similar"
29 | ,"description":"type of the args container"
30 | }
31 | ,"dataType": {
32 | "content":"$2"
33 | ,"example":"string"
34 | ,"description":"type of data in each array index"
35 | }
36 | ,"functionArgs": {
37 | "content":"$3"
38 | ,"example":"arguments"
39 | ,"description":"whatever you call what you pass into a function/method. args, params, etc."
40 | }
41 | }
42 | }
43 | ,"l10nThirdParagraph": {
44 | "message":"Message contents are passed right into innerHTML without processing - include any tags (or even scripts) that you feel like. If you have an input field, the placeholder will be set instead, and buttons will have the value attribute set."
45 | ,"description":"inform that we handle placeholders, buttons, and direct HTML input"
46 | }
47 | ,"l10nButtonsBefore": {
48 | "message":"Different types of buttons are handled as well. <button> elements have their html set:"
49 | }
50 | ,"l10nButton": {
51 | "message":"in a button"
52 | }
53 | ,"l10nButtonsBetween": {
54 | "message":"while <input type='submit'> and <input type='button'> get their 'value' set (note: no HTML):"
55 | }
56 | ,"l10nSubmit": {
57 | "message":"a submit value"
58 | }
59 | ,"l10nButtonsAfter": {
60 | "message":"Awesome, no?"
61 | }
62 | ,"l10nExtras": {
63 | "message":"You can even set data-l10n on things like the <title> tag, which lets you have translatable page titles, or fieldset <legend> tags, or anywhere else - the default Boil.localize() behavior will check every tag in the document, not just the body."
64 | ,"description":"inform about places which may not be obvious, like , etc"
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/cnki-downloader/src/background.js:
--------------------------------------------------------------------------------
1 | // if you checked "fancy-settings" in extensionizr.com, uncomment this lines
2 |
3 | // var settings = new Store("settings", {
4 | // "sample_setting": "This is how you use Store.js to remember values"
5 | // });
6 |
7 |
8 | function _classCallCheck (instance, Constructor) {
9 | if (!(instance instanceof Constructor)) {
10 | throw new TypeError('Cannot call a class as a function');
11 | }
12 | }
13 |
14 | var cnki_download = null;
15 |
16 | chrome.runtime.onMessage.addListener(
17 | function (request, sender, sendResponse) {
18 | console.log('background.js got a message', request);
19 | switch (request.action) {
20 | case 'download':
21 | if (cnki_download === null)
22 | cnki_download = new cnki();
23 | cnki_download.GetArticle(request.dbCode, request.fileName);
24 | sendResponse({ ret: 'download' });
25 | break;
26 | case 'close':
27 | chrome.tabs.remove(request.tabId);
28 | sendResponse({ ret: 'close' });
29 | break;
30 | default:
31 | sendResponse({ ret: 'undefined action' });
32 | break;
33 | }
34 | }
35 | );
36 |
37 | chrome.runtime.onMessageExternal.addListener(
38 | function (request, sender, sendResponse) {
39 | console.log('background.js got a external message', request);
40 | switch (request.action) {
41 | case 'close':
42 | chrome.tabs.remove(request.tabId);
43 | sendResponse({ ret: 'close' });
44 | break;
45 | default:
46 | sendResponse({ ret: 'undefined action' });
47 | break;
48 | }
49 | }
50 | );
51 |
52 | console.log('extension injected!');
53 |
54 |
55 | var sha1 = function () {
56 | /*
57 | * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
58 | * in FIPS PUB 180-1
59 | * Version 2.1-BETA Copyright Paul Johnston 2000 - 2002.
60 | * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
61 | * Distributed under the BSD License
62 | * See http://pajhome.org.uk/crypt/md5 for details.
63 | */
64 | /*
65 | * Configurable variables. You may need to tweak these to be compatible with
66 | * the server-side, but the defaults work in most cases.
67 | */
68 | var hexcase = 0;
69 | /* hex output format. 0 - lowercase; 1 - uppercase */
70 | var b64pad = '';
71 | /* base-64 pad character. "=" for strict RFC compliance */
72 | var chrsz = 8;
73 | /* bits per input character. 8 - ASCII; 16 - Unicode */
74 |
75 | /*
76 | * These are the functions you'll usually want to call
77 | * They take string arguments and return either hex or base-64 encoded strings
78 | */
79 | function hex_sha1 (s) {
80 | return binb2hex(core_sha1(str2binb(s), s.length * chrsz));
81 | }
82 |
83 | function b64_sha1 (s) {
84 | return binb2b64(core_sha1(str2binb(s), s.length * chrsz));
85 | }
86 |
87 | function str_sha1 (s) {
88 | return binb2str(core_sha1(str2binb(s), s.length * chrsz));
89 | }
90 |
91 | function hex_hmac_sha1 (key, data) {
92 | return binb2hex(core_hmac_sha1(key, data));
93 | }
94 |
95 | function b64_hmac_sha1 (key, data) {
96 | return binb2b64(core_hmac_sha1(key, data));
97 | }
98 |
99 | function str_hmac_sha1 (key, data) {
100 | return binb2str(core_hmac_sha1(key, data));
101 | }
102 |
103 | /*
104 | * Perform a simple self-test to see if the VM is working
105 | */
106 | function sha1_vm_test () {
107 | return hex_sha1('abc') === 'a9993e364706816aba3e25717850c26c9cd0d89d';
108 | }
109 |
110 | /*
111 | * Calculate the SHA-1 of an array of big-endian words, and a bit length
112 | */
113 | function core_sha1 (x, len) {
114 | /* append padding */
115 | x[len >> 5] |= 0x80 << 24 - len % 32;
116 | x[(len + 64 >> 9 << 4) + 15] = len;
117 |
118 | var w = new Array(80);
119 | var a = 1732584193;
120 | var b = -271733879;
121 | var c = -1732584194;
122 | var d = 271733878;
123 | var e = -1009589776;
124 |
125 | for (var i = 0; i < x.length; i += 16) {
126 | var olda = a;
127 | var oldb = b;
128 | var oldc = c;
129 | var oldd = d;
130 | var olde = e;
131 |
132 | for (var j = 0; j < 80; j++) {
133 | if (j < 16) w[j] = x[i + j]; else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
134 | var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));
135 | e = d;
136 | d = c;
137 | c = rol(b, 30);
138 | b = a;
139 | a = t;
140 | }
141 |
142 | a = safe_add(a, olda);
143 | b = safe_add(b, oldb);
144 | c = safe_add(c, oldc);
145 | d = safe_add(d, oldd);
146 | e = safe_add(e, olde);
147 | }
148 | return [a, b, c, d, e];
149 | }
150 |
151 | /*
152 | * Perform the appropriate triplet combination function for the current
153 | * iteration
154 | */
155 | function sha1_ft (t, b, c, d) {
156 | if (t < 20) return b & c | ~b & d;
157 | if (t < 40) return b ^ c ^ d;
158 | if (t < 60) return b & c | b & d | c & d;
159 | return b ^ c ^ d;
160 | }
161 |
162 | /*
163 | * Determine the appropriate additive constant for the current iteration
164 | */
165 | function sha1_kt (t) {
166 | return t < 20 ? 1518500249 : t < 40 ? 1859775393 : t < 60 ? -1894007588 : -899497514;
167 | }
168 |
169 | /*
170 | * Calculate the HMAC-SHA1 of a key and some data
171 | */
172 | function core_hmac_sha1 (key, data) {
173 | var bkey = str2binb(key);
174 | if (bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
175 |
176 | var ipad = new Array(16),
177 | opad = new Array(16);
178 | for (var i = 0; i < 16; i++) {
179 | ipad[i] = bkey[i] ^ 0x36363636;
180 | opad[i] = bkey[i] ^ 0x5C5C5C5C;
181 | }
182 |
183 | var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
184 | return core_sha1(opad.concat(hash), 512 + 160);
185 | }
186 |
187 | /*
188 | * Add integers, wrapping at 2^32. This uses 16-bit operations internally
189 | * to work around bugs in some JS interpreters.
190 | */
191 | function safe_add (x, y) {
192 | var lsw = (x & 0xFFFF) + (y & 0xFFFF);
193 | var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
194 | return msw << 16 | lsw & 0xFFFF;
195 | }
196 |
197 | /*
198 | * Bitwise rotate a 32-bit number to the left.
199 | */
200 | function rol (num, cnt) {
201 | return num << cnt | num >>> 32 - cnt;
202 | }
203 |
204 | /*
205 | * Convert an 8-bit or 16-bit string to an array of big-endian words
206 | * In 8-bit function, characters >255 have their hi-byte silently ignored.
207 | */
208 | function str2binb (str) {
209 | var bin = [];
210 | var mask = (1 << chrsz) - 1;
211 | for (var i = 0; i < str.length * chrsz; i += chrsz) {
212 | bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << 24 - i % 32;
213 | }
214 | return bin;
215 | }
216 |
217 | /*
218 | * Convert an array of big-endian words to a string
219 | */
220 | function binb2str (bin) {
221 | var str = '';
222 | var mask = (1 << chrsz) - 1;
223 | for (var i = 0; i < bin.length * 32; i += chrsz) {
224 | str += String.fromCharCode(bin[i >> 5] >>> 24 - i % 32 & mask);
225 | }
226 | return str;
227 | }
228 |
229 | /*
230 | * Convert an array of big-endian words to a hex string.
231 | */
232 | function binb2hex (binarray) {
233 | var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef';
234 | var str = '';
235 | for (var i = 0; i < binarray.length * 4; i++) {
236 | str += hex_tab.charAt(binarray[i >> 2] >> (3 - i % 4) * 8 + 4 & 0xF) + hex_tab.charAt(binarray[i >> 2] >> (3 - i % 4) * 8 & 0xF);
237 | }
238 | return str;
239 | }
240 |
241 | /*
242 | * Convert an array of big-endian words to a base-64 string
243 | */
244 | function binb2b64 (binarray) {
245 | var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
246 | var str = '';
247 | for (var i = 0; i < binarray.length * 4; i += 3) {
248 | var triplet = (binarray[i >> 2] >> 8 * (3 - i % 4) & 0xFF) << 16 | (binarray[i + 1 >> 2] >> 8 * (3 - (i + 1) % 4) & 0xFF) << 8 | binarray[i + 2 >> 2] >> 8 * (3 - (i + 2) % 4) & 0xFF;
249 | for (var j = 0; j < 4; j++) {
250 | if (i * 8 + j * 6 > binarray.length * 32) str += b64pad; else str += tab.charAt(triplet >> 6 * (3 - j) & 0x3F);
251 | }
252 | }
253 | return str;
254 | }
255 |
256 | return {
257 | hex_sha1: hex_sha1
258 | };
259 | }();
260 | var cnki = function cnki () {
261 | var _this = this;
262 |
263 | _classCallCheck(this, cnki);
264 |
265 | this.authInfo = {
266 | username: "voidpointer",
267 | password: "voidpointer",
268 | login: false
269 | };
270 |
271 | this.base64 = function (arr) {
272 | if (typeof Buffer !== 'undefined') return Buffer.from(arr).toString('base64');
273 | return btoa(arr.map(function (e) {
274 | return String.fromCharCode(e);
275 | }).join(''));
276 | };
277 |
278 | this.Auth = function (callback) {
279 |
280 | var appKey = "2isdlw";
281 | var appId = "cnkimdl_clcn";
282 | var encryptKey = 'jds)(#&dsa7SDNJ32hwbds%u32j33edjdu2@**@3w';
283 | var requestURL = "http://api.cnki.net/OAuth/OAuth/Token";
284 |
285 | //
286 | // calculate params
287 | //
288 | var encPassData = [];
289 | var bArray1 = _this.authInfo.password;
290 | var bArray2 = encryptKey;
291 | for (var i = 0; i < bArray1.length; i++) {
292 | encPassData[i] = bArray1.charCodeAt(i) ^ bArray2.charCodeAt(i % bArray2.length);
293 | }
294 | var encPass = _this.base64(encPassData) + '\n';
295 |
296 | var sign = String(Date.now());
297 |
298 | var secureKey = sha1.hex_sha1(sign + appKey);
299 |
300 | console.log(secureKey);
301 |
302 | var authInfo = 'grant_type=password';
303 | authInfo += '&username=' + encodeURIComponent(_this.authInfo.username);
304 | authInfo += '&password=' + encodeURIComponent(encPass);
305 | authInfo += '&client_id=' + encodeURIComponent(appId);
306 | authInfo += '&client_secret=' + encodeURIComponent(secureKey);
307 | authInfo += '&sign=' + encodeURIComponent(sign);
308 |
309 | $.ajax({
310 | url: 'http://api.cnki.net/OAuth/OAuth/Token',
311 | type: 'POST',
312 | data: authInfo,
313 | contentType: 'application/x-www-form-urlencoded',
314 | dataType: 'json',
315 | success: function success (ret) {
316 | console.log('login', ret);
317 | $.ajaxSetup({
318 | beforeSend: function beforeSend (xhr) {
319 | xhr.setRequestHeader('Authorization', ret.token_type + ' ' + ret.access_token);
320 | }
321 | });
322 | _this.authInfo.login = true;
323 | callback && callback();
324 | },
325 | error: function error (xhr, _error, info) {
326 | console.error('Auth', xhr, _error, info);
327 | alert('插件登录失败!');
328 | },
329 | timeout: function timeout () {
330 | alert('插件登录超时!');
331 | }
332 | });
333 | };
334 |
335 | this.GetArticle = function (category, file) {
336 | var login = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
337 |
338 | if (!_this.authInfo.login && login) {
339 | _this.Auth(function () {
340 | _this.GetArticle(category, file, false);
341 | });
342 | return;
343 | }
344 | $.ajax({
345 | url: 'http://api.cnki.net/file/' + category + '/' + file + '/download',
346 | type: 'GET',
347 | contentType: 'application/x-www-form-urlencoded',
348 | dataType: 'json',
349 | success: function success (ret) {
350 | // cnki://oversea.d.cnki.net/DocService/padDoc.ashx?op=download&db=mastertheses&name=%e5%af%86%e7%a0%81%e5%ad%a6%e5%9c%a8%e7%bd%91%e7%bb%9c%e4%bf%a1%e6%81%af%e5%ae%89%e5%85%a8%e6%8a%80%e6%9c%af%e4%b8%ad%e7%9a%84%e5%ba%94%e7%94%a8%e7%a0%94%e7%a9%b6&fn=2005012953.nh&file=5JHSqpVb2BlUXdWZvB1VZRney12YxtCUOpVbJF1TRhGOix2Lv8Gbnh2NFx0cNZ2MvgHSaBjZjVVZTRlQaFWNjFmb4F3UFdHMwsGbttkcVJDN4hkR212YmNHehRERKZHd90zdqBXRyE2ZOJEb4Z2VNh1TpN2ZsJ1crYDMyd0Sx0Ga0c0LQFmWClGNRd2c3cjahZ0dJp2VsVWaS9WMN90ZUlzQ5hnTsdnSoVTMVRFUSFzVLZjQnd0Nx9WSVBjczEWe
351 | console.log('GetArticle success', ret);
352 | if (ret.indexOf('cnki') === -1) {
353 | alert('获取下载地址失败!');
354 | return;
355 | }
356 | var url = ret.replace('cnki:', 'http:');
357 | //window.open(url, '_blank');
358 | _this.GetDownload(url);
359 | },
360 | error: function error (xhr, _error2, info) {
361 | console.error('GetArticle', xhr, _error2, info);
362 | alert('获取下载地址失败!');
363 | },
364 | timeout: function timeout () {
365 | alert('获取下载地址超时!');
366 | }
367 | });
368 | };
369 |
370 | this.GetDownload = function (url) {
371 | $.ajax({
372 | url: url,
373 | type: 'GET',
374 | dataType: 'xml',
375 | beforeSend: function beforeSend (xhr) {
376 | xhr.setRequestHeader('Request-Action', 'FileInfo');
377 | },
378 | success: function success (ret) {
379 | console.log('GetDownload', ret);
380 | _this.Download($(ret).find('url:first').text(), $(ret).find('filename').text());
381 | },
382 | error: function error (xhr, _error3, info) {
383 | console.error('GetDownload', xhr, _error3, info);
384 | alert('解析下载地址失败!');
385 | },
386 | timeout: function timeout () {
387 | alert('解析下载地址超时!');
388 | }
389 | });
390 | };
391 |
392 | this.Download = function (url, fileName) {
393 | _openWithHeader({
394 | url: url,
395 | method: 'GET',
396 | headers: { 'Accept-Range': 'bytes=0', 'Content-Type': 'application/octet-stream' }
397 | })
398 | }
399 | };
400 |
401 | var needInjectTabIds = [];
402 | var needInjectOptions = {};
403 |
404 | function _openWithHeader (options) {
405 | chrome.tabs.create(
406 | { url: chrome.runtime.getURL('src/helper/redirect.html') },
407 | function (tab) {
408 | options.tabId = tab.id;
409 | needInjectTabIds.push(tab.id);
410 | needInjectOptions[tab.id] = options;
411 |
412 | console.log('tab.id', tab.id, options.url);
413 |
414 | var handler = function (tabId, changeInfo) {
415 | if (tabId === tab.id && changeInfo.status === 'complete') {
416 | chrome.tabs.onUpdated.removeListener(handler);
417 | chrome.tabs.sendMessage(tabId, options);
418 | }
419 | };
420 |
421 | // in case we're faster than page load (usually):
422 | chrome.tabs.onUpdated.addListener(handler);
423 |
424 | // just in case we're too late with the listener:
425 | chrome.tabs.sendMessage(tab.id, options);
426 | }
427 | );
428 | return true;
429 | }
430 |
431 | chrome.webRequest.onBeforeSendHeaders.addListener(
432 | function (details) {
433 | var index = needInjectTabIds.indexOf(details.tabId);
434 | if (index > -1) {
435 | var headers = needInjectOptions[details.tabId].headers;
436 | needInjectTabIds.splice(index, 1);
437 | delete needInjectOptions[details.tabId];
438 |
439 | for (var key in headers) {
440 | if (headers.hasOwnProperty(key))
441 | modifyHeader(details.url, details.requestHeaders, key, headers[key]);
442 | }
443 | console.log(details);
444 | setTimeout(function () { // very bad method !!
445 | chrome.tabs.remove(details.tabId);
446 | }, 5000);
447 | return { requestHeaders: details.requestHeaders };
448 | }
449 | return { requestHeaders: details.requestHeaders };
450 | },
451 | { urls: ['*://*/*'] },
452 | ['blocking', 'requestHeaders']
453 | );
454 |
455 | function modifyHeader (_url, headers, name, value) {
456 |
457 | if (name.toLocaleLowerCase() === 'cookie') {
458 | var url = new URL(_url);
459 | var arr = value.split(';');
460 | for (var c = 0; c < arr.length; c++) {
461 | var line = arr[c].split('=');
462 | if (line.length === 2) {
463 | chrome.cookies.set({
464 | 'url': url.origin,
465 | 'domain': url.hostname,
466 | 'name': line[0].trim(),
467 | 'value': line[1]
468 | }, function (cookie) {
469 | console.log(JSON.stringify(cookie));
470 | });
471 | }
472 | }
473 |
474 | }
475 | for (var i = 0; i < headers.length; i++) {
476 | if (headers[i].name.toLocaleLowerCase() === name.toLocaleLowerCase()) {
477 | headers[i].value = value;
478 | return;
479 | }
480 | }
481 | headers.push({ name: name, value: value });
482 | }
483 |
--------------------------------------------------------------------------------
/cnki-downloader/src/jquery.min.js:
--------------------------------------------------------------------------------
1 | /*! jQuery v2.2.4 | (c) jQuery Foundation | 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=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.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 e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.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()},push:g,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){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},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?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.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){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[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):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.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,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"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=ga(),z=ga(),A=ga(),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="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),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")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=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)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){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 fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(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 la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(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 oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.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]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);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"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(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(".#.+[+~]")}),ia(function(a){var b=n.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=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.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===n||a.ownerDocument===v&&t(v,a)?-1:b===n||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,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!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 fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.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},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.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=fa.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=fa.selectors={cacheLength:50,createPseudo:ha,match:W,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(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===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]||fa.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]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.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(ba,ca).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=fa.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(P," ")+" ").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,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(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:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(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:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).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 Y.test(a.nodeName)},input:function(a){return X.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:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(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,k=[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(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(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 ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(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 va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(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=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(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=[ra(sa(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 va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.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(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.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(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(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}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=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},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(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(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==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(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};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=w.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.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.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.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(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 u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(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&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},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().progress(c.notify).done(c.resolve).fail(c.reject):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=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;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||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=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)K(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},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][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=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c;
3 | }catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.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=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.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 N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.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.length",""],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.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"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.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)),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=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.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)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.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.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!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&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(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)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/