diff --git a/Gruntfile.js b/Gruntfile.js index 2b801246153c8382872f4abb22be04e9ba20794c..40818b7bcfd103ffcbe0af06aebf6a0c4a8e7efd 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,3 +1,4 @@ +/*global module, require*/ module.exports = function (grunt) { "use strict"; @@ -93,7 +94,7 @@ module.exports = function (grunt) { predef: [ 'jIO' ] - }, + } }, tests: { src: ['test/**/*.js'], @@ -106,7 +107,7 @@ module.exports = function (grunt) { 'QUnit', 'jIO' ] - }, + } }, queries: { src: ['src/queries/*.js'], @@ -136,8 +137,8 @@ module.exports = function (grunt) { 'QUnit', 'jIO' ] - }, - }, + } + } }, concat: { options: { @@ -184,6 +185,13 @@ module.exports = function (grunt) { ], dest: 'dist/<%= pkg.name %>-<%= pkg.version %>.js' // dest: 'jio.js' + }, + zipfile: { + src: [ + 'node_modules/jszip/dist/jszip.min.js', + 'src/jio.storage/zipfilestorage.js' + ], + dest: 'dist/zipfilestorage-with-jszip.js' } }, uglify: { diff --git a/dist/zipfilestorage-with-jszip.js b/dist/zipfilestorage-with-jszip.js new file mode 100644 index 0000000000000000000000000000000000000000..db103e90e72fb58dd6758feca24d5430743420ad --- /dev/null +++ b/dist/zipfilestorage-with-jszip.js @@ -0,0 +1,258 @@ +/*! + +JSZip v3.1.3 - A Javascript class for generating and reading zip files + + +(c) 2009-2016 Stuart Knightley +Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. + +JSZip uses the library pako released under the MIT license : +https://github.com/nodeca/pako/blob/master/LICENSE +*/ +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.JSZip=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g>2,h=(3&b)<<4|c>>4,i=n>1?(15&c)<<2|e>>6:64,j=n>2?63&e:64,k.push(f.charAt(g)+f.charAt(h)+f.charAt(i)+f.charAt(j));return k.join("")},c.decode=function(a){var b,c,d,g,h,i,j,k=0,l=0,m="data:";if(a.substr(0,m.length)===m)throw new Error("Invalid base64 input, it looks like a data url.");a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");var n=3*a.length/4;if(a.charAt(a.length-1)===f.charAt(64)&&n--,a.charAt(a.length-2)===f.charAt(64)&&n--,n%1!==0)throw new Error("Invalid base64 input, bad content length.");var o;for(o=e.uint8array?new Uint8Array(0|n):new Array(0|n);k>4,c=(15&h)<<4|i>>2,d=(3&i)<<6|j,o[l++]=b,64!==i&&(o[l++]=c),64!==j&&(o[l++]=d);return o}},{"./support":30,"./utils":32}],2:[function(a,b,c){"use strict";function d(a,b,c,d,e){this.compressedSize=a,this.uncompressedSize=b,this.crc32=c,this.compression=d,this.compressedContent=e}var e=a("./external"),f=a("./stream/DataWorker"),g=a("./stream/DataLengthProbe"),h=a("./stream/Crc32Probe"),g=a("./stream/DataLengthProbe");d.prototype={getContentWorker:function(){var a=new f(e.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new g("data_length")),b=this;return a.on("end",function(){if(this.streamInfo.data_length!==b.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),a},getCompressedWorker:function(){return new f(e.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},d.createWorkerFrom=function(a,b,c){return a.pipe(new h).pipe(new g("uncompressedSize")).pipe(b.compressWorker(c)).pipe(new g("compressedSize")).withStreamInfo("compression",b)},b.exports=d},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(a,b,c){"use strict";var d=a("./stream/GenericWorker");c.STORE={magic:"\0\0",compressWorker:function(a){return new d("STORE compression")},uncompressWorker:function(){return new d("STORE decompression")}},c.DEFLATE=a("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(a,b,c){"use strict";function d(){for(var a,b=[],c=0;c<256;c++){a=c;for(var d=0;d<8;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=h,f=d+c;a^=-1;for(var g=d;g>>8^e[255&(a^b[g])];return a^-1}function f(a,b,c,d){var e=h,f=d+c;a^=-1;for(var g=d;g>>8^e[255&(a^b.charCodeAt(g))];return a^-1}var g=a("./utils"),h=d();b.exports=function(a,b){if("undefined"==typeof a||!a.length)return 0;var c="string"!==g.getTypeOf(a);return c?e(0|b,a,a.length,0):f(0|b,a,a.length,0)}},{"./utils":32}],5:[function(a,b,c){"use strict";c.base64=!1,c.binary=!1,c.dir=!1,c.createFolders=!0,c.date=null,c.compression=null,c.compressionOptions=null,c.comment=null,c.unixPermissions=null,c.dosPermissions=null},{}],6:[function(a,b,c){"use strict";var d=null;d="undefined"!=typeof Promise?Promise:a("lie"),b.exports={Promise:d}},{lie:58}],7:[function(a,b,c){"use strict";function d(a,b){h.call(this,"FlateWorker/"+a),this._pako=new f[a]({raw:!0,level:b.level||-1}),this.meta={};var c=this;this._pako.onData=function(a){c.push({data:a,meta:c.meta})}}var e="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,f=a("pako"),g=a("./utils"),h=a("./stream/GenericWorker"),i=e?"uint8array":"array";c.magic="\b\0",g.inherits(d,h),d.prototype.processChunk=function(a){this.meta=a.meta,this._pako.push(g.transformTo(i,a.data),!1)},d.prototype.flush=function(){h.prototype.flush.call(this),this._pako.push([],!0)},d.prototype.cleanUp=function(){h.prototype.cleanUp.call(this),this._pako=null},c.compressWorker=function(a){return new d("Deflate",a)},c.uncompressWorker=function(){return new d("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:59}],8:[function(a,b,c){"use strict";function d(a,b,c,d){f.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=b,this.zipPlatform=c,this.encodeFileName=d,this.streamFiles=a,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}var e=a("../utils"),f=a("../stream/GenericWorker"),g=a("../utf8"),h=a("../crc32"),i=a("../signature"),j=function(a,b){var c,d="";for(c=0;c>>=8;return d},k=function(a,b){var c=a;return a||(c=b?16893:33204),(65535&c)<<16},l=function(a,b){return 63&(a||0)},m=function(a,b,c,d,f,m){var n,o,p=a.file,q=a.compression,r=m!==g.utf8encode,s=e.transformTo("string",m(p.name)),t=e.transformTo("string",g.utf8encode(p.name)),u=p.comment,v=e.transformTo("string",m(u)),w=e.transformTo("string",g.utf8encode(u)),x=t.length!==p.name.length,y=w.length!==u.length,z="",A="",B="",C=p.dir,D=p.date,E={crc32:0,compressedSize:0,uncompressedSize:0};b&&!c||(E.crc32=a.crc32,E.compressedSize=a.compressedSize,E.uncompressedSize=a.uncompressedSize);var F=0;b&&(F|=8),r||!x&&!y||(F|=2048);var G=0,H=0;C&&(G|=16),"UNIX"===f?(H=798,G|=k(p.unixPermissions,C)):(H=20,G|=l(p.dosPermissions,C)),n=D.getUTCHours(),n<<=6,n|=D.getUTCMinutes(),n<<=5,n|=D.getUTCSeconds()/2,o=D.getUTCFullYear()-1980,o<<=4,o|=D.getUTCMonth()+1,o<<=5,o|=D.getUTCDate(),x&&(A=j(1,1)+j(h(s),4)+t,z+="up"+j(A.length,2)+A),y&&(B=j(1,1)+j(h(v),4)+w,z+="uc"+j(B.length,2)+B);var I="";I+="\n\0",I+=j(F,2),I+=q.magic,I+=j(n,2),I+=j(o,2),I+=j(E.crc32,4),I+=j(E.compressedSize,4),I+=j(E.uncompressedSize,4),I+=j(s.length,2),I+=j(z.length,2);var J=i.LOCAL_FILE_HEADER+I+s+z,K=i.CENTRAL_FILE_HEADER+j(H,2)+I+j(v.length,2)+"\0\0\0\0"+j(G,4)+j(d,4)+s+z+v;return{fileRecord:J,dirRecord:K}},n=function(a,b,c,d,f){var g="",h=e.transformTo("string",f(d));return g=i.CENTRAL_DIRECTORY_END+"\0\0\0\0"+j(a,2)+j(a,2)+j(b,4)+j(c,4)+j(h.length,2)+h},o=function(a){var b="";return b=i.DATA_DESCRIPTOR+j(a.crc32,4)+j(a.compressedSize,4)+j(a.uncompressedSize,4)};e.inherits(d,f),d.prototype.push=function(a){var b=a.meta.percent||0,c=this.entriesCount,d=this._sources.length;this.accumulate?this.contentBuffer.push(a):(this.bytesWritten+=a.data.length,f.prototype.push.call(this,{data:a.data,meta:{currentFile:this.currentFile,percent:c?(b+100*(c-d-1))/c:100}}))},d.prototype.openedSource=function(a){this.currentSourceOffset=this.bytesWritten,this.currentFile=a.file.name;var b=this.streamFiles&&!a.file.dir;if(b){var c=m(a,b,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:c.fileRecord,meta:{percent:0}})}else this.accumulate=!0},d.prototype.closedSource=function(a){this.accumulate=!1;var b=this.streamFiles&&!a.file.dir,c=m(a,b,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(c.dirRecord),b)this.push({data:o(a),meta:{percent:100}});else for(this.push({data:c.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},d.prototype.flush=function(){for(var a=this.bytesWritten,b=0;b0?a.substring(0,b):""},q=function(a){return"/"!==a.slice(-1)&&(a+="/"),a},r=function(a,b){return b="undefined"!=typeof b?b:i.createFolders,a=q(a),this.files[a]||o.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},s={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(a){var b,c,d;for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],c=b.slice(this.root.length,b.length),c&&b.slice(0,this.root.length)===this.root&&a(c,d))},filter:function(a){var b=[];return this.forEach(function(c,d){a(c,d)&&b.push(d)}),b},file:function(a,b,c){if(1===arguments.length){if(d(a)){var e=a;return this.filter(function(a,b){return!b.dir&&e.test(a)})}var f=this.files[this.root+a];return f&&!f.dir?f:null}return a=this.root+a,o.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(d(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=this.root+a,c=r.call(this,b),e=this.clone();return e.root=c.name,e},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!==a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var c=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),d=0;d=0;--f)if(this.data[f]===b&&this.data[f+1]===c&&this.data[f+2]===d&&this.data[f+3]===e)return f-this.zero;return-1},d.prototype.readAndCheckSignature=function(a){var b=a.charCodeAt(0),c=a.charCodeAt(1),d=a.charCodeAt(2),e=a.charCodeAt(3),f=this.readData(4);return b===f[0]&&c===f[1]&&d===f[2]&&e===f[3]},d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return[];var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":32,"./DataReader":18}],18:[function(a,b,c){"use strict";function d(a){this.data=a,this.length=a.length,this.index=0,this.zero=0}var e=a("../utils");d.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return e.transformTo("string",this.readData(a))},readData:function(a){},lastIndexOfSignature:function(a){},readAndCheckSignature:function(a){},readDate:function(){var a=this.readInt(4);return new Date(Date.UTC((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,(31&a)<<1))}},b.exports=d},{"../utils":32}],19:[function(a,b,c){"use strict";function d(a){e.call(this,a)}var e=a("./Uint8ArrayReader"),f=a("../utils");f.inherits(d,e),d.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(a,b,c){"use strict";function d(a){e.call(this,a)}var e=a("./DataReader"),f=a("../utils");f.inherits(d,e),d.prototype.byteAt=function(a){return this.data.charCodeAt(this.zero+a)},d.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)-this.zero},d.prototype.readAndCheckSignature=function(a){var b=this.readData(4);return a===b},d.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":32,"./DataReader":18}],21:[function(a,b,c){"use strict";function d(a){e.call(this,a)}var e=a("./ArrayReader"),f=a("../utils");f.inherits(d,e),d.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.zero+this.index,this.zero+this.index+a);return this.index+=a,b},b.exports=d},{"../utils":32,"./ArrayReader":17}],22:[function(a,b,c){"use strict";var d=a("../utils"),e=a("../support"),f=a("./ArrayReader"),g=a("./StringReader"),h=a("./NodeBufferReader"),i=a("./Uint8ArrayReader");b.exports=function(a){var b=d.getTypeOf(a);return d.checkSupport(b),"string"!==b||e.uint8array?"nodebuffer"===b?new h(a):e.uint8array?new i(d.transformTo("uint8array",a)):new f(d.transformTo("array",a)):new g(a)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(a,b,c){"use strict";c.LOCAL_FILE_HEADER="PK",c.CENTRAL_FILE_HEADER="PK",c.CENTRAL_DIRECTORY_END="PK",c.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",c.ZIP64_CENTRAL_DIRECTORY_END="PK",c.DATA_DESCRIPTOR="PK\b"},{}],24:[function(a,b,c){"use strict";function d(a){e.call(this,"ConvertWorker to "+a),this.destType=a}var e=a("./GenericWorker"),f=a("../utils");f.inherits(d,e),d.prototype.processChunk=function(a){this.push({data:f.transformTo(this.destType,a.data),meta:a.meta})},b.exports=d},{"../utils":32,"./GenericWorker":28}],25:[function(a,b,c){"use strict";function d(){e.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}var e=a("./GenericWorker"),f=a("../crc32"),g=a("../utils");g.inherits(d,e),d.prototype.processChunk=function(a){this.streamInfo.crc32=f(a.data,this.streamInfo.crc32||0),this.push(a)},b.exports=d},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(a,b,c){"use strict";function d(a){f.call(this,"DataLengthProbe for "+a),this.propName=a,this.withStreamInfo(a,0)}var e=a("../utils"),f=a("./GenericWorker");e.inherits(d,f),d.prototype.processChunk=function(a){if(a){var b=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=b+a.data.length}f.prototype.processChunk.call(this,a)},b.exports=d},{"../utils":32,"./GenericWorker":28}],27:[function(a,b,c){"use strict";function d(a){f.call(this,"DataWorker");var b=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,a.then(function(a){b.dataIsReady=!0,b.data=a,b.max=a&&a.length||0,b.type=e.getTypeOf(a),b.isPaused||b._tickAndRepeat()},function(a){b.error(a)})}var e=a("../utils"),f=a("./GenericWorker"),g=16384;e.inherits(d,f),d.prototype.cleanUp=function(){f.prototype.cleanUp.call(this),this.data=null},d.prototype.resume=function(){return!!f.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,e.delay(this._tickAndRepeat,[],this)),!0)},d.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(e.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},d.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var a=g,b=null,c=Math.min(this.max,this.index+a);if(this.index>=this.max)return this.end();switch(this.type){case"string":b=this.data.substring(this.index,c);break;case"uint8array":b=this.data.subarray(this.index,c);break;case"array":case"nodebuffer":b=this.data.slice(this.index,c)}return this.index=c,this.push({data:b,meta:{percent:this.max?this.index/this.max*100:0}})},b.exports=d},{"../utils":32,"./GenericWorker":28}],28:[function(a,b,c){"use strict";function d(a){this.name=a||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}d.prototype={push:function(a){this.emit("data",a)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(a){this.emit("error",a)}return!0},error:function(a){return!this.isFinished&&(this.isPaused?this.generatedError=a:(this.isFinished=!0,this.emit("error",a),this.previous&&this.previous.error(a),this.cleanUp()),!0)},on:function(a,b){return this._listeners[a].push(b),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(a,b){if(this._listeners[a])for(var c=0;c "+a:a}},b.exports=d},{}],29:[function(a,b,c){"use strict";function d(a,b,c,d){var f=null;switch(a){case"blob":return h.newBlob(c,d);case"base64":return f=e(b,c),k.encode(f);default:return f=e(b,c),h.transformTo(a,f)}}function e(a,b){var c,d=0,e=null,f=0;for(c=0;c=252?6:k>=248?5:k>=240?4:k>=224?3:k>=192?2:1;j[254]=j[254]=1;var l=function(a){var b,c,d,e,f,h=a.length,i=0;for(e=0;e>>6,b[f++]=128|63&c):c<65536?(b[f++]=224|c>>>12,b[f++]=128|c>>>6&63,b[f++]=128|63&c):(b[f++]=240|c>>>18,b[f++]=128|c>>>12&63,b[f++]=128|c>>>6&63,b[f++]=128|63&c);return b},m=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return c<0?b:0===c?b:c+j[a[c]]>b?c:b},n=function(a){var b,c,d,e,g=a.length,h=new Array(2*g);for(c=0,b=0;b4)h[c++]=65533,b+=e-1;else{for(d&=2===e?31:3===e?15:7;e>1&&b1?h[c++]=65533:d<65536?h[c++]=d:(d-=65536,h[c++]=55296|d>>10&1023,h[c++]=56320|1023&d)}return h.length!==c&&(h.subarray?h=h.subarray(0,c):h.length=c),f.applyFromCharCode(h)};c.utf8encode=function(a){return g.nodebuffer?h.newBuffer(a,"utf-8"):l(a)},c.utf8decode=function(a){return g.nodebuffer?f.transformTo("nodebuffer",a).toString("utf-8"):(a=f.transformTo(g.uint8array?"uint8array":"array",a),n(a))},f.inherits(d,i),d.prototype.processChunk=function(a){var b=f.transformTo(g.uint8array?"uint8array":"array",a.data);if(this.leftOver&&this.leftOver.length){if(g.uint8array){var d=b;b=new Uint8Array(d.length+this.leftOver.length),b.set(this.leftOver,0),b.set(d,this.leftOver.length)}else b=this.leftOver.concat(b);this.leftOver=null}var e=m(b),h=b;e!==b.length&&(g.uint8array?(h=b.subarray(0,e),this.leftOver=b.subarray(e,b.length)):(h=b.slice(0,e),this.leftOver=b.slice(e,b.length))),this.push({data:c.utf8decode(h),meta:a.meta})},d.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:c.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},c.Utf8DecodeWorker=d,f.inherits(e,i),e.prototype.processChunk=function(a){this.push({data:c.utf8encode(a.data),meta:a.meta})},c.Utf8EncodeWorker=e},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(a,b,c){"use strict";function d(a){var b=null;return b=i.uint8array?new Uint8Array(a.length):new Array(a.length),f(a,b)}function e(a){return a}function f(a,b){for(var c=0;c1;)try{return n.stringifyByChunk(a,d,b)}catch(f){b=Math.floor(b/2)}return n.stringifyByChar(a)}function h(a,b){for(var c=0;c1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var a,b;for(a=0;a0)this.isSignature(c,g.CENTRAL_FILE_HEADER)||(this.reader.zero=e);else if(e<0)throw new Error("Corrupted zip: missing "+Math.abs(e)+" bytes.")},prepareReader:function(a){this.reader=e(a)},load:function(a){this.prepareReader(a),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},b.exports=d},{"./reader/readerFor":22,"./signature":23,"./support":30,"./utf8":31,"./utils":32,"./zipEntry":34}],34:[function(a,b,c){"use strict";function d(a,b){this.options=a,this.loadOptions=b}var e=a("./reader/readerFor"),f=a("./utils"),g=a("./compressedObject"),h=a("./crc32"),i=a("./utf8"),j=a("./compressions"),k=a("./support"),l=0,m=3,n=function(a){for(var b in j)if(j.hasOwnProperty(b)&&j[b].magic===a)return j[b];return null};d.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readData(this.fileNameLength),a.skip(c),this.compressedSize===-1||this.uncompressedSize===-1)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(b=n(this.compressionMethod),null===b)throw new Error("Corrupted zip : compression "+f.pretty(this.compressionMethod)+" unknown (inner file : "+f.transformTo("string",this.fileName)+")");this.decompressed=new g(this.compressedSize,this.uncompressedSize,this.crc32,b,a.readData(this.compressedSize))},readCentralPart:function(a){this.versionMadeBy=a.readInt(2),a.skip(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4);var b=a.readInt(2);if(this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");a.skip(b),this.readExtraFields(a),this.parseZIP64ExtraField(a),this.fileComment=a.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var a=this.versionMadeBy>>8;this.dir=!!(16&this.externalFileAttributes),a===l&&(this.dosPermissions=63&this.externalFileAttributes),a===m&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(a){if(this.extraFields[1]){var b=e(this.extraFields[1].value);this.uncompressedSize===f.MAX_VALUE_32BITS&&(this.uncompressedSize=b.readInt(8)),this.compressedSize===f.MAX_VALUE_32BITS&&(this.compressedSize=b.readInt(8)),this.localHeaderOffset===f.MAX_VALUE_32BITS&&(this.localHeaderOffset=b.readInt(8)),this.diskNumberStart===f.MAX_VALUE_32BITS&&(this.diskNumberStart=b.readInt(4))}},readExtraFields:function(a){var b,c,d,e=a.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});a.indexc;)b.push(arguments[c++]);return q[++p]=function(){h("function"==typeof a?a:Function(a),b)},d(p),p},n=function(a){delete q[a]},"process"==a("./_cof")(l)?d=function(a){l.nextTick(g(s,a,1))}:o?(e=new o,f=e.port2,e.port1.onmessage=t,d=g(f.postMessage,f,1)):k.addEventListener&&"function"==typeof postMessage&&!k.importScripts?(d=function(a){k.postMessage(a+"","*")},k.addEventListener("message",t,!1)):d=r in j("script")?function(a){i.appendChild(j("script"))[r]=function(){i.removeChild(this),s.call(a)}}:function(a){setTimeout(g(s,a,1),0)}),b.exports={set:m,clear:n}},{"./_cof":39,"./_ctx":41,"./_dom-create":43,"./_global":46,"./_html":48,"./_invoke":50}],55:[function(a,b,c){var d=a("./_is-object");b.exports=function(a,b){if(!d(a))return a;var c,e;if(b&&"function"==typeof(c=a.toString)&&!d(e=c.call(a)))return e;if("function"==typeof(c=a.valueOf)&&!d(e=c.call(a)))return e;if(!b&&"function"==typeof(c=a.toString)&&!d(e=c.call(a)))return e;throw TypeError("Can't convert object to primitive value")}},{"./_is-object":51}],56:[function(a,b,c){var d=a("./_export"),e=a("./_task");d(d.G+d.B,{setImmediate:e.set,clearImmediate:e.clear})},{"./_export":44,"./_task":54}],57:[function(a,b,c){(function(a){"use strict";function c(){k=!0;for(var a,b,c=l.length;c;){for(b=l,l=[],a=-1;++a0?b.windowBits=-b.windowBits:b.gzip&&b.windowBits>0&&b.windowBits<16&&(b.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=h.deflateInit2(this.strm,b.level,b.method,b.windowBits,b.memLevel,b.strategy);if(c!==p)throw new Error(k[c]);if(b.header&&h.deflateSetHeader(this.strm,b.header),b.dictionary){var e;if(e="string"==typeof b.dictionary?j.string2buf(b.dictionary):"[object ArrayBuffer]"===m.call(b.dictionary)?new Uint8Array(b.dictionary):b.dictionary,c=h.deflateSetDictionary(this.strm,e),c!==p)throw new Error(k[c]);this._dict_set=!0}}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}function g(a,b){return b=b||{},b.gzip=!0,e(a,b)}var h=a("./zlib/deflate"),i=a("./utils/common"),j=a("./utils/strings"),k=a("./zlib/messages"),l=a("./zlib/zstream"),m=Object.prototype.toString,n=0,o=4,p=0,q=1,r=2,s=-1,t=0,u=8;d.prototype.push=function(a,b){var c,d,e=this.strm,f=this.options.chunkSize;if(this.ended)return!1;d=b===~~b?b:b===!0?o:n,"string"==typeof a?e.input=j.string2buf(a):"[object ArrayBuffer]"===m.call(a)?e.input=new Uint8Array(a):e.input=a,e.next_in=0,e.avail_in=e.input.length;do{if(0===e.avail_out&&(e.output=new i.Buf8(f),e.next_out=0,e.avail_out=f),c=h.deflate(e,d),c!==q&&c!==p)return this.onEnd(c),this.ended=!0,!1;0!==e.avail_out&&(0!==e.avail_in||d!==o&&d!==r)||("string"===this.options.to?this.onData(j.buf2binstring(i.shrinkBuf(e.output,e.next_out))):this.onData(i.shrinkBuf(e.output,e.next_out)))}while((e.avail_in>0||0===e.avail_out)&&c!==q);return d===o?(c=h.deflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===p):d!==r||(this.onEnd(p),e.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===p&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=i.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Deflate=d,c.deflate=e,c.deflateRaw=f,c.gzip=g},{"./utils/common":62,"./utils/strings":63,"./zlib/deflate":67,"./zlib/messages":72,"./zlib/zstream":74}],61:[function(a,b,c){"use strict";function d(a){if(!(this instanceof d))return new d(a);this.options=h.assign({chunkSize:16384,windowBits:0,to:""},a||{});var b=this.options;b.raw&&b.windowBits>=0&&b.windowBits<16&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15)),!(b.windowBits>=0&&b.windowBits<16)||a&&a.windowBits||(b.windowBits+=32),b.windowBits>15&&b.windowBits<48&&0===(15&b.windowBits)&&(b.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new l,this.strm.avail_out=0;var c=g.inflateInit2(this.strm,b.windowBits);if(c!==j.Z_OK)throw new Error(k[c]);this.header=new m,g.inflateGetHeader(this.strm,this.header)}function e(a,b){var c=new d(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}function f(a,b){return b=b||{},b.raw=!0,e(a,b)}var g=a("./zlib/inflate"),h=a("./utils/common"),i=a("./utils/strings"),j=a("./zlib/constants"),k=a("./zlib/messages"),l=a("./zlib/zstream"),m=a("./zlib/gzheader"),n=Object.prototype.toString;d.prototype.push=function(a,b){var c,d,e,f,k,l,m=this.strm,o=this.options.chunkSize,p=this.options.dictionary,q=!1;if(this.ended)return!1;d=b===~~b?b:b===!0?j.Z_FINISH:j.Z_NO_FLUSH,"string"==typeof a?m.input=i.binstring2buf(a):"[object ArrayBuffer]"===n.call(a)?m.input=new Uint8Array(a):m.input=a,m.next_in=0,m.avail_in=m.input.length;do{if(0===m.avail_out&&(m.output=new h.Buf8(o),m.next_out=0,m.avail_out=o),c=g.inflate(m,j.Z_NO_FLUSH),c===j.Z_NEED_DICT&&p&&(l="string"==typeof p?i.string2buf(p):"[object ArrayBuffer]"===n.call(p)?new Uint8Array(p):p,c=g.inflateSetDictionary(this.strm,l)),c===j.Z_BUF_ERROR&&q===!0&&(c=j.Z_OK,q=!1),c!==j.Z_STREAM_END&&c!==j.Z_OK)return this.onEnd(c),this.ended=!0,!1;m.next_out&&(0!==m.avail_out&&c!==j.Z_STREAM_END&&(0!==m.avail_in||d!==j.Z_FINISH&&d!==j.Z_SYNC_FLUSH)||("string"===this.options.to?(e=i.utf8border(m.output,m.next_out),f=m.next_out-e,k=i.buf2string(m.output,e),m.next_out=f,m.avail_out=o-f,f&&h.arraySet(m.output,m.output,e,f,0),this.onData(k)):this.onData(h.shrinkBuf(m.output,m.next_out)))),0===m.avail_in&&0===m.avail_out&&(q=!0)}while((m.avail_in>0||0===m.avail_out)&&c!==j.Z_STREAM_END);return c===j.Z_STREAM_END&&(d=j.Z_FINISH),d===j.Z_FINISH?(c=g.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===j.Z_OK):d!==j.Z_SYNC_FLUSH||(this.onEnd(j.Z_OK),m.avail_out=0,!0)},d.prototype.onData=function(a){this.chunks.push(a)},d.prototype.onEnd=function(a){a===j.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=h.flattenChunks(this.chunks)),this.chunks=[],this.err=a,this.msg=this.strm.msg},c.Inflate=d,c.inflate=e,c.inflateRaw=f,c.ungzip=e},{"./utils/common":62,"./utils/strings":63,"./zlib/constants":65,"./zlib/gzheader":68,"./zlib/inflate":70,"./zlib/messages":72,"./zlib/zstream":74}],62:[function(a,b,c){"use strict";var d="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;c.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a},c.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var e={arraySet:function(a,b,c,d,e){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),e);for(var f=0;f=252?6:j>=248?5:j>=240?4:j>=224?3:j>=192?2:1;i[254]=i[254]=1,c.string2buf=function(a){var b,c,d,f,g,h=a.length,i=0;for(f=0;f>>6,b[g++]=128|63&c):c<65536?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b},c.buf2binstring=function(a){return d(a,a.length)},c.binstring2buf=function(a){for(var b=new e.Buf8(a.length),c=0,d=b.length;c4)j[e++]=65533,c+=g-1;else{for(f&=2===g?31:3===g?15:7;g>1&&c1?j[e++]=65533:f<65536?j[e++]=f:(f-=65536,j[e++]=55296|f>>10&1023,j[e++]=56320|1023&f)}return d(j,e)},c.utf8border=function(a,b){var c;for(b=b||a.length,b>a.length&&(b=a.length),c=b-1;c>=0&&128===(192&a[c]);)c--;return c<0?b:0===c?b:c+i[a[c]]>b?c:b}},{"./common":62}],64:[function(a,b,c){"use strict";function d(a,b,c,d){for(var e=65535&a|0,f=a>>>16&65535|0,g=0;0!==c;){g=c>2e3?2e3:c,c-=g;do e=e+b[d++]|0,f=f+e|0;while(--g);e%=65521,f%=65521}return e|f<<16|0}b.exports=d},{}],65:[function(a,b,c){"use strict";b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],66:[function(a,b,c){"use strict";function d(){ +for(var a,b=[],c=0;c<256;c++){a=c;for(var d=0;d<8;d++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}function e(a,b,c,d){var e=f,g=d+c;a^=-1;for(var h=d;h>>8^e[255&(a^b[h])];return a^-1}var f=d();b.exports=e},{}],67:[function(a,b,c){"use strict";function d(a,b){return a.msg=I[b],b}function e(a){return(a<<1)-(a>4?9:0)}function f(a){for(var b=a.length;--b>=0;)a[b]=0}function g(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out),0!==c&&(E.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&(b.pending_out=0))}function h(a,b){F._tr_flush_block(a,a.block_start>=0?a.block_start:-1,a.strstart-a.block_start,b),a.block_start=a.strstart,g(a.strm)}function i(a,b){a.pending_buf[a.pending++]=b}function j(a,b){a.pending_buf[a.pending++]=b>>>8&255,a.pending_buf[a.pending++]=255&b}function k(a,b,c,d){var e=a.avail_in;return e>d&&(e=d),0===e?0:(a.avail_in-=e,E.arraySet(b,a.input,a.next_in,e,c),1===a.state.wrap?a.adler=G(a.adler,b,e,c):2===a.state.wrap&&(a.adler=H(a.adler,b,e,c)),a.next_in+=e,a.total_in+=e,e)}function l(a,b){var c,d,e=a.max_chain_length,f=a.strstart,g=a.prev_length,h=a.nice_match,i=a.strstart>a.w_size-la?a.strstart-(a.w_size-la):0,j=a.window,k=a.w_mask,l=a.prev,m=a.strstart+ka,n=j[f+g-1],o=j[f+g];a.prev_length>=a.good_match&&(e>>=2),h>a.lookahead&&(h=a.lookahead);do if(c=b,j[c+g]===o&&j[c+g-1]===n&&j[c]===j[f]&&j[++c]===j[f+1]){f+=2,c++;do;while(j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&j[++f]===j[++c]&&fg){if(a.match_start=b,g=d,d>=h)break;n=j[f+g-1],o=j[f+g]}}while((b=l[b&k])>i&&0!==--e);return g<=a.lookahead?g:a.lookahead}function m(a){var b,c,d,e,f,g=a.w_size;do{if(e=a.window_size-a.lookahead-a.strstart,a.strstart>=g+(g-la)){E.arraySet(a.window,a.window,g,g,0),a.match_start-=g,a.strstart-=g,a.block_start-=g,c=a.hash_size,b=c;do d=a.head[--b],a.head[b]=d>=g?d-g:0;while(--c);c=g,b=c;do d=a.prev[--b],a.prev[b]=d>=g?d-g:0;while(--c);e+=g}if(0===a.strm.avail_in)break;if(c=k(a.strm,a.window,a.strstart+a.lookahead,e),a.lookahead+=c,a.lookahead+a.insert>=ja)for(f=a.strstart-a.insert,a.ins_h=a.window[f],a.ins_h=(a.ins_h<a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(a.lookahead<=1){if(m(a),0===a.lookahead&&b===J)return ua;if(0===a.lookahead)break}a.strstart+=a.lookahead,a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,h(a,!1),0===a.strm.avail_out))return ua;if(a.strstart-a.block_start>=a.w_size-la&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.strstart>a.block_start&&(h(a,!1),0===a.strm.avail_out)?ua:ua}function o(a,b){for(var c,d;;){if(a.lookahead=ja&&(a.ins_h=(a.ins_h<=ja)if(d=F._tr_tally(a,a.strstart-a.match_start,a.match_length-ja),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=ja){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<=ja&&(a.ins_h=(a.ins_h<4096)&&(a.match_length=ja-1)),a.prev_length>=ja&&a.match_length<=a.prev_length){e=a.strstart+a.lookahead-ja,d=F._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-ja),a.lookahead-=a.prev_length-1,a.prev_length-=2;do++a.strstart<=e&&(a.ins_h=(a.ins_h<=ja&&a.strstart>0&&(e=a.strstart-1,d=g[e],d===g[++e]&&d===g[++e]&&d===g[++e])){f=a.strstart+ka;do;while(d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&d===g[++e]&&ea.lookahead&&(a.match_length=a.lookahead)}if(a.match_length>=ja?(c=F._tr_tally(a,1,a.match_length-ja),a.lookahead-=a.match_length,a.strstart+=a.match_length,a.match_length=0):(c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++),c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function r(a,b){for(var c;;){if(0===a.lookahead&&(m(a),0===a.lookahead)){if(b===J)return ua;break}if(a.match_length=0,c=F._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++,c&&(h(a,!1),0===a.strm.avail_out))return ua}return a.insert=0,b===M?(h(a,!0),0===a.strm.avail_out?wa:xa):a.last_lit&&(h(a,!1),0===a.strm.avail_out)?ua:va}function s(a,b,c,d,e){this.good_length=a,this.max_lazy=b,this.nice_length=c,this.max_chain=d,this.func=e}function t(a){a.window_size=2*a.w_size,f(a.head),a.max_lazy_match=D[a.level].max_lazy,a.good_match=D[a.level].good_length,a.nice_match=D[a.level].nice_length,a.max_chain_length=D[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=ja-1,a.match_available=0,a.ins_h=0}function u(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=$,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new E.Buf16(2*ha),this.dyn_dtree=new E.Buf16(2*(2*fa+1)),this.bl_tree=new E.Buf16(2*(2*ga+1)),f(this.dyn_ltree),f(this.dyn_dtree),f(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new E.Buf16(ia+1),this.heap=new E.Buf16(2*ea+1),f(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new E.Buf16(2*ea+1),f(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function v(a){var b;return a&&a.state?(a.total_in=a.total_out=0,a.data_type=Z,b=a.state,b.pending=0,b.pending_out=0,b.wrap<0&&(b.wrap=-b.wrap),b.status=b.wrap?na:sa,a.adler=2===b.wrap?0:1,b.last_flush=J,F._tr_init(b),O):d(a,Q)}function w(a){var b=v(a);return b===O&&t(a.state),b}function x(a,b){return a&&a.state?2!==a.state.wrap?Q:(a.state.gzhead=b,O):Q}function y(a,b,c,e,f,g){if(!a)return Q;var h=1;if(b===T&&(b=6),e<0?(h=0,e=-e):e>15&&(h=2,e-=16),f<1||f>_||c!==$||e<8||e>15||b<0||b>9||g<0||g>X)return d(a,Q);8===e&&(e=9);var i=new u;return a.state=i,i.strm=a,i.wrap=h,i.gzhead=null,i.w_bits=e,i.w_size=1<N||b<0)return a?d(a,Q):Q;if(h=a.state,!a.output||!a.input&&0!==a.avail_in||h.status===ta&&b!==M)return d(a,0===a.avail_out?S:Q);if(h.strm=a,c=h.last_flush,h.last_flush=b,h.status===na)if(2===h.wrap)a.adler=0,i(h,31),i(h,139),i(h,8),h.gzhead?(i(h,(h.gzhead.text?1:0)+(h.gzhead.hcrc?2:0)+(h.gzhead.extra?4:0)+(h.gzhead.name?8:0)+(h.gzhead.comment?16:0)),i(h,255&h.gzhead.time),i(h,h.gzhead.time>>8&255),i(h,h.gzhead.time>>16&255),i(h,h.gzhead.time>>24&255),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,255&h.gzhead.os),h.gzhead.extra&&h.gzhead.extra.length&&(i(h,255&h.gzhead.extra.length),i(h,h.gzhead.extra.length>>8&255)),h.gzhead.hcrc&&(a.adler=H(a.adler,h.pending_buf,h.pending,0)),h.gzindex=0,h.status=oa):(i(h,0),i(h,0),i(h,0),i(h,0),i(h,0),i(h,9===h.level?2:h.strategy>=V||h.level<2?4:0),i(h,ya),h.status=sa);else{var m=$+(h.w_bits-8<<4)<<8,n=-1;n=h.strategy>=V||h.level<2?0:h.level<6?1:6===h.level?2:3,m|=n<<6,0!==h.strstart&&(m|=ma),m+=31-m%31,h.status=sa,j(h,m),0!==h.strstart&&(j(h,a.adler>>>16),j(h,65535&a.adler)),a.adler=1}if(h.status===oa)if(h.gzhead.extra){for(k=h.pending;h.gzindex<(65535&h.gzhead.extra.length)&&(h.pending!==h.pending_buf_size||(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending!==h.pending_buf_size));)i(h,255&h.gzhead.extra[h.gzindex]),h.gzindex++;h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),h.gzindex===h.gzhead.extra.length&&(h.gzindex=0,h.status=pa)}else h.status=pa;if(h.status===pa)if(h.gzhead.name){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.gzindex=0,h.status=qa)}else h.status=qa;if(h.status===qa)if(h.gzhead.comment){k=h.pending;do{if(h.pending===h.pending_buf_size&&(h.gzhead.hcrc&&h.pending>k&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),g(a),k=h.pending,h.pending===h.pending_buf_size)){l=1;break}l=h.gzindexk&&(a.adler=H(a.adler,h.pending_buf,h.pending-k,k)),0===l&&(h.status=ra)}else h.status=ra;if(h.status===ra&&(h.gzhead.hcrc?(h.pending+2>h.pending_buf_size&&g(a),h.pending+2<=h.pending_buf_size&&(i(h,255&a.adler),i(h,a.adler>>8&255),a.adler=0,h.status=sa)):h.status=sa),0!==h.pending){if(g(a),0===a.avail_out)return h.last_flush=-1,O}else if(0===a.avail_in&&e(b)<=e(c)&&b!==M)return d(a,S);if(h.status===ta&&0!==a.avail_in)return d(a,S);if(0!==a.avail_in||0!==h.lookahead||b!==J&&h.status!==ta){var o=h.strategy===V?r(h,b):h.strategy===W?q(h,b):D[h.level].func(h,b);if(o!==wa&&o!==xa||(h.status=ta),o===ua||o===wa)return 0===a.avail_out&&(h.last_flush=-1),O;if(o===va&&(b===K?F._tr_align(h):b!==N&&(F._tr_stored_block(h,0,0,!1),b===L&&(f(h.head),0===h.lookahead&&(h.strstart=0,h.block_start=0,h.insert=0))),g(a),0===a.avail_out))return h.last_flush=-1,O}return b!==M?O:h.wrap<=0?P:(2===h.wrap?(i(h,255&a.adler),i(h,a.adler>>8&255),i(h,a.adler>>16&255),i(h,a.adler>>24&255),i(h,255&a.total_in),i(h,a.total_in>>8&255),i(h,a.total_in>>16&255),i(h,a.total_in>>24&255)):(j(h,a.adler>>>16),j(h,65535&a.adler)),g(a),h.wrap>0&&(h.wrap=-h.wrap),0!==h.pending?O:P)}function B(a){var b;return a&&a.state?(b=a.state.status,b!==na&&b!==oa&&b!==pa&&b!==qa&&b!==ra&&b!==sa&&b!==ta?d(a,Q):(a.state=null,b===sa?d(a,R):O)):Q}function C(a,b){var c,d,e,g,h,i,j,k,l=b.length;if(!a||!a.state)return Q;if(c=a.state,g=c.wrap,2===g||1===g&&c.status!==na||c.lookahead)return Q;for(1===g&&(a.adler=G(a.adler,b,l,0)),c.wrap=0,l>=c.w_size&&(0===g&&(f(c.head),c.strstart=0,c.block_start=0,c.insert=0),k=new E.Buf8(c.w_size),E.arraySet(k,b,l-c.w_size,c.w_size,0),b=k,l=c.w_size),h=a.avail_in,i=a.next_in,j=a.input,a.avail_in=l,a.next_in=0,a.input=b,m(c);c.lookahead>=ja;){d=c.strstart,e=c.lookahead-(ja-1);do c.ins_h=(c.ins_h<>>24,p>>>=w,q-=w,w=v>>>16&255,0===w)C[h++]=65535&v;else{if(!(16&w)){if(0===(64&w)){v=r[(65535&v)+(p&(1<>>=w,q-=w),q<15&&(p+=B[f++]<>>24,p>>>=w,q-=w,w=v>>>16&255,!(16&w)){if(0===(64&w)){v=s[(65535&v)+(p&(1<k){a.msg="invalid distance too far back",c.mode=d;break a}if(p>>>=w,q-=w,w=h-i,y>w){if(w=y-w,w>m&&c.sane){a.msg="invalid distance too far back",c.mode=d;break a}if(z=0,A=o,0===n){if(z+=l-w,w2;)C[h++]=A[z++],C[h++]=A[z++],C[h++]=A[z++],x-=3;x&&(C[h++]=A[z++],x>1&&(C[h++]=A[z++]))}else{z=h-y;do C[h++]=C[z++],C[h++]=C[z++],C[h++]=C[z++],x-=3;while(x>2);x&&(C[h++]=C[z++],x>1&&(C[h++]=C[z++]))}break}}break}}while(f>3,f-=x,q-=x<<3,p&=(1<>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function e(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new s.Buf16(320),this.work=new s.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function f(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=L,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=0,b.bits=0,b.lencode=b.lendyn=new s.Buf32(pa),b.distcode=b.distdyn=new s.Buf32(qa),b.sane=1,b.back=-1,D):G}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,f(a)):G}function h(a,b){var c,d;return a&&a.state?(d=a.state,b<0?(c=0,b=-b):(c=(b>>4)+1,b<48&&(b&=15)),b&&(b<8||b>15)?G:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):G}function i(a,b){var c,d;return a?(d=new e,a.state=d,d.window=null,c=h(a,b),c!==D&&(a.state=null),c):G}function j(a){return i(a,sa)}function k(a){if(ta){var b;for(q=new s.Buf32(512),r=new s.Buf32(32),b=0;b<144;)a.lens[b++]=8;for(;b<256;)a.lens[b++]=9;for(;b<280;)a.lens[b++]=7;for(;b<288;)a.lens[b++]=8;for(w(y,a.lens,0,288,q,0,a.work,{bits:9}),b=0;b<32;)a.lens[b++]=5;w(z,a.lens,0,32,r,0,a.work,{bits:5}),ta=!1}a.lencode=q,a.lenbits=9,a.distcode=r,a.distbits=5}function l(a,b,c,d){var e,f=a.state;return null===f.window&&(f.wsize=1<=f.wsize?(s.arraySet(f.window,b,c-f.wsize,f.wsize,0),f.wnext=0,f.whave=f.wsize):(e=f.wsize-f.wnext,e>d&&(e=d),s.arraySet(f.window,b,c-d,e,f.wnext),d-=e,d?(s.arraySet(f.window,b,c-d,d,0),f.wnext=d,f.whave=f.wsize):(f.wnext+=e,f.wnext===f.wsize&&(f.wnext=0),f.whave>>8&255,c.check=u(c.check,Ba,2,0),m=0,n=0,c.mode=M;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&m)<<8)+(m>>8))%31){a.msg="incorrect header check",c.mode=ma;break}if((15&m)!==K){a.msg="unknown compression method",c.mode=ma;break}if(m>>>=4,n-=4,wa=(15&m)+8,0===c.wbits)c.wbits=wa;else if(wa>c.wbits){a.msg="invalid window size",c.mode=ma;break}c.dmax=1<>8&1),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=N;case N:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<>>8&255,Ba[2]=m>>>16&255,Ba[3]=m>>>24&255,c.check=u(c.check,Ba,4,0)),m=0,n=0,c.mode=O;case O:for(;n<16;){if(0===i)break a;i--,m+=e[g++]<>8),512&c.flags&&(Ba[0]=255&m,Ba[1]=m>>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0,c.mode=P;case P:if(1024&c.flags){for(;n<16;){if(0===i)break a;i--,m+=e[g++]<>>8&255,c.check=u(c.check,Ba,2,0)),m=0,n=0}else c.head&&(c.head.extra=null);c.mode=Q;case Q:if(1024&c.flags&&(q=c.length,q>i&&(q=i),q&&(c.head&&(wa=c.head.extra_len-c.length,c.head.extra||(c.head.extra=new Array(c.head.extra_len)),s.arraySet(c.head.extra,e,g,q,wa)),512&c.flags&&(c.check=u(c.check,e,q,g)),i-=q,g+=q,c.length-=q),c.length))break a;c.length=0,c.mode=R;case R:if(2048&c.flags){if(0===i)break a;q=0;do wa=e[g+q++],c.head&&wa&&c.length<65536&&(c.head.name+=String.fromCharCode(wa));while(wa&&q>9&1,c.head.done=!0),a.adler=c.check=0,c.mode=W;break;case U:for(;n<32;){if(0===i)break a;i--,m+=e[g++]<>>=7&n,n-=7&n,c.mode=ja;break}for(;n<3;){if(0===i)break a;i--,m+=e[g++]<>>=1,n-=1,3&m){case 0:c.mode=Y;break;case 1:if(k(c),c.mode=ca,b===C){m>>>=2,n-=2;break a}break;case 2:c.mode=_;break;case 3:a.msg="invalid block type",c.mode=ma}m>>>=2,n-=2;break;case Y:for(m>>>=7&n,n-=7&n;n<32;){if(0===i)break a;i--,m+=e[g++]<>>16^65535)){a.msg="invalid stored block lengths",c.mode=ma;break}if(c.length=65535&m,m=0,n=0,c.mode=Z,b===C)break a;case Z:c.mode=$;case $:if(q=c.length){if(q>i&&(q=i),q>j&&(q=j),0===q)break a;s.arraySet(f,e,g,q,h),i-=q,g+=q,j-=q,h+=q,c.length-=q;break}c.mode=W;break;case _:for(;n<14;){if(0===i)break a;i--,m+=e[g++]<>>=5,n-=5,c.ndist=(31&m)+1,m>>>=5,n-=5,c.ncode=(15&m)+4,m>>>=4,n-=4,c.nlen>286||c.ndist>30){a.msg="too many length or distance symbols",c.mode=ma;break}c.have=0,c.mode=aa;case aa:for(;c.have>>=3,n-=3}for(;c.have<19;)c.lens[Ca[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,ya={bits:c.lenbits},xa=w(x,c.lens,0,19,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg="invalid code lengths set",c.mode=ma;break}c.have=0,c.mode=ba;case ba:for(;c.have>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=qa,n-=qa,c.lens[c.have++]=sa;else{if(16===sa){for(za=qa+2;n>>=qa,n-=qa,0===c.have){a.msg="invalid bit length repeat",c.mode=ma;break}wa=c.lens[c.have-1],q=3+(3&m),m>>>=2,n-=2}else if(17===sa){for(za=qa+3;n>>=qa,n-=qa,wa=0,q=3+(7&m),m>>>=3,n-=3}else{for(za=qa+7;n>>=qa,n-=qa,wa=0,q=11+(127&m),m>>>=7,n-=7}if(c.have+q>c.nlen+c.ndist){a.msg="invalid bit length repeat",c.mode=ma;break}for(;q--;)c.lens[c.have++]=wa}}if(c.mode===ma)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block",c.mode=ma;break}if(c.lenbits=9,ya={bits:c.lenbits},xa=w(y,c.lens,0,c.nlen,c.lencode,0,c.work,ya),c.lenbits=ya.bits,xa){a.msg="invalid literal/lengths set",c.mode=ma;break}if(c.distbits=6,c.distcode=c.distdyn,ya={bits:c.distbits},xa=w(z,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,ya),c.distbits=ya.bits,xa){a.msg="invalid distances set",c.mode=ma;break}if(c.mode=ca,b===C)break a;case ca:c.mode=da;case da:if(i>=6&&j>=258){a.next_out=h,a.avail_out=j,a.next_in=g,a.avail_in=i,c.hold=m,c.bits=n,v(a,p),h=a.next_out,f=a.output,j=a.avail_out,g=a.next_in,e=a.input,i=a.avail_in,m=c.hold,n=c.bits,c.mode===W&&(c.back=-1);break}for(c.back=0;Aa=c.lencode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,c.length=sa,0===ra){c.mode=ia;break}if(32&ra){c.back=-1,c.mode=W;break}if(64&ra){a.msg="invalid literal/length code",c.mode=ma;break}c.extra=15&ra,c.mode=ea;case ea:if(c.extra){for(za=c.extra;n>>=c.extra,n-=c.extra,c.back+=c.extra}c.was=c.length,c.mode=fa;case fa:for(;Aa=c.distcode[m&(1<>>24,ra=Aa>>>16&255,sa=65535&Aa,!(qa<=n);){if(0===i)break a;i--,m+=e[g++]<>ta)],qa=Aa>>>24,ra=Aa>>>16&255,sa=65535&Aa,!(ta+qa<=n);){if(0===i)break a;i--,m+=e[g++]<>>=ta,n-=ta,c.back+=ta}if(m>>>=qa,n-=qa,c.back+=qa,64&ra){a.msg="invalid distance code",c.mode=ma;break}c.offset=sa,c.extra=15&ra,c.mode=ga;case ga:if(c.extra){for(za=c.extra;n>>=c.extra,n-=c.extra,c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back",c.mode=ma;break}c.mode=ha;case ha:if(0===j)break a;if(q=p-j,c.offset>q){if(q=c.offset-q,q>c.whave&&c.sane){a.msg="invalid distance too far back",c.mode=ma;break}q>c.wnext?(q-=c.wnext,r=c.wsize-q):r=c.wnext-q,q>c.length&&(q=c.length),pa=c.window}else pa=f,r=h-c.offset,q=c.length;q>j&&(q=j),j-=q,c.length-=q;do f[h++]=pa[r++];while(--q);0===c.length&&(c.mode=da);break;case ia:if(0===j)break a;f[h++]=c.length,j--,c.mode=da;break;case ja:if(c.wrap){for(;n<32;){if(0===i)break a;i--,m|=e[g++]<=1&&0===P[G];G--);if(H>G&&(H=G),0===G)return p[q++]=20971520,p[q++]=20971520,s.bits=1,0;for(F=1;F0&&(a===h||1!==G))return-1;for(Q[1]=0,D=1;Df||a===j&&L>g)return 1;for(var T=0;;){T++,z=D-J,r[E]y?(A=R[S+r[E]],B=N[O+r[E]]):(A=96,B=0),t=1<>J)+u]=z<<24|A<<16|B|0;while(0!==u);for(t=1<>=1;if(0!==t?(M&=t-1,M+=t):M=0,E++,0===--P[D]){if(D===G)break;D=b[c+r[E]]}if(D>H&&(M&w)!==v){for(0===J&&(J=H),x+=F,I=D-J,K=1<f||a===j&&L>g)return 1;v=M&w,p[v]=H<<24|I<<16|x-q|0}}return 0!==M&&(p[x+M]=D-J<<24|64<<16|0),s.bits=H,0}},{"../utils/common":62}],72:[function(a,b,c){"use strict";b.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],73:[function(a,b,c){"use strict";function d(a){for(var b=a.length;--b>=0;)a[b]=0}function e(a,b,c,d,e){this.static_tree=a,this.extra_bits=b,this.extra_base=c,this.elems=d,this.max_length=e,this.has_stree=a&&a.length}function f(a,b){this.dyn_tree=a,this.max_code=0,this.stat_desc=b}function g(a){return a<256?ia[a]:ia[256+(a>>>7)]}function h(a,b){a.pending_buf[a.pending++]=255&b,a.pending_buf[a.pending++]=b>>>8&255}function i(a,b,c){a.bi_valid>X-c?(a.bi_buf|=b<>X-a.bi_valid,a.bi_valid+=c-X):(a.bi_buf|=b<>>=1,c<<=1;while(--b>0);return c>>>1}function l(a){16===a.bi_valid?(h(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):a.bi_valid>=8&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}function m(a,b){var c,d,e,f,g,h,i=b.dyn_tree,j=b.max_code,k=b.stat_desc.static_tree,l=b.stat_desc.has_stree,m=b.stat_desc.extra_bits,n=b.stat_desc.extra_base,o=b.stat_desc.max_length,p=0;for(f=0;f<=W;f++)a.bl_count[f]=0;for(i[2*a.heap[a.heap_max]+1]=0,c=a.heap_max+1;co&&(f=o,p++),i[2*d+1]=f,d>j||(a.bl_count[f]++,g=0,d>=n&&(g=m[d-n]),h=i[2*d],a.opt_len+=h*(f+g),l&&(a.static_len+=h*(k[2*d+1]+g)));if(0!==p){do{for(f=o-1;0===a.bl_count[f];)f--;a.bl_count[f]--,a.bl_count[f+1]+=2,a.bl_count[o]--,p-=2}while(p>0);for(f=o;0!==f;f--)for(d=a.bl_count[f];0!==d;)e=a.heap[--c],e>j||(i[2*e+1]!==f&&(a.opt_len+=(f-i[2*e+1])*i[2*e],i[2*e+1]=f),d--)}}function n(a,b,c){var d,e,f=new Array(W+1),g=0; +for(d=1;d<=W;d++)f[d]=g=g+c[d-1]<<1;for(e=0;e<=b;e++){var h=a[2*e+1];0!==h&&(a[2*e]=k(f[h]++,h))}}function o(){var a,b,c,d,f,g=new Array(W+1);for(c=0,d=0;d>=7;d8?h(a,a.bi_buf):a.bi_valid>0&&(a.pending_buf[a.pending++]=a.bi_buf),a.bi_buf=0,a.bi_valid=0}function r(a,b,c,d){q(a),d&&(h(a,c),h(a,~c)),G.arraySet(a.pending_buf,a.window,b,c,a.pending),a.pending+=c}function s(a,b,c,d){var e=2*b,f=2*c;return a[e]>1;c>=1;c--)t(a,f,c);e=i;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],t(a,f,1),d=a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,f[2*e]=f[2*c]+f[2*d],a.depth[e]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,f[2*c+1]=f[2*d+1]=e,a.heap[1]=e++,t(a,f,1);while(a.heap_len>=2);a.heap[--a.heap_max]=a.heap[1],m(a,b),n(f,j,a.bl_count)}function w(a,b,c){var d,e,f=-1,g=b[1],h=0,i=7,j=4;for(0===g&&(i=138,j=3),b[2*(c+1)+1]=65535,d=0;d<=c;d++)e=g,g=b[2*(d+1)+1],++h=3&&0===a.bl_tree[2*ea[b]+1];b--);return a.opt_len+=3*(b+1)+5+5+4,b}function z(a,b,c,d){var e;for(i(a,b-257,5),i(a,c-1,5),i(a,d-4,4),e=0;e>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return I;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return J;for(b=32;b0?(a.strm.data_type===K&&(a.strm.data_type=A(a)),v(a,a.l_desc),v(a,a.d_desc),g=y(a),e=a.opt_len+3+7>>>3,f=a.static_len+3+7>>>3,f<=e&&(e=f)):e=f=c+5,c+4<=e&&b!==-1?C(a,b,c,d):a.strategy===H||f===e?(i(a,(M<<1)+(d?1:0),3),u(a,ga,ha)):(i(a,(N<<1)+(d?1:0),3),z(a,a.l_desc.max_code+1,a.d_desc.max_code+1,g+1),u(a,a.dyn_ltree,a.dyn_dtree)),p(a),d&&q(a)}function F(a,b,c){return a.pending_buf[a.d_buf+2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(ja[c]+R+1)]++,a.dyn_dtree[2*g(b)]++),a.last_lit===a.lit_bufsize-1}var G=a("../utils/common"),H=4,I=0,J=1,K=2,L=0,M=1,N=2,O=3,P=258,Q=29,R=256,S=R+1+Q,T=30,U=19,V=2*S+1,W=15,X=16,Y=7,Z=256,$=16,_=17,aa=18,ba=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],ca=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],da=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],ea=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],fa=512,ga=new Array(2*(S+2));d(ga);var ha=new Array(2*T);d(ha);var ia=new Array(fa);d(ia);var ja=new Array(P-O+1);d(ja);var ka=new Array(Q);d(ka);var la=new Array(T);d(la);var ma,na,oa,pa=!1;c._tr_init=B,c._tr_stored_block=C,c._tr_flush_block=E,c._tr_tally=F,c._tr_align=D},{"../utils/common":62}],74:[function(a,b,c){"use strict";function d(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}b.exports=d},{}]},{},[10])(10)});;/*global jIO, RSVP, Blob, JSZip */ +/*jslint nomen: true, indent: 2*/ + +/* + * Copyright 2016, Nexedi SA + * Released under the LGPL license. + * http://www.gnu.org/licenses/lgpl.html + */ + +// JIO ZipFile Storage Description : +// { +// type: "zipfile", +// file: {string, blob, array}, +// } +// You can get archived file by getAttachment("/", "/") + +(function (jIO, RSVP, JSZip) { + "use strict"; + + //if (JSZip.external.Promise !== RSVP.Promise) { + // JSZip.external.Promise = RSVP.Promise; + //} + + function loadZip(storage) { + if (!storage._error) { + if (storage._zip) { + return new RSVP.Queue() + .push(function () { + return storage._zip; + }); + } + return storage._unzip_queue; + } + throw storage._error; + } + + + function restrictDocumentId(id) { + if (id.indexOf("/") !== 0) { + throw new jIO.util.jIOError("id " + id + " is forbidden (no begin /)", + 400); + } + if (id.lastIndexOf("/") !== (id.length - 1) && id !== "") { + throw new jIO.util.jIOError("id " + id + " is forbidden (no end /)", + 400); + } + // remove started '/' + return id.slice(1); + } + + function restrictAttachmentId(id, name) { + if (name.indexOf("/") !== -1) { + throw new jIO.util.jIOError("attachment " + name + " is forbidden", + 400); + } + return id + name; + } + + /** + * The JIO Zip File Storage extension + * It allow to use existing or to create + * empty zipfile represented as jiostorage + * and to receive modified zip file after. + * + * @class ZipFileStorage + * @constructor + */ + function ZipFileStorage(spec) { + var storage = this, + zip = new JSZip(); + if (spec.file) { + this._unzip_queue = new RSVP.Queue() + .push(function () { + return zip.loadAsync(spec.file, { + createFolders: true, + checkCRC32: true + }); + }) + .push(function () { + storage._zip = zip; + return zip; + }, function (error) { + storage._error = error; + throw error; + }); + } else { + this._zip = zip; + } + } + + ZipFileStorage.prototype.put = function (id, param) { + id = restrictDocumentId(id); + if (Object.getOwnPropertyNames(param).length > 0) { + // Reject if param has some properties + throw new jIO.util.jIOError("Can not store properties: " + + Object.getOwnPropertyNames(param), 400); + } + return loadZip(this) + .push(function (zip) { + zip.folder(id); + return {}; + }); + }; + + ZipFileStorage.prototype.remove = function (id) { + id = restrictDocumentId(id); + return loadZip(this) + .push(function (zip) { + zip.remove(id); + return {}; + }); + }; + + ZipFileStorage.prototype.get = function (id) { + id = restrictDocumentId(id); + return loadZip(this) + .push(function (zip) { + if (id === "") { + return {}; + } + if (zip.files.hasOwnProperty(id) && zip.files[id].dir) { + return {}; + } + throw new jIO.util.jIOError("Cannot find document", 404); + }); + }; + + ZipFileStorage.prototype.hasCapacity = function (name) { + return (name === "list"); + }; + + ZipFileStorage.prototype.buildQuery = function () { + return loadZip(this) + .push(function (zip) { + var dirname, + dir_list = [{id: '/', value: {}}]; + for (dirname in zip.files) { + if (zip.files.hasOwnProperty(dirname)) { + if (zip.files[dirname].dir) { + dir_list.push({id: '/' + dirname, value: {}}); + } + } + } + return dir_list; + }); + }; + + ZipFileStorage.prototype.allAttachments = function (id) { + id = restrictDocumentId(id); + return loadZip(this) + .push(function (zip) { + var filename, + file, + attachments = {}, + relativePath; + if (id !== "" && !(zip.files.hasOwnProperty(id) && zip.files[id].dir)) { + throw new jIO.util.jIOError("Cannot find document", 404); + } + for (filename in zip.files) { + if (zip.files.hasOwnProperty(filename)) { + if (filename.slice(0, id.length) === id) { + file = zip.files[filename]; + if (!file.dir) { + relativePath = filename.slice( + id.length, + filename.length + ); + if (relativePath.indexOf('/') === -1) { + attachments[relativePath] = {}; + } + } + } + } + } + return attachments; + }); + }; + + + ZipFileStorage.prototype.putAttachment = function (id, name, blob) { + id = restrictDocumentId(id); + var attachId = restrictAttachmentId(id, name); + + return loadZip(this) + .push(function (zip) { + if (id !== "" && !(zip.files.hasOwnProperty(id) && zip.files[id].dir)) { + throw new jIO.util.jIOError("Cannot access subdocument", 404); + } + zip.file(attachId, blob); + return {}; + }); + }; + + ZipFileStorage.prototype.getAttachment = function (id, name) { + var archive_request = false, + attachId; + if (id === "/" && name === "/") { + archive_request = true; + } else { + id = restrictDocumentId(id); + attachId = restrictAttachmentId(id, name); + } + + return loadZip(this) + .push(function (zip) { + if (archive_request) { + return zip.generateAsync({type: "blob", + compression: "DEFLATE" + }); + } + if (id !== "" && !(zip.files.hasOwnProperty(id) && zip.files[id].dir)) { + throw new jIO.util.jIOError("Cannot find document", 404); + } + if (!(zip.files.hasOwnProperty(attachId) && !zip.files[attachId].dir)) { + throw new jIO.util.jIOError("Cannot find attachment: " + + '/' + id + " , " + name, + 404); + } + return zip.file(attachId).async('blob'); + }); + }; + + ZipFileStorage.prototype.removeAttachment = function (id, name) { + id = restrictDocumentId(id); + var attachId = restrictAttachmentId(id, name); + + return loadZip(this) + .push(function (zip) { + if (id !== "" && !(zip.files.hasOwnProperty(id) && zip.files[id].dir)) { + throw new jIO.util.jIOError("Cannot find document", 404); + } + if (!(zip.files.hasOwnProperty(attachId) && !zip.files[attachId].dir)) { + throw new jIO.util.jIOError("Cannot find attachment: " + + '/' + id + " , " + name, + 404); + } + zip.remove(attachId); + return {}; + }); + }; + + jIO.addStorage('zipfile', ZipFileStorage); + +}(jIO, RSVP, JSZip)); diff --git a/package.json b/package.json index a446475770315493ef93da2d5c9ac3084f89545f..b9c7624f86caca10ce283dc237148f10bd336857 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "grunt-contrib-watch": "~0.5.3", "grunt-jslint": "~1.0.0", "lz-string": "^1.4.4", + "jszip": "3.1.x", "sinon": "~1.7.3", "jison": "~0.4.16", "connect-livereload": "~0.3.0", diff --git a/src/jio.storage/zipfilestorage.js b/src/jio.storage/zipfilestorage.js new file mode 100644 index 0000000000000000000000000000000000000000..4c458555542f7a30bae780919e1f0089f5e2eeef --- /dev/null +++ b/src/jio.storage/zipfilestorage.js @@ -0,0 +1,244 @@ +/*global jIO, RSVP, Blob, JSZip */ +/*jslint nomen: true, indent: 2*/ + +/* + * Copyright 2016, Nexedi SA + * Released under the LGPL license. + * http://www.gnu.org/licenses/lgpl.html + */ + +// JIO ZipFile Storage Description : +// { +// type: "zipfile", +// file: {string, blob, array}, +// } +// You can get archived file by getAttachment("/", "/") + +(function (jIO, RSVP, JSZip) { + "use strict"; + + //if (JSZip.external.Promise !== RSVP.Promise) { + // JSZip.external.Promise = RSVP.Promise; + //} + + function loadZip(storage) { + if (!storage._error) { + if (storage._zip) { + return new RSVP.Queue() + .push(function () { + return storage._zip; + }); + } + return storage._unzip_queue; + } + throw storage._error; + } + + + function restrictDocumentId(id) { + if (id.indexOf("/") !== 0) { + throw new jIO.util.jIOError("id " + id + " is forbidden (no begin /)", + 400); + } + if (id.lastIndexOf("/") !== (id.length - 1) && id !== "") { + throw new jIO.util.jIOError("id " + id + " is forbidden (no end /)", + 400); + } + // remove started '/' + return id.slice(1); + } + + function restrictAttachmentId(id, name) { + if (name.indexOf("/") !== -1) { + throw new jIO.util.jIOError("attachment " + name + " is forbidden", + 400); + } + return id + name; + } + + /** + * The JIO Zip File Storage extension + * It allow to use existing or to create + * empty zipfile represented as jiostorage + * and to receive modified zip file after. + * + * @class ZipFileStorage + * @constructor + */ + function ZipFileStorage(spec) { + var storage = this, + zip = new JSZip(); + if (spec.file) { + this._unzip_queue = new RSVP.Queue() + .push(function () { + return zip.loadAsync(spec.file, { + createFolders: true, + checkCRC32: true + }); + }) + .push(function () { + storage._zip = zip; + return zip; + }, function (error) { + storage._error = error; + throw error; + }); + } else { + this._zip = zip; + } + } + + ZipFileStorage.prototype.put = function (id, param) { + id = restrictDocumentId(id); + if (Object.getOwnPropertyNames(param).length > 0) { + // Reject if param has some properties + throw new jIO.util.jIOError("Can not store properties: " + + Object.getOwnPropertyNames(param), 400); + } + return loadZip(this) + .push(function (zip) { + zip.folder(id); + return {}; + }); + }; + + ZipFileStorage.prototype.remove = function (id) { + id = restrictDocumentId(id); + return loadZip(this) + .push(function (zip) { + zip.remove(id); + return {}; + }); + }; + + ZipFileStorage.prototype.get = function (id) { + id = restrictDocumentId(id); + return loadZip(this) + .push(function (zip) { + if (id === "") { + return {}; + } + if (zip.files.hasOwnProperty(id) && zip.files[id].dir) { + return {}; + } + throw new jIO.util.jIOError("Cannot find document", 404); + }); + }; + + ZipFileStorage.prototype.hasCapacity = function (name) { + return (name === "list"); + }; + + ZipFileStorage.prototype.buildQuery = function () { + return loadZip(this) + .push(function (zip) { + var dirname, + dir_list = [{id: '/', value: {}}]; + for (dirname in zip.files) { + if (zip.files.hasOwnProperty(dirname)) { + if (zip.files[dirname].dir) { + dir_list.push({id: '/' + dirname, value: {}}); + } + } + } + return dir_list; + }); + }; + + ZipFileStorage.prototype.allAttachments = function (id) { + id = restrictDocumentId(id); + return loadZip(this) + .push(function (zip) { + var filename, + file, + attachments = {}, + relativePath; + if (id !== "" && !(zip.files.hasOwnProperty(id) && zip.files[id].dir)) { + throw new jIO.util.jIOError("Cannot find document", 404); + } + for (filename in zip.files) { + if (zip.files.hasOwnProperty(filename)) { + if (filename.slice(0, id.length) === id) { + file = zip.files[filename]; + if (!file.dir) { + relativePath = filename.slice( + id.length, + filename.length + ); + if (relativePath.indexOf('/') === -1) { + attachments[relativePath] = {}; + } + } + } + } + } + return attachments; + }); + }; + + + ZipFileStorage.prototype.putAttachment = function (id, name, blob) { + id = restrictDocumentId(id); + var attachId = restrictAttachmentId(id, name); + + return loadZip(this) + .push(function (zip) { + if (id !== "" && !(zip.files.hasOwnProperty(id) && zip.files[id].dir)) { + throw new jIO.util.jIOError("Cannot access subdocument", 404); + } + zip.file(attachId, blob); + return {}; + }); + }; + + ZipFileStorage.prototype.getAttachment = function (id, name) { + var archive_request = false, + attachId; + if (id === "/" && name === "/") { + archive_request = true; + } else { + id = restrictDocumentId(id); + attachId = restrictAttachmentId(id, name); + } + + return loadZip(this) + .push(function (zip) { + if (archive_request) { + return zip.generateAsync({type: "blob", + compression: "DEFLATE" + }); + } + if (id !== "" && !(zip.files.hasOwnProperty(id) && zip.files[id].dir)) { + throw new jIO.util.jIOError("Cannot find document", 404); + } + if (!(zip.files.hasOwnProperty(attachId) && !zip.files[attachId].dir)) { + throw new jIO.util.jIOError("Cannot find attachment: " + + '/' + id + " , " + name, + 404); + } + return zip.file(attachId).async('blob'); + }); + }; + + ZipFileStorage.prototype.removeAttachment = function (id, name) { + id = restrictDocumentId(id); + var attachId = restrictAttachmentId(id, name); + + return loadZip(this) + .push(function (zip) { + if (id !== "" && !(zip.files.hasOwnProperty(id) && zip.files[id].dir)) { + throw new jIO.util.jIOError("Cannot find document", 404); + } + if (!(zip.files.hasOwnProperty(attachId) && !zip.files[attachId].dir)) { + throw new jIO.util.jIOError("Cannot find attachment: " + + '/' + id + " , " + name, + 404); + } + zip.remove(attachId); + return {}; + }); + }; + + jIO.addStorage('zipfile', ZipFileStorage); + +}(jIO, RSVP, JSZip)); diff --git a/src/jio.storage/ziptodocuments.js b/src/jio.storage/ziptodocuments.js new file mode 100644 index 0000000000000000000000000000000000000000..1ef04cccdc5c10d2f0f33146dc80ce85742f7a92 --- /dev/null +++ b/src/jio.storage/ziptodocuments.js @@ -0,0 +1,268 @@ +/*jslint nomen: true*/ +/*global jIO, RSVP*/ +(function (jIO, RSVP) { + "use strict"; + + function decodeJsonPointer(_str) { + // https://tools.ietf.org/html/rfc6901#section-5 + return _str.replace(/~1/g, '/').replace(/~0/g, '~'); + } + + function encodeJsonPointer(_str) { + // https://tools.ietf.org/html/rfc6901#section-5 + return _str.replace(/~/g, '~0').replace(/\//g, '~1'); + } + + /** + * The jIO ZipToDocumentsBridgeStorage extension + * + * convert set of files provided zip container as + * documents contains metadata for files + * with attachment 'body' as file content + * + * @class ZipToDocumentsBridgeStorage + * @constructor + */ + function ZipToDocumentsBridgeStorage(spec) { + this._sub_storage = jIO.createJIO(spec.sub_storage); + if (spec.generateMetadata) { + this._generateMetadata = spec.generateMetadata; + } else { + throw new jIO.util.jIOError("Need specify generateMetadata function", + 400); + /** + * used for generate metadata for files + * based on extension and file content. + * used for determine supported or not + * supported file by return undefined. + * + * @function generateMetadata + */ + // example generateMetadata function + // function generateMetadata(id, filename, path, body) { + // var ret; + // if (endsWith(filename, ".json")) { + // ret = { + // id: id, + // content_type: "application/json", + // reference: path + // }; + // if (body) { + // if (body.$schema && body.$schema !== "") { + // ret.portal_type = "JSON Schema"; + // ret.parent_relative_url = "schema_module"; + // ret.title = body.title; + // } else { + // // XXX need schema relation property + // ret.portal_type = "JSON Document"; + // ret.parent_relative_url = "document_module"; + // ret.title = body.filename; + // } + // } else { + // ret.format = "json"; + // } + // // used for detect supported extension + // return ret; + // } + // } + } + } + + + ZipToDocumentsBridgeStorage.prototype.get = function (id) { + var context = this, + path = "/" + decodeJsonPointer(id), + idx = path.lastIndexOf('/') + 1, + filename = path.substring(idx), + dirname = path.substring(0, idx), + file_supported; + path = path.substring(1); + file_supported = context._generateMetadata(id, filename, path); + if (!file_supported) { + return new RSVP.Queue() + .push(function () { + throw new jIO.util.jIOError("Cannot find document " + id, + 404); + }); + } + return context._sub_storage.getAttachment(dirname, filename, + {format: file_supported.format} + ) + .push(undefined, function (error) { + if ((error instanceof jIO.util.jIOError) && + (error.status_code === 404)) { + throw new jIO.util.jIOError("Cannot find document " + id, + 404); + + } + throw error; + }) + .push(function (attachment) { + return context._generateMetadata(id, filename, path, attachment); + }); + }; + + ZipToDocumentsBridgeStorage.prototype.allAttachments = function (id) { + var context = this, + path = "/" + decodeJsonPointer(id), + idx = path.lastIndexOf('/') + 1, + filename = path.substring(idx), + dirname = path.substring(0, idx); + return context._sub_storage.getAttachment(dirname, filename) + .push(function () { + return {"data": {}}; + }, function (error) { + if ((error instanceof jIO.util.jIOError) && + (error.status_code === 404)) { + throw new jIO.util.jIOError("Cannot find document " + id, + 404); + } + throw error; + }); + }; + + ZipToDocumentsBridgeStorage.prototype.put = function (doc_id) { + // we can not save file metadata(document in upper storage) + // in zip so do nothing + return RSVP.Queue() + .push(function () { + return doc_id; + }); + }; + + ZipToDocumentsBridgeStorage.prototype.remove = function (id) { + var context = this, + path = "/" + decodeJsonPointer(id), + idx = path.lastIndexOf('/') + 1, + filename = path.substring(idx), + dirname = path.substring(0, idx); + return context._sub_storage.removeAttachment(dirname, filename) + .push(undefined, function (error) { + if ((error instanceof jIO.util.jIOError) && + (error.status_code === 404)) { + throw new jIO.util.jIOError("Cannot find document " + id, + 404); + } + throw error; + }); + + }; + + ZipToDocumentsBridgeStorage.prototype.hasCapacity = function (capacity) { + return ((capacity === "list") || (capacity === "include")); + }; + + ZipToDocumentsBridgeStorage.prototype.buildQuery = function (options) { + var result_dict = {}, + context = this; + return context._sub_storage.allDocs() + .push(function (result) { + var i, + id, + tasks = []; + + function push_doc(k, filename, path) { + return function (json) { + result_dict[k].doc = context._generateMetadata(k, filename, path, json); + }; + } + + function f(dirname) { + return function (dir) { + var k, + path, + filename, + attachment_tasks = []; + + for (filename in dir) { + if (dir.hasOwnProperty(filename)) { + path = dirname.substring(1) + filename; + k = encodeJsonPointer(dirname.substring(1) + filename); + // check file with extension supported + if (context._generateMetadata(k, filename, path)) { + result_dict[k] = { + id: k, + value: {} + }; + if (options.include_docs) { + attachment_tasks.push( + context._sub_storage.getAttachment(id, filename) + .push(push_doc(k, filename, path)) + ); + } + } + } + } + if (attachment_tasks.length > 0) { + return RSVP.all(attachment_tasks); + } + }; + } + + for (i = 0; i < result.data.rows.length; i += 1) { + id = result.data.rows[i].id; + tasks.push(context._sub_storage.allAttachments(id) + .push(f(id))); + } + return RSVP.all(tasks); + }) + .push(function () { + var result = [], + key; + for (key in result_dict) { + if (result_dict.hasOwnProperty(key)) { + result.push(result_dict[key]); + } + } + return result; + }); + }; + + ZipToDocumentsBridgeStorage.prototype.getAttachment = function (id, + name, + options) { + if (name !== "data") { + throw new jIO.util.jIOError("Only support 'data' attachment", + 400); + } + var path = "/" + decodeJsonPointer(id), + idx = path.lastIndexOf('/') + 1, + filename = path.substring(idx), + dirname = path.substring(0, idx); + + return this._sub_storage.getAttachment(dirname, filename, options); + }; + + ZipToDocumentsBridgeStorage.prototype.putAttachment = function (id, + name, + blob) { + if (name !== "data") { + throw new jIO.util.jIOError("Only support 'data' attachment", + 400); + } + + var path = "/" + decodeJsonPointer(id), + idx = path.lastIndexOf('/') + 1, + filename = path.substring(idx), + dirname = path.substring(0, idx); + return this._sub_storage.putAttachment(dirname, filename, blob); + }; + + ZipToDocumentsBridgeStorage.prototype.removeAttachment = function (id, + name) { + if (name !== "data") { + throw new jIO.util.jIOError("Only support 'data' attachment" + + " in document:" + id, + 400); + } + // document(metadata) with attachment === attachment in zip + // so we can do nothing + }; + + ZipToDocumentsBridgeStorage.prototype.repair = function () { + return this._sub_storage.repair.apply(this._sub_storage, arguments); + }; + + jIO.addStorage('ziptodocuments', ZipToDocumentsBridgeStorage); + +}(jIO, RSVP)); diff --git a/test/jio.storage/zipfilestorage.tests.js b/test/jio.storage/zipfilestorage.tests.js new file mode 100644 index 0000000000000000000000000000000000000000..1cbb90203edeb349c31e1336e03fe91032aa060b --- /dev/null +++ b/test/jio.storage/zipfilestorage.tests.js @@ -0,0 +1,918 @@ +/*jslint nomen: true */ +/*global jIO, QUnit, Blob, Uint8Array*/ +(function (jIO, QUnit, Blob, Uint8Array) { + "use strict"; + var test = QUnit.test, + stop = QUnit.stop, + start = QUnit.start, + ok = QUnit.ok, + expect = QUnit.expect, + deepEqual = QUnit.deepEqual, + equal = QUnit.equal, + module = QUnit.module, + /* + zip file created by + (echo '[';(echo 'data:application/zip;base64,' ; + cd zipfile ; zip -r - * | base64 -w 40) + |sed 's#$#",#' | sed 's#^#"#' ; echo ']') + zipfile contents: + /get1/ + /id1/ + /id2/ + /id2/attachment1 -- "foo\nbaré\n" + /id2/attachment2 -- "foo2\n" + */ + zipfile = jIO.util.dataURItoBlob([ + "data:application/zip;base64,", + "UEsDBAoAAAAAANOTc0kAAAAAAAAAAAAAAAAFABwA", + "Z2V0MS9VVAkAAx5wMFhVcDBYdXgLAAEE6AMAAATo", + "AwAAUEsDBAoAAAAAAJxxc0kAAAAAAAAAAAAAAAAE", + "ABwAaWQxL1VUCQADuDMwWI5fMFh1eAsAAQToAwAA", + "BOgDAABQSwMECgAAAAAAUJtzSQAAAAAAAAAAAAAA", + "AAQAHABpZDIvVVQJAAM3fTBYN30wWHV4CwABBOgD", + "AAAE6AMAAFBLAwQUAAgACABUm3NJAAAAAAAAAAAK", + "AAAADwAcAGlkMi9hdHRhY2htZW50MVVUCQADQH0w", + "WEV9MFh1eAsAAQToAwAABOgDAABLy8/nSkosOryS", + "CwBQSwcIceGzPQwAAAAKAAAAUEsDBBQACAAIAOqT", + "c0kAAAAAAAAAAAUAAAAPABwAaWQyL2F0dGFjaG1l", + "bnQyVVQJAANHcDBYVXAwWHV4CwABBOgDAAAE6AMA", + "AEvLzzfiAgBQSwcI16M7/QcAAAAFAAAAUEsBAh4D", + "CgAAAAAA05NzSQAAAAAAAAAAAAAAAAUAGAAAAAAA", + "AAAQAO1BAAAAAGdldDEvVVQFAAMecDBYdXgLAAEE", + "6AMAAAToAwAAUEsBAh4DCgAAAAAAnHFzSQAAAAAA", + "AAAAAAAAAAQAGAAAAAAAAAAQAO1BPwAAAGlkMS9V", + "VAUAA7gzMFh1eAsAAQToAwAABOgDAABQSwECHgMK", + "AAAAAABQm3NJAAAAAAAAAAAAAAAABAAYAAAAAAAA", + "ABAA7UF9AAAAaWQyL1VUBQADN30wWHV4CwABBOgD", + "AAAE6AMAAFBLAQIeAxQACAAIAFSbc0lx4bM9DAAA", + "AAoAAAAPABgAAAAAAAEAAACkgbsAAABpZDIvYXR0", + "YWNobWVudDFVVAUAA0B9MFh1eAsAAQToAwAABOgD", + "AABQSwECHgMUAAgACADqk3NJ16M7/QcAAAAFAAAA", + "DwAYAAAAAAABAAAApIEgAQAAaWQyL2F0dGFjaG1l", + "bnQyVVQFAANHcDBYdXgLAAEE6AMAAAToAwAAUEsF", + "BgAAAAAFAAUAiQEAAIABAAAAAA==" + ].join('')); + + ///////////////////////////////////////////////////////////////// + // zipFileStorage constructor + ///////////////////////////////////////////////////////////////// + module("zipFileStorage.constructor"); + + test("Storage ", function () { + var jio = jIO.createJIO({ + type: "zipfile" + }); + + equal(jio.__type, "zipfile"); + }); + + ///////////////////////////////////////////////////////////////// + // zipFileStorage.put + ///////////////////////////////////////////////////////////////// + module("zipFileStorage.put", { + setup: function () { + this.jio = jIO.createJIO({ + type: "zipfile" + }); + } + }); + + test("put document", function () { + var dir_name = 'put1/', + jio = this.jio; + stop(); + expect(2); + + jio.put('/put1/', {}) + .then(function () { + ok(jio.__storage._zip.files.hasOwnProperty(dir_name)); + ok(jio.__storage._zip.files[dir_name].dir); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("don't throw error when putting existing directory", function () { + stop(); + expect(1); + this.jio.put("/put1/", {}) + .then(function () { + ok(true); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject ID not starting with /", function () { + stop(); + expect(3); + + this.jio.put("put1/", {}) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id put1/ is forbidden (no begin /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject ID not ending with /", function () { + stop(); + expect(3); + + this.jio.put("/put1", {}) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id /put1 is forbidden (no end /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject to store any property", function () { + stop(); + expect(3); + + this.jio.put("/put1/", {title: "foo"}) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "Can not store properties: title"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + /////////////////////////////////////////////////////////////////// + //// zipFileStorage.remove + /////////////////////////////////////////////////////////////////// + module("zipFileStorage.remove", { + setup: function () { + this.jio = jIO.createJIO({ + type: "zipfile" + }); + } + }); + + test("remove document", function () { + var dir_name = "id1/", + jio = this.jio; + stop(); + expect(1); + + jio.remove("/" + dir_name) + .then(function () { + ok(!jio.__storage._zip.files.hasOwnProperty(dir_name)); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject ID not starting with /", function () { + stop(); + expect(3); + + this.jio.remove("remove1/") + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id remove1/ is forbidden (no begin /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject ID not ending with /", function () { + stop(); + expect(3); + + this.jio.remove("/remove1") + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id /remove1 is forbidden (no end /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + ///////////////////////////////////////////////////////////////// + // zipFileStorage.get + ///////////////////////////////////////////////////////////////// + module("zipFileStorage.get", { + setup: function () { + this.jio = jIO.createJIO({ + type: "zipfile", + file: zipfile + }); + } + }); + + test("reject ID not starting with /", function () { + stop(); + expect(3); + + this.jio.get("get1/") + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id get1/ is forbidden (no begin /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject ID not ending with /", function () { + stop(); + expect(3); + + this.jio.get("/get1") + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id /get1 is forbidden (no end /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("get inexistent document", function () { + stop(); + expect(3); + + this.jio.get("/inexistent/") + .then(function (data) { + ok(false, data); + }) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "Cannot find document"); + equal(error.status_code, 404); + }) + .always(function () { + start(); + }); + }); + + test("get document", function () { + var id = "/id1/"; + stop(); + expect(1); + + this.jio.get(id) + .then(function (result) { + deepEqual(result, {}, "Check document"); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + /////////////////////////////////////////////////////////////// + // zipFileStorage.putAttachment + ///////////////////////////////////////////////////////////////// + module("zipFileStorage.putAttachment", { + setup: function () { + this.jio = jIO.createJIO({ + type: "zipfile", + file: zipfile + }); + } + }); + + test("reject ID not starting with /", function () { + stop(); + expect(3); + + this.jio.putAttachment( + "putAttachment1/", + "attachment1", + new Blob([""]) + ) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id putAttachment1/ is forbidden (no begin /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject ID not ending with /", function () { + stop(); + expect(3); + + this.jio.putAttachment( + "/putAttachment1", + "attachment1", + new Blob([""]) + ) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id /putAttachment1 is forbidden (no end /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject attachment with / character", function () { + stop(); + expect(3); + + this.jio.putAttachment( + "/putAttachment1/", + "attach/ment1", + new Blob([""]) + ) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "attachment attach/ment1 is forbidden"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("putAttachment to inexisting directory: expecting a 404", function () { + var blob = new Blob(["foo"]); + stop(); + expect(3); + + this.jio.putAttachment( + "/inexistent_dir/", + "attachment1", + blob + ) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "Cannot access subdocument"); + equal(error.status_code, 404); + }) + .always(function () { + start(); + }); + }); + + + test("putAttachment document", function () { + var blob = new Blob(["foo"]), + jio = this.jio, + dir_name = 'id1/', + att_name = 'attachment1'; + stop(); + expect(2); + + jio.putAttachment( + "/" + dir_name, + "attachment1", + blob + ) + .then(function () { + var path_name = dir_name + att_name; + ok(jio.__storage._zip.files.hasOwnProperty(path_name)); + ok(!jio.__storage._zip.files[path_name].dir); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + /////////////////////////////////////////////////////////////////// + //// zipFileStorage.allAttachments + /////////////////////////////////////////////////////////////////// + module("zipFileStorage.allAttachments", { + setup: function () { + this.jio = jIO.createJIO({ + type: "zipfile", + file: zipfile + }); + } + }); + + test("reject ID not starting with /", function () { + stop(); + expect(3); + + this.jio.allAttachments("get1/") + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id get1/ is forbidden (no begin /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject ID not ending with /", function () { + stop(); + expect(3); + + this.jio.allAttachments("/get1") + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id /get1 is forbidden (no end /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("get inexistent document", function () { + stop(); + expect(3); + + this.jio.allAttachments("/inexistent/") + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "Cannot find document"); + equal(error.status_code, 404); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("get document without attachment", function () { + var id = "/id1/"; + stop(); + expect(1); + + this.jio.allAttachments(id) + .then(function (result) { + deepEqual(result, {}, "Check document"); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("get document with attachment", function () { + var id = "/id2/"; + stop(); + expect(1); + + this.jio.allAttachments(id) + .then(function (result) { + deepEqual(result, { + attachment1: {}, + attachment2: {} + }, "Check document"); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + ///////////////////////////////////////////////////////////////// + // zipFileStorage.getAttachment + ///////////////////////////////////////////////////////////////// + module("zipFileStorage.getAttachment", { + setup: function () { + this.jio = jIO.createJIO({ + type: "zipfile", + file: zipfile + }); + } + }); + + test("reject ID not starting with /", function () { + stop(); + expect(3); + + this.jio.getAttachment( + "getAttachment1/", + "attachment1" + ) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id getAttachment1/ is forbidden (no begin /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject ID not ending with /", function () { + stop(); + expect(3); + + this.jio.getAttachment( + "/getAttachment1", + "attachment1" + ) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id /getAttachment1 is forbidden (no end /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject attachment with / character", function () { + stop(); + expect(3); + + this.jio.getAttachment( + "/getAttachment1/", + "attach/ment1" + ) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "attachment attach/ment1 is forbidden"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("getAttachment document", function () { + stop(); + expect(3); + + this.jio.getAttachment( + "/id2/", + "attachment1" + ) + .then(function (result) { + ok(result instanceof Blob, "Data is Blob"); + deepEqual(result.type, "", "Check mimetype"); + return jIO.util.readBlobAsText(result); + }) + .then(function (result) { + equal(result.target.result, "foo\nbaré\n", + "Attachment correctly fetched"); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("get inexistent attachment", function () { + stop(); + expect(3); + + this.jio.getAttachment( + "/id2/", + "attachment3" + ) + .then(function () { + ok(false); + }) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "Cannot find attachment: /id2/ " + + ", attachment3"); + equal(error.status_code, 404); + }) + .always(function () { + start(); + }); + }); + + /////////////////////////////////////////////////////////////////// + //// zipFileStorage.removeAttachment + /////////////////////////////////////////////////////////////////// + module("zipFileStorage.removeAttachment", { + setup: function () { + this.jio = jIO.createJIO({ + type: "zipfile", + file: zipfile + }); + } + }); + + test("reject ID not starting with /", function () { + stop(); + expect(3); + + this.jio.removeAttachment( + "removeAttachment1/", + "attachment1" + ) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id removeAttachment1/ is forbidden (no begin /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject ID not ending with /", function () { + stop(); + expect(3); + + this.jio.removeAttachment( + "/removeAttachment1", + "attachment1" + ) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "id /removeAttachment1 is forbidden (no end /)"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("reject attachment with / character", function () { + stop(); + expect(3); + + this.jio.removeAttachment( + "/removeAttachment1/", + "attach/ment1" + ) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "attachment attach/ment1 is forbidden"); + equal(error.status_code, 400); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("removeAttachment document", function () { + var jio = this.jio, + dir_name = 'id2/', + att_name = 'attachment1', + path_name = dir_name + att_name; + stop(); + expect(1); + //ok(jio.__storage._zip.files.hasOwnProperty(path_name)); + //ok(!jio.__storage._zip.files[path_name].dir); + + this.jio.removeAttachment( + "/" + dir_name, + att_name + ) + .then(function () { + ok(!jio.__storage._zip.files.hasOwnProperty(path_name)); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("remove inexistent attachment", function () { + stop(); + expect(3); + + this.jio.removeAttachment( + "/id2/", + "attachment3" + ) + .then(function () { + ok(false); + }) + .fail(function (error) { + ok(error instanceof jIO.util.jIOError); + equal(error.message, "Cannot find attachment: /id2/ " + + ", attachment3"); + equal(error.status_code, 404); + }) + .always(function () { + start(); + }); + }); + + /////////////////////////////////////////////////////////////////// + //// zipFileStorage.createJIO from zipfile + /////////////////////////////////////////////////////////////////// + module("zipFileStorage.createJIO"); + + test("read zip archive from Array Buffer", function () { + var jio; + stop(); + expect(3); + jIO.util.readBlobAsArrayBuffer(zipfile) + .then(function (result) { + jio = jIO.createJIO({ + type: "zipfile", + file: result.target.result + }); + return jio.getAttachment('/id2/', 'attachment1'); + }) + .then(function (result) { + ok(result instanceof Blob, "Data is Blob"); + deepEqual(result.type, "", "Check mimetype"); + return jIO.util.readBlobAsText(result); + }) + .then(function (result) { + equal(result.target.result, "foo\nbaré\n", + "Attachment correctly fetched"); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + test("read zip archive from binary string", function () { + var jio; + stop(); + expect(3); + jIO.util.readBlobAsArrayBuffer(zipfile) + .then(function (result) { + jio = jIO.createJIO({ + type: "zipfile", + file: String.fromCharCode + .apply(null, new Uint8Array(result.target.result)) + }); + return jio.getAttachment('/id2/', 'attachment1'); + }) + .then(function (result) { + ok(result instanceof Blob, "Data is Blob"); + deepEqual(result.type, "", "Check mimetype"); + return jIO.util.readBlobAsText(result); + }) + .then(function (result) { + equal(result.target.result, "foo\nbaré\n", + "Attachment correctly fetched"); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + /////////////////////////////////////////////////////////////////// + //// zipFileStorage.getAttachment make zip archive + /////////////////////////////////////////////////////////////////// + module("zipFileStorage.getAttachment('/','/')", { + setup: function () { + this.jio = jIO.createJIO({ + type: "zipfile", + file: zipfile + }); + } + }); + + test("make zip archive", function () { + stop(); + expect(2); + this.jio.getAttachment('/', '/') + .then(function (result) { + ok(result instanceof Blob, "Data is Blob"); + deepEqual(result.type, "application/zip", "Check mimetype"); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + + ///////////////////////////////////////////////////////////////// + // zipFileStorage.allDocs + ///////////////////////////////////////////////////////////////// + module("zipFileStorage.allDocs", { + setup: function () { + this.jio = jIO.createJIO({ + type: "zipfile", + file: zipfile + }); + } + }); + + test("get all docs", function () { + var object_result = { + "data": { + "rows": [ + {"id": "/", "value": {}}, + {"id": "/get1/", "value": {}}, + {"id": "/id1/", "value": {}}, + {"id": "/id2/", "value": {}} + ], + "total_rows": 4 + } + }; + stop(); + expect(1); + this.jio.allDocs() + .then(function (res) { + deepEqual(res, object_result); + }) + .fail(function (error) { + ok(false, error); + }) + .always(function () { + start(); + }); + }); + +}(jIO, QUnit, Blob, Uint8Array)); diff --git a/test/tests.html b/test/tests.html index a1b4b765b6a5af4f746f6274b8d36b23a40de4e7..b0f59dcddc15793fa6625414e73789d01e883224 100644 --- a/test/tests.html +++ b/test/tests.html @@ -5,6 +5,7 @@ JIO Qunit/Sinon Unit Tests + @@ -46,6 +47,7 @@ +