From e2f72ddea65fd117f2ca38a77f75094b547d567e Mon Sep 17 00:00:00 2001 From: "windhamwong@nva-hk.com" Date: Thu, 23 Mar 2017 13:13:49 +0000 Subject: [PATCH 01/20] Adding nTcpdump as new operations --- package.json | 3 + src/js/config/Categories.js | 1 + src/js/config/OperationConfig.js | 9 ++ src/js/operations/nTcpdump.js | 200 +++++++++++++++++++++++++++++++ 4 files changed, 213 insertions(+) create mode 100644 src/js/operations/nTcpdump.js diff --git a/package.json b/package.json index 8878ff97..14eb315e 100644 --- a/package.json +++ b/package.json @@ -42,5 +42,8 @@ "grunt-jsdoc": "^2.1.0", "ink-docstrap": "^1.1.4", "phantomjs-prebuilt": "^2.1.14" + }, + "dependencies": { + "grunt-cli": "^1.2.0" } } diff --git a/src/js/config/Categories.js b/src/js/config/Categories.js index 3a84b0ef..c92cc4c3 100755 --- a/src/js/config/Categories.js +++ b/src/js/config/Categories.js @@ -27,6 +27,7 @@ var Categories = [ ops: [ "To Hexdump", "From Hexdump", + "From nTcpdump", "To Hex", "From Hex", "To Charcode", diff --git a/src/js/config/OperationConfig.js b/src/js/config/OperationConfig.js index e8e3a881..b6d56c6e 100755 --- a/src/js/config/OperationConfig.js +++ b/src/js/config/OperationConfig.js @@ -517,6 +517,15 @@ var OperationConfig = { } ] }, + "From nTcpdump": { + description: "For Tcpdump conversion only. (nva-hk)", + run: nTcpdump.runFrom, + highlight: nTcpdump.highlightFrom, + highlightReverse: nTcpdump.highlightTo, + inputType: "string", + outputType: "byteArray", + args: [] + }, "From Hexdump": { description: "Attempts to convert a hexdump back into raw data. This operation supports many different hexdump variations, but probably not all. Make sure you verify that the data it gives you is correct before continuing analysis.", run: Hexdump.runFrom, diff --git a/src/js/operations/nTcpdump.js b/src/js/operations/nTcpdump.js new file mode 100644 index 00000000..ec250505 --- /dev/null +++ b/src/js/operations/nTcpdump.js @@ -0,0 +1,200 @@ +/* globals app */ + +/** + * Hexdump operations. + * + * @author n1474335 [n1474335@gmail.com] + * @copyright Crown Copyright 2016 + * @license Apache-2.0 + * + * @namespace + */ +var nTcpdump = { + + /** + * @constant + * @default + */ + WIDTH: 16, + /** + * @constant + * @default + */ + UPPER_CASE: false, + /** + * @constant + * @default + */ + INCLUDE_FINAL_LENGTH: false, + + /** + * To Hexdump operation. + * + * @param {byteArray} input + * @param {Object[]} args + * @returns {string} + */ + runTo: function(input, args) { + var length = args[0] || nTcpdump.WIDTH; + var upperCase = args[1]; + var includeFinalLength = args[2]; + + var output = "", padding = 2; + for (var i = 0; i < input.length; i += length) { + var buff = input.slice(i, i+length); + var hexa = ""; + for (var j = 0; j < buff.length; j++) { + hexa += Utils.hex(buff[j], padding) + " "; + } + + var lineNo = Utils.hex(i, 8); + + if (upperCase) { + hexa = hexa.toUpperCase(); + lineNo = lineNo.toUpperCase(); + } + + output += lineNo + " " + + Utils.padRight(hexa, (length*(padding+1))) + + " |" + Utils.padRight(Utils.printable(Utils.byteArrayToChars(buff)), buff.length) + "|\n"; + + if (includeFinalLength && i+buff.length === input.length) { + output += Utils.hex(i+buff.length, 8) + "\n"; + } + } + + return output.slice(0, -1); + }, + + + /** + * From Hexdump operation. + * + * @param {string} input + * @param {Object[]} args + * @returns {byteArray} + */ + runFrom: function(input, args) { + var output = [], + regex = /^\s*(?:0x[\dA-F]{4}:?)?\s*((?:[\dA-F]{4}\s?){1,8})/igm, + regex_header = /^\s*(?:0x0000:){1}\s*((?:[\dA-F]{4}\s?){6})/igm, + block, line; + + while ((block = regex.exec(input))) { + // block[1].replace(regex_header, "0x0000:"); + line = Utils.fromHex(block[1].replace(/-/g, " ")); + for (var i = 0; i < line.length; i++) { + output.push(line[i]); + } + } + // Is this a CyberChef hexdump or is it from a different tool? + var width = input.indexOf("\n"); + var w = (width - 13) / 4; + // w should be the specified width of the hexdump and therefore a round number + if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) { + app.options.attemptHighlight = false; + } + return output; + }, + + + /** + * Highlight to hexdump + * + * @param {Object[]} pos + * @param {number} pos[].start + * @param {number} pos[].end + * @param {Object[]} args + * @returns {Object[]} pos + */ + highlightTo: function(pos, args) { + // Calculate overall selection + var w = args[0] || 16, + width = 14 + (w*4), + line = Math.floor(pos[0].start / w), + offset = pos[0].start % w, + start = 0, + end = 0; + + pos[0].start = line*width + 10 + offset*3; + + line = Math.floor(pos[0].end / w); + offset = pos[0].end % w; + if (offset === 0) { + line--; + offset = w; + } + pos[0].end = line*width + 10 + offset*3 - 1; + + // Set up multiple selections for bytes + var startLineNum = Math.floor(pos[0].start / width); + var endLineNum = Math.floor(pos[0].end / width); + + if (startLineNum === endLineNum) { + pos.push(pos[0]); + } else { + start = pos[0].start; + end = (startLineNum+1) * width - w - 5; + pos.push({ start: start, end: end }); + while (end < pos[0].end) { + startLineNum++; + start = startLineNum * width + 10; + end = (startLineNum+1) * width - w - 5; + if (end > pos[0].end) end = pos[0].end; + pos.push({ start: start, end: end }); + } + } + + // Set up multiple selections for ASCII + var len = pos.length, lineNum = 0; + start = 0; + end = 0; + for (var i = 1; i < len; i++) { + lineNum = Math.floor(pos[i].start / width); + start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); + end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); + pos.push({ start: start, end: end }); + } + return pos; + }, + + + /** + * Highlight from hexdump + * + * @param {Object[]} pos + * @param {number} pos[].start + * @param {number} pos[].end + * @param {Object[]} args + * @returns {Object[]} pos + */ + highlightFrom: function(pos, args) { + var w = args[0] || 16; + var width = 14 + (w*4); + + var line = Math.floor(pos[0].start / width); + var offset = pos[0].start % width; + + if (offset < 10) { // In line number section + pos[0].start = line*w; + } else if (offset > 10+(w*3)) { // In ASCII section + pos[0].start = (line+1)*w; + } else { // In byte section + pos[0].start = line*w + Math.floor((offset-10)/3); + } + + line = Math.floor(pos[0].end / width); + offset = pos[0].end % width; + + if (offset < 10) { // In line number section + pos[0].end = line*w; + } else if (offset > 10+(w*3)) { // In ASCII section + pos[0].end = (line+1)*w; + } else { // In byte section + pos[0].end = line*w + Math.ceil((offset-10)/3); + } + + return pos; + }, + +}; From f1449ac8698bd7f4f78ddb22f3798a368040db8a Mon Sep 17 00:00:00 2001 From: "windhamwong@nva-hk.com" Date: Thu, 23 Mar 2017 13:23:53 +0000 Subject: [PATCH 02/20] Cleaned build folder Update Readme --- .gitignore | 3 +- README.md | 17 + build/prod/.htaccess | 50 --- build/prod/cyberchef.htm | 383 ------------------ build/prod/images/breakpoint-16x16.png | Bin 295 -> 0 bytes build/prod/images/bug-16x16.png | Bin 773 -> 0 bytes build/prod/images/clean-16x16.png | Bin 702 -> 0 bytes build/prod/images/code-16x16.png | Bin 796 -> 0 bytes build/prod/images/cook_female-32x32.png | Bin 1748 -> 0 bytes build/prod/images/cook_male-32x32.png | Bin 1639 -> 0 bytes build/prod/images/cyberchef-128x128.png | Bin 7543 -> 0 bytes build/prod/images/cyberchef-16x16.png | Bin 419 -> 0 bytes build/prod/images/cyberchef-256x256.png | Bin 17380 -> 0 bytes build/prod/images/cyberchef-32x32.png | Bin 1400 -> 0 bytes build/prod/images/cyberchef-512x512.png | Bin 39069 -> 0 bytes build/prod/images/cyberchef-64x64.png | Bin 3393 -> 0 bytes .../prod/images/disable_deselected-16x16.png | Bin 746 -> 0 bytes build/prod/images/disable_selected-16x16.png | Bin 590 -> 0 bytes build/prod/images/download-24x24.png | Bin 905 -> 0 bytes build/prod/images/erase-16x16.png | Bin 680 -> 0 bytes build/prod/images/favicon.ico | Bin 1082 -> 0 bytes build/prod/images/favourite-16x16.png | Bin 491 -> 0 bytes build/prod/images/favourite-24x24.png | Bin 1229 -> 0 bytes build/prod/images/fork_me.png | Bin 7660 -> 0 bytes build/prod/images/help-16x16.png | Bin 843 -> 0 bytes build/prod/images/help-22x22.png | Bin 1294 -> 0 bytes build/prod/images/info-16x16.png | Bin 513 -> 0 bytes build/prod/images/layout-16x16.png | Bin 334 -> 0 bytes build/prod/images/mail-16x16.png | Bin 463 -> 0 bytes build/prod/images/maximise-16x16.png | Bin 235 -> 0 bytes build/prod/images/open_yellow-16x16.png | Bin 474 -> 0 bytes build/prod/images/open_yellow-24x24.png | Bin 719 -> 0 bytes build/prod/images/recycle-16x16.png | Bin 585 -> 0 bytes build/prod/images/remove-16x16.png | Bin 507 -> 0 bytes build/prod/images/restore-16x16.png | Bin 245 -> 0 bytes build/prod/images/save-16x16.png | Bin 472 -> 0 bytes build/prod/images/save-22x22.png | Bin 695 -> 0 bytes build/prod/images/save_as-16x16.png | Bin 642 -> 0 bytes build/prod/images/settings-22x22.png | Bin 1050 -> 0 bytes build/prod/images/speech-16x16.png | Bin 360 -> 0 bytes build/prod/images/stats-16x16.png | Bin 3264 -> 0 bytes build/prod/images/step-16x16.png | Bin 575 -> 0 bytes build/prod/images/switch-16x16.png | Bin 472 -> 0 bytes build/prod/images/thumb_down-16x16.png | Bin 769 -> 0 bytes build/prod/images/thumb_up-16x16.png | Bin 717 -> 0 bytes build/prod/images/undo-16x16.png | Bin 553 -> 0 bytes build/prod/index.html | 21 - build/prod/scripts.js | 292 ------------- build/prod/styles.css | 68 ---- 49 files changed, 18 insertions(+), 816 deletions(-) delete mode 100755 build/prod/.htaccess delete mode 100755 build/prod/cyberchef.htm delete mode 100755 build/prod/images/breakpoint-16x16.png delete mode 100755 build/prod/images/bug-16x16.png delete mode 100755 build/prod/images/clean-16x16.png delete mode 100755 build/prod/images/code-16x16.png delete mode 100755 build/prod/images/cook_female-32x32.png delete mode 100755 build/prod/images/cook_male-32x32.png delete mode 100755 build/prod/images/cyberchef-128x128.png delete mode 100755 build/prod/images/cyberchef-16x16.png delete mode 100755 build/prod/images/cyberchef-256x256.png delete mode 100755 build/prod/images/cyberchef-32x32.png delete mode 100755 build/prod/images/cyberchef-512x512.png delete mode 100755 build/prod/images/cyberchef-64x64.png delete mode 100755 build/prod/images/disable_deselected-16x16.png delete mode 100755 build/prod/images/disable_selected-16x16.png delete mode 100755 build/prod/images/download-24x24.png delete mode 100755 build/prod/images/erase-16x16.png delete mode 100755 build/prod/images/favicon.ico delete mode 100755 build/prod/images/favourite-16x16.png delete mode 100755 build/prod/images/favourite-24x24.png delete mode 100755 build/prod/images/fork_me.png delete mode 100755 build/prod/images/help-16x16.png delete mode 100755 build/prod/images/help-22x22.png delete mode 100755 build/prod/images/info-16x16.png delete mode 100755 build/prod/images/layout-16x16.png delete mode 100755 build/prod/images/mail-16x16.png delete mode 100755 build/prod/images/maximise-16x16.png delete mode 100755 build/prod/images/open_yellow-16x16.png delete mode 100755 build/prod/images/open_yellow-24x24.png delete mode 100755 build/prod/images/recycle-16x16.png delete mode 100755 build/prod/images/remove-16x16.png delete mode 100755 build/prod/images/restore-16x16.png delete mode 100755 build/prod/images/save-16x16.png delete mode 100755 build/prod/images/save-22x22.png delete mode 100755 build/prod/images/save_as-16x16.png delete mode 100755 build/prod/images/settings-22x22.png delete mode 100755 build/prod/images/speech-16x16.png delete mode 100755 build/prod/images/stats-16x16.png delete mode 100755 build/prod/images/step-16x16.png delete mode 100755 build/prod/images/switch-16x16.png delete mode 100755 build/prod/images/thumb_down-16x16.png delete mode 100755 build/prod/images/thumb_up-16x16.png delete mode 100755 build/prod/images/undo-16x16.png delete mode 100755 build/prod/index.html delete mode 100755 build/prod/scripts.js delete mode 100755 build/prod/styles.css diff --git a/.gitignore b/.gitignore index 5019a4eb..5697a2cc 100755 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ node_modules npm-debug.log -build/dev -build/test +build/* docs/* !docs/*.conf.json !docs/*.ico diff --git a/README.md b/README.md index 83ae12b5..a484bb01 100755 --- a/README.md +++ b/README.md @@ -1,5 +1,22 @@ # CyberChef +This is a fork of original CyberChef by GCHQ. This project has implemented my own operations for the daily SoC tasks. Please feel free to clone/test/share/contribute it. + +## Features + +- opeartion **nTcpdump**: tcpdump hexdump convert + +## Todo + +- operation GZip HTTP data +- operation char() data +- operation SQL comment strip function + + +--- + +## Original project info + ####*The Cyber Swiss Army Knife* CyberChef is a simple, intuitive web app for carrying out all manner of "cyber" operations within a web browser. These operations include creating hexdumps, simple encoding like XOR or Base64, more complex encryption like AES, DES and Blowfish, data compression and decompression, calculating hashes and checksums, IPv6 and X.509 parsing, and much more. diff --git a/build/prod/.htaccess b/build/prod/.htaccess deleted file mode 100755 index 80626724..00000000 --- a/build/prod/.htaccess +++ /dev/null @@ -1,50 +0,0 @@ -# Serve up .htm files as binary files rather than text/html. -# This allows cyberchef.htm to be downloaded rather than opened in the browser. -AddType application/octet-stream .htm - -# Fix Apache bug #45023 where "-gzip" is appended to all ETags, preventing 304 responses - - RequestHeader edit "If-None-Match" "^\"(.*)-gzip\"$" "\"$1\"" - Header edit "ETag" "^\"(.*[^g][^z][^i][^p])\"$" "\"$1-gzip\"" - - -# Set gzip compression on all resources that support it - - SetOutputFilter DEFLATE - - -# Set Expires headers on various resources - - ExpiresActive On - - # 10 minutes - ExpiresDefault "access plus 600 seconds" - - # 30 days - ExpiresByType image/x-icon "access plus 2592000 seconds" - ExpiresByType image/jpeg "access plus 2592000 seconds" - ExpiresByType image/png "access plus 2592000 seconds" - ExpiresByType image/gif "access plus 2592000 seconds" - - # 7 days - ExpiresByType text/css "access plus 604800 seconds" - ExpiresByType text/javascript "access plus 604800 seconds" - ExpiresByType application/javascript "access plus 604800 seconds" - ExpiresByType text/html "access plus 604800 seconds" - - -# Set Cache-Control headers on various resources - - - Header set Cache-Control "max-age=2592000, public" - - - Header set Cache-Control "max-age=600, public" - - - Header set Cache-Control "max-age=600, private, must-revalidate" - - - Header set Cache-Control "max-age=600, private, must-revalidate" - - diff --git a/build/prod/cyberchef.htm b/build/prod/cyberchef.htm deleted file mode 100755 index 3e3a2662..00000000 --- a/build/prod/cyberchef.htm +++ /dev/null @@ -1,383 +0,0 @@ - -CyberChef Edit
Operations
    Recipe
      Input
      Output
      \ No newline at end of file diff --git a/build/prod/images/breakpoint-16x16.png b/build/prod/images/breakpoint-16x16.png deleted file mode 100755 index 336df401877efb14926e127192c45d26f993bd04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QU}E!cd)U2j*R?VUHv&U^mB6Zr>@SQmoINjMHA%3R zImyTO_tmT44<6iCR{nYJT(`dLOHYWUyZ41qv;CHB+zmAn9H-X_NPY__ t<1Z~^&|T@4F!#?d#pM#A+3#*}Uwq8$u;26J8U_Xi22WQ%mvv4FO#sSRaa;fZ diff --git a/build/prod/images/bug-16x16.png b/build/prod/images/bug-16x16.png deleted file mode 100755 index 8098d345ec3ceb6b1d5688a8bf4ecbbc5a9764b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 773 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 diff --git a/build/prod/images/cyberchef-16x16.png b/build/prod/images/cyberchef-16x16.png deleted file mode 100755 index b847c10e5c8a5ecdeb76207296fd5b85c621b710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7Bes~&GX4a3HKfldS zyk>lCgM8+!D8ti6tH1xQ&EJ3RHhYho^5&a48D_H?bf$YVOj0Ry@@g>gJ)5uGaBbGt zs@N(8&q+d0dYBh(U6-->=9)!w=U;l0Rbus`#A==Z)BW$>uDx!|4KGWgZXP@+Sf;3M z{lnj)T%m{f<|wPDBIf7Eon3FOe+SzDpjrNof6Rf?fd zM*6wp-g|dvCblr%F ViHFW&XJBAp@O1TaS?83{1ORW`u}S~{ diff --git a/build/prod/images/cyberchef-256x256.png b/build/prod/images/cyberchef-256x256.png deleted file mode 100755 index 61835a10e58ab2884cfae570c1b35f6e3a48e772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17380 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 MboFyt=akR{03SGs+W-In diff --git a/build/prod/images/cyberchef-512x512.png b/build/prod/images/cyberchef-512x512.png deleted file mode 100755 index f48cd49b25a58be58efca40955b0573679f2d6e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39069 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 y(NC!S`)fAIBMuF>_56Mb9sN}a^tzj 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 diff --git a/build/prod/images/disable_deselected-16x16.png b/build/prod/images/disable_deselected-16x16.png deleted file mode 100755 index 0dcaf2b3f3c9a647969fb3e1b271cde5b401836a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 746 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>ln-{A3zCO**&!2qTZ1?WnSF%hQf>w$=e*9Qv^2v*T|Ni~6yIE0e zs@9Q4jRUv7{#9eWaLJG`r>Gg)!cpdhK7zSL!7)i1(L3O|GP8J zL4akm6Nk=er^{QeUKbBxy}q>KU6EKtAxS#G zV;X$1)~w9>@v3jw=lZor=(N56eR*#>PZPsZ5hsp}-6D5Cr$30Wl)~6B z{kyZTn7p02?zM*|XH&xGB?ouq-Yz{}C?O-WBt&bX-*WS!f9rMR?KhRZeVAk;r=K~? z?6C#kw%qHr_v6|7>K>ifocm|(QdLD4yQyA@5^S}#wJu7642KM!eE2XSY_;p!u*0Qy zeV%16EJ!_XZ4}_OF)3H{*4wgWF?!cmU)2iovN?bFv(1tzA*(}AJuTXMH!nSG&Dy4* zu6YOhPkOAE|9N|6{WQ(bs`s@oU-haG`C$K> zdBl@FdCIgWYO*|&j?BI@`^lGDh2DvIUt8Nh7oB@=`Tt(Alb7ZlwYCEle{%#3T)P)l zUi9fd-C5>xd(mRMpD(RVw%zq(?>K&QU76|Ib}4!PLz~iWxErR+A3yOW!oY&@)?2eb zckf<3_u+$>k8xD4$pru9g&Q_H8nXYkaBI`C{mW_Pm{8XE{b48PA3K{P`o~Y2oI4j6 zbuy)6(jCK9p&1u7PE1(3+}`oQ?{0&hjI|+$T+L?hT>M&p+4bxD7u;kqlB~88^Del3 zhgWjbml*kj-=DX;xnI-}DKHoMnXzuooI{@*V$QLB__qG%zZ)~0+jMLbHuOAw-aqx% z2d}?9wkh0Sby>HHZFlu5np(?p>RCj8;1`cC{S50?^!IFF{q~(bTX`Z_mu?0R&=NOIE`o_h!V&Xx*xx>TGy!dt9$bn3%Ut;t39 z`6nhUP2a$ETYOz~p4ZALQ##XjRvw=P-E)>h-T+qm-8~?Ne92oS3n> zq;B6=1&)NX=a^~qomS}~5-4+g ze|}o{=M$$obi6)!Y}WATXlnY$xrn)^OE2J!!3F^G!0A{J&3D?y>Ca^VL0YavJZWWC@epV-h)U9nQ-Bt7l+e zp40mCtk?-18Ld+5tyvA(a(nJ1a`G8`IuM{Wf4l6mWqAyO%_~H1-QwiW|HJMO^ig1y zhyIa^%W5R5jTAW7`ib_h+i`KnazhJ;nu7^Oy84F_v+Z~~Ua)bj@8|0~K3yb&KjJTQ zkFKQOEd{Mb`Z9dtIcDsuuDx+ysp>yv#dHn9FTay#cl}z$C(+ZO!rgXD_d>~+tMZM% zj$gDE*09QA=z6}s;b$plRE%GXLq{=N@47BKgHA_2)g2-Sf?l_MZWTX!eAd5NXT#f% z@NN{5mhSJ(oN1Ax$@G4bYi5dV)jC_3D|79f9y9aL@o)X{aew#!E6q3ND4OUfGOm8M z>|x7NpO$;ff_ZEYe%iA39go{GArF^1f4q9L#{Qhf)ap1VfxZ7N@W@0aSo=!Ue1#Y&o{r7|)_#%oO9FPu~SQ}>^H zL!Pl@Cm-{4feAmt56s;B{CbgJVA6{9oSu_3?nvCzY+Lmx_>jf(N&62?I^xvo$7mf} z`OdGX=+TjX7i*8^EOcPLS{}n}{3?Iyt_NR#1q6S;aPE}0Ur^ewriRx2+hf;Keq&+H`1gg)c$J%?)iUu*O4}65Z%M`Ms9{}`5zhHECH>&zmsegdzuOqG zLZ&NSeqML-Gy!`BK1D^hm_0S3InjxRsrvCfW#Q~^)~>z9!==M3IAa>8df$nA6JK0k z-_H=ke0xf~hvZA{#NP>r-@eL{*z(tcBlzfiCoeCqAUBnV&wMX7e|>F!dD7DEugN4cSxg^l#nI_{+0i S`UwLA1B0ilpUXO@geCx#?WryR diff --git a/build/prod/images/erase-16x16.png b/build/prod/images/erase-16x16.png deleted file mode 100755 index bc6a3fa43ac3b338374598f4696089d9b27105e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 680 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7BuiW)N`mv#O3D+9QW+dm z@{>{(JaZG%Q-e|yQz{EjrrIztFnM{pIEGZ*Dw*WpArvTcygpw<-1f)w3$6wRXQC@O zm+@(8C%-r)SM)MyyA_9{Ld68tm`MpAA1OA)rg18*coFjE+_g9@|G?_V4`FhDih2G_ zW-q-mv-0n~(-Ti_m9MGn|9@ehEr3a2B9jNhln1{& znSZQfX5~#yPf!qOh|pnM7{DRJ$F6hJlzGLLj~}lJJ8@{N+`a66{+mnlPNq~m5mngy zn$1CJ?H--4yJLM^8_rI?zV!P_YqNP02f`1&|9-f>=b*VcU;LCRj^M77(rjO|5LdB@FaW{9wb%t!J$MWSLxOKbZLR;o@|QW6Eb1YeguFce_enuTNN}=4Q6-k&NBB zw{H^Pws+J%Og2%Temb?%L~3q!#_qevUUEJt+nxCOZQVDyg}zQF(?8!krxdOwT4^CO zuQ__{H7391mm_^I`xWw;e(SDl;woL$beAP^RakQ7>;fCP=NnExU3FFPk3)U&3`tM5 z$$}+HT3t%~Y|M2x4zz8|fBpHVf>dwX#h)wBrmf!iY?EAMZ^hm?G1aDvN3ynRegFOU z=u(X?nPa)Vz6nz|7S*ia_FMj0$ZfC1?6Vb?pU(%Sb1qC<@v_lBoq6--EndBP^{M3KWNDBYAUt*I)MbwzJ%Zbf&3>3WK=htHdw%ESg9~uUmb?Vfqe=t2rG&o#A zaTOI6#e4GP$&+Y$!EV53|KY=jzb{y@;3z10Z{50eCMeuM>XFSs5C7ArPlMe8iifRR zw?1`tc9sD7pMimaf8V}+kDy@ywi{#)x_*%R4<0=DciXmYKlbk3`!h2$Q_tPq9clyv zLuY4a%IejtyQfc|UVHiS<+q@)1nB|!bJeO# zVL}Y~`T5F|Cr_^I@9&>eSy>t8=KYyO@pKcv8(^L2)^0m{cFLlkU;lh@^?A10dcx(UyW&+|o}GS}dFipTdHQBA&Wav- zAH1mKYV=3{J$xDy8)AeR`@vs zGrNO+Yu48;6Siet!Jr#=hedFs$=ulGfuUB9dUhrV~k94fNgB1uAYm>A7--_ z9hJD_ztpp*iY>4!JovdikYR#+cj9B|%s=P&e!g3|`RTOE|H8Y4U+^sJ>v6KVbM5=V z15?gy=qtT?yCwa)gGqiAAe*c}@^=#RRDI1OZ{VIw?pUm}jS^njjz}IC5iY8Z1 zeOGgQ&-sI<`p$3LHWVEFDbKmt!Ncq&-+zX_#k?lTqQ`j|7#J8lUHx3vIVCg!0Ps%b A$^ZZW diff --git a/build/prod/images/favourite-24x24.png b/build/prod/images/favourite-24x24.png deleted file mode 100755 index eb1b91be32fcdc14c7c024fc441eca55007580e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1229 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuKTrg*wIhE&{I8yf2)6DsoW z-J5go-ZX`9IWY>}4!WiAba}wXgDnv%OO7qG-|}b6l_Tu)YXanbk~2~qSADzaCaip` zT`M5#_LZzf+rl0>XR}6%t=KwsT1j&P=h3LL>5Sjb#hky>>a;~q#pvYSlV|om|Gn?? z+~PFJX%&_C?<~|bb7fCXSao^gcem^c&BC0QEVs|ExmTaDTY%}G+4+x6zk*FqyIuHw zF0NN|*1nHdpEn$c{8GQhv138^rWsLkP0Li9W7}pZrkUd6nNvu%|#!(g= zuD*6<`J@?l<8*k8(?eg@EqOM#Va7~GA8Fka*1?A*c1>y7IIqxP_RsDI4^Nv-uWo5? zdM+BeciYOBs|`Ibd@u7|ZjfeXEhOLmc%u8qf^T9sWcUwGox^lhQiWC4;P`CMz0s@s z1tKCZ^iSiOSRwK7fW;S1)?+0M^|5acoVg*OYd<6DeUh!*rUm~@TuU!~V*aJz^EaC* zM8U@^U_#cy#+hC%2R6*(jrww+^T?btv-CM=!SFr()9yW7f~JwJ0eroK~YkQQ;*7wKDgy6lc@vH5AKFBRW< zRi1pF@@4I11LvkkoFPro3`udeqTxb+Kij>WKGUc>gq3aIMS&R|KNo+vAinZ@_npTp zW#eWZ50=;F4zxDX4BFO^sm>IAWYtPVg&OvxPkIK6FNd%z&AhPbz}m<67HhGw-SjB^ z?{jPatu4zJmRTrX_wd!f%<0m~;V*DOL9p-gguj;jX6e2&4)Ol_aq+=LbAfwlyyky$ zmYkCI`F-BW_pB$^e3q|x zd5-D(_tQ#V^_5F1XN11VJag;l65lSh3*Wl9tJk;PSj4iND|Tk4|8#zl{bg)5hk~r1 ze_msIY>llEw`fa!5I(;6?%UYxDH%c(h#(=V?m_jHBU&zy^|w|68o+Fse!)xpsH zvcq=M2{Fd4Y0o!S@bJERx_h_N^F=~6^PXpERaoxM^Yt|6$qHY+pv#n7rR-6c7U!c) zhpwcCEY5UITO7cC-zMMvysP_Rx%>mdQy17CFJ1V>DE7R(&9z6~;-UP8 zlg5&-c|^jBEQBn!8kCBsmOl@Z+4tY1X5A@qoqoRwZ{==Y6Py3&Qd{B#*IM^EJMOJ@ zD(!B&YtO!P*W}sBwuy7ErsqD;xN-QP314ju>%N+P{;;oX*WJ`B4ykJG?kd>((LLs8 z*ka)|wcE`<9N2$svg^jQwU)R0!Upi^A+`NM`|NUoRU|{fc^>bP0l+XkKz3Wl# diff --git a/build/prod/images/fork_me.png b/build/prod/images/fork_me.png deleted file mode 100755 index 6e0c3a7882e8eefbeee4746f4c1466283f244a84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7660 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 diff --git a/build/prod/images/help-16x16.png b/build/prod/images/help-16x16.png deleted file mode 100755 index 63a7069ff9a7609a423b70805b8f9684d7bdf409..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 843 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!tog*;sxLn`7*gL6HC<0b0L z%FExc%aH1ru`*}nU(uN_bd0qlzbdY%{m{H9#A$1s0&j^+tl()o7jK>Fdg1?n{`a*$ zX!i+}&eYL7Gi{yeN7e9IFXp7(@|oUr`{kV1VQwXQ_UA0mSJs{XX?wo7pF@#lb$iWx zJvslM5?Va1=W`AlB)({${j>2ZOP1)wLmHes3A?z9jepGgd{Z**@Ja=yO?qceKlm8Q z|LtMt`+UZlw!Ykxn>JmGp4G78L&B`i9H`Z|X{yt=C~!SKzDR-Ig38J*SblXtltoVIex;aLiNY<9lQr6)MmH*Me4 z;ypP_{lBoH(Uu4nqth1*UX?tIWC{vn`r)&o{^u*U&X!|kf)QkJ}#bjC^1rCUg1o1ODC&89vM;+ zoeYkSFDLpWWElRrpVZoTF_Pnf#2a_U<3c>|X#zp}J3lA=3VLgNI z)(Z|>wdJQ9L@1s(_99?I|5=7}2i-(w+~c#lRKEOZP;BjEhs#Nd;ez{CZZ7wU=sv1q zDy6NG%{A%Kp#|TYFLzs~DlvXB<$ad)c<$nus3egu{XWdSbDfwhHBQ}SN)fqR!=l{-B()vJpOX`dB^&?&VR<= zl&>EW(z;+;cYndPk1enDlU%E($Hrh zpl*Hc$IRym+pl+PaZJ?suzG=k*QBCVcdquIi7UQuQFK;+k!6kYzrqX7i_cD;RDM@> z@xC*{@%Hc6pO+N(ZasgZSj}~du70&o#sA~Q{}^4u!-JMrTY|C+gQu&X%Q~loCIF-I Bg(?65 diff --git a/build/prod/images/help-22x22.png b/build/prod/images/help-22x22.png deleted file mode 100755 index ddea036d127d748ab92672bdaa9f185721e0f33b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1294 zcmeAS@N?(olHy`uVBq!ia0y~yU=Rag4mJh`h9g^YtQia$~+{bJoCqm(>k|jT(rEaW@UQrjeh;z zl9^>cPE0%FnxJ*WH+}n~5>5Wb4uuuWiVKvcO>_T!TVMS`Nb~0{^Y56cKmYuDUi|x= zR|N&-%yTrOc^QOeRQr70y64Psy-EL_%{UKarD+-Wd^8r4n75jtVA{=tuCIOzbsVW( zayrRKNG9yF@#FT!^&T>rqMuX4r30(BGV1x~ir0T*j5zw~Fn{;b_9e*-Az7>Dd^~x| z^4WUxJw57cm>+1ZJbe4M|AV`-l^R;RIjip^$lTcBadS&np1p7Aw~xDGj$K(kW2sid zpN-!X4}bnYJ?|N-N9^k(-<Ci9?v^|WXq zS;NhYZ|XuGt(_Ivc`okzqP*pwW$dg!Xy@CrMc45Ww+Hn67Ov`QV3<=BfArVh z^a&ev#of8|+L_LJZF9UFlHta@@9fuvcTXmINXcfiO%S@*wes?$oI9trO4vErT-&k& z9@s>7?X{0RG<9})!F}0;tl&q;Yz`Hw#K^uG@d zxn|~^HuF$YqlUt*rk*P*D!o!lORh`5S3Do9eJM-lY2_8uZHZ?-Xb4=Kac^?@{D~!2 zvMTrHt+{SI$wT|dnM0X;D*a;YE*x`O!xt1d_ObhMe2AWyx`Fx6r|(_b5u@%g+>2QwzPa>*W!7G82zvR71-Gr~+=Zla*u43kifouv<2E>!p~vgJze zTJ?wF&cjE!?;csj2j1jevfNK3Nl2iB3Hw>MaPS);Z{phkszT8iAejEua+HsPYW|NpQo%|E-`bT`+_y>B*u zxmYKj`{SIiG{4xz<@e(kEb3y*+Vyy;tNfFSpEhgw$~`%xT`E?t`0{IFBK5F;==xOtN>rehQkmf)2f{`I& zO>o%0wAuTYs^pPjWNk5u<4a z{y*$Hc5o{(@}#h7K3lQyZ_ed3Nu5B>tRoL9PCV0)Wjffff9uKXw*s!-ycKXU>hEms z1!4^468jd-tKDb!e^!JZ^92cE;fv1p#}0Y)tbe{`+t--Awm&p|zUhCiGxd&GkWjgTe~DWM4f$;@s< diff --git a/build/prod/images/info-16x16.png b/build/prod/images/info-16x16.png deleted file mode 100755 index 05f16291fec836655cb6f170d7734e3594744c45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7Pk6dGhE&8Y4L+MCl_+AX zIVo*n*rY3S13Fty?0BKoebZ$Zhn|y|VoA1nt4%|&!mkKMyj&2-`739>j2F6GPm3ar=MQE^ZYKnH?U{X>;hO@BMYc z%*lbXcj(sT%(&^ymM`2+*dJBgUQ+cUwJow( zT%?%0{8Q=19kF84?DyX~_ojc#4S5&)^wfOsiGLP!PM^uuK4;ctt^WTrj@6wjul~|M VSBvBAX9fla22WQ%mvv4FO#tRU~~369QdHW0Ye z%Dc$P)?teASGK?;KFFUe|8^J$uDqP*7N_1ur|BzCM?#jj*_ zDLZ3@23PS;$H-~%)72T)>6~`jwT;oh`0VFBC*LxbJ~(CKyJy{NH;3XU&z+babj?d+ z6>t!7HQ{0Yxzlz5Urgchg|h7G51xNxSl9FTM4e&O>)-db^_OzoV833)@M*2Xyywp@ z$}Y>S+VPrUb7`!5Y3zTSPX{DE>sq~cQ|L>+&A2Y;Xfu=NqyyUfUNgK-_c^lfD}&ZP z_6ny1=ifezI(})J?%_c5_g7;-6)%it2%oh~P@-w(9LpW?_Tol@G3PeD36A$$|EKHL rL&^A4vybg=`!m@-`_Dg40|seB3#ZVV31=A?7#KWV{an^LB{Ts5+540C diff --git a/build/prod/images/mail-16x16.png b/build/prod/images/mail-16x16.png deleted file mode 100755 index 6afab8a87ddc5c9045be42edaebc5b7b3dfee619..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 463 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7r+Kc`n_xrOG7A+1at#fp;T^lG2My@~?6-WQ80#L@)AbOC;%3T}W8z zIgKOd79Z!f>u>qrBUCLsc1e(?qtfHX%FKcpyn W)Auup>}6nJVDNPHb6Mw<&;$V5{L;|? diff --git a/build/prod/images/maximise-16x16.png b/build/prod/images/maximise-16x16.png deleted file mode 100755 index be47e6ee11a3d4b555254345ac2225b837fd91ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>l@9XG6_!kS@F<{A-L~+Fl90RJBeh3CqDzh}`?`45rj+VSg7V6@~txTJib!P5mZc9x1YjQ->#^pvpl2 zyD=|b)GSsz-^L+3t9h#D;q&zeC5{*W`EhSk;X1C49546q{|Y%-OXM#%@p{~!v(%S+ z`XUv@PdmfEY-o7TXgTe~DWM4f68O}U diff --git a/build/prod/images/open_yellow-24x24.png b/build/prod/images/open_yellow-24x24.png deleted file mode 100755 index 7ff528887580d59ceb1531de886506292f270e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuL8rg^$JhE&|TGVOdmZ=lF= z`|`AV{JMeMnSVG0g*I*!_RUc}bgXG_YfI=&4#!;^J}BSyY?*3*py`ImL_HNHC9$AY ztGqr2h5l-uzTEiz+5YOjqi3dESNJtc?@mh5ySY2RSD*ViPrkfo)uuUz6K5XZr2S!D zjFH4={%H~hZF3JSw9nbO_S6E6Kc{wW=SVJFRa9|%-#xj22!UPO|E3oiv(L6U@gy+e z^!*F2iN_DFetx^WMA${}zBKP2gC{rIx1Kr2W@GW-ThF(-MGdhB&iqH*rAt-10$E%x)$R;&4K0|<n^eAzKRz`R(D|y0!BCN4*87=Sx-p|8(u;y-L;9JpnStD~9tM-j2jS^2Ufgks;osnS zN6I#?u|I#Ff19B*+Xtgru`VmFzb=_}YvuW?v!Wj*wcXfY^zGMb=JgCV_ACp0Lp8Rq zJ=UgpY0*~(W8ta#bnI_(Q6h%844XTAc g-~S)_M}pz@)<+jh-Ok1^FfcH9y85}Sb4q9e09&C`@c;k- diff --git a/build/prod/images/recycle-16x16.png b/build/prod/images/recycle-16x16.png deleted file mode 100755 index faff7bf65a7ceb17861a815aa2be59ff1ae6bfed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 585 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to1Uy|FLn`8yPVn^(36wcj z|Gm~|v$(MDa>0`T?5;%W!4IRQ@&i=8nSBkp)9_o zre2v#E^q`EwZ7MGa!_izB*~#Uap9J0nZ-3Zi4qGo|F)=QF8meju3V~;{qkjQn!;6A z_i$VFTl|;r6isjm7Cm`Rg<PHv3adzvT zdE5Fiee=F&I?F_rr`Ml3b}Z-09yXcXATF?|6*>I-tGZ6@-MVF4jDod!qX46qHV8-lv z$$dJ3K?_1&IKAQc!0>73d&lIgTe~DWM4f-h>0i diff --git a/build/prod/images/remove-16x16.png b/build/prod/images/remove-16x16.png deleted file mode 100755 index b0cbfb64045b8fce6c8faa0346a61ce2686212ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s74|%#chE&{I5^U?w$pE8=bL2<<8;#j>4^3fUbzCl~{&UZo>#seY6y<{e zcJgu6wyw+4rZLCt5(@}^@#4UqcNXi9H#3Ue@r#@$bUid_$@Spx2d?o(^S7s7Fxlu~ zc-`XI3|q^&Ck-!Yy7dUf2Ccone$&qCW5?=yFP7}PZ}DY9ey7JrrQ2)Wp9FNzxStxV z9CmX4ge<;_3cmK-Z+rR!Y(DXCTeUNb%c&#vmVOT7?%4-^3KvxJ-wAxv{ATj+-Mnvd z8N^E;ygGRBUgzyH)@d377n(oB_&v>i9v;B_DSJ-4kGrpGp6G~uEzH>pCCDFo; Qfq{X+)78&qol`;+0CQ*O$^ZZW diff --git a/build/prod/images/restore-16x16.png b/build/prod/images/restore-16x16.png deleted file mode 100755 index 10ca13dda5a6521a1c9aca8dbfb744cde28fda45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 245 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>l*&^*M@uH(+4wpC+?k|(mc?vVGZyI@CX3uyG?mF@Bi{)%1!bMp3X)-r zH`}8^-l`ndv-%?%(0$F>%8`Ei4S?Ju{c6hA1rF!ATGIJU4an)--+1NRME7yIU<^rdq(>KHFN`6Rv-<`xy~zP`#; zLCj3;uB>NXy8EUUWlpZ={B8d?Sbt7WOH6%#?)3FlRm~i18)p80ea`Z`lit0mxO?~a z&w97Fo<}i3QQ+#Lb#pSOCLg=~`g_HvSHhYNY>&ThZl9r5%6a{rn=fNvXqlW%@3~UV zyrhfPKoc+Hbf8SaumXN6zGhAe=_TIb2vPjBfl1kha*V+|40ig_ShZRd-lgGp$ItxS{QUCznI2t<2`;SH{&ghC{Nmo} erMBwZUw*GSoQytY(jg2C3=E#GelF{r5}E)5tI^#6 diff --git a/build/prod/images/save-22x22.png b/build/prod/images/save-22x22.png deleted file mode 100755 index 51183947bccb82b9df31700443caa4f05f3ba982..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 695 zcmeAS@N?(olHy`uVBq!ia0y~yU=Rag4mJh`h9g^YtQi=X>O5T>Ln`8yhV0J{4ix!! zu3CSgis?})S*;MI9Y2yMSxL`fSykCl@%5W zm_$r*Sh!L}_2lm7Rp%?GpEecEJUjh+;W^vN@73|=cIubB`?c9MZ69+(zyYO0?{4jX zuh`&NqMiKg=n>mX^N3E!FFGV(p6~eKU2}EM`CTbW`39{WYmimR<0aNnLo*Y=3Jek@bS>C=O3dF8st2FxKV7q-4BM> zUsWge$Ju2)Q+7JpR^`-UW9~Sk=ss8Z!vDpxd)Mc06!$qZ&pph3>7uNbj3+X`A8y?G zqPDvI=g-P3S*BCGR8u0CU3~6j`}}R0^y<~CSNP2TvTot;n@0}q{5P{j{rc-t(TK>% zMs_hVu?z3NUwr*FWJZTVLbA#Cy%WNY95#Lwc9eCh7wgq5QA4Y_eA~8fZ&lP^@cU4m z@Lq)w5!to8hdd`K99psBlJ&IOho$EpKc4n_;j;%jZogf1V#NmyMj_{iA(7Jm?k>^( z@pbRrgJ%|UalEpy=r(+1R+GOsBcs(mPi)7Ae@~CkzI?n-#-gf1Xg*_3Ztlwkv(Bou z9bWiENhOeNxk+8d<*l2#SALtNYap>|gKFiaJ6o5hb5^7_uDp5nxh6+_^R6yOg)Mw> zOfECF1a&Zd&$xcpg|lJO+J+6n7?E-1y+Bc3;KLLkD_Xk`uO0Qc-kH{+YmGDj!ri+jD0gJ`{1+JKK2s?&|&TEP1XeH2*nx{Qv*Lf6pI(kUjjf^K|m*%;giN z6xlOeVa{N`5TO=uEi3YOTId+jT0MWhv6CY5&1`nC7PhpMI8%xI#056xmO2)67)~|L|&Az8!yUgBm`DK#| zLx-lDOBSuW#u_);gWl{-O2vNc#_Wk4Ze9X{wD52{XPFPjCw` z<(<2@Sc7#&{G^3XLhtbGe|EIO=pw&>1(R^ENye(Sm&RukzLd(lZeGs$`n6=vcCL(% zJ1*Y7%6V+%Hd`C-kP1eIdpB~FM2@yjh(Ea0y8p+77t2KrYetriUn^;!Aan}1J`uQ{<{zx4e}kv?~;&*;l%f8D@yUaI%lBL?5g6HcbgNM(#O z7C&WZBJCCySa|Dt!@k3D98C=&T1PjBtrq2B{>@c>*-jw)L%q(PTILOm8zXv>F0NR2 zv8mti{FLv3cil@_7kt0-S!Va?@`UZTKR$X|EWq2UT@($vb!qEu+kfXh-~TPhp8i9{|DWyNo%?Oh z+dlWW@Pb*WL0RC??0QmY)JT1E{<@x~l%UmLzkTbwp1-cT=;NdIi9RYECt5_GJ`-QC_^@8wqudaU2W4{gvZBAw zE2(~ddVYI+;K3=&ZX_7|`5NR~`tPy-n#Y<~_j29e&CPiJw0ryB-~;V{`gI>)xOmU} z`Mhkav(foV59;MT9}|K7-VSw%*MhM~1|`oWi)WzWkRjwS_`y$X?EyhTT@zgu(C z^6o{c0{M&wyxu)ew=xkva#h;=YlQ>wt~%iOiEH&(xPv#7J{kB_;|cvtDn`Liq2r>;tV zseJm!#xoq(GZ(hs+qPiiHm3A?iDOH%b$0Hb=yT+tC|`SXr^};EK7E}k5f#yO z*I$S3s4@-To0J~U_wSg~_vACz?w&8(Ti!GG&rAQZ50l?VBo~W6J|BMFWIfviXEQTX z(@>$7lbg=u{o0fB{G99~^Z)+7KAv~aZgKn?`ubx1J0=@D`!)I@-An4;^TzDaQ?|5C z>to%!lY#4`_wnP$CqIdrcgID2+4AM>+Z!kRsL)&+6WUcdGx66nbzZ5T#{)&@NO&%5 z68Z45#OgT%i_*js+upr znQ`Yaeb>C>|&hJ6LLgt^=G=5jlXeaW!{l}!W Rehdr@44$rjF6*2UngF#h|7rjL diff --git a/build/prod/images/speech-16x16.png b/build/prod/images/speech-16x16.png deleted file mode 100755 index 5519c5d73875314c14720621ea1bfd4a99b2d311..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 360 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 C3KiY} diff --git a/build/prod/images/step-16x16.png b/build/prod/images/step-16x16.png deleted file mode 100755 index cea525a30b24b473224cdbb9196f227130224f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 575 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to*gRbvLn`8WC;4UzJ4zg% zKlAR~v-?!kmL@3%>ilT(TG)OpfnSa*?u&B8hbPjlaeFGh35eQM3$!S0d&K@>TC+O8 z*E?3hjhTX;dTE!}%)I;Nhq~cmKfQ1K{LW_kpMQU&!yoK*v2at(>&nRpB!#3^hgm|68)7!K^9X^NQ$$bUU$(CX8WIkgUvyHE z)e2gq&vAOJ%yH%Ro5IAb(I(e>oMBmKU}W3^BiADlHo`}|G?^WY|G7Ulsa`qd@E!$U z6~m;rGZXR)z8q&*w0MTa^ITmI;nM;hnued170nnW_}tk9TsQh$Hf-?Rw^HYGb^BZ! zrGWXIiP`1%yXwC`NqKf`dieI}FY{%xr*7nCw^(JVa8RrJrs#&w-RuIA49mD}TQ~mQ zuqmL_cD|71qPq3JCkyQD6ifd-UGK_^U%y17Vk6Z~KVm51`1ID|)$z_LCU3qkRjSJ8 zxKz09uH~Df7ZsMt&t2!j%%GfqNu~1R?%&xB<`ulj#`)?sCz!&1acUhZjeArsDKu;S hX7l-kM^p}a-ll_z(!=dO(O*6t3mzdB16i7mXUn$KX#Rx5%cBXQ@L~I&(ByIbG%x1*YGfhf}-%Y_8I?W z_DP-%FFbJhzn!^d%Sz+M#nOffN&jaw+gfP;@k;r$!NT;;1kP2R$76jAOMj-UivK73 zf-T=*QIvc0Q9JYCsb>dUvK%QGlqUO(BnRqpzTJ zegCJe!TAeB7b)`SoSU%af#m~1Ca=Q>KYL65i`cCa{?kwXmf0bJwG#^&8VVHELAb#&v-D|1(hdLzgy#G0Y z;|cq;XSEw9@0(mb>BWWDGAzZ?p;6JjQdjmho;4O^vd(Rr{n|#+Fz;%hYvdhu)gT^E z$H)KerN20t)UoPBvmLv4ur1u|ON7o5f1$=%oa;7knEUYW>6PX^t%n5~l^VT-dQQ%+ cFS28t9yV>IdhzAe3=9kmp00i_>zopr0RJ7z82|tP diff --git a/build/prod/images/thumb_down-16x16.png b/build/prod/images/thumb_down-16x16.png deleted file mode 100755 index 69e6663cc5815e7c09cd230ba8949c062b928163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!toPI$UFhE&|j3HJ2}2^6t= zpI>rJvUJ%TjZUV^tsI#eef{`s}95k00{7X?_n0d|Js)MsNPepl;-n%yo?^W;ho4|&?|7#3w< z-Z5L8ML>nK%&aZ>^Z8#a-3K1uxbUvj$^G=weZqSAQ;(bQMEEavJpJ^5SCW9M_NJY; z_iw+Yu%$=z+03RXPW`Quw|qM}_x0t8M|Y}RER8sy=IE!QpnH0Ps}bvS%h1+6%Ni%1 zZ}vN2%?v21DO$zY4jIzxNFsH*us)-KO|T zsXYJOhSuWn{Ow^Cd&889+w;^8p6Hv6M6+wXkB?JA6Q zAMPBp3%vTWyYpdPxuRerESXaG(?F6( z?@UkIq=Mw4RwtK#`>j5=r^`PSX>Fgsv6@;``+PXd^@aaT-rSfRhu;#n z1^)$?{`vPUDkI%KPWRxAhz^|_u_qVYFg(9UPa}cFrnZrvki17ah{b|+Z1|1Nuz^fj@Qx{5j~}jTdlJ%DP&w;rl6Uz@Wmq6 zT(852Vj_52CQjt`)jW1~LYmdDS>NC7p8LDTZ}FGn2i5QIRG*>NS2`Ni_<;(gz5DQtf$e3x zP-4t0%3k|olItH14$j0|tzWNwYCHV3hwF%Z563p%Nsl{Uzlxe_^yjXg=d5`vEDCf^ zvR{7ruyel1v7HVf;tpSDeA<7)SA3U0w}S9(qv`6$+tfc#;eE%`EzR^_<$`0=l1=;e z{+^lyL{L4EgZ07NOapdd!xI5fO0yaAE6gpk;D80LLo!PM^3X4U&%FWfz z-OKUHIrnMP>z*xo7fzH*d8=J~mGbo4lZ$_^urY1eHhFb-cYqL=V_xDyhku6VQ#Z;k z$m14E)#W`KKI`kIu84akiK^*LN8c`+ao2IhEH){{cQOChp61hcjgh3vGMW3 ze39=zf4y1G&)r;GemU-&ld96T1s@n@Pmgs;^LSR?_B+NVZmar~T{kKVX6vQ=>H46x zphEoQmWI^*e)ZgLNlVT6zXhyd_-}LY#Ao%H-}Bv#JYLT~*gWT;t?hZ%BC*$!GCS5! zKUzLjdSXUEAoHqys*8SKX^?lhsJ`gqwr|%|z3uz=*Ofo#m7evpR^grTgsjsG4h1Ma zoV*~bo$=ucK1JWQ4Ju8Ij7Cn!%fj5#7M5p79h)%O^-S{YE4A(%_DT&O4*oyuwC00$ f6Vo|;MmC06J>$5t<9=Zb3=9mOu6{1-oD!M<8;n)U diff --git a/build/prod/images/undo-16x16.png b/build/prod/images/undo-16x16.png deleted file mode 100755 index a9ba0be94fad0a420b8350b8d99e560ca6e3bf38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 553 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7KX|%0hE&AOogD8GoG5W@ ze(@KJSdqM_Go|S>G`{$2?B-ab?I_R`%N^^w`^B>EiHYV~I=d#ka|y_n)IL;t(KW$s z=T;3#(IYZzBX5?hGb)cLmVR5YZ+o%bhYiPgp1*%)YkvNH_4(tU6Rn%d9d0lxc~uxT zx+%x3d{DJNW#Xz0*Is^D7{th5zFkXG&M)4y?(xp$ik8*Y|9?lGKUmFtJ?q;7mW3v3 zmb3-xo^qJWyuf#b7Gpwv+*zB5DJ~r6m0rG6+`cJj&$dW=&yzniwwLsL`pD;X{FcV* z+SkQD-!lFZwRPROWb(B8bCdtAY!lVJoS3tq{pZQo%>qZY9)FVv-ndd^!ukA!?yO+p zP10#PZORLG_J4}Zojm7II8evDW -CyberChef Edit

      Operations
        Recipe
          Input
          Output
          \ No newline at end of file diff --git a/build/prod/scripts.js b/build/prod/scripts.js deleted file mode 100755 index 0bf65a3a..00000000 --- a/build/prod/scripts.js +++ /dev/null @@ -1,292 +0,0 @@ -/** - * CyberChef - The Cyber Swiss Army Knife - * - * @copyright Crown Copyright 2016 - * @license Apache-2.0 - * - * Copyright 2016 Crown Copyright - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -"use strict";function BigInteger(a,b,c){null!=a&&("number"==typeof a?this.fromNumber(a,b,c):null==b&&"string"!=typeof a?this.fromString(a,256):this.fromString(a,b))}function nbi(){return new BigInteger(null)}function am1(a,b,c,d,e,f){for(;--f>=0;){var g=b*this[a++]+c[d]+e;e=Math.floor(g/67108864),c[d++]=67108863&g}return e}function am2(a,b,c,d,e,f){for(var g=32767&b,h=b>>15;--f>=0;){var i=32767&this[a],j=this[a++]>>15,k=h*i+j*g;i=g*i+((32767&k)<<15)+c[d]+(1073741823&e),e=(i>>>30)+(k>>>15)+h*j+(e>>>30),c[d++]=1073741823&i}return e}function am3(a,b,c,d,e,f){for(var g=16383&b,h=b>>14;--f>=0;){var i=16383&this[a],j=this[a++]>>14,k=h*i+j*g;i=g*i+((16383&k)<<14)+c[d]+e,e=(i>>28)+(k>>14)+h*j,c[d++]=268435455&i}return e}function int2char(a){return BI_RM.charAt(a)}function intAt(a,b){var c=BI_RC[a.charCodeAt(b)];return null==c?-1:c}function bnpCopyTo(a){for(var b=this.t-1;b>=0;--b)a[b]=this[b];a.t=this.t,a.s=this.s}function bnpFromInt(a){this.t=1,this.s=a<0?-1:0,a>0?this[0]=a:a<-1?this[0]=a+this.DV:this.t=0}function nbv(a){var b=nbi();return b.fromInt(a),b}function bnpFromString(a,b){var c;if(16==b)c=4;else if(8==b)c=3;else if(256==b)c=8;else if(2==b)c=1;else if(32==b)c=5;else{if(4!=b)return void this.fromRadix(a,b);c=2}this.t=0,this.s=0;for(var d=a.length,e=!1,f=0;--d>=0;){var g=8==c?255&a[d]:intAt(a,d);g<0?"-"==a.charAt(d)&&(e=!0):(e=!1,0==f?this[this.t++]=g:f+c>this.DB?(this[this.t-1]|=(g&(1<>this.DB-f):this[this.t-1]|=g<=this.DB&&(f-=this.DB))}8==c&&0!=(128&a[0])&&(this.s=-1,f>0&&(this[this.t-1]|=(1<0&&this[this.t-1]==a;)--this.t}function bnToString(a){if(this.s<0)return"-"+this.negate().toString(a);var b;if(16==a)b=4;else if(8==a)b=3;else if(2==a)b=1;else if(32==a)b=5;else{if(4!=a)return this.toRadix(a);b=2}var c,d=(1<0)for(h>h)>0&&(e=!0,f=int2char(c));g>=0;)h>(h+=this.DB-b)):(c=this[g]>>(h-=b)&d,h<=0&&(h+=this.DB,--g)),c>0&&(e=!0),e&&(f+=int2char(c));return e?f:"0"}function bnNegate(){var a=nbi();return BigInteger.ZERO.subTo(this,a),a}function bnAbs(){return this.s<0?this.negate():this}function bnCompareTo(a){var b=this.s-a.s;if(0!=b)return b;var c=this.t;if(b=c-a.t,0!=b)return this.s<0?-b:b;for(;--c>=0;)if(0!=(b=this[c]-a[c]))return b;return 0}function nbits(a){var b,c=1;return 0!=(b=a>>>16)&&(a=b,c+=16),0!=(b=a>>8)&&(a=b,c+=8),0!=(b=a>>4)&&(a=b,c+=4),0!=(b=a>>2)&&(a=b,c+=2),0!=(b=a>>1)&&(a=b,c+=1),c}function bnBitLength(){return this.t<=0?0:this.DB*(this.t-1)+nbits(this[this.t-1]^this.s&this.DM)}function bnpDLShiftTo(a,b){var c;for(c=this.t-1;c>=0;--c)b[c+a]=this[c];for(c=a-1;c>=0;--c)b[c]=0;b.t=this.t+a,b.s=this.s}function bnpDRShiftTo(a,b){for(var c=a;c=0;--c)b[c+g+1]=this[c]>>e|h,h=(this[c]&f)<=0;--c)b[c]=0;b[g]=h,b.t=this.t+g+1,b.s=this.s,b.clamp()}function bnpRShiftTo(a,b){b.s=this.s;var c=Math.floor(a/this.DB);if(c>=this.t)return void(b.t=0);var d=a%this.DB,e=this.DB-d,f=(1<>d;for(var g=c+1;g>d;d>0&&(b[this.t-c-1]|=(this.s&f)<>=this.DB;if(a.t>=this.DB;d+=this.s}else{for(d+=this.s;c>=this.DB;d-=a.s}b.s=d<0?-1:0,d<-1?b[c++]=this.DV+d:d>0&&(b[c++]=d),b.t=c,b.clamp()}function bnpMultiplyTo(a,b){var c=this.abs(),d=a.abs(),e=c.t;for(b.t=e+d.t;--e>=0;)b[e]=0;for(e=0;e=0;)a[c]=0;for(c=0;c=b.DV&&(a[c+b.t]-=b.DV,a[c+b.t+1]=1)}a.t>0&&(a[a.t-1]+=b.am(c,b[c],a,2*c,0,1)),a.s=0,a.clamp()}function bnpDivRemTo(a,b,c){var d=a.abs();if(!(d.t<=0)){var e=this.abs();if(e.t0?(d.lShiftTo(i,f),e.lShiftTo(i,c)):(d.copyTo(f),e.copyTo(c));var j=f.t,k=f[j-1];if(0!=k){var l=k*(1<1?f[j-2]>>this.F2:0),m=this.FV/l,n=(1<=0&&(c[c.t++]=1,c.subTo(r,c)),BigInteger.ONE.dlShiftTo(j,r),r.subTo(f,f);f.t=0;){var s=c[--p]==k?this.DM:Math.floor(c[p]*m+(c[p-1]+o)*n);if((c[p]+=f.am(0,s,c,q,0,j))0&&c.rShiftTo(i,c),g<0&&BigInteger.ZERO.subTo(c,c)}}}function bnMod(a){var b=nbi();return this.abs().divRemTo(a,null,b),this.s<0&&b.compareTo(BigInteger.ZERO)>0&&a.subTo(b,b),b}function Classic(a){this.m=a}function cConvert(a){return a.s<0||a.compareTo(this.m)>=0?a.mod(this.m):a}function cRevert(a){return a}function cReduce(a){a.divRemTo(this.m,null,a)}function cMulTo(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function cSqrTo(a,b){a.squareTo(b),this.reduce(b)}function bnpInvDigit(){if(this.t<1)return 0;var a=this[0];if(0==(1&a))return 0;var b=3&a;return b=b*(2-(15&a)*b)&15,b=b*(2-(255&a)*b)&255,b=b*(2-((65535&a)*b&65535))&65535,b=b*(2-a*b%this.DV)%this.DV,b>0?this.DV-b:-b}function Montgomery(a){this.m=a,this.mp=a.invDigit(),this.mpl=32767&this.mp,this.mph=this.mp>>15,this.um=(1<0&&this.m.subTo(b,b),b}function montRevert(a){var b=nbi();return a.copyTo(b),this.reduce(b),b}function montReduce(a){for(;a.t<=this.mt2;)a[a.t++]=0;for(var b=0;b>15)*this.mpl&this.um)<<15)&a.DM;for(c=b+this.m.t,a[c]+=this.m.am(0,d,a,b,0,this.m.t);a[c]>=a.DV;)a[c]-=a.DV,a[++c]++}a.clamp(),a.drShiftTo(this.m.t,a),a.compareTo(this.m)>=0&&a.subTo(this.m,a)}function montSqrTo(a,b){a.squareTo(b),this.reduce(b)}function montMulTo(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function bnpIsEven(){return 0==(this.t>0?1&this[0]:this.s)}function bnpExp(a,b){if(a>4294967295||a<1)return BigInteger.ONE;var c=nbi(),d=nbi(),e=b.convert(this),f=nbits(a)-1;for(e.copyTo(c);--f>=0;)if(b.sqrTo(c,d),(a&1<0)b.mulTo(d,e,c);else{var g=c;c=d,d=g}return b.revert(c)}function bnModPowInt(a,b){var c;return c=a<256||b.isEven()?new Classic(b):new Montgomery(b),this.exp(a,c)}function bnClone(){var a=nbi();return this.copyTo(a),a}function bnIntValue(){if(this.s<0){if(1==this.t)return this[0]-this.DV;if(0==this.t)return-1}else{if(1==this.t)return this[0];if(0==this.t)return 0}return(this[1]&(1<<32-this.DB)-1)<>24}function bnShortValue(){return 0==this.t?this.s:this[0]<<16>>16}function bnpChunkSize(a){return Math.floor(Math.LN2*this.DB/Math.log(a))}function bnSigNum(){return this.s<0?-1:this.t<=0||1==this.t&&this[0]<=0?0:1}function bnpToRadix(a){if(null==a&&(a=10),0==this.signum()||a<2||a>36)return"0";var b=this.chunkSize(a),c=Math.pow(a,b),d=nbv(c),e=nbi(),f=nbi(),g="";for(this.divRemTo(d,e,f);e.signum()>0;)g=(c+f.intValue()).toString(a).substr(1)+g,e.divRemTo(d,e,f);return f.intValue().toString(a)+g}function bnpFromRadix(a,b){this.fromInt(0),null==b&&(b=10);for(var c=this.chunkSize(b),d=Math.pow(b,c),e=!1,f=0,g=0,h=0;h=c&&(this.dMultiply(d),this.dAddOffset(g,0),f=0,g=0))}f>0&&(this.dMultiply(Math.pow(b,f)),this.dAddOffset(g,0)),e&&BigInteger.ZERO.subTo(this,this)}function bnpFromNumber(a,b,c){if("number"==typeof b)if(a<2)this.fromInt(1);else for(this.fromNumber(a,c),this.testBit(a-1)||this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this),this.isEven()&&this.dAddOffset(1,0);!this.isProbablePrime(b);)this.dAddOffset(2,0),this.bitLength()>a&&this.subTo(BigInteger.ONE.shiftLeft(a-1),this);else{var d=new Array,e=7&a;d.length=(a>>3)+1,b.nextBytes(d),e>0?d[0]&=(1<0)for(d>d)!=(this.s&this.DM)>>d&&(b[e++]=c|this.s<=0;)d<8?(c=(this[a]&(1<>(d+=this.DB-8)):(c=this[a]>>(d-=8)&255,d<=0&&(d+=this.DB,--a)),0!=(128&c)&&(c|=-256),0==e&&(128&this.s)!=(128&c)&&++e,(e>0||c!=this.s)&&(b[e++]=c);return b}function bnEquals(a){return 0==this.compareTo(a)}function bnMin(a){return this.compareTo(a)<0?this:a}function bnMax(a){return this.compareTo(a)>0?this:a}function bnpBitwiseTo(a,b,c){var d,e,f=Math.min(a.t,this.t);for(d=0;d>=16,b+=16),0==(255&a)&&(a>>=8,b+=8),0==(15&a)&&(a>>=4,b+=4),0==(3&a)&&(a>>=2,b+=2),0==(1&a)&&++b,b}function bnGetLowestSetBit(){for(var a=0;a=this.t?0!=this.s:0!=(this[b]&1<>=this.DB;if(a.t>=this.DB;d+=this.s}else{for(d+=this.s;c>=this.DB;d+=a.s}b.s=d<0?-1:0,d>0?b[c++]=d:d<-1&&(b[c++]=this.DV+d),b.t=c,b.clamp()}function bnAdd(a){var b=nbi();return this.addTo(a,b),b}function bnSubtract(a){var b=nbi();return this.subTo(a,b),b}function bnMultiply(a){var b=nbi();return this.multiplyTo(a,b),b}function bnSquare(){var a=nbi();return this.squareTo(a),a}function bnDivide(a){var b=nbi();return this.divRemTo(a,b,null),b}function bnRemainder(a){var b=nbi();return this.divRemTo(a,null,b),b}function bnDivideAndRemainder(a){var b=nbi(),c=nbi();return this.divRemTo(a,b,c),new Array(b,c)}function bnpDMultiply(a){this[this.t]=this.am(0,a-1,this,0,0,this.t),++this.t,this.clamp()}function bnpDAddOffset(a,b){if(0!=a){for(;this.t<=b;)this[this.t++]=0;for(this[b]+=a;this[b]>=this.DV;)this[b]-=this.DV,++b>=this.t&&(this[this.t++]=0),++this[b]}}function NullExp(){}function nNop(a){return a}function nMulTo(a,b,c){a.multiplyTo(b,c)}function nSqrTo(a,b){a.squareTo(b)}function bnPow(a){return this.exp(a,new NullExp)}function bnpMultiplyLowerTo(a,b,c){var d=Math.min(this.t+a.t,b);for(c.s=0,c.t=d;d>0;)c[--d]=0;var e;for(e=c.t-this.t;d=0;)c[d]=0;for(d=Math.max(b-this.t,0);d2*this.m.t)return a.mod(this.m);if(a.compareTo(this.m)<0)return a;var b=nbi();return a.copyTo(b),this.reduce(b),b}function barrettRevert(a){return a}function barrettReduce(a){for(a.drShiftTo(this.m.t-1,this.r2),a.t>this.m.t+1&&(a.t=this.m.t+1,a.clamp()),this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3),this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);a.compareTo(this.r2)<0;)a.dAddOffset(1,this.m.t+1);for(a.subTo(this.r2,a);a.compareTo(this.m)>=0;)a.subTo(this.m,a)}function barrettSqrTo(a,b){a.squareTo(b),this.reduce(b)}function barrettMulTo(a,b,c){a.multiplyTo(b,c),this.reduce(c)}function bnModPow(a,b){var c,d,e=a.bitLength(),f=nbv(1);if(e<=0)return f;c=e<18?1:e<48?3:e<144?4:e<768?5:6,d=e<8?new Classic(b):b.isEven()?new Barrett(b):new Montgomery(b);var g=new Array,h=3,i=c-1,j=(1<1){var k=nbi();for(d.sqrTo(g[1],k);h<=j;)g[h]=nbi(),d.mulTo(k,g[h-2],g[h]),h+=2}var l,m,n=a.t-1,o=!0,p=nbi();for(e=nbits(a[n])-1;n>=0;){for(e>=i?l=a[n]>>e-i&j:(l=(a[n]&(1<0&&(l|=a[n-1]>>this.DB+e-i)),h=c;0==(1&l);)l>>=1,--h;if((e-=h)<0&&(e+=this.DB,--n),o)g[l].copyTo(f),o=!1;else{for(;h>1;)d.sqrTo(f,p),d.sqrTo(p,f),h-=2;h>0?d.sqrTo(f,p):(m=f,f=p,p=m),d.mulTo(p,g[l],f)}for(;n>=0&&0==(a[n]&1<0&&(b.rShiftTo(f,b),c.rShiftTo(f,c));b.signum()>0;)(e=b.getLowestSetBit())>0&&b.rShiftTo(e,b),(e=c.getLowestSetBit())>0&&c.rShiftTo(e,c),b.compareTo(c)>=0?(b.subTo(c,b),b.rShiftTo(1,b)):(c.subTo(b,c),c.rShiftTo(1,c));return f>0&&c.lShiftTo(f,c),c}function bnpModInt(a){if(a<=0)return 0;var b=this.DV%a,c=this.s<0?a-1:0;if(this.t>0)if(0==b)c=this[0]%a;else for(var d=this.t-1;d>=0;--d)c=(b*c+this[d])%a;return c}function bnModInverse(a){var b=a.isEven();if(this.isEven()&&b||0==a.signum())return BigInteger.ZERO;for(var c=a.clone(),d=this.clone(),e=nbv(1),f=nbv(0),g=nbv(0),h=nbv(1);0!=c.signum();){for(;c.isEven();)c.rShiftTo(1,c),b?(e.isEven()&&f.isEven()||(e.addTo(this,e),f.subTo(a,f)),e.rShiftTo(1,e)):f.isEven()||f.subTo(a,f),f.rShiftTo(1,f);for(;d.isEven();)d.rShiftTo(1,d),b?(g.isEven()&&h.isEven()||(g.addTo(this,g),h.subTo(a,h)),g.rShiftTo(1,g)):h.isEven()||h.subTo(a,h),h.rShiftTo(1,h);c.compareTo(d)>=0?(c.subTo(d,c),b&&e.subTo(g,e),f.subTo(h,f)):(d.subTo(c,d),b&&g.subTo(e,g),h.subTo(f,h))}return 0!=d.compareTo(BigInteger.ONE)?BigInteger.ZERO:h.compareTo(a)>=0?h.subtract(a):h.signum()<0?(h.addTo(a,h),h.signum()<0?h.add(a):h):h}function bnIsProbablePrime(a){var b,c=this.abs();if(1==c.t&&c[0]<=lowprimes[lowprimes.length-1]){for(b=0;b>1,a>lowprimes.length&&(a=lowprimes.length);for(var e=nbi(),f=0;f>6)+b64map.charAt(63&c);for(b+1==a.length?(c=parseInt(a.substring(b,b+1),16),d+=b64map.charAt(c<<2)):b+2==a.length&&(c=parseInt(a.substring(b,b+2),16),d+=b64map.charAt(c>>2)+b64map.charAt((3&c)<<4));(3&d.length)>0;)d+=b64padchar;return d}function b64tohex(a){var b,c,d="",e=0;for(b=0;b>2),c=3&f,e=1):1==e?(d+=int2char(c<<2|f>>4),c=15&f,e=2):2==e?(d+=int2char(c),d+=int2char(f>>2),c=3&f,e=3):(d+=int2char(c<<2|f>>4),d+=int2char(15&f),e=0))}return 1==e&&(d+=int2char(c<<2)),d}function b64toBA(a){var b,c=b64tohex(a),d=new Array;for(b=0;2*b0;--b){f=f.twice();var g=d.testBit(b),h=c.testBit(b);g!=h&&(f=f.add(g?this:e))}return f}function pointFpMultiplyTwo(a,b,c){var d;d=a.bitLength()>c.bitLength()?a.bitLength()-1:c.bitLength()-1;for(var e=this.curve.getInfinity(),f=this.add(b);d>=0;)e=e.twice(),a.testBit(d)?e=c.testBit(d)?e.add(f):e.add(this):c.testBit(d)&&(e=e.add(b)),--d;return e}function ECCurveFp(a,b,c){this.q=a,this.a=this.fromBigInteger(b),this.b=this.fromBigInteger(c),this.infinity=new ECPointFp(this,null,null),this.reducer=new Barrett(this.q)}function curveFpGetQ(){return this.q}function curveFpGetA(){return this.a}function curveFpGetB(){return this.b}function curveFpEquals(a){return a==this||this.q.equals(a.q)&&this.a.equals(a.a)&&this.b.equals(a.b)}function curveFpGetInfinity(){return this.infinity}function curveFpFromBigInteger(a){return new ECFieldElementFp(this.q,a)}function curveReduce(a){this.reducer.reduce(a)}function curveFpDecodePointHex(a){switch(parseInt(a.substr(0,2),16)){case 0:return this.infinity;case 2:case 3:return null;case 4:case 6:case 7:var b=(a.length-2)/2,c=a.substr(2,b),d=a.substr(b+2,b);return new ECPointFp(this,this.fromBigInteger(new BigInteger(c,16)),this.fromBigInteger(new BigInteger(d,16)));default:return null}}function curveFpEncodePointHex(a){if(a.isInfinity())return"00";var b=a.getX().toBigInteger().toString(16),c=a.getY().toBigInteger().toString(16),d=this.getQ().toString(16).length;for(d%2!=0&&d++;b.length>8&255,rng_pptr>=rng_psize&&(rng_pptr-=rng_psize)}function rng_seed_time(){rng_seed_int((new Date).getTime())}function rng_get_byte(){if(null==rng_state){for(rng_seed_time(),rng_state=prng_newstate(),rng_state.init(rng_pool),rng_pptr=0;rng_pptr=0&&b>0;){var e=a.charCodeAt(d--);e<128?c[--b]=e:e>127&&e<2048?(c[--b]=63&e|128,c[--b]=e>>6|192):(c[--b]=63&e|128,c[--b]=e>>6&63|128,c[--b]=e>>12|224)}c[--b]=0;for(var f=new SecureRandom,g=new Array;b>2;){for(g[0]=0;0==g[0];)f.nextBytes(g);c[--b]=g[0]}return c[--b]=2,c[--b]=0,new BigInteger(c)}function RSAKey(){this.n=null,this.e=0,this.d=null,this.p=null,this.q=null,this.dmp1=null,this.dmq1=null,this.coeff=null}function RSASetPublic(a,b){null!=a&&null!=b&&a.length>0&&b.length>0&&(this.n=parseBigInt(a,16),this.e=parseInt(b,16))}function RSADoPublic(a){return a.modPowInt(this.e,this.n)}function RSAEncrypt(a){var b=pkcs1pad2(a,this.n.bitLength()+7>>3);if(null==b)return null;var c=this.doPublic(b);if(null==c)return null;var d=c.toString(16);return 0==(1&d.length)?d:"0"+d}function X9ECParameters(a,b,c,d){this.curve=a,this.g=b,this.n=c,this.h=d}function x9getCurve(){return this.curve}function x9getG(){return this.g}function x9getN(){return this.n}function x9getH(){return this.h}function fromHex(a){return new BigInteger(a,16)}function secp128r1(){var a=fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF"),b=fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC"),c=fromHex("E87579C11079F43DD824993C2CEE5ED3"),d=fromHex("FFFFFFFE0000000075A30D1B9038A115"),e=BigInteger.ONE,f=new ECCurveFp(a,b,c),g=f.decodePointHex("04161FF7528B899B2D0C28607CA52C5B86CF5AC8395BAFEB13C02DA292DDED7A83");return new X9ECParameters(f,g,d,e)}function secp160k1(){var a=fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73"),b=BigInteger.ZERO,c=fromHex("7"),d=fromHex("0100000000000000000001B8FA16DFAB9ACA16B6B3"),e=BigInteger.ONE,f=new ECCurveFp(a,b,c),g=f.decodePointHex("043B4C382CE37AA192A4019E763036F4F5DD4D7EBB938CF935318FDCED6BC28286531733C3F03C4FEE");return new X9ECParameters(f,g,d,e)}function secp160r1(){var a=fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF"),b=fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC"),c=fromHex("1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45"),d=fromHex("0100000000000000000001F4C8F927AED3CA752257"),e=BigInteger.ONE,f=new ECCurveFp(a,b,c),g=f.decodePointHex("044A96B5688EF573284664698968C38BB913CBFC8223A628553168947D59DCC912042351377AC5FB32");return new X9ECParameters(f,g,d,e)}function secp192k1(){var a=fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37"),b=BigInteger.ZERO,c=fromHex("3"),d=fromHex("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D"),e=BigInteger.ONE,f=new ECCurveFp(a,b,c),g=f.decodePointHex("04DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D");return new X9ECParameters(f,g,d,e)}function secp192r1(){var a=fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF"),b=fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"),c=fromHex("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1"),d=fromHex("FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831"),e=BigInteger.ONE,f=new ECCurveFp(a,b,c),g=f.decodePointHex("04188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF101207192B95FFC8DA78631011ED6B24CDD573F977A11E794811");return new X9ECParameters(f,g,d,e)}function secp224r1(){var a=fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001"),b=fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE"),c=fromHex("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4"),d=fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D"),e=BigInteger.ONE,f=new ECCurveFp(a,b,c),g=f.decodePointHex("04B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34");return new X9ECParameters(f,g,d,e)}function secp256r1(){var a=fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF"),b=fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC"),c=fromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"),d=fromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"),e=BigInteger.ONE,f=new ECCurveFp(a,b,c),g=f.decodePointHex("046B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2964FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5");return new X9ECParameters(f,g,d,e)}function getSECCurveByName(a){return"secp128r1"==a?secp128r1():"secp160k1"==a?secp160k1():"secp160r1"==a?secp160r1():"secp192k1"==a?secp192k1():"secp192r1"==a?secp192r1():"secp224r1"==a?secp224r1():"secp256r1"==a?secp256r1():null}function Base64x(){}function stoBA(a){for(var b=new Array,c=0;c0&&b-1 in a))}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(ha.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=oa[a]={};return _.each(a.match(na)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+Math.random()}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ua,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c||"false"!==c&&("null"===c?null:+c+""===c?+c:ta.test(c)?_.parseJSON(c):c)}catch(a){}sa.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Ka.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;c")).appendTo(b.documentElement),b=Na[0].contentDocument,b.write(),b.close(),c=t(a,b),Na.detach()),Oa[a]=c),c}function v(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),c&&(g=c.getPropertyValue(b)||c[b]),c&&(""!==g||_.contains(a.ownerDocument,a)||(g=_.style(a,b)),Qa.test(g)&&Pa.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 w(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}function x(a,b){if(b in a)return b;for(var c=b[0].toUpperCase()+b.slice(1),d=b,e=Xa.length;e--;)if(b=Xa[e]+c,b in a)return b;return d}function y(a,b,c){var d=Ta.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function z(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;f<4;f+=2)"margin"===c&&(g+=_.css(a,c+wa[f],!0,e)),d?("content"===c&&(g-=_.css(a,"padding"+wa[f],!0,e)),"margin"!==c&&(g-=_.css(a,"border"+wa[f]+"Width",!0,e))):(g+=_.css(a,"padding"+wa[f],!0,e),"padding"!==c&&(g+=_.css(a,"border"+wa[f]+"Width",!0,e)));return g}function A(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g="border-box"===_.css(a,"boxSizing",!1,f);if(e<=0||null==e){if(e=v(a,b,f),(e<0||null==e)&&(e=a.style[b]),Qa.test(e))return e;d=g&&(Y.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+z(a,b,c||(g?"border":"content"),d,f)+"px"}function B(a,b){for(var c,d,e,f=[],g=0,h=a.length;g=0&&c=0},isPlainObject:function(a){return"object"===_.type(a)&&!a.nodeType&&!_.isWindow(a)&&!(a.constructor&&!X.call(a.constructor.prototype,"isPrototypeOf"))},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?V[W.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=_.trim(a),a&&(1===a.indexOf("use strict")?(b=Z.createElement("script"),b.text=a,Z.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(ba,"ms-").replace(ca,da)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,d){var e,f=0,g=a.length,h=c(a);if(d){if(h)for(;fw.cacheLength&&delete a[b.shift()],a[c+" "]=d}var b=[];return a}function d(a){return a[N]=!0,a}function e(a){var b=G.createElement("div");try{return!!a(b)}catch(a){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function f(a,b){for(var c=a.split("|"),d=a.length;d--;)w.attrHandle[c[d]]=b}function g(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||W)-(~a.sourceIndex||W);if(d)return d;if(c)for(;c=c.nextSibling;)if(c===b)return-1;return a?1:-1}function h(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function i(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function j(a){return d(function(b){return b=+b,d(function(c,d){for(var e,f=a([],c.length,b),g=f.length;g--;)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function k(a){return a&&typeof a.getElementsByTagName!==V&&a}function l(){}function m(a){for(var b=0,c=a.length,d="";b1?function(b,c,d){for(var e=a.length;e--;)if(!a[e](b,c,d))return!1;return!0}:a[0]}function p(a,c,d){for(var e=0,f=c.length;e-1&&(d[j]=!(g[j]=l))}}else t=q(t===g?t.splice(o,t.length):t),f?f(null,g,t,i):_.apply(g,t)})}function s(a){for(var b,c,d,e=a.length,f=w.relative[a[0].type],g=f||w.relative[" "],h=f?1:0,i=n(function(a){return a===b},g,!0),j=n(function(a){return ba.call(b,a)>-1},g,!0),k=[function(a,c,d){return!f&&(d||c!==C)||((b=c).nodeType?i(a,c,d):j(a,c,d))}];h1&&o(k),h>1&&m(a.slice(0,h-1).concat({value:" "===a[h-2].type?"*":""})).replace(ia,"$1"),c,h0,f=a.length>0,g=function(d,g,h,i,j){var k,l,m,n=0,o="0",p=d&&[],r=[],s=C,t=d||f&&w.find.TAG("*",j),u=P+=null==s?1:Math.random()||.1,v=t.length;for(j&&(C=g!==G&&g);o!==v&&null!=(k=t[o]);o++){if(f&&k){for(l=0;m=a[l++];)if(m(k,g,h)){i.push(k);break}j&&(P=u)}e&&((k=!m&&k)&&n--,d&&p.push(k))}if(n+=o,e&&o!==n){for(l=0;m=c[l++];)m(p,r,g,h);if(d){if(n>0)for(;o--;)p[o]||r[o]||(r[o]=Z.call(i));r=q(r)}_.apply(i,r),j&&!d&&r.length>0&&n+c.length>1&&b.uniqueSort(i)}return j&&(P=u,C=s),p};return e?d(g):g}var u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N="sizzle"+-new Date,O=a.document,P=0,Q=0,R=c(),S=c(),T=c(),U=function(a,b){return a===b&&(E=!0),0},V="undefined",W=1<<31,X={}.hasOwnProperty,Y=[],Z=Y.pop,$=Y.push,_=Y.push,aa=Y.slice,ba=Y.indexOf||function(a){for(var b=0,c=this.length;b+~]|"+da+")"+da+"*"),la=new RegExp("="+da+"*([^\\]'\"]*?)"+da+"*\\]","g"),ma=new RegExp(ha),na=new RegExp("^"+fa+"$"),oa={ID:new RegExp("^#("+ea+")"),CLASS:new RegExp("^\\.("+ea+")"),TAG:new RegExp("^("+ea.replace("w","w*")+")"),ATTR:new RegExp("^"+ga),PSEUDO:new RegExp("^"+ha),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+da+"*(even|odd|(([+-]|)(\\d*)n|)"+da+"*(?:([+-]|)"+da+"*(\\d+)|))"+da+"*\\)|)","i"),bool:new RegExp("^(?:"+ca+")$","i"),needsContext:new RegExp("^"+da+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+da+"*((?:-\\d)?\\d*)"+da+"*\\)|)(?=[^-]|$)","i")},pa=/^(?:input|select|textarea|button)$/i,qa=/^h\d$/i,ra=/^[^{]+\{\s*\[native \w/,sa=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ta=/[+~]/,ua=/'|\\/g,va=new RegExp("\\\\([\\da-f]{1,6}"+da+"?|("+da+")|.)","ig"),wa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{_.apply(Y=aa.call(O.childNodes),O.childNodes),Y[O.childNodes.length].nodeType}catch(a){_={apply:Y.length?function(a,b){$.apply(a,aa.call(b))}:function(a,b){for(var c=a.length,d=0;a[c++]=b[d++];);a.length=c-1}}}v=b.support={},y=b.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},F=b.setDocument=function(a){var b,c=a?a.ownerDocument||a:O,d=c.defaultView;return c!==G&&9===c.nodeType&&c.documentElement?(G=c,H=c.documentElement,I=!y(c),d&&d!==d.top&&(d.addEventListener?d.addEventListener("unload",function(){F()},!1):d.attachEvent&&d.attachEvent("onunload",function(){F()})),v.attributes=e(function(a){return a.className="i",!a.getAttribute("className")}),v.getElementsByTagName=e(function(a){return a.appendChild(c.createComment("")),!a.getElementsByTagName("*").length}),v.getElementsByClassName=ra.test(c.getElementsByClassName)&&e(function(a){return a.innerHTML="
          ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),v.getById=e(function(a){return H.appendChild(a).id=N,!c.getElementsByName||!c.getElementsByName(N).length}),v.getById?(w.find.ID=function(a,b){if(typeof b.getElementById!==V&&I){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},w.filter.ID=function(a){var b=a.replace(va,wa);return function(a){return a.getAttribute("id")===b}}):(delete w.find.ID,w.filter.ID=function(a){var b=a.replace(va,wa);return function(a){var c=typeof a.getAttributeNode!==V&&a.getAttributeNode("id");return c&&c.value===b}}),w.find.TAG=v.getElementsByTagName?function(a,b){if(typeof b.getElementsByTagName!==V)return b.getElementsByTagName(a)}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){for(;c=f[e++];)1===c.nodeType&&d.push(c);return d}return f},w.find.CLASS=v.getElementsByClassName&&function(a,b){if(typeof b.getElementsByClassName!==V&&I)return b.getElementsByClassName(a)},K=[],J=[],(v.qsa=ra.test(c.querySelectorAll))&&(e(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&J.push("[*^$]="+da+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||J.push("\\["+da+"*(?:value|"+ca+")"),a.querySelectorAll(":checked").length||J.push(":checked")}),e(function(a){var b=c.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&J.push("name"+da+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||J.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),J.push(",.*:")})),(v.matchesSelector=ra.test(L=H.matches||H.webkitMatchesSelector||H.mozMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&e(function(a){v.disconnectedMatch=L.call(a,"div"),L.call(a,"[s!='']:x"),K.push("!=",ha)}),J=J.length&&new RegExp(J.join("|")),K=K.length&&new RegExp(K.join("|")),b=ra.test(H.compareDocumentPosition),M=b||ra.test(H.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)for(;b=b.parentNode;)if(b===a)return!0;return!1},U=b?function(a,b){if(a===b)return E=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!v.sortDetached&&b.compareDocumentPosition(a)===d?a===c||a.ownerDocument===O&&M(O,a)?-1:b===c||b.ownerDocument===O&&M(O,b)?1:D?ba.call(D,a)-ba.call(D,b):0:4&d?-1:1)}:function(a,b){if(a===b)return E=!0,0;var d,e=0,f=a.parentNode,h=b.parentNode,i=[a],j=[b];if(!f||!h)return a===c?-1:b===c?1:f?-1:h?1:D?ba.call(D,a)-ba.call(D,b):0;if(f===h)return g(a,b);for(d=a;d=d.parentNode;)i.unshift(d);for(d=b;d=d.parentNode;)j.unshift(d);for(;i[e]===j[e];)e++;return e?g(i[e],j[e]):i[e]===O?-1:j[e]===O?1:0},c):G},b.matches=function(a,c){return b(a,null,null,c)},b.matchesSelector=function(a,c){if((a.ownerDocument||a)!==G&&F(a),c=c.replace(la,"='$1']"),v.matchesSelector&&I&&(!K||!K.test(c))&&(!J||!J.test(c)))try{var d=L.call(a,c);if(d||v.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(a){}return b(c,G,null,[a]).length>0},b.contains=function(a,b){return(a.ownerDocument||a)!==G&&F(a),M(a,b)},b.attr=function(a,b){(a.ownerDocument||a)!==G&&F(a);var c=w.attrHandle[b.toLowerCase()],d=c&&X.call(w.attrHandle,b.toLowerCase())?c(a,b,!I):void 0;return void 0!==d?d:v.attributes||!I?a.getAttribute(b):(d=a.getAttributeNode(b))&&d.specified?d.value:null},b.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},b.uniqueSort=function(a){var b,c=[],d=0,e=0;if(E=!v.detectDuplicates,D=!v.sortStable&&a.slice(0),a.sort(U),E){for(;b=a[e++];)b===a[e]&&(d=c.push(e));for(;d--;)a.splice(c[d],1)}return D=null,a},x=b.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(1===e||9===e||11===e){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=x(a)}else if(3===e||4===e)return a.nodeValue}else for(;b=a[d++];)c+=x(b);return c},w=b.selectors={cacheLength:50,createPseudo:d,match:oa,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(va,wa),a[3]=(a[3]||a[4]||a[5]||"").replace(va,wa),"~="===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]||b.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]&&b.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return oa.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&ma.test(c)&&(b=z(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(va,wa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=R[a+" "];return b||(b=new RegExp("(^|"+da+")"+a+"("+da+"|$)"))&&R(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==V&&a.getAttribute("class")||"")})},ATTR:function(a,c,d){return function(e){var f=b.attr(e,a);return null==f?"!="===c:!c||(f+="","="===c?f===d:"!="===c?f!==d:"^="===c?d&&0===f.indexOf(d):"*="===c?d&&f.indexOf(d)>-1:"$="===c?d&&f.slice(-d.length)===d:"~="===c?(" "+f+" ").indexOf(d)>-1:"|="===c&&(f===d||f.slice(0,d.length+1)===d+"-"))}},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){for(;p;){for(l=b;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){for(k=q[N]||(q[N]={}),j=k[a]||[],n=j[0]===P&&j[1],m=j[0]===P&&j[2],l=n&&q.childNodes[n];l=++n&&l&&l[p]||(m=n=0)||o.pop();)if(1===l.nodeType&&++m&&l===b){k[a]=[P,n,m];break}}else if(s&&(j=(b[N]||(b[N]={}))[a])&&j[0]===P)m=j[1];else for(;(l=++n&&l&&l[p]||(m=n=0)||o.pop())&&((h?l.nodeName.toLowerCase()!==r:1!==l.nodeType)||!++m||(s&&((l[N]||(l[N]={}))[a]=[P,m]),l!==b)););return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,c){var e,f=w.pseudos[a]||w.setFilters[a.toLowerCase()]||b.error("unsupported pseudo: "+a);return f[N]?f(c):f.length>1?(e=[a,a,"",c],w.setFilters.hasOwnProperty(a.toLowerCase())?d(function(a,b){for(var d,e=f(a,c),g=e.length;g--;)d=ba.call(a,e[g]),a[d]=!(b[d]=e[g])}):function(a){return f(a,0,e)}):f}},pseudos:{not:d(function(a){var b=[],c=[],e=A(a.replace(ia,"$1"));return e[N]?d(function(a,b,c,d){for(var f,g=e(a,null,d,[]),h=a.length;h--;)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,d,f){return b[0]=a,e(b,null,f,c),!c.pop()}}),has:d(function(a){return function(c){return b(a,c).length>0}}),contains:d(function(a){return function(b){return(b.textContent||b.innerText||x(b)).indexOf(a)>-1}}),lang:d(function(a){return na.test(a||"")||b.error("unsupported lang: "+a),a=a.replace(va,wa).toLowerCase(),function(b){var c;do if(c=I?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===H},focus:function(a){return a===G.activeElement&&(!G.hasFocus||G.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!w.pseudos.empty(a)},header:function(a){return qa.test(a.nodeName)},input:function(a){return pa.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:j(function(){return[0]}),last:j(function(a,b){return[b-1]}),eq:j(function(a,b,c){return[c<0?c+b:c]}),even:j(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:j(function(a,b,c){for(var d=c<0?c+b:c;++d2&&"ID"===(g=f[0]).type&&v.getById&&9===b.nodeType&&I&&w.relative[f[1].type]){if(b=(w.find.ID(g.matches[0].replace(va,wa),b)||[])[0],!b)return c;j&&(b=b.parentNode),a=a.slice(f.shift().value.length)}for(e=oa.needsContext.test(a)?0:f.length;e--&&(g=f[e],!w.relative[h=g.type]);)if((i=w.find[h])&&(d=i(g.matches[0].replace(va,wa),ta.test(f[0].type)&&k(b.parentNode)||b))){if(f.splice(e,1),a=d.length&&m(f),!a)return _.apply(c,d),c;break}}return(j||A(a,l))(d,b,!I,c,ta.test(a)&&k(b.parentNode)||b),c},v.sortStable=N.split("").sort(U).join("")===N,v.detectDuplicates=!!E,F(),v.sortDetached=e(function(a){return 1&a.compareDocumentPosition(G.createElement("div"))}),e(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||f("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),v.attributes&&e(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||f("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),e(function(a){return null==a.getAttribute("disabled")})||f(ca,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),b}(a);_.find=ea,_.expr=ea.selectors,_.expr[":"]=_.expr.pseudos,_.unique=ea.uniqueSort,_.text=ea.getText,_.isXMLDoc=ea.isXML,_.contains=ea.contains;var fa=_.expr.match.needsContext,ga=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,ha=/^.[^:#\[\.,]*$/;_.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?_.find.matchesSelector(d,a)?[d]:[]:_.find.matches(a,_.grep(b,function(a){return 1===a.nodeType}))},_.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(_(a).filter(function(){for(b=0;b1?_.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(d(this,a||[],!1))},not:function(a){return this.pushStack(d(this,a||[],!0))},is:function(a){return!!d(this,"string"==typeof a&&fa.test(a)?_(a):a||[],!1).length}});var ia,ja=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ka=_.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]:ja.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||ia).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof _?b[0]:b,_.merge(this,_.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:Z,!0)),ga.test(c[1])&&_.isPlainObject(b))for(c in b)_.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=Z.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=Z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):_.isFunction(a)?"undefined"!=typeof ia.ready?ia.ready(a):a(_):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),_.makeArray(a,this))};ka.prototype=_.fn,ia=_(Z);var la=/^(?:parents|prev(?:Until|All))/,ma={children:!0,contents:!0,next:!0,prev:!0};_.extend({dir:function(a,b,c){for(var d=[],e=void 0!==c;(a=a[b])&&9!==a.nodeType;)if(1===a.nodeType){if(e&&_(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}}),_.fn.extend({has:function(a){var b=_(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&_.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?_.unique(f):f)},index:function(a){return a?"string"==typeof a?U.call(_(a),this[0]):U.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(_.unique(_.merge(this.get(),_(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}}),_.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return _.dir(a,"parentNode")},parentsUntil:function(a,b,c){return _.dir(a,"parentNode",c)},next:function(a){return e(a,"nextSibling")},prev:function(a){return e(a,"previousSibling")},nextAll:function(a){return _.dir(a,"nextSibling")},prevAll:function(a){return _.dir(a,"previousSibling")},nextUntil:function(a,b,c){return _.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return _.dir(a,"previousSibling",c)},siblings:function(a){return _.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return _.sibling(a.firstChild)},contents:function(a){return a.contentDocument||_.merge([],a.childNodes)}},function(a,b){_.fn[a]=function(c,d){var e=_.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=_.filter(d,e)),this.length>1&&(ma[a]||_.unique(e),la.test(a)&&e.reverse()),this.pushStack(e)}});var na=/\S+/g,oa={};_.Callbacks=function(a){a="string"==typeof a?oa[a]||f(a):_.extend({},a);var b,c,d,e,g,h,i=[],j=!a.once&&[],k=function(f){for(b=a.memory&&f,c=!0,h=e||0,e=0,g=i.length,d=!0;i&&h-1;)i.splice(c,1),d&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return a?_.inArray(a,i)>-1:!(!i||!i.length)},empty:function(){return i=[],g=0,this},disable:function(){return i=j=b=void 0,this},disabled:function(){return!i},lock:function(){return j=void 0,b||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return!i||c&&!j||(b=b||[],b=[a,b.slice?b.slice():b],d?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!c}};return l},_.extend({Deferred:function(a){var b=[["resolve","done",_.Callbacks("once memory"),"resolved"],["reject","fail",_.Callbacks("once memory"),"rejected"],["notify","progress",_.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return _.Deferred(function(c){_.each(b,function(b,f){var g=_.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&_.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?_.extend(a,d):d}},e={};return d.pipe=d.then,_.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,c,d,e=0,f=R.call(arguments),g=f.length,h=1!==g||a&&_.isFunction(a.promise)?g:0,i=1===h?a:_.Deferred(),j=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?R.call(arguments):e,d===b?i.notifyWith(c,d):--h||i.resolveWith(c,d)}};if(g>1)for(b=new Array(g),c=new Array(g),d=new Array(g);e0||(pa.resolveWith(Z,[_]),_.fn.triggerHandler&&(_(Z).triggerHandler("ready"),_(Z).off("ready"))))}}),_.ready.promise=function(b){return pa||(pa=_.Deferred(),"complete"===Z.readyState?setTimeout(_.ready):(Z.addEventListener("DOMContentLoaded",g,!1),a.addEventListener("load",g,!1))),pa.promise(b)},_.ready.promise();var qa=_.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===_.type(c)){e=!0;for(h in c)_.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,_.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(_(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){sa.remove(this,a)})}}),_.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=ra.get(a,b),c&&(!d||_.isArray(c)?d=ra.access(a,b,_.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=_.queue(a,b),d=c.length,e=c.shift(),f=_._queueHooks(a,b),g=function(){_.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 ra.get(a,c)||ra.access(a,c,{empty:_.Callbacks("once memory").add(function(){ra.remove(a,[b+"queue",c])})})}}),_.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",Y.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var za="undefined";Y.focusinBubbles="onfocusin"in a;var Aa=/^key/,Ba=/^(?:mouse|pointer|contextmenu)|click/,Ca=/^(?:focusinfocus|focusoutblur)$/,Da=/^([^.]*)(?:\.(.+)|)$/;_.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=ra.get(a);if(q)for(c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=_.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return typeof _!==za&&_.event.triggered!==b.type?_.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(na)||[""],j=b.length;j--;)h=Da.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=_.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=_.event.special[n]||{},k=_.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&_.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,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),_.event.global[n]=!0)},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=ra.hasData(a)&&ra.get(a);if(q&&(i=q.events)){for(b=(b||"").match(na)||[""],j=b.length;j--;)if(h=Da.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){for(l=_.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;f--;)k=m[f],!e&&p!==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,o,q.handle)!==!1||_.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)_.event.remove(a,n+b[j],c,d,!0);_.isEmptyObject(i)&&(delete q.handle,ra.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,j,k,l,m=[d||Z],n=X.call(b,"type")?b.type:b,o=X.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||Z,3!==d.nodeType&&8!==d.nodeType&&!Ca.test(n+_.event.triggered)&&(n.indexOf(".")>=0&&(o=n.split("."),n=o.shift(),o.sort()),j=n.indexOf(":")<0&&"on"+n,b=b[_.expando]?b:new _.Event(n,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=o.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:_.makeArray(c,[b]),l=_.event.special[n]||{},e||!l.trigger||l.trigger.apply(d,c)!==!1)){if(!e&&!l.noBubble&&!_.isWindow(d)){for(i=l.delegateType||n,Ca.test(i+n)||(g=g.parentNode);g;g=g.parentNode)m.push(g),h=g;h===(d.ownerDocument||Z)&&m.push(h.defaultView||h.parentWindow||a)}for(f=0;(g=m[f++])&&!b.isPropagationStopped();)b.type=f>1?i:l.bindType||n,k=(ra.get(g,"events")||{})[b.type]&&ra.get(g,"handle"),k&&k.apply(g,c),k=j&&g[j],k&&k.apply&&_.acceptData(g)&&(b.result=k.apply(g,c),b.result===!1&&b.preventDefault());return b.type=n,e||b.isDefaultPrevented()||l._default&&l._default.apply(m.pop(),c)!==!1||!_.acceptData(d)||j&&_.isFunction(d[n])&&!_.isWindow(d)&&(h=d[j],h&&(d[j]=null),_.event.triggered=n,d[n](),_.event.triggered=void 0,h&&(d[j]=h)),b.result}},dispatch:function(a){a=_.event.fix(a);var b,c,d,e,f,g=[],h=R.call(arguments),i=(ra.get(this,"events")||{})[a.type]||[],j=_.event.special[a.type]||{};if(h[0]=a,a.delegateTarget=this,!j.preDispatch||j.preDispatch.call(this,a)!==!1){for(g=_.event.handlers.call(this,a,i),b=0;(e=g[b++])&&!a.isPropagationStopped();)for(a.currentTarget=e.elem,c=0;(f=e.handlers[c++])&&!a.isImmediatePropagationStopped();)a.namespace_re&&!a.namespace_re.test(f.namespace)||(a.handleObj=f,a.data=f.data,d=((_.event.special[f.origType]||{}).handle||f.handler).apply(e.elem,h),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()));return j.postDispatch&&j.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;c=0:_.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,Fa=/<([\w:]+)/,Ga=/<|&#?\w+;/,Ha=/<(?:script|style|link)/i,Ia=/checked\s*(?:[^=]|=\s*.checked.)/i,Ja=/^$|\/(?:java|ecma)script/i,Ka=/^true\/(.*)/,La=/^\s*\s*$/g,Ma={option:[1,""],thead:[1,"","
          "],col:[2,"","
          "],tr:[2,"","
          "],td:[3,"","
          "],_default:[0,"",""]};Ma.optgroup=Ma.option,Ma.tbody=Ma.tfoot=Ma.colgroup=Ma.caption=Ma.thead,Ma.th=Ma.td,_.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=_.contains(a.ownerDocument,a);if(!(Y.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||_.isXMLDoc(a)))for(g=r(h),f=r(a),d=0,e=f.length;d0&&p(g,!i&&r(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,n=a.length;m")+h[2],j=h[0];j--;)f=f.lastChild;_.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));for(k.textContent="",m=0;e=l[m++];)if((!d||_.inArray(e,d)===-1)&&(i=_.contains(e.ownerDocument,e),f=r(k.appendChild(e),"script"),i&&p(f),c))for(j=0;e=f[j++];)Ja.test(e.type||"")&&c.push(e);return k},cleanData:function(a){for(var b,c,d,e,f=_.event.special,g=0;void 0!==(c=a[g]);g++){if(_.acceptData(c)&&(e=c[ra.expando],e&&(b=ra.cache[e]))){if(b.events)for(d in b.events)f[d]?_.event.remove(c,d):_.removeEvent(c,d,b.handle);ra.cache[e]&&delete ra.cache[e]}delete sa.cache[c[sa.expando]]}}}),_.fn.extend({text:function(a){return qa(this,function(a){return void 0===a?_.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=m(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=m(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?_.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||_.cleanData(r(c)),c.parentNode&&(b&&_.contains(c.ownerDocument,c)&&p(r(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(_.cleanData(r(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return _.clone(this,a,b)})},html:function(a){return qa(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&&!Ha.test(a)&&!Ma[(Fa.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ea,"<$1>");try{for(;c1&&"string"==typeof m&&!Y.checkClone&&Ia.test(m))return this.each(function(c){var d=k.eq(c);p&&(a[0]=m.call(this,c,d.html())),d.domManip(a,b)});if(j&&(c=_.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(e=_.map(r(c,"script"),n),f=e.length;i1)},show:function(){return B(this,!0)},hide:function(){return B(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){xa(this)?_(this).show():_(this).hide()})}}),_.Tween=C,C.prototype={constructor:C,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||(_.cssNumber[c]?"":"px")},cur:function(){var a=C.propHooks[this.prop];return a&&a.get?a.get(this):C.propHooks._default.get(this)},run:function(a){var b,c=C.propHooks[this.prop];return this.options.duration?this.pos=b=_.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):C.propHooks._default.set(this),this}},C.prototype.init.prototype=C.prototype,C.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=_.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){_.fx.step[a.prop]?_.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[_.cssProps[a.prop]]||_.cssHooks[a.prop])?_.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},C.propHooks.scrollTop=C.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},_.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},_.fx=C.prototype.init,_.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=new RegExp("^(?:([+-])=|)("+va+")([a-z%]*)$","i"),ab=/queueHooks$/,bb=[G],cb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=_a.exec(b),f=e&&e[3]||(_.cssNumber[a]?"":"px"),g=(_.cssNumber[a]||"px"!==f&&+d)&&_a.exec(_.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,_.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}]};_.Animation=_.extend(I,{tweener:function(a,b){_.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;d1)},removeAttr:function(a){return this.each(function(){_.removeAttr(this,a)})}}),_.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===za?_.prop(a,b,c):(1===f&&_.isXMLDoc(a)||(b=b.toLowerCase(),d=_.attrHooks[b]||(_.expr.match.bool.test(b)?eb:db)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=_.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 _.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(na);if(f&&1===a.nodeType)for(;c=f[e++];)d=_.propFix[c]||c,_.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!Y.radioValue&&"radio"===b&&_.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),eb={set:function(a,b,c){return b===!1?_.removeAttr(a,c):a.setAttribute(c,c),c}},_.each(_.expr.match.bool.source.match(/\w+/g),function(a,b){var c=fb[b]||_.find.attr;fb[b]=function(a,b,d){var e,f;return d||(f=fb[b],fb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,fb[b]=f),e}});var gb=/^(?:input|select|textarea|button)$/i;_.fn.extend({prop:function(a,b){return qa(this,_.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[_.propFix[a]||a]})}}),_.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||!_.isXMLDoc(a),f&&(b=_.propFix[b]||b,e=_.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")||gb.test(a.nodeName)||a.href?a.tabIndex:-1}}}}),Y.optSelected||(_.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),_.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){_.propFix[this.toLowerCase()]=this});var hb=/[\t\r\n\f]/g;_.fn.extend({addClass:function(a){var b,c,d,e,f,g,h="string"==typeof a&&a,i=0,j=this.length;if(_.isFunction(a))return this.each(function(b){_(this).addClass(a.call(this,b,this.className))});if(h)for(b=(a||"").match(na)||[];i=0;)d=d.replace(" "+e+" "," ");g=a?_.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):_.isFunction(a)?this.each(function(c){_(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if("string"===c)for(var b,d=0,e=_(this),f=a.match(na)||[];b=f[d++];)e.hasClass(b)?e.removeClass(b):e.addClass(b);else c!==za&&"boolean"!==c||(this.className&&ra.set(this,"__className__",this.className),this.className=this.className||a===!1?"":ra.get(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;c=0)return!0;return!1}});var ib=/\r/g;_.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=_.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,_(this).val()):a,null==e?e="":"number"==typeof e?e+="":_.isArray(e)&&(e=_.map(e,function(a){return null==a?"":a+""})),b=_.valHooks[this.type]||_.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=_.valHooks[e.type]||_.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ib,""):null==c?"":c)}}}),_.extend({valHooks:{option:{get:function(a){var b=_.find.attr(a,"value");return null!=b?b:_.trim(_.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||e<0,g=f?null:[],h=f?e+1:d.length,i=e<0?h:f?e:0;i=0)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),_.each(["radio","checkbox"],function(){_.valHooks[this]={set:function(a,b){if(_.isArray(b))return a.checked=_.inArray(_(a).val(),b)>=0}},Y.checkOn||(_.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})}),_.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){_.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),_.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 jb=_.now(),kb=/\?/;_.parseJSON=function(a){return JSON.parse(a+"")},_.parseXML=function(a){var b,c;if(!a||"string"!=typeof a)return null;try{c=new DOMParser,b=c.parseFromString(a,"text/xml")}catch(a){b=void 0}return b&&!b.getElementsByTagName("parsererror").length||_.error("Invalid XML: "+a),b};var lb,mb,nb=/#.*$/,ob=/([?&])_=[^&]*/,pb=/^(.*?):[ \t]*([^\r\n]*)$/gm,qb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rb=/^(?:GET|HEAD)$/,sb=/^\/\//,tb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,ub={},vb={},wb="*/".concat("*");try{mb=location.href}catch(a){mb=Z.createElement("a"),mb.href="",mb=mb.href}lb=tb.exec(mb.toLowerCase())||[],_.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:mb,type:"GET",isLocal:qb.test(lb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":wb,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":_.parseJSON,"text xml":_.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?L(L(a,_.ajaxSettings),b):L(_.ajaxSettings,a)},ajaxPrefilter:J(ub),ajaxTransport:J(vb),ajax:function(a,b){function c(a,b,c,g){var i,k,r,s,u,w=b;2!==t&&(t=2,h&&clearTimeout(h),d=void 0,f=g||"",v.readyState=a>0?4:0,i=a>=200&&a<300||304===a,c&&(s=M(l,v,c)),s=N(l,s,v,i),i?(l.ifModified&&(u=v.getResponseHeader("Last-Modified"),u&&(_.lastModified[e]=u),u=v.getResponseHeader("etag"),u&&(_.etag[e]=u)),204===a||"HEAD"===l.type?w="nocontent":304===a?w="notmodified":(w=s.state,k=s.data,r=s.error,i=!r)):(r=w,!a&&w||(w="error",a<0&&(a=0))),v.status=a,v.statusText=(b||w)+"",i?o.resolveWith(m,[k,w,v]):o.rejectWith(m,[v,w,r]),v.statusCode(q),q=void 0,j&&n.trigger(i?"ajaxSuccess":"ajaxError",[v,l,i?k:r]),p.fireWith(m,[v,w]),j&&(n.trigger("ajaxComplete",[v,l]),--_.active||_.event.trigger("ajaxStop")))}"object"==typeof a&&(b=a,a=void 0),b=b||{};var d,e,f,g,h,i,j,k,l=_.ajaxSetup({},b),m=l.context||l,n=l.context&&(m.nodeType||m.jquery)?_(m):_.event,o=_.Deferred(),p=_.Callbacks("once memory"),q=l.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!g)for(g={};b=pb.exec(f);)g[b[1].toLowerCase()]=b[2];b=g[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f: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||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(t<2)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 d&&d.abort(b),c(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,l.url=((a||l.url||mb)+"").replace(nb,"").replace(sb,lb[1]+"//"),l.type=b.method||b.type||l.method||l.type,l.dataTypes=_.trim(l.dataType||"*").toLowerCase().match(na)||[""],null==l.crossDomain&&(i=tb.exec(l.url.toLowerCase()),l.crossDomain=!(!i||i[1]===lb[1]&&i[2]===lb[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(lb[3]||("http:"===lb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=_.param(l.data,l.traditional)),K(ub,l,b,v),2===t)return v;j=l.global,j&&0===_.active++&&_.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!rb.test(l.type),e=l.url,l.hasContent||(l.data&&(e=l.url+=(kb.test(e)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=ob.test(e)?e.replace(ob,"$1_="+jb++):e+(kb.test(e)?"&":"?")+"_="+jb++)),l.ifModified&&(_.lastModified[e]&&v.setRequestHeader("If-Modified-Since",_.lastModified[e]),_.etag[e]&&v.setRequestHeader("If-None-Match",_.etag[e])),(l.data&&l.hasContent&&l.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",l.contentType),v.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+wb+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)v.setRequestHeader(k,l.headers[k]);if(l.beforeSend&&(l.beforeSend.call(m,v,l)===!1||2===t))return v.abort();u="abort";for(k in{success:1,error:1,complete:1})v[k](l[k]);if(d=K(vb,l,b,v)){v.readyState=1,j&&n.trigger("ajaxSend",[v,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){v.abort("timeout")},l.timeout));try{t=1,d.send(r,c)}catch(a){if(!(t<2))throw a;c(-1,a)}}else c(-1,"No Transport");return v},getJSON:function(a,b,c){return _.get(a,b,c,"json")},getScript:function(a,b){return _.get(a,void 0,b,"script")}}),_.each(["get","post"],function(a,b){_[b]=function(a,c,d,e){return _.isFunction(c)&&(e=e||d,d=c,c=void 0),_.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),_.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){_.fn[b]=function(a){return this.on(b,a)}}),_._evalUrl=function(a){return _.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},_.fn.extend({wrapAll:function(a){var b;return _.isFunction(a)?this.each(function(b){_(this).wrapAll(a.call(this,b))}):(this[0]&&(b=_(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){for(var a=this;a.firstElementChild;)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return _.isFunction(a)?this.each(function(b){_(this).wrapInner(a.call(this,b))}):this.each(function(){var b=_(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=_.isFunction(a);return this.each(function(c){_(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){_.nodeName(this,"body")||_(this).replaceWith(this.childNodes)}).end()}}),_.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0},_.expr.filters.visible=function(a){return!_.expr.filters.hidden(a)};var xb=/%20/g,yb=/\[\]$/,zb=/\r?\n/g,Ab=/^(?:submit|button|image|reset|file)$/i,Bb=/^(?:input|select|textarea|keygen)/i;_.param=function(a,b){var c,d=[],e=function(a,b){b=_.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=_.ajaxSettings&&_.ajaxSettings.traditional),_.isArray(a)||a.jquery&&!_.isPlainObject(a))_.each(a,function(){e(this.name,this.value)});else for(c in a)O(c,a[c],b,e);return d.join("&").replace(xb,"+")},_.fn.extend({serialize:function(){return _.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=_.prop(this,"elements");return a?_.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!_(this).is(":disabled")&&Bb.test(this.nodeName)&&!Ab.test(a)&&(this.checked||!ya.test(a))}).map(function(a,b){var c=_(this).val();return null==c?null:_.isArray(c)?_.map(c,function(a){return{name:b.name,value:a.replace(zb,"\r\n")}}):{name:b.name,value:c.replace(zb,"\r\n")}}).get()}}),_.ajaxSettings.xhr=function(){try{return new XMLHttpRequest}catch(a){}};var Cb=0,Db={},Eb={0:200,1223:204},Fb=_.ajaxSettings.xhr();a.ActiveXObject&&_(a).on("unload",function(){for(var a in Db)Db[a]()}),Y.cors=!!Fb&&"withCredentials"in Fb,Y.ajax=Fb=!!Fb,_.ajaxTransport(function(a){var b;if(Y.cors||Fb&&!a.crossDomain)return{send:function(c,d){var e,f=a.xhr(),g=++Cb;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 Db[g],b=f.onload=f.onerror=null,"abort"===a?f.abort():"error"===a?d(f.status,f.statusText):d(Eb[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=Db[g]=b("abort");try{f.send(a.hasContent&&a.data||null)}catch(a){if(b)throw a}},abort:function(){b&&b()}}}),_.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return _.globalEval(a),a}}}),_.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),_.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(d,e){b=_(" From 48b851ba763e29e9fc63ebf4cf9f614815f0ce19 Mon Sep 17 00:00:00 2001 From: "windhamwong@nva-hk.com" Date: Wed, 14 Jun 2017 15:30:14 +0100 Subject: [PATCH 09/20] Fixing issues on packing images into build #webpack #base64 #loader --- Gruntfile.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index c3b0e49f..4b9b680c 100755 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -206,14 +206,14 @@ module.exports = function (grunt) { limit: 10000 } }, - { // First party images are saved as files to be cached - test: /\.(png|jpg|gif|svg)$/, - exclude: /node_modules/, - loader: "file-loader", - options: { - name: "images/[name].[ext]" - } - }, + // { // First party images are saved as files to be cached + // test: /\.(png|jpg|gif|svg)$/, + // exclude: /node_modules/, + // loader: "file-loader", + // options: { + // name: "images/[name].[ext]" + // } + // }, { // Third party images are inlined test: /\.(png|jpg|gif|svg)$/, exclude: /web\/static/, @@ -321,7 +321,7 @@ module.exports = function (grunt) { }, src: "build/prod/index.html", dest: "build/prod/index.html" - } + }, }, chmod: { build: { From b9d33c0618093b58603814c1499178d8feb81cda Mon Sep 17 00:00:00 2001 From: "windhamwong@nva-hk.com" Date: Tue, 4 Jul 2017 14:30:34 +0100 Subject: [PATCH 10/20] HTTP Gzip Decrypt working --- package.json | 1 + src/core/Utils.js | 20 ++++++++++++++++++++ src/core/config/Categories.js | 1 + src/core/config/OperationConfig.js | 7 +++++++ src/core/operations/Compress.js | 21 +++++++++++++++++++++ 5 files changed, 50 insertions(+) diff --git a/package.json b/package.json index 45e2dd79..006d6165 100644 --- a/package.json +++ b/package.json @@ -80,6 +80,7 @@ "lodash": "^4.17.4", "moment": "^2.17.1", "moment-timezone": "^0.5.11", + "pako": "^1.0.5", "sladex-blowfish": "^0.8.1", "sortablejs": "^1.5.1", "split.js": "^1.2.0", diff --git a/src/core/Utils.js b/src/core/Utils.js index 9b0d2a30..6e615efb 100755 --- a/src/core/Utils.js +++ b/src/core/Utils.js @@ -344,6 +344,26 @@ const Utils = { }, + /** + * Translates an array of bytes to a hex string. + * + * @param {byteArray} byteArray + * @returns {string} + * + * @example + * // returns "fe09a7" + * Utils.byteArrayToHex([0xfe, 0x09, 0xa7]); + */ + byteArrayToHexNoSpace: function(byteArray) { + if (!byteArray) return ""; + let hexStr = ""; + for (let i = 0; i < byteArray.length; i++) { + hexStr += Utils.hex(byteArray[i]); + } + return hexStr.slice(0, hexStr.length-1); + }, + + /** * Converts a string to a byte array. * Treats the string as UTF-8 if any values are over 255. diff --git a/src/core/config/Categories.js b/src/core/config/Categories.js index e31bbc60..a99e39f2 100755 --- a/src/core/config/Categories.js +++ b/src/core/config/Categories.js @@ -131,6 +131,7 @@ const Categories = [ ops: [ "HTTP request", "Strip HTTP headers", + "HTTP gzip decrypt", "Parse User Agent", "Parse IP range", "Parse IPv6 address", diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index b378854c..d1b5d835 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -1676,6 +1676,13 @@ const OperationConfig = { outputType: "string", args: [] }, + "HTTP gzip decrypt": { + description: "Decrypts Gzip payload from a request or response and returning plaintext of the header and decrypted payload.", + run: Compress.runHttpGzip, + inputType: "byteArray", + outputType: "byteArray", + args: [] + }, "Parse User Agent": { description: "Attempts to identify and categorise information contained in a user-agent string.", run: HTTP.runParseUserAgent, diff --git a/src/core/operations/Compress.js b/src/core/operations/Compress.js index 020d40cf..22414247 100755 --- a/src/core/operations/Compress.js +++ b/src/core/operations/Compress.js @@ -5,6 +5,7 @@ import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min"; import zip from "zlibjs/bin/zip.min"; import unzip from "zlibjs/bin/unzip.min"; import bzip2 from "exports-loader?bzip2!../lib/bzip2.js"; +import pako from "pako/index.js"; const Zlib = { RawDeflate: rawdeflate.Zlib.RawDeflate, @@ -254,6 +255,26 @@ const Compress = { }, + /** + * HTTP Gzip operation. + * + * @param {byteArray} input + * @param {Object[]} args + * @returns {byteArray} + */ + runHttpGzip: function(input, args) { + input = Utils.byteArrayToHexNoSpace(input); + + let regexStr = /1f8b080[0-8][0-9a-f]{12}/; + let gzipPos = input.search(regexStr); + let plainData = input.substr(0, gzipPos); + let gzipData = input.substr(gzipPos); + + gzipData = Utils.hexToByteArray(gzipData); + return Utils.hexToByteArray(plainData).concat(Array.prototype.slice.call(pako.ungzip(gzipData))); + }, + + /** * @constant * @default From 6e81bb71fc7b912c89e1025e9e3e1fbae50b95bb Mon Sep 17 00:00:00 2001 From: Windham Wong Date: Tue, 4 Jul 2017 15:53:54 +0100 Subject: [PATCH 11/20] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35ec36b6..167436d3 100755 --- a/README.md +++ b/README.md @@ -13,10 +13,10 @@ This is a fork of original CyberChef by GCHQ. This project has implemented my ow - e.g. chr(33) to ! - This operation supports char() and chr() - Combining the usage of **From 0x[Hex]** and **From char(hex)** can decode chr(0x3333) to ! +- operation **HTTP gzip decrypt**: Decrypt gzip payload in HTTP ## Todo -- Operation GZip HTTP data - Operation SQL comment strip function - Adding more support to char(hex, hex) - Adding support of themes From 8ce8fac26cb017cbba6468956bc54f972743ce62 Mon Sep 17 00:00:00 2001 From: "windhamwong@nva-hk.com" Date: Wed, 12 Jul 2017 13:48:08 +0100 Subject: [PATCH 12/20] HTTP Gzip will search for gzip, otherwise return the original message. --- src/core/operations/Compress.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/operations/Compress.js b/src/core/operations/Compress.js index 22414247..2f4fe653 100755 --- a/src/core/operations/Compress.js +++ b/src/core/operations/Compress.js @@ -267,6 +267,7 @@ const Compress = { let regexStr = /1f8b080[0-8][0-9a-f]{12}/; let gzipPos = input.search(regexStr); + if (gzipPos == -1) {return Utils.hexToByteArray(input);} let plainData = input.substr(0, gzipPos); let gzipData = input.substr(gzipPos); From 93d47630b8ae8fff8b102503963afd31e5511e77 Mon Sep 17 00:00:00 2001 From: "windhamwong@nva-hk.com" Date: Thu, 13 Jul 2017 08:42:38 +0100 Subject: [PATCH 13/20] char() operation now supports multiple values inside bracket. i.e. CHAR(45,120,49,45,81,45) --- src/core/operations/ByteRepr.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/core/operations/ByteRepr.js b/src/core/operations/ByteRepr.js index 1c877898..eeef5e5f 100755 --- a/src/core/operations/ByteRepr.js +++ b/src/core/operations/ByteRepr.js @@ -53,8 +53,8 @@ const ByteRepr = { const delim = args[0] || "Space"; return Utils.fromHex(input, delim, 2); }, - - + + /** * From 0xHex operation. * @@ -63,7 +63,7 @@ const ByteRepr = { * @returns {byteArray} */ runFrom0xHex: function(input, args) { - var data = input.replace(/0x([0-9a-f]{2,})/ig, + var data = input.replace(/0x([0-9a-f]{2,})/ig, function(match, p1) { if (p1) { return Utils.byteArrayToChars(Utils.fromHex(p1)); @@ -71,8 +71,8 @@ const ByteRepr = { }); return data; }, - - + + /** * From char(hex) operation. * @@ -81,13 +81,16 @@ const ByteRepr = { * @returns {byteArray} */ runFromCharHex: function(input, args) { - var data = input.replace(/cha?r\((\d{1,3})\)/ig, - function(match, p1) { - if (p1) { - return Utils.byteArrayToChars([parseInt(p1)]); - }; - }); - return data; + var re = /cha?r\((((\d{1,3})(,\s?)?)+)\)/ig; + var inner_re = /(\d{1,3}),?/g; + var match, inner_match; + var result = ""; + while ((match = re.exec(input)) != null) { + while ((inner_match = inner_re.exec(match[1])) != null) { + result += Utils.byteArrayToChars([parseInt(inner_match[1])]); + } + } + return input.replace(re, result); }, From 0299f23363800df07cdd6238ce6d1382f4575f31 Mon Sep 17 00:00:00 2001 From: "windhamwong@nva-hk.com" Date: Thu, 13 Jul 2017 15:42:05 +0100 Subject: [PATCH 14/20] Fix bug on char() --- src/core/operations/ByteRepr.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/core/operations/ByteRepr.js b/src/core/operations/ByteRepr.js index eeef5e5f..bb0b8616 100755 --- a/src/core/operations/ByteRepr.js +++ b/src/core/operations/ByteRepr.js @@ -82,15 +82,18 @@ const ByteRepr = { */ runFromCharHex: function(input, args) { var re = /cha?r\((((\d{1,3})(,\s?)?)+)\)/ig; - var inner_re = /(\d{1,3}),?/g; - var match, inner_match; - var result = ""; - while ((match = re.exec(input)) != null) { - while ((inner_match = inner_re.exec(match[1])) != null) { - result += Utils.byteArrayToChars([parseInt(inner_match[1])]); + var inner_re = /(\d{1,3}),?/g + var data = input.replace(re, + function(match, p1) { + if (p1) { + var result = "", inner_match; + while ((inner_match = inner_re.exec(p1)) != null) { + result += Utils.byteArrayToChars([parseInt(inner_match[1])]); + } + return result; } - } - return input.replace(re, result); + }); + return data; }, From a74d97f2a414b3f8532f4653e8725654ca1bc446 Mon Sep 17 00:00:00 2001 From: Windham Wong Date: Wed, 18 Oct 2017 13:22:32 +0100 Subject: [PATCH 15/20] Sync up to GCHQ master HEAD Fix syntax issues in multiple files --- prod_image_list.txt | 26 ++++++++++++++++ src/core/config/Categories.js | 4 +-- src/core/operations/ByteRepr.js | 38 +++++++++++------------ src/core/operations/Compress.js | 4 ++- src/core/operations/nTcpdump.js | 55 ++++++++++++++++----------------- 5 files changed, 76 insertions(+), 51 deletions(-) create mode 100644 prod_image_list.txt diff --git a/prod_image_list.txt b/prod_image_list.txt new file mode 100644 index 00000000..e3ab8d31 --- /dev/null +++ b/prod_image_list.txt @@ -0,0 +1,26 @@ +./src/web/static/images/bug-16x16.png +./src/web/static/images/clean-16x16.png +./src/web/static/images/cook_male-32x32.png +./src/web/static/images/cyberchef-128x128.png +./src/web/static/images/download-24x24.png +./src/web/static/images/erase-16x16.png +./src/web/static/images/favourite-16x16.png +./src/web/static/images/favourite-24x24.png +./src/web/static/images/fork_me.png +./src/web/static/images/gitter-badge.svg +./src/web/static/images/help-16x16.png +./src/web/static/images/help-22x22.png +./src/web/static/images/layout-16x16.png +./src/web/static/images/maximise-16x16.png +./src/web/static/images/open_yellow-16x16.png +./src/web/static/images/open_yellow-24x24.png +./src/web/static/images/recycle-16x16.png +./src/web/static/images/save-22x22.png +./src/web/static/images/save_as-16x16.png +./src/web/static/images/settings-22x22.png +./src/web/static/images/speech-16x16.png +./src/web/static/images/step-16x16.png +./src/web/static/images/switch-16x16.png +./src/web/static/images/thumb_down-16x16.png +./src/web/static/images/thumb_up-16x16.png +./src/web/static/images/undo-16x16.png \ No newline at end of file diff --git a/src/core/config/Categories.js b/src/core/config/Categories.js index 53ba0f91..b5912771 100755 --- a/src/core/config/Categories.js +++ b/src/core/config/Categories.js @@ -28,8 +28,8 @@ const Categories = [ "To Hexdump", "From Hexdump", "From nTcpdump", - "From 0x[Hex]", - "From Char(Hex)", + "From 0x[Hex]", + "From Char(Hex)", "To Hex", "From Hex", "To Charcode", diff --git a/src/core/operations/ByteRepr.js b/src/core/operations/ByteRepr.js index fabe8888..56d8bdf5 100755 --- a/src/core/operations/ByteRepr.js +++ b/src/core/operations/ByteRepr.js @@ -54,44 +54,44 @@ const ByteRepr = { }, - /** + /** * From 0xHex operation. * * @param {string} input (Starting with 0x only in the raw input) * @param {Object[]} args * @returns {byteArray} */ - runFrom0xHex: function(input, args) { - var data = input.replace(/0x([0-9a-f]{2,})/ig, - function(match, p1) { - if (p1) { - return Utils.byteArrayToChars(Utils.fromHex(p1)); - }; - }); - return data; + runFrom0xHex: function(input, args) { + let data = input.replace(/0x([0-9a-f]{2,})/ig, + function(match, p1) { + if (p1) { + return Utils.byteArrayToChars(Utils.fromHex(p1)); + } + }); + return data; }, - /** + /** * From char(hex) operation. * * @param {string} input (Starting with chr or char only in the raw input) * @param {Object[]} args * @returns {byteArray} */ - runFromCharHex: function(input, args) { - var re = /cha?r\((((\d{1,3})(,\s?)?)+)\)/ig; - var inner_re = /(\d{1,3}),?/g - var data = input.replace(re, + runFromCharHex: function(input, args) { + let re = /cha?r\((((\d{1,3})(,\s?)?)+)\)/ig; + let innerRe = /(\d{1,3}),?/g; + let data = input.replace(re, function(match, p1) { if (p1) { - var result = "", inner_match; - while ((inner_match = inner_re.exec(p1)) != null) { - result += Utils.byteArrayToChars([parseInt(inner_match[1])]); + let result = "", innerMatch; + while ((innerMatch = innerRe.exec(p1)) != null) { + result += Utils.byteArrayToChars([parseInt(innerMatch[1], 10)]); } return result; - } - }); + } + }); return data; }, diff --git a/src/core/operations/Compress.js b/src/core/operations/Compress.js index 527b04d6..2614c6f5 100755 --- a/src/core/operations/Compress.js +++ b/src/core/operations/Compress.js @@ -267,7 +267,9 @@ const Compress = { let regexStr = /1f8b080[0-8][0-9a-f]{12}/; let gzipPos = input.search(regexStr); - if (gzipPos == -1) {return Utils.hexToByteArray(input);} + if (gzipPos === -1) { + return Utils.hexToByteArray(input); + } let plainData = input.substr(0, gzipPos); let gzipData = input.substr(gzipPos); diff --git a/src/core/operations/nTcpdump.js b/src/core/operations/nTcpdump.js index bcdabaed..0e6f1f63 100644 --- a/src/core/operations/nTcpdump.js +++ b/src/core/operations/nTcpdump.js @@ -37,19 +37,19 @@ const nTcpdump = { * @returns {string} */ runTo: function(input, args) { - var length = args[0] || nTcpdump.WIDTH; - var upperCase = args[1]; - var includeFinalLength = args[2]; + let length = args[0] || nTcpdump.WIDTH; + let upperCase = args[1]; + let includeFinalLength = args[2]; - var output = "", padding = 2; - for (var i = 0; i < input.length; i += length) { - var buff = input.slice(i, i+length); - var hexa = ""; - for (var j = 0; j < buff.length; j++) { + let output = "", padding = 2; + for (let i = 0; i < input.length; i += length) { + let buff = input.slice(i, i+length); + let hexa = ""; + for (let j = 0; j < buff.length; j++) { hexa += Utils.hex(buff[j], padding) + " "; } - var lineNo = Utils.hex(i, 8); + let lineNo = Utils.hex(i, 8); if (upperCase) { hexa = hexa.toUpperCase(); @@ -77,21 +77,18 @@ const nTcpdump = { * @returns {byteArray} */ runFrom: function(input, args) { - var output = [], - regex = /^\s*(?:0x[\dA-F]{4}:?)?\s*((?:[\dA-F]{4}\s?){1,8})/igm, - regex_header = /^\s*(?:0x0000:){1}\s*((?:[\dA-F]{4}\s?){6})/igm, - block, line; - - while ((block = regex.exec(input))) { - // block[1].replace(regex_header, "0x0000:"); - line = Utils.fromHex(block[1].replace(/-/g, " ")); - for (var i = 0; i < line.length; i++) { + let output = []; + let regex = /^\s*(?:0x[\dA-F]{4}:?)?\s*((?:[\dA-F]{4}\s?){1,8})/igm; + let block = regex.exec(input); + while (block) { + let line = Utils.fromHex(block[1].replace(/-/g, " ")); + for (let i = 0; i < line.length; i++) { output.push(line[i]); } } // Is this a CyberChef hexdump or is it from a different tool? - var width = input.indexOf("\n"); - var w = (width - 13) / 4; + let width = input.indexOf("\n"); + let w = (width - 13) / 4; // w should be the specified width of the hexdump and therefore a round number if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) { app.options.attemptHighlight = false; @@ -111,7 +108,7 @@ const nTcpdump = { */ highlightTo: function(pos, args) { // Calculate overall selection - var w = args[0] || 16, + let w = args[0] || 16, width = 14 + (w*4), line = Math.floor(pos[0].start / w), offset = pos[0].start % w, @@ -129,8 +126,8 @@ const nTcpdump = { pos[0].end = line*width + 10 + offset*3 - 1; // Set up multiple selections for bytes - var startLineNum = Math.floor(pos[0].start / width); - var endLineNum = Math.floor(pos[0].end / width); + let startLineNum = Math.floor(pos[0].start / width); + let endLineNum = Math.floor(pos[0].end / width); if (startLineNum === endLineNum) { pos.push(pos[0]); @@ -148,10 +145,10 @@ const nTcpdump = { } // Set up multiple selections for ASCII - var len = pos.length, lineNum = 0; + let len = pos.length, lineNum = 0; start = 0; end = 0; - for (var i = 1; i < len; i++) { + for (let i = 1; i < len; i++) { lineNum = Math.floor(pos[i].start / width); start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); @@ -171,11 +168,11 @@ const nTcpdump = { * @returns {Object[]} pos */ highlightFrom: function(pos, args) { - var w = args[0] || 16; - var width = 14 + (w*4); + let w = args[0] || 16; + let width = 14 + (w*4); - var line = Math.floor(pos[0].start / width); - var offset = pos[0].start % width; + let line = Math.floor(pos[0].start / width); + let offset = pos[0].start % width; if (offset < 10) { // In line number section pos[0].start = line*w; From a34547dab14558fadff369b1cdabb274ecc89c90 Mon Sep 17 00:00:00 2001 From: Windham Wong Date: Thu, 19 Oct 2017 14:19:16 +0100 Subject: [PATCH 16/20] Sync up and fix issues Renaming from tcpdump into packets category. Adding a new packet category. Update structures --- src/core/config/Categories.js | 9 +- src/core/config/OperationConfig.js | 18 +-- src/core/config/modules/Compression.js | 1 + src/core/config/modules/Default.js | 2 + src/core/config/modules/OpModules.js | 4 +- src/core/config/modules/Packets.js | 19 +++ src/core/operations/Packets.js | 54 +++++++ src/core/operations/nTcpdump.js | 201 ------------------------- 8 files changed, 93 insertions(+), 215 deletions(-) create mode 100644 src/core/config/modules/Packets.js create mode 100644 src/core/operations/Packets.js delete mode 100644 src/core/operations/nTcpdump.js diff --git a/src/core/config/Categories.js b/src/core/config/Categories.js index b5912771..3d48bda3 100755 --- a/src/core/config/Categories.js +++ b/src/core/config/Categories.js @@ -27,7 +27,6 @@ const Categories = [ ops: [ "To Hexdump", "From Hexdump", - "From nTcpdump", "From 0x[Hex]", "From Char(Hex)", "To Hex", @@ -137,7 +136,6 @@ const Categories = [ ops: [ "HTTP request", "Strip HTTP headers", - "HTTP gzip decrypt", "Parse User Agent", "Parse IP range", "Parse IPv6 address", @@ -300,6 +298,13 @@ const Categories = [ "To Kebab case", ] }, + { + name: "Packets", + ops: [ + "From Tcpdump", + "HTTP gzip Decrypt", + ] + }, { name: "Other", ops: [ diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index 7c9da98b..6e477617 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -36,8 +36,6 @@ import Tidy from "../operations/Tidy.js"; import Unicode from "../operations/Unicode.js"; import URL_ from "../operations/URL.js"; -import nTcpdump from "../operations/nTcpdump.js"; - /** * Type definition for an OpConf. * @@ -501,8 +499,8 @@ const OperationConfig = { ] }, "From 0x[Hex]": { + module: "Default", description: "Converts a hexadecimal byte string back into a its raw value.

          e.g. 0x217e21 becomes the UTF-8 encoded string !~!", - run: ByteRepr.runFrom0xHex, highlight: ByteRepr.highlightFrom, highlightReverse: ByteRepr.highlightTo, inputType: "string", @@ -510,8 +508,8 @@ const OperationConfig = { args: [] }, "From Char(Hex)": { + module: "Default", description: "Converts a hexadecimal byte string back into a its raw value.

          e.g. chr(33) becomes the UTF-8 encoded string !", - run: ByteRepr.runFromCharHex, highlight: ByteRepr.highlightFrom, highlightReverse: ByteRepr.highlightTo, inputType: "string", @@ -675,11 +673,9 @@ const OperationConfig = { } ] }, - "From nTcpdump": { - description: "For Tcpdump conversion only.", - run: nTcpdump.runFrom, - highlight: nTcpdump.highlightFrom, - highlightReverse: nTcpdump.highlightTo, + "From Tcpdump": { + module: "Packets", + description: "[DEPRECATED] Converts Tcpdump hex to string", inputType: "string", outputType: "byteArray", args: [] @@ -1767,9 +1763,9 @@ const OperationConfig = { outputType: "string", args: [] }, - "HTTP gzip decrypt": { + "HTTP gzip Decrypt": { + module: "Compression", description: "Decrypts Gzip payload from a request or response and returning plaintext of the header and decrypted payload.", - run: Compress.runHttpGzip, inputType: "byteArray", outputType: "byteArray", args: [] diff --git a/src/core/config/modules/Compression.js b/src/core/config/modules/Compression.js index aa8d074f..bbe05bfa 100644 --- a/src/core/config/modules/Compression.js +++ b/src/core/config/modules/Compression.js @@ -26,6 +26,7 @@ OpModules.Compression = { "Bzip2 Decompress": Compress.runBzip2Decompress, "Tar": Compress.runTar, "Untar": Compress.runUntar, + "HTTP gzip Decrypt":Compress.runHttpGzip, }; diff --git a/src/core/config/modules/Default.js b/src/core/config/modules/Default.js index 682db223..9a588936 100644 --- a/src/core/config/modules/Default.js +++ b/src/core/config/modules/Default.js @@ -51,6 +51,8 @@ OpModules.Default = { "From Hexdump": Hexdump.runFrom, "To Hex": ByteRepr.runToHex, "From Hex": ByteRepr.runFromHex, + "From 0x[Hex]": ByteRepr.runFrom0xHex, + "From Char(Hex)": ByteRepr.runFromCharHex, "To Octal": ByteRepr.runToOct, "From Octal": ByteRepr.runFromOct, "To Charcode": ByteRepr.runToCharcode, diff --git a/src/core/config/modules/OpModules.js b/src/core/config/modules/OpModules.js index 3f3963c3..b7a9ca2b 100644 --- a/src/core/config/modules/OpModules.js +++ b/src/core/config/modules/OpModules.js @@ -20,6 +20,7 @@ import JSBNModule from "./JSBN.js"; import PublicKeyModule from "./PublicKey.js"; import ShellcodeModule from "./Shellcode.js"; import URLModule from "./URL.js"; +import PacketsModule from "./Packets.js"; Object.assign( OpModules, @@ -35,7 +36,8 @@ Object.assign( JSBNModule, PublicKeyModule, ShellcodeModule, - URLModule + URLModule, + PacketsModule ); export default OpModules; diff --git a/src/core/config/modules/Packets.js b/src/core/config/modules/Packets.js new file mode 100644 index 00000000..88f3d7a8 --- /dev/null +++ b/src/core/config/modules/Packets.js @@ -0,0 +1,19 @@ +import Packets from "../../operations/Packets.js"; + +/** + * Packets module. + * + * Libraries: + * - Utils.js + * + * @author drkna [whytho@email] + * @copyright Crown Copyright 2017 + * @license Apache-2.0 + */ +let OpModules = typeof self === "undefined" ? {} : self.OpModules || {}; + +OpModules.Packets = { + "From Tcpdump": Packets.runFromTcpdump, +}; + +export default OpModules; diff --git a/src/core/operations/Packets.js b/src/core/operations/Packets.js new file mode 100644 index 00000000..4ecdf190 --- /dev/null +++ b/src/core/operations/Packets.js @@ -0,0 +1,54 @@ +import Utils from "../Utils.js"; + + +/** + * Packets operations. + * + * @author drkna [whytho@email] + * @copyright Crown Copyright 2016 + * @license Apache-2.0 + * + * @namespace + */ +const Packets = { + + /** + * @constant + * @default + */ + WIDTH: 16, + /** + * @constant + * @default + */ + UPPER_CASE: false, + /** + * @constant + * @default + */ + INCLUDE_FINAL_LENGTH: false, + + /** + * From Tcpdump Hexstring operation. + * + * @param {string} input + * @param {Object[]} args + * @returns {byteArray} + */ + runFromTcpdump: function(input, args) { + let output = []; + let regex = /^\s*(?:0x[\dA-F]{4}:?)?\s*((?:[\dA-F]{4}\s?){1,8})/igm; + let block = regex.exec(input); + while (block) { + let line = Utils.fromHex(block[1].replace(/-/g, " ")); + for (let i = 0; i < line.length; i++) { + output.push(line[i]); + } + block = regex.exec(input); + } + return output; + }, + +}; + +export default Packets; diff --git a/src/core/operations/nTcpdump.js b/src/core/operations/nTcpdump.js deleted file mode 100644 index 0e6f1f63..00000000 --- a/src/core/operations/nTcpdump.js +++ /dev/null @@ -1,201 +0,0 @@ -/* globals app */ -import Utils from "../Utils.js"; - - -/** - * Hexdump operations. - * - * @author n1474335 [n1474335@gmail.com] - * @copyright Crown Copyright 2016 - * @license Apache-2.0 - * - * @namespace - */ -const nTcpdump = { - - /** - * @constant - * @default - */ - WIDTH: 16, - /** - * @constant - * @default - */ - UPPER_CASE: false, - /** - * @constant - * @default - */ - INCLUDE_FINAL_LENGTH: false, - - /** - * To Hexdump operation. - * - * @param {byteArray} input - * @param {Object[]} args - * @returns {string} - */ - runTo: function(input, args) { - let length = args[0] || nTcpdump.WIDTH; - let upperCase = args[1]; - let includeFinalLength = args[2]; - - let output = "", padding = 2; - for (let i = 0; i < input.length; i += length) { - let buff = input.slice(i, i+length); - let hexa = ""; - for (let j = 0; j < buff.length; j++) { - hexa += Utils.hex(buff[j], padding) + " "; - } - - let lineNo = Utils.hex(i, 8); - - if (upperCase) { - hexa = hexa.toUpperCase(); - lineNo = lineNo.toUpperCase(); - } - - output += lineNo + " " + - Utils.padRight(hexa, (length*(padding+1))) + - " |" + Utils.padRight(Utils.printable(Utils.byteArrayToChars(buff)), buff.length) + "|\n"; - - if (includeFinalLength && i+buff.length === input.length) { - output += Utils.hex(i+buff.length, 8) + "\n"; - } - } - - return output.slice(0, -1); - }, - - - /** - * From Hexdump operation. - * - * @param {string} input - * @param {Object[]} args - * @returns {byteArray} - */ - runFrom: function(input, args) { - let output = []; - let regex = /^\s*(?:0x[\dA-F]{4}:?)?\s*((?:[\dA-F]{4}\s?){1,8})/igm; - let block = regex.exec(input); - while (block) { - let line = Utils.fromHex(block[1].replace(/-/g, " ")); - for (let i = 0; i < line.length; i++) { - output.push(line[i]); - } - } - // Is this a CyberChef hexdump or is it from a different tool? - let width = input.indexOf("\n"); - let w = (width - 13) / 4; - // w should be the specified width of the hexdump and therefore a round number - if (Math.floor(w) !== w || input.indexOf("\r") !== -1 || output.indexOf(13) !== -1) { - app.options.attemptHighlight = false; - } - return output; - }, - - - /** - * Highlight to hexdump - * - * @param {Object[]} pos - * @param {number} pos[].start - * @param {number} pos[].end - * @param {Object[]} args - * @returns {Object[]} pos - */ - highlightTo: function(pos, args) { - // Calculate overall selection - let w = args[0] || 16, - width = 14 + (w*4), - line = Math.floor(pos[0].start / w), - offset = pos[0].start % w, - start = 0, - end = 0; - - pos[0].start = line*width + 10 + offset*3; - - line = Math.floor(pos[0].end / w); - offset = pos[0].end % w; - if (offset === 0) { - line--; - offset = w; - } - pos[0].end = line*width + 10 + offset*3 - 1; - - // Set up multiple selections for bytes - let startLineNum = Math.floor(pos[0].start / width); - let endLineNum = Math.floor(pos[0].end / width); - - if (startLineNum === endLineNum) { - pos.push(pos[0]); - } else { - start = pos[0].start; - end = (startLineNum+1) * width - w - 5; - pos.push({ start: start, end: end }); - while (end < pos[0].end) { - startLineNum++; - start = startLineNum * width + 10; - end = (startLineNum+1) * width - w - 5; - if (end > pos[0].end) end = pos[0].end; - pos.push({ start: start, end: end }); - } - } - - // Set up multiple selections for ASCII - let len = pos.length, lineNum = 0; - start = 0; - end = 0; - for (let i = 1; i < len; i++) { - lineNum = Math.floor(pos[i].start / width); - start = (((pos[i].start - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); - end = (((pos[i].end + 1 - (lineNum * width)) - 10) / 3) + (width - w -2) + (lineNum * width); - pos.push({ start: start, end: end }); - } - return pos; - }, - - - /** - * Highlight from hexdump - * - * @param {Object[]} pos - * @param {number} pos[].start - * @param {number} pos[].end - * @param {Object[]} args - * @returns {Object[]} pos - */ - highlightFrom: function(pos, args) { - let w = args[0] || 16; - let width = 14 + (w*4); - - let line = Math.floor(pos[0].start / width); - let offset = pos[0].start % width; - - if (offset < 10) { // In line number section - pos[0].start = line*w; - } else if (offset > 10+(w*3)) { // In ASCII section - pos[0].start = (line+1)*w; - } else { // In byte section - pos[0].start = line*w + Math.floor((offset-10)/3); - } - - line = Math.floor(pos[0].end / width); - offset = pos[0].end % width; - - if (offset < 10) { // In line number section - pos[0].end = line*w; - } else if (offset > 10+(w*3)) { // In ASCII section - pos[0].end = (line+1)*w; - } else { // In byte section - pos[0].end = line*w + Math.ceil((offset-10)/3); - } - - return pos; - }, - -}; - -export default nTcpdump; From 54194f2cc1cc4e4fe19ecc1ea0be5f18209741c4 Mon Sep 17 00:00:00 2001 From: Windham Wong Date: Thu, 19 Oct 2017 15:58:47 +0100 Subject: [PATCH 17/20] New recipe: Strip Ethernet/IP/TCP Header from hexstream --- src/core/config/Categories.js | 1 + src/core/config/OperationConfig.js | 38 +++++++++++++++---- src/core/config/modules/Packets.js | 3 +- src/core/operations/Packets.js | 61 +++++++++++++++++++++--------- 4 files changed, 78 insertions(+), 25 deletions(-) diff --git a/src/core/config/Categories.js b/src/core/config/Categories.js index 3d48bda3..640f864b 100755 --- a/src/core/config/Categories.js +++ b/src/core/config/Categories.js @@ -303,6 +303,7 @@ const Categories = [ ops: [ "From Tcpdump", "HTTP gzip Decrypt", + "Strip TCP Headers", ] }, { diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index 6e477617..3b866a60 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -35,6 +35,7 @@ import StrUtils from "../operations/StrUtils.js"; import Tidy from "../operations/Tidy.js"; import Unicode from "../operations/Unicode.js"; import URL_ from "../operations/URL.js"; +import Packets from "../operations/Packets.js"; /** * Type definition for an OpConf. @@ -673,13 +674,6 @@ const OperationConfig = { } ] }, - "From Tcpdump": { - module: "Packets", - description: "[DEPRECATED] Converts Tcpdump hex to string", - inputType: "string", - outputType: "byteArray", - args: [] - }, "From Hexdump": { module: "Default", description: "Attempts to convert a hexdump back into raw data. This operation supports many different hexdump variations, but probably not all. Make sure you verify that the data it gives you is correct before continuing analysis.", @@ -3876,6 +3870,36 @@ const OperationConfig = { } ] }, + "From Tcpdump": { + module: "Packets", + description: "[DEPRECATED] Converts Tcpdump hex to string", + inputType: "string", + outputType: "byteArray", + args: [] + }, + "Strip TCP Headers": { + module: "Packets", + description: "Remove selected TCP headers from hexstream", + inputType: "string", + outputType: "string", + args: [ + { + name: "Ethernet Header", + type: "boolean", + value: Packets.STRIP_ETHERNET_HEADER, + }, + { + name: "IP Header", + type: "boolean", + value: Packets.STRIP_IP_HEADER, + }, + { + name: "Ethernet Header", + type: "boolean", + value: Packets.STRIP_TCP_HEADER, + }, + ] + }, }; diff --git a/src/core/config/modules/Packets.js b/src/core/config/modules/Packets.js index 88f3d7a8..97586d00 100644 --- a/src/core/config/modules/Packets.js +++ b/src/core/config/modules/Packets.js @@ -13,7 +13,8 @@ import Packets from "../../operations/Packets.js"; let OpModules = typeof self === "undefined" ? {} : self.OpModules || {}; OpModules.Packets = { - "From Tcpdump": Packets.runFromTcpdump, + "From Tcpdump": Packets.runFromTcpdump, + "Strip TCP Headers": Packets.stripPacketHeader }; export default OpModules; diff --git a/src/core/operations/Packets.js b/src/core/operations/Packets.js index 4ecdf190..181abece 100644 --- a/src/core/operations/Packets.js +++ b/src/core/operations/Packets.js @@ -11,23 +11,6 @@ import Utils from "../Utils.js"; * @namespace */ const Packets = { - - /** - * @constant - * @default - */ - WIDTH: 16, - /** - * @constant - * @default - */ - UPPER_CASE: false, - /** - * @constant - * @default - */ - INCLUDE_FINAL_LENGTH: false, - /** * From Tcpdump Hexstring operation. * @@ -48,7 +31,51 @@ const Packets = { } return output; }, + + + /** + * @constant + * @default + */ + STRIP_ETHERNET_HEADER: true, + + /** + * @constant + * @default + */ + STRIP_IP_HEADER: true, + + /** + * @constant + * @default + */ + STRIP_TCP_HEADER: true, + + /** + * Strip TCP Headersoperation. + * + * @param {string} input + * @param {Object[]} args + * @returns {string} + */ + stripPacketHeader: function(input, args) { + let output = input, + stripEthernet = args[0], + stripIP = args[1], + stripTCP = args[2]; + if (stripEthernet) { + output = output.replace(/^(([0-9a-f]{4} ){6,8}0800 )/igm,''); + } + if (stripIP) { + output = output.replace(/^((45[0-9a-f]{2} ([0-9a-f]{4} ){9}))/igm,''); + } + if (stripTCP) { + output = output.replace(/^([0-9a-f]{4} ){6}((80[0-9a-f]{2} ([0-9a-f]{4} ?){9})|(50[0-9a-f]{2} ([0-9a-f]{4} ?){3}))/igm,''); + } + + return output; + }, }; export default Packets; From 5b9665e8b9066fabbd899ac5b4676491324aa21f Mon Sep 17 00:00:00 2001 From: Windham Wong Date: Thu, 19 Oct 2017 16:07:01 +0100 Subject: [PATCH 18/20] fix bugs --- src/core/config/Categories.js | 2 +- src/core/config/modules/Packets.js | 2 +- src/core/operations/Packets.js | 18 +++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/core/config/Categories.js b/src/core/config/Categories.js index 640f864b..aa1dcb53 100755 --- a/src/core/config/Categories.js +++ b/src/core/config/Categories.js @@ -303,7 +303,7 @@ const Categories = [ ops: [ "From Tcpdump", "HTTP gzip Decrypt", - "Strip TCP Headers", + "Strip TCP Headers", ] }, { diff --git a/src/core/config/modules/Packets.js b/src/core/config/modules/Packets.js index 97586d00..1d441ca4 100644 --- a/src/core/config/modules/Packets.js +++ b/src/core/config/modules/Packets.js @@ -14,7 +14,7 @@ let OpModules = typeof self === "undefined" ? {} : self.OpModules || {}; OpModules.Packets = { "From Tcpdump": Packets.runFromTcpdump, - "Strip TCP Headers": Packets.stripPacketHeader + "Strip TCP Headers": Packets.stripPacketHeader }; export default OpModules; diff --git a/src/core/operations/Packets.js b/src/core/operations/Packets.js index 181abece..602e049d 100644 --- a/src/core/operations/Packets.js +++ b/src/core/operations/Packets.js @@ -31,26 +31,26 @@ const Packets = { } return output; }, - - - /** + + + /** * @constant * @default */ STRIP_ETHERNET_HEADER: true, - + /** * @constant * @default */ STRIP_IP_HEADER: true, - + /** * @constant * @default */ STRIP_TCP_HEADER: true, - + /** * Strip TCP Headersoperation. * @@ -65,13 +65,13 @@ const Packets = { stripTCP = args[2]; if (stripEthernet) { - output = output.replace(/^(([0-9a-f]{4} ){6,8}0800 )/igm,''); + output = output.replace(/^(([0-9a-f]{4} ){6,8}0800 )/igm, ""); } if (stripIP) { - output = output.replace(/^((45[0-9a-f]{2} ([0-9a-f]{4} ){9}))/igm,''); + output = output.replace(/^((45[0-9a-f]{2} ([0-9a-f]{4} ){9}))/igm, ""); } if (stripTCP) { - output = output.replace(/^([0-9a-f]{4} ){6}((80[0-9a-f]{2} ([0-9a-f]{4} ?){9})|(50[0-9a-f]{2} ([0-9a-f]{4} ?){3}))/igm,''); + output = output.replace(/^([0-9a-f]{4} ){6}((80[0-9a-f]{2} ([0-9a-f]{4} ?){9})|(50[0-9a-f]{2} ([0-9a-f]{4} ?){3}))/igm, ""); } return output; From fde87fd95cce30b469d6a2523660504a6f4e4e1e Mon Sep 17 00:00:00 2001 From: Windham Wong Date: Sat, 21 Oct 2017 07:51:03 +0100 Subject: [PATCH 19/20] Gzip decryption now supports 2 libraries and threshold search. Gzip decryption now stop decrypting at the position of plaintext searched by threshold --- src/core/config/OperationConfig.js | 17 +++++++-- src/core/config/modules/Compression.js | 24 ++++++------- src/core/operations/Compress.js | 48 +++++++++++++++++++++++--- 3 files changed, 70 insertions(+), 19 deletions(-) diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index 3b866a60..6b6e7fa2 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -1759,10 +1759,21 @@ const OperationConfig = { }, "HTTP gzip Decrypt": { module: "Compression", - description: "Decrypts Gzip payload from a request or response and returning plaintext of the header and decrypted payload.", + description: "Decrypts Gzip payload from a request or response and returning plaintext of the header and decrypted payload.

          Arguments:
          Library: The library used for decoding GZIP data.
          Threshold: The threshold value for searching non-GZIP data. It has to be at least 8.", inputType: "byteArray", outputType: "byteArray", - args: [] + args: [ + { + name: "Library", + type: "option", + value: Compress.HTTP_GZIP_OPTION + }, + { + name: "Threshold", + type: "number", + value: Compress.HTTP_GZIP_THRESHOLD + }, + ] }, "Parse User Agent": { module: "HTTP", @@ -3879,7 +3890,7 @@ const OperationConfig = { }, "Strip TCP Headers": { module: "Packets", - description: "Remove selected TCP headers from hexstream", + description: "Remove selected TCP headers from hexstream using Regular Expressions.

          Ethernet Header: /^(([0-9a-f]{4} ){6,8}0800 )/igm
          IP Header: /^((45[0-9a-f]{2} ([0-9a-f]{4} ){9}))/igm
          TCP Header: /^([0-9a-f]{4} ){6}((80[0-9a-f]{2} ([0-9a-f]{4} ?){9})|(50[0-9a-f]{2} ([0-9a-f]{4} ?){3}))/igm", inputType: "string", outputType: "string", args: [ diff --git a/src/core/config/modules/Compression.js b/src/core/config/modules/Compression.js index bbe05bfa..9d55b400 100644 --- a/src/core/config/modules/Compression.js +++ b/src/core/config/modules/Compression.js @@ -15,18 +15,18 @@ import Compress from "../../operations/Compress.js"; let OpModules = typeof self === "undefined" ? {} : self.OpModules || {}; OpModules.Compression = { - "Raw Deflate": Compress.runRawDeflate, - "Raw Inflate": Compress.runRawInflate, - "Zlib Deflate": Compress.runZlibDeflate, - "Zlib Inflate": Compress.runZlibInflate, - "Gzip": Compress.runGzip, - "Gunzip": Compress.runGunzip, - "Zip": Compress.runPkzip, - "Unzip": Compress.runPkunzip, - "Bzip2 Decompress": Compress.runBzip2Decompress, - "Tar": Compress.runTar, - "Untar": Compress.runUntar, - "HTTP gzip Decrypt":Compress.runHttpGzip, + "Raw Deflate": Compress.runRawDeflate, + "Raw Inflate": Compress.runRawInflate, + "Zlib Deflate": Compress.runZlibDeflate, + "Zlib Inflate": Compress.runZlibInflate, + "Gzip": Compress.runGzip, + "Gunzip": Compress.runGunzip, + "Zip": Compress.runPkzip, + "Unzip": Compress.runPkunzip, + "Bzip2 Decompress": Compress.runBzip2Decompress, + "Tar": Compress.runTar, + "Untar": Compress.runUntar, + "HTTP gzip Decrypt": Compress.runHttpGzip, }; diff --git a/src/core/operations/Compress.js b/src/core/operations/Compress.js index 2614c6f5..7748f9d9 100755 --- a/src/core/operations/Compress.js +++ b/src/core/operations/Compress.js @@ -255,6 +255,17 @@ const Compress = { }, + /** + * @constant + * @default + */ + HTTP_GZIP_OPTION: ["pako.js", "zlib.js"], + /** + * @constant + * @default + */ + HTTP_GZIP_THRESHOLD: 8, + /** * HTTP Gzip operation. * @@ -263,18 +274,47 @@ const Compress = { * @returns {byteArray} */ runHttpGzip: function(input, args) { + const library = Compress.HTTP_GZIP_OPTION.indexOf(args[0]); + let threshold = Compress.HTTP_GZIP_THRESHOLD; + if (args[1] > 8) { + threshold = args[1]; + } input = Utils.byteArrayToHexNoSpace(input); + let output = input; let regexStr = /1f8b080[0-8][0-9a-f]{12}/; let gzipPos = input.search(regexStr); if (gzipPos === -1) { return Utils.hexToByteArray(input); } - let plainData = input.substr(0, gzipPos); - let gzipData = input.substr(gzipPos); - gzipData = Utils.hexToByteArray(gzipData); - return Utils.hexToByteArray(plainData).concat(Array.prototype.slice.call(pako.ungzip(gzipData))); + while (gzipPos !== -1) { + output = input; + + let plainData = output.substr(0, gzipPos); + let gzipData = output.substr(gzipPos); + let httpDataAfter = ""; + + let httpDataPosRegex = new RegExp("/((3[0-9])|(6[0-9a-f])|(7[0-9a])|(4[0-9a-f])|(5[0-9a])|(2[e-f])|(2b)|(20)){" + threshold + "}/"); + let httpDataPos = gzipData.search(httpDataPosRegex); + if (httpDataPos !== -1) { + httpDataAfter = gzipData.substr(httpDataPos); + gzipData = gzipData.substr(0, httpDataPos); + } + + console.log(httpDataPos); + gzipData = Utils.hexToByteArray(gzipData); + if (library === 0) { + output = Utils.hexToByteArray(plainData).concat(Array.prototype.slice.call(pako.inflate(gzipData))).concat(Utils.hexToByteArray(httpDataAfter)); + } else if (library === 1) { + let gzipDataRaw = new Zlib.Gunzip(gzipData); + output = Utils.hexToByteArray(plainData).concat(Array.prototype.slice.call(gzipDataRaw.decompress())).concat(Utils.hexToByteArray("0d0a 0d0a")).concat(Utils.hexToByteArray(httpDataAfter)); + } + + input = Utils.byteArrayToHexNoSpace(output); + gzipPos = input.search(regexStr); + } + return output; }, From d5aca252a95baf81791ef947f66e43adffb2e4a4 Mon Sep 17 00:00:00 2001 From: Windham Wong Date: Sat, 21 Oct 2017 07:58:50 +0100 Subject: [PATCH 20/20] Fix linebreak-style Strip TCP Header now supports Wireshark format --- src/core/operations/Packets.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/operations/Packets.js b/src/core/operations/Packets.js index 602e049d..b5825003 100644 --- a/src/core/operations/Packets.js +++ b/src/core/operations/Packets.js @@ -65,13 +65,13 @@ const Packets = { stripTCP = args[2]; if (stripEthernet) { - output = output.replace(/^(([0-9a-f]{4} ){6,8}0800 )/igm, ""); + output = output.replace(/^(([0-9a-f]{4} ?){6,8}0800 ?)/igm, ""); } if (stripIP) { - output = output.replace(/^((45[0-9a-f]{2} ([0-9a-f]{4} ){9}))/igm, ""); + output = output.replace(/^((45[0-9a-f]{2} ?([0-9a-f]{4} ?){9}))/igm, ""); } if (stripTCP) { - output = output.replace(/^([0-9a-f]{4} ){6}((80[0-9a-f]{2} ([0-9a-f]{4} ?){9})|(50[0-9a-f]{2} ([0-9a-f]{4} ?){3}))/igm, ""); + output = output.replace(/^([0-9a-f]{4} ?){6}((80[0-9a-f]{2} ?([0-9a-f]{4} ?){9})|(50[0-9a-f]{2} ?([0-9a-f]{4} ?){3}))/igm, ""); } return output;