exifr-npm-7.1.3-e3f1c7a57d 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353
  1. diff --git a/dist/mini.umd.js b/dist/mini.umd.js
  2. index 0c6655f1c7c8c133a74963019637a3b2c2db57df..e55d6c5522617e33494c6585e17a992493210dab 100644
  3. --- a/dist/mini.umd.js
  4. +++ b/dist/mini.umd.js
  5. @@ -1 +1,1328 @@
  6. -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define("exifr",["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).exifr={})}(this,(function(e){"use strict";function t(e,t,s){return t in e?Object.defineProperty(e,t,{value:s,enumerable:!0,configurable:!0,writable:!0}):e[t]=s,e}var s="undefined"!=typeof self?self:global;const i="undefined"!=typeof navigator,n=i&&"undefined"==typeof HTMLImageElement,r=!("undefined"==typeof global||"undefined"==typeof process||!process.versions||!process.versions.node),a=s.Buffer,h=!!a,f=e=>void 0!==e;function l(e){return void 0===e||(e instanceof Map?0===e.size:0===Object.values(e).filter(f).length)}function o(e){let t=new Error(e);throw delete t.stack,t}function u(e){let t=function(e){let t=0;return e.ifd0.enabled&&(t+=1024),e.exif.enabled&&(t+=2048),e.makerNote&&(t+=2048),e.userComment&&(t+=1024),e.gps.enabled&&(t+=512),e.interop.enabled&&(t+=100),e.ifd1.enabled&&(t+=1024),t+2048}(e);return e.jfif.enabled&&(t+=50),e.xmp.enabled&&(t+=2e4),e.iptc.enabled&&(t+=14e3),e.icc.enabled&&(t+=6e3),t}const d=e=>String.fromCharCode.apply(null,e),c="undefined"!=typeof TextDecoder?new TextDecoder("utf-8"):void 0;class p{static from(e,t){return e instanceof this&&e.le===t?e:new p(e,void 0,void 0,t)}constructor(e,t=0,s,i){if("boolean"==typeof i&&(this.le=i),Array.isArray(e)&&(e=new Uint8Array(e)),0===e)this.byteOffset=0,this.byteLength=0;else if(e instanceof ArrayBuffer){void 0===s&&(s=e.byteLength-t);let i=new DataView(e,t,s);this._swapDataView(i)}else if(e instanceof Uint8Array||e instanceof DataView||e instanceof p){void 0===s&&(s=e.byteLength-t),(t+=e.byteOffset)+s>e.byteOffset+e.byteLength&&o("Creating view outside of available memory in ArrayBuffer");let i=new DataView(e.buffer,t,s);this._swapDataView(i)}else if("number"==typeof e){let t=new DataView(new ArrayBuffer(e));this._swapDataView(t)}else o("Invalid input argument for BufferView: "+e)}_swapArrayBuffer(e){this._swapDataView(new DataView(e))}_swapBuffer(e){this._swapDataView(new DataView(e.buffer,e.byteOffset,e.byteLength))}_swapDataView(e){this.dataView=e,this.buffer=e.buffer,this.byteOffset=e.byteOffset,this.byteLength=e.byteLength}_lengthToEnd(e){return this.byteLength-e}set(e,t,s=p){return e instanceof DataView||e instanceof p?e=new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Uint8Array||o("BufferView.set(): Invalid data argument."),this.toUint8().set(e,t),new s(this,t,e.byteLength)}subarray(e,t){return t=t||this._lengthToEnd(e),new p(this,e,t)}toUint8(){return new Uint8Array(this.buffer,this.byteOffset,this.byteLength)}getUint8Array(e,t){return new Uint8Array(this.buffer,this.byteOffset+e,t)}getString(e=0,t=this.byteLength){let s=this.getUint8Array(e,t);return i=s,c?c.decode(i):h?Buffer.from(i).toString("utf8"):decodeURIComponent(escape(d(i)));var i}getLatin1String(e=0,t=this.byteLength){let s=this.getUint8Array(e,t);return d(s)}getUnicodeString(e=0,t=this.byteLength){const s=[];for(let i=0;i<t&&e+i<this.byteLength;i+=2)s.push(this.getUint16(e+i));return d(s)}getInt8(e){return this.dataView.getInt8(e)}getUint8(e){return this.dataView.getUint8(e)}getInt16(e,t=this.le){return this.dataView.getInt16(e,t)}getInt32(e,t=this.le){return this.dataView.getInt32(e,t)}getUint16(e,t=this.le){return this.dataView.getUint16(e,t)}getUint32(e,t=this.le){return this.dataView.getUint32(e,t)}getFloat32(e,t=this.le){return this.dataView.getFloat32(e,t)}getFloat64(e,t=this.le){return this.dataView.getFloat64(e,t)}getFloat(e,t=this.le){return this.dataView.getFloat32(e,t)}getDouble(e,t=this.le){return this.dataView.getFloat64(e,t)}getUintBytes(e,t,s){switch(t){case 1:return this.getUint8(e,s);case 2:return this.getUint16(e,s);case 4:return this.getUint32(e,s);case 8:return this.getUint64&&this.getUint64(e,s)}}getUint(e,t,s){switch(t){case 8:return this.getUint8(e,s);case 16:return this.getUint16(e,s);case 32:return this.getUint32(e,s);case 64:return this.getUint64&&this.getUint64(e,s)}}toString(e){return this.dataView.toString(e,this.constructor.name)}ensureChunk(){}}function g(e,t){o(`${e} '${t}' was not loaded, try using full build of exifr.`)}class m extends Map{constructor(e){super(),this.kind=e}get(e,t){return this.has(e)||g(this.kind,e),t&&(e in t||function(e,t){o(`Unknown ${e} '${t}'.`)}(this.kind,e),t[e].enabled||g(this.kind,e)),super.get(e)}keyList(){return Array.from(this.keys())}}var y=new m("file parser"),b=new m("segment parser"),w=new m("file reader");let k=s.fetch;const O="Invalid input argument";function v(e,t){return(s=e).startsWith("data:")||s.length>1e4?A(e,t,"base64"):r&&e.includes("://")?S(e,t,"url",U):r?A(e,t,"fs"):i?S(e,t,"url",U):void o(O);var s}async function S(e,t,s,i){return w.has(s)?A(e,t,s):i?async function(e,t){let s=await t(e);return new p(s)}(e,i):void o(`Parser ${s} is not loaded`)}async function A(e,t,s){let i=new(w.get(s))(e,t);return await i.read(),i}const U=e=>k(e).then((e=>e.arrayBuffer())),x=e=>new Promise(((t,s)=>{let i=new FileReader;i.onloadend=()=>t(i.result||new ArrayBuffer),i.onerror=s,i.readAsArrayBuffer(e)}));class C extends Map{get tagKeys(){return this.allKeys||(this.allKeys=Array.from(this.keys())),this.allKeys}get tagValues(){return this.allValues||(this.allValues=Array.from(this.values())),this.allValues}}function B(e,t,s){let i=new C;for(let[e,t]of s)i.set(e,t);if(Array.isArray(t))for(let s of t)e.set(s,i);else e.set(t,i);return i}function V(e,t,s){let i,n=e.get(t);for(i of s)n.set(i[0],i[1])}const I=new Map,L=new Map,T=new Map,P=37500,z=37510,F=33723,j=34675,E=34665,_=34853,D=40965,M=["chunked","firstChunkSize","firstChunkSizeNode","firstChunkSizeBrowser","chunkSize","chunkLimit"],N=["jfif","xmp","icc","iptc","ihdr"],R=["tiff",...N],$=["ifd0","ifd1","exif","gps","interop"],K=[...R,...$],W=["makerNote","userComment"],X=["translateKeys","translateValues","reviveValues","multiSegment"],H=[...X,"sanitize","mergeOutput","silentErrors"];class Y{get translate(){return this.translateKeys||this.translateValues||this.reviveValues}}class G extends Y{get needed(){return this.enabled||this.deps.size>0}constructor(e,s,i,n){if(super(),t(this,"enabled",!1),t(this,"skip",new Set),t(this,"pick",new Set),t(this,"deps",new Set),t(this,"translateKeys",!1),t(this,"translateValues",!1),t(this,"reviveValues",!1),this.key=e,this.enabled=s,this.parse=this.enabled,this.applyInheritables(n),this.canBeFiltered=$.includes(e),this.canBeFiltered&&(this.dict=I.get(e)),void 0!==i)if(Array.isArray(i))this.parse=this.enabled=!0,this.canBeFiltered&&i.length>0&&this.translateTagSet(i,this.pick);else if("object"==typeof i){if(this.enabled=!0,this.parse=!1!==i.parse,this.canBeFiltered){let{pick:e,skip:t}=i;e&&e.length>0&&this.translateTagSet(e,this.pick),t&&t.length>0&&this.translateTagSet(t,this.skip)}this.applyInheritables(i)}else!0===i||!1===i?this.parse=this.enabled=i:o(`Invalid options argument: ${i}`)}applyInheritables(e){let t,s;for(t of X)s=e[t],void 0!==s&&(this[t]=s)}translateTagSet(e,t){if(this.dict){let s,i,{tagKeys:n,tagValues:r}=this.dict;for(s of e)"string"==typeof s?(i=r.indexOf(s),-1===i&&(i=n.indexOf(Number(s))),-1!==i&&t.add(Number(n[i]))):t.add(s)}else for(let s of e)t.add(s)}finalizeFilters(){!this.enabled&&this.deps.size>0?(this.enabled=!0,te(this.pick,this.deps)):this.enabled&&this.pick.size>0&&te(this.pick,this.deps)}}var J={jfif:!1,tiff:!0,xmp:!1,icc:!1,iptc:!1,ifd0:!0,ifd1:!1,exif:!0,gps:!0,interop:!1,ihdr:void 0,makerNote:!1,userComment:!1,multiSegment:!1,skip:[],pick:[],translateKeys:!0,translateValues:!0,reviveValues:!0,sanitize:!0,mergeOutput:!0,silentErrors:!0,chunked:!0,firstChunkSize:void 0,firstChunkSizeNode:512,firstChunkSizeBrowser:65536,chunkSize:65536,chunkLimit:5},q=new Map;class Q extends Y{static useCached(e){let t=q.get(e);return void 0!==t||(t=new this(e),q.set(e,t)),t}constructor(e){super(),!0===e?this.setupFromTrue():void 0===e?this.setupFromUndefined():Array.isArray(e)?this.setupFromArray(e):"object"==typeof e?this.setupFromObject(e):o(`Invalid options argument ${e}`),void 0===this.firstChunkSize&&(this.firstChunkSize=i?this.firstChunkSizeBrowser:this.firstChunkSizeNode),this.mergeOutput&&(this.ifd1.enabled=!1),this.filterNestedSegmentTags(),this.traverseTiffDependencyTree(),this.checkLoadedPlugins()}setupFromUndefined(){let e;for(e of M)this[e]=J[e];for(e of H)this[e]=J[e];for(e of W)this[e]=J[e];for(e of K)this[e]=new G(e,J[e],void 0,this)}setupFromTrue(){let e;for(e of M)this[e]=J[e];for(e of H)this[e]=J[e];for(e of W)this[e]=!0;for(e of K)this[e]=new G(e,!0,void 0,this)}setupFromArray(e){let t;for(t of M)this[t]=J[t];for(t of H)this[t]=J[t];for(t of W)this[t]=J[t];for(t of K)this[t]=new G(t,!1,void 0,this);this.setupGlobalFilters(e,void 0,$)}setupFromObject(e){let t;for(t of($.ifd0=$.ifd0||$.image,$.ifd1=$.ifd1||$.thumbnail,Object.assign(this,e),M))this[t]=ee(e[t],J[t]);for(t of H)this[t]=ee(e[t],J[t]);for(t of W)this[t]=ee(e[t],J[t]);for(t of R)this[t]=new G(t,J[t],e[t],this);for(t of $)this[t]=new G(t,J[t],e[t],this.tiff);this.setupGlobalFilters(e.pick,e.skip,$,K),!0===e.tiff?this.batchEnableWithBool($,!0):!1===e.tiff?this.batchEnableWithUserValue($,e):Array.isArray(e.tiff)?this.setupGlobalFilters(e.tiff,void 0,$):"object"==typeof e.tiff&&this.setupGlobalFilters(e.tiff.pick,e.tiff.skip,$)}batchEnableWithBool(e,t){for(let s of e)this[s].enabled=t}batchEnableWithUserValue(e,t){for(let s of e){let e=t[s];this[s].enabled=!1!==e&&void 0!==e}}setupGlobalFilters(e,t,s,i=s){if(e&&e.length){for(let e of i)this[e].enabled=!1;let t=Z(e,s);for(let[e,s]of t)te(this[e].pick,s),this[e].enabled=!0}else if(t&&t.length){let e=Z(t,s);for(let[t,s]of e)te(this[t].skip,s)}}filterNestedSegmentTags(){let{ifd0:e,exif:t,xmp:s,iptc:i,icc:n}=this;this.makerNote?t.deps.add(P):t.skip.add(P),this.userComment?t.deps.add(z):t.skip.add(z),s.enabled||e.skip.add(700),i.enabled||e.skip.add(F),n.enabled||e.skip.add(j)}traverseTiffDependencyTree(){let{ifd0:e,exif:t,gps:s,interop:i}=this;i.needed&&(t.deps.add(D),e.deps.add(D)),t.needed&&e.deps.add(E),s.needed&&e.deps.add(_),this.tiff.enabled=$.some((e=>!0===this[e].enabled))||this.makerNote||this.userComment;for(let e of $)this[e].finalizeFilters()}get onlyTiff(){return!N.map((e=>this[e].enabled)).some((e=>!0===e))&&this.tiff.enabled}checkLoadedPlugins(){for(let e of R)this[e].enabled&&!b.has(e)&&g("segment parser",e)}}function Z(e,t){let s,i,n,r,a=[];for(n of t){for(r of(s=I.get(n),i=[],s))(e.includes(r[0])||e.includes(r[1]))&&i.push(r[0]);i.length&&a.push([n,i])}return a}function ee(e,t){return void 0!==e?e:void 0!==t?t:void 0}function te(e,t){for(let s of t)e.add(s)}t(Q,"default",J);class se{constructor(e){t(this,"parsers",{}),t(this,"output",{}),t(this,"errors",[]),t(this,"pushToErrors",(e=>this.errors.push(e))),this.options=Q.useCached(e)}async read(e){this.file=await function(e,t){return"string"==typeof e?v(e,t):i&&!n&&e instanceof HTMLImageElement?v(e.src,t):e instanceof Uint8Array||e instanceof ArrayBuffer||e instanceof DataView?new p(e):i&&e instanceof Blob?S(e,t,"blob",x):void o(O)}(e,this.options)}setup(){if(this.fileParser)return;let{file:e}=this,t=e.getUint16(0);for(let[s,i]of y)if(i.canHandle(e,t))return this.fileParser=new i(this.options,this.file,this.parsers),e[s]=!0;this.file.close&&this.file.close(),o("Unknown file format")}async parse(){let{output:e,errors:t}=this;return this.setup(),this.options.silentErrors?(await this.executeParsers().catch(this.pushToErrors),t.push(...this.fileParser.errors)):await this.executeParsers(),this.file.close&&this.file.close(),this.options.silentErrors&&t.length>0&&(e.errors=t),l(s=e)?void 0:s;var s}async executeParsers(){let{output:e}=this;await this.fileParser.parse();let t=Object.values(this.parsers).map((async t=>{let s=await t.parse();t.assignToOutput(e,s)}));this.options.silentErrors&&(t=t.map((e=>e.catch(this.pushToErrors)))),await Promise.all(t)}async extractThumbnail(){this.setup();let{options:e,file:t}=this,s=b.get("tiff",e);var i;if(t.tiff?i={start:0,type:"tiff"}:t.jpeg&&(i=await this.fileParser.getOrFindSegment("tiff")),void 0===i)return;let n=await this.fileParser.ensureSegmentChunk(i),r=this.parsers.tiff=new s(n,e,t),a=await r.extractThumbnail();return t.close&&t.close(),a}}async function ie(e,t){let s=new se(t);return await s.read(e),s.parse()}var ne=Object.freeze({__proto__:null,parse:ie,Exifr:se,fileParsers:y,segmentParsers:b,fileReaders:w,tagKeys:I,tagValues:L,tagRevivers:T,createDictionary:B,extendDictionary:V,fetchUrlAsArrayBuffer:U,readBlobAsArrayBuffer:x,chunkedProps:M,otherSegments:N,segments:R,tiffBlocks:$,segmentsAndBlocks:K,tiffExtractables:W,inheritables:X,allFormatters:H,Options:Q});class re{static findPosition(e,t){let s=e.getUint16(t+2)+2,i="function"==typeof this.headerLength?this.headerLength(e,t,s):this.headerLength,n=t+i,r=s-i;return{offset:t,length:s,headerLength:i,start:n,size:r,end:n+r}}static parse(e,t={}){return new this(e,new Q({[this.type]:t}),e).parse()}normalizeInput(e){return e instanceof p?e:new p(e)}constructor(e,s={},i){t(this,"errors",[]),t(this,"raw",new Map),t(this,"handleError",(e=>{if(!this.options.silentErrors)throw e;this.errors.push(e.message)})),this.chunk=this.normalizeInput(e),this.file=i,this.type=this.constructor.type,this.globalOptions=this.options=s,this.localOptions=s[this.type],this.canTranslate=this.localOptions&&this.localOptions.translate}translate(){this.canTranslate&&(this.translated=this.translateBlock(this.raw,this.type))}get output(){return this.translated?this.translated:this.raw?Object.fromEntries(this.raw):void 0}translateBlock(e,t){let s=T.get(t),i=L.get(t),n=I.get(t),r=this.options[t],a=r.reviveValues&&!!s,h=r.translateValues&&!!i,f=r.translateKeys&&!!n,l={};for(let[t,r]of e)a&&s.has(t)?r=s.get(t)(r):h&&i.has(t)&&(r=this.translateValue(r,i.get(t))),f&&n.has(t)&&(t=n.get(t)||t),l[t]=r;return l}translateValue(e,t){return t[e]||t.DEFAULT||e}assignToOutput(e,t){this.assignObjectToOutput(e,this.constructor.type,t)}assignObjectToOutput(e,t,s){if(this.globalOptions.mergeOutput)return Object.assign(e,s);e[t]?Object.assign(e[t],s):e[t]=s}}t(re,"headerLength",4),t(re,"type",void 0),t(re,"multiSegment",!1),t(re,"canHandle",(()=>!1));function ae(e){return 192===e||194===e||196===e||219===e||221===e||218===e||254===e}function he(e){return e>=224&&e<=239}function fe(e,t,s){for(let[i,n]of b)if(n.canHandle(e,t,s))return i}class le extends class{constructor(e,s,i){t(this,"errors",[]),t(this,"ensureSegmentChunk",(async e=>{let t=e.start,s=e.size||65536;if(this.file.chunked)if(this.file.available(t,s))e.chunk=this.file.subarray(t,s);else try{e.chunk=await this.file.readChunk(t,s)}catch(t){o(`Couldn't read segment: ${JSON.stringify(e)}. ${t.message}`)}else this.file.byteLength>t+s?e.chunk=this.file.subarray(t,s):void 0===e.size?e.chunk=this.file.subarray(t):o("Segment unreachable: "+JSON.stringify(e));return e.chunk})),this.extendOptions&&this.extendOptions(e),this.options=e,this.file=s,this.parsers=i}injectSegment(e,t){this.options[e].enabled&&this.createParser(e,t)}createParser(e,t){let s=new(b.get(e))(t,this.options,this.file);return this.parsers[e]=s}createParsers(e){for(let t of e){let{type:e,chunk:s}=t,i=this.options[e];if(i&&i.enabled){let t=this.parsers[e];t&&t.append||t||this.createParser(e,s)}}}async readSegments(e){let t=e.map(this.ensureSegmentChunk);await Promise.all(t)}}{constructor(...e){super(...e),t(this,"appSegments",[]),t(this,"jpegSegments",[]),t(this,"unknownSegments",[])}static canHandle(e,t){return 65496===t}async parse(){await this.findAppSegments(),await this.readSegments(this.appSegments),this.mergeMultiSegments(),this.createParsers(this.mergedAppSegments||this.appSegments)}setupSegmentFinderArgs(e){!0===e?(this.findAll=!0,this.wanted=new Set(b.keyList())):(e=void 0===e?b.keyList().filter((e=>this.options[e].enabled)):e.filter((e=>this.options[e].enabled&&b.has(e))),this.findAll=!1,this.remaining=new Set(e),this.wanted=new Set(e)),this.unfinishedMultiSegment=!1}async findAppSegments(e=0,t){this.setupSegmentFinderArgs(t);let{file:s,findAll:i,wanted:n,remaining:r}=this;if(!i&&this.file.chunked&&(i=Array.from(n).some((e=>{let t=b.get(e),s=this.options[e];return t.multiSegment&&s.multiSegment})),i&&await this.file.readWhole()),e=this.findAppSegmentsInRange(e,s.byteLength),!this.options.onlyTiff&&s.chunked){let t=!1;for(;r.size>0&&!t&&(s.canReadNextChunk||this.unfinishedMultiSegment);){let{nextChunkOffset:i}=s,n=this.appSegments.some((e=>!this.file.available(e.offset||e.start,e.length||e.size)));if(t=e>i&&!n?!await s.readNextChunk(e):!await s.readNextChunk(i),void 0===(e=this.findAppSegmentsInRange(e,s.byteLength)))return}}}findAppSegmentsInRange(e,t){t-=2;let s,i,n,r,a,h,{file:f,findAll:l,wanted:o,remaining:u,options:d}=this;for(;e<t;e++)if(255===f.getUint8(e))if(s=f.getUint8(e+1),he(s)){if(i=f.getUint16(e+2),n=fe(f,e,i),n&&o.has(n)&&(r=b.get(n),a=r.findPosition(f,e),h=d[n],a.type=n,this.appSegments.push(a),!l&&(r.multiSegment&&h.multiSegment?(this.unfinishedMultiSegment=a.chunkNumber<a.chunkCount,this.unfinishedMultiSegment||u.delete(n)):u.delete(n),0===u.size)))break;d.recordUnknownSegments&&(a=re.findPosition(f,e),a.marker=s,this.unknownSegments.push(a)),e+=i+1}else if(ae(s)){if(i=f.getUint16(e+2),218===s&&!1!==d.stopAfterSos)return;d.recordJpegSegments&&this.jpegSegments.push({offset:e,length:i,marker:s}),e+=i+1}return e}mergeMultiSegments(){if(!this.appSegments.some((e=>e.multiSegment)))return;let e=function(e,t){let s,i,n,r=new Map;for(let a=0;a<e.length;a++)s=e[a],i=s[t],r.has(i)?n=r.get(i):r.set(i,n=[]),n.push(s);return Array.from(r)}(this.appSegments,"type");this.mergedAppSegments=e.map((([e,t])=>{let s=b.get(e,this.options);if(s.handleMultiSegments){return{type:e,chunk:s.handleMultiSegments(t)}}return t[0]}))}getSegment(e){return this.appSegments.find((t=>t.type===e))}async getOrFindSegment(e){let t=this.getSegment(e);return void 0===t&&(await this.findAppSegments(0,[e]),t=this.getSegment(e)),t}}t(le,"type","jpeg"),y.set("jpeg",le);const oe=[void 0,1,1,2,4,8,1,1,2,4,8,4,8,4];class ue extends re{parseHeader(){var e=this.chunk.getUint16();18761===e?this.le=!0:19789===e&&(this.le=!1),this.chunk.le=this.le,this.headerParsed=!0}parseTags(e,t,s=new Map){let{pick:i,skip:n}=this.options[t];i=new Set(i);let r=i.size>0,a=0===n.size,h=this.chunk.getUint16(e);e+=2;for(let f=0;f<h;f++){let h=this.chunk.getUint16(e);if(r){if(i.has(h)&&(s.set(h,this.parseTag(e,h,t)),i.delete(h),0===i.size))break}else!a&&n.has(h)||s.set(h,this.parseTag(e,h,t));e+=12}return s}parseTag(e,t,s){let{chunk:i}=this,n=i.getUint16(e+2),r=i.getUint32(e+4),a=oe[n];if(a*r<=4?e+=8:e=i.getUint32(e+8),(n<1||n>13)&&o(`Invalid TIFF value type. block: ${s.toUpperCase()}, tag: ${t.toString(16)}, type: ${n}, offset ${e}`),e>i.byteLength&&o(`Invalid TIFF value offset. block: ${s.toUpperCase()}, tag: ${t.toString(16)}, type: ${n}, offset ${e} is outside of chunk size ${i.byteLength}`),1===n)return i.getUint8Array(e,r);if(2===n)return""===(h=function(e){for(;e.endsWith("\0");)e=e.slice(0,-1);return e}(h=i.getString(e,r)).trim())?void 0:h;var h;if(7===n)return i.getUint8Array(e,r);if(1===r)return this.parseTagValue(n,e);{let t=new(function(e){switch(e){case 1:return Uint8Array;case 3:return Uint16Array;case 4:return Uint32Array;case 5:return Array;case 6:return Int8Array;case 8:return Int16Array;case 9:return Int32Array;case 10:return Array;case 11:return Float32Array;case 12:return Float64Array;default:return Array}}(n))(r),s=a;for(let i=0;i<r;i++)t[i]=this.parseTagValue(n,e),e+=s;return t}}parseTagValue(e,t){let{chunk:s}=this;switch(e){case 1:return s.getUint8(t);case 3:return s.getUint16(t);case 4:return s.getUint32(t);case 5:return s.getUint32(t)/s.getUint32(t+4);case 6:return s.getInt8(t);case 8:return s.getInt16(t);case 9:return s.getInt32(t);case 10:return s.getInt32(t)/s.getInt32(t+4);case 11:return s.getFloat(t);case 12:return s.getDouble(t);case 13:return s.getUint32(t);default:o(`Invalid tiff type ${e}`)}}}class de extends ue{static canHandle(e,t){return 225===e.getUint8(t+1)&&1165519206===e.getUint32(t+4)&&0===e.getUint16(t+8)}async parse(){this.parseHeader();let{options:e}=this;return e.ifd0.enabled&&await this.parseIfd0Block(),e.exif.enabled&&await this.safeParse("parseExifBlock"),e.gps.enabled&&await this.safeParse("parseGpsBlock"),e.interop.enabled&&await this.safeParse("parseInteropBlock"),e.ifd1.enabled&&await this.safeParse("parseThumbnailBlock"),this.createOutput()}safeParse(e){let t=this[e]();return void 0!==t.catch&&(t=t.catch(this.handleError)),t}findIfd0Offset(){void 0===this.ifd0Offset&&(this.ifd0Offset=this.chunk.getUint32(4))}findIfd1Offset(){if(void 0===this.ifd1Offset){this.findIfd0Offset();let e=this.chunk.getUint16(this.ifd0Offset),t=this.ifd0Offset+2+12*e;this.ifd1Offset=this.chunk.getUint32(t)}}parseBlock(e,t){let s=new Map;return this[t]=s,this.parseTags(e,t,s),s}async parseIfd0Block(){if(this.ifd0)return;let{file:e}=this;this.findIfd0Offset(),this.ifd0Offset<8&&o("Malformed EXIF data"),!e.chunked&&this.ifd0Offset>e.byteLength&&o(`IFD0 offset points to outside of file.\nthis.ifd0Offset: ${this.ifd0Offset}, file.byteLength: ${e.byteLength}`),e.tiff&&await e.ensureChunk(this.ifd0Offset,u(this.options));let t=this.parseBlock(this.ifd0Offset,"ifd0");return 0!==t.size?(this.exifOffset=t.get(E),this.interopOffset=t.get(D),this.gpsOffset=t.get(_),this.xmp=t.get(700),this.iptc=t.get(F),this.icc=t.get(j),this.options.sanitize&&(t.delete(E),t.delete(D),t.delete(_),t.delete(700),t.delete(F),t.delete(j)),t):void 0}async parseExifBlock(){if(this.exif)return;if(this.ifd0||await this.parseIfd0Block(),void 0===this.exifOffset)return;this.file.tiff&&await this.file.ensureChunk(this.exifOffset,u(this.options));let e=this.parseBlock(this.exifOffset,"exif");return this.interopOffset||(this.interopOffset=e.get(D)),this.makerNote=e.get(P),this.userComment=e.get(z),this.options.sanitize&&(e.delete(D),e.delete(P),e.delete(z)),this.unpack(e,41728),this.unpack(e,41729),e}unpack(e,t){let s=e.get(t);s&&1===s.length&&e.set(t,s[0])}async parseGpsBlock(){if(this.gps)return;if(this.ifd0||await this.parseIfd0Block(),void 0===this.gpsOffset)return;let e=this.parseBlock(this.gpsOffset,"gps");return e&&e.has(2)&&e.has(4)&&(e.set("latitude",ce(...e.get(2),e.get(1))),e.set("longitude",ce(...e.get(4),e.get(3)))),e}async parseInteropBlock(){if(!this.interop&&(this.ifd0||await this.parseIfd0Block(),void 0!==this.interopOffset||this.exif||await this.parseExifBlock(),void 0!==this.interopOffset))return this.parseBlock(this.interopOffset,"interop")}async parseThumbnailBlock(e=!1){if(!this.ifd1&&!this.ifd1Parsed&&(!this.options.mergeOutput||e))return this.findIfd1Offset(),this.ifd1Offset>0&&(this.parseBlock(this.ifd1Offset,"ifd1"),this.ifd1Parsed=!0),this.ifd1}async extractThumbnail(){if(this.headerParsed||this.parseHeader(),this.ifd1Parsed||await this.parseThumbnailBlock(!0),void 0===this.ifd1)return;let e=this.ifd1.get(513),t=this.ifd1.get(514);return this.chunk.getUint8Array(e,t)}get image(){return this.ifd0}get thumbnail(){return this.ifd1}createOutput(){let e,t,s,i={};for(t of $)if(e=this[t],!l(e))if(s=this.canTranslate?this.translateBlock(e,t):Object.fromEntries(e),this.options.mergeOutput){if("ifd1"===t)continue;Object.assign(i,s)}else i[t]=s;return this.makerNote&&(i.makerNote=this.makerNote),this.userComment&&(i.userComment=this.userComment),i}assignToOutput(e,t){if(this.globalOptions.mergeOutput)Object.assign(e,t);else for(let[s,i]of Object.entries(t))this.assignObjectToOutput(e,s,i)}}function ce(e,t,s,i){var n=e+t/60+s/3600;return"S"!==i&&"W"!==i||(n*=-1),n}t(de,"type","tiff"),t(de,"headerLength",10),b.set("tiff",de);var pe=Object.freeze({__proto__:null,default:ne,Exifr:se,fileParsers:y,segmentParsers:b,fileReaders:w,tagKeys:I,tagValues:L,tagRevivers:T,createDictionary:B,extendDictionary:V,fetchUrlAsArrayBuffer:U,readBlobAsArrayBuffer:x,chunkedProps:M,otherSegments:N,segments:R,tiffBlocks:$,segmentsAndBlocks:K,tiffExtractables:W,inheritables:X,allFormatters:H,Options:Q,parse:ie});const ge={ifd0:!1,ifd1:!1,exif:!1,gps:!1,interop:!1,sanitize:!1,reviveValues:!0,translateKeys:!1,translateValues:!1,mergeOutput:!1},me=Object.assign({},ge,{firstChunkSize:4e4,gps:[1,2,3,4]});const ye=Object.assign({},ge,{tiff:!1,ifd1:!0,mergeOutput:!1});const be=Object.assign({},ge,{firstChunkSize:4e4,ifd0:[274]});async function we(e){let t=new se(be);await t.read(e);let s=await t.parse();if(s&&s.ifd0)return s.ifd0[274]}const ke=Object.freeze({1:{dimensionSwapped:!1,scaleX:1,scaleY:1,deg:0,rad:0},2:{dimensionSwapped:!1,scaleX:-1,scaleY:1,deg:0,rad:0},3:{dimensionSwapped:!1,scaleX:1,scaleY:1,deg:180,rad:180*Math.PI/180},4:{dimensionSwapped:!1,scaleX:-1,scaleY:1,deg:180,rad:180*Math.PI/180},5:{dimensionSwapped:!0,scaleX:1,scaleY:-1,deg:90,rad:90*Math.PI/180},6:{dimensionSwapped:!0,scaleX:1,scaleY:1,deg:90,rad:90*Math.PI/180},7:{dimensionSwapped:!0,scaleX:1,scaleY:-1,deg:270,rad:270*Math.PI/180},8:{dimensionSwapped:!0,scaleX:1,scaleY:1,deg:270,rad:270*Math.PI/180}});if(e.rotateCanvas=!0,e.rotateCss=!0,"object"==typeof navigator){let t=navigator.userAgent;if(t.includes("iPad")||t.includes("iPhone")){let s=t.match(/OS (\d+)_(\d+)/);if(s){let[,t,i]=s,n=Number(t)+.1*Number(i);e.rotateCanvas=n<13.4,e.rotateCss=!1}}else if(t.includes("OS X 10")){let[,s]=t.match(/OS X 10[_.](\d+)/);e.rotateCanvas=e.rotateCss=Number(s)<15}if(t.includes("Chrome/")){let[,s]=t.match(/Chrome\/(\d+)/);e.rotateCanvas=e.rotateCss=Number(s)<81}else if(t.includes("Firefox/")){let[,s]=t.match(/Firefox\/(\d+)/);e.rotateCanvas=e.rotateCss=Number(s)<77}}class Oe extends p{constructor(...e){super(...e),t(this,"ranges",new ve),0!==this.byteLength&&this.ranges.add(0,this.byteLength)}_tryExtend(e,t,s){if(0===e&&0===this.byteLength&&s){let e=new DataView(s.buffer||s,s.byteOffset,s.byteLength);this._swapDataView(e)}else{let s=e+t;if(s>this.byteLength){let{dataView:e}=this._extend(s);this._swapDataView(e)}}}_extend(e){let t;t=h?a.allocUnsafe(e):new Uint8Array(e);let s=new DataView(t.buffer,t.byteOffset,t.byteLength);return t.set(new Uint8Array(this.buffer,this.byteOffset,this.byteLength),0),{uintView:t,dataView:s}}subarray(e,t,s=!1){return t=t||this._lengthToEnd(e),s&&this._tryExtend(e,t),this.ranges.add(e,t),super.subarray(e,t)}set(e,t,s=!1){s&&this._tryExtend(t,e.byteLength,e);let i=super.set(e,t);return this.ranges.add(t,i.byteLength),i}async ensureChunk(e,t){this.chunked&&(this.ranges.available(e,t)||await this.readChunk(e,t))}available(e,t){return this.ranges.available(e,t)}}class ve{constructor(){t(this,"list",[])}get length(){return this.list.length}add(e,t,s=0){let i=e+t,n=this.list.filter((t=>Se(e,t.offset,i)||Se(e,t.end,i)));if(n.length>0){e=Math.min(e,...n.map((e=>e.offset))),i=Math.max(i,...n.map((e=>e.end))),t=i-e;let s=n.shift();s.offset=e,s.length=t,s.end=i,this.list=this.list.filter((e=>!n.includes(e)))}else this.list.push({offset:e,length:t,end:i})}available(e,t){let s=e+t;return this.list.some((t=>t.offset<=e&&s<=t.end))}}function Se(e,t,s){return e<=t&&t<=s}class Ae extends Oe{constructor(e,s){super(0),t(this,"chunksRead",0),this.input=e,this.options=s}async readWhole(){this.chunked=!1,await this.readChunk(this.nextChunkOffset)}async readChunked(){this.chunked=!0,await this.readChunk(0,this.options.firstChunkSize)}async readNextChunk(e=this.nextChunkOffset){if(this.fullyRead)return this.chunksRead++,!1;let t=this.options.chunkSize,s=await this.readChunk(e,t);return!!s&&s.byteLength===t}async readChunk(e,t){if(this.chunksRead++,0!==(t=this.safeWrapAddress(e,t)))return this._readChunk(e,t)}safeWrapAddress(e,t){return void 0!==this.size&&e+t>this.size?Math.max(0,this.size-e):t}get nextChunkOffset(){if(0!==this.ranges.list.length)return this.ranges.list[0].length}get canReadNextChunk(){return this.chunksRead<this.options.chunkLimit}get fullyRead(){return void 0!==this.size&&this.nextChunkOffset===this.size}read(){return this.options.chunked?this.readChunked():this.readWhole()}close(){}}w.set("blob",class extends Ae{async readWhole(){this.chunked=!1;let e=await x(this.input);this._swapArrayBuffer(e)}readChunked(){return this.chunked=!0,this.size=this.input.size,super.readChunked()}async _readChunk(e,t){let s=t?e+t:void 0,i=this.input.slice(e,s),n=await x(i);return this.set(n,e,!0)}}),e.Exifr=se,e.Options=Q,e.allFormatters=H,e.chunkedProps=M,e.createDictionary=B,e.default=pe,e.extendDictionary=V,e.fetchUrlAsArrayBuffer=U,e.fileParsers=y,e.fileReaders=w,e.gps=async function(e){let t=new se(me);await t.read(e);let s=await t.parse();if(s&&s.gps){let{latitude:e,longitude:t}=s.gps;return{latitude:e,longitude:t}}},e.gpsOnlyOptions=me,e.inheritables=X,e.orientation=we,e.orientationOnlyOptions=be,e.otherSegments=N,e.parse=ie,e.readBlobAsArrayBuffer=x,e.rotation=async function(t){let s=await we(t);return Object.assign({canvas:e.rotateCanvas,css:e.rotateCss},ke[s])},e.rotations=ke,e.segmentParsers=b,e.segments=R,e.segmentsAndBlocks=K,e.tagKeys=I,e.tagRevivers=T,e.tagValues=L,e.thumbnail=async function(e){let t=new se(ye);await t.read(e);let s=await t.extractThumbnail();return s&&h?a.from(s):s},e.thumbnailOnlyOptions=ye,e.thumbnailUrl=async function(e){let t=await this.thumbnail(e);if(void 0!==t){let e=new Blob([t]);return URL.createObjectURL(e)}},e.tiffBlocks=$,e.tiffExtractables=W,Object.defineProperty(e,"__esModule",{value:!0})}));
  7. +"use strict";
  8. +function e(e, t, i) {
  9. + return (
  10. + t in e
  11. + ? Object.defineProperty(e, t, {
  12. + value: i,
  13. + enumerable: !0,
  14. + configurable: !0,
  15. + writable: !0,
  16. + })
  17. + : (e[t] = i),
  18. + e
  19. + );
  20. +}
  21. +Object.defineProperty(exports, "__esModule", { value: !0 });
  22. +var t = "undefined" != typeof self ? self : global;
  23. +const i = "undefined" != typeof navigator,
  24. + s = i && "undefined" == typeof HTMLImageElement,
  25. + n = !(
  26. + "undefined" == typeof global ||
  27. + "undefined" == typeof process ||
  28. + !process.versions ||
  29. + !process.versions.node
  30. + ),
  31. + r = !!t.Buffer,
  32. + a = (e) => void 0 !== e;
  33. +function h(e) {
  34. + return (
  35. + void 0 === e ||
  36. + (e instanceof Map ? 0 === e.size : 0 === Object.values(e).filter(a).length)
  37. + );
  38. +}
  39. +function f(e) {
  40. + let t = new Error(e);
  41. + throw (delete t.stack, t);
  42. +}
  43. +function o(e) {
  44. + let t = (function (e) {
  45. + let t = 0;
  46. + return (
  47. + e.ifd0.enabled && (t += 1024),
  48. + e.exif.enabled && (t += 2048),
  49. + e.makerNote && (t += 2048),
  50. + e.userComment && (t += 1024),
  51. + e.gps.enabled && (t += 512),
  52. + e.interop.enabled && (t += 100),
  53. + e.ifd1.enabled && (t += 1024),
  54. + t + 2048
  55. + );
  56. + })(e);
  57. + return (
  58. + e.jfif.enabled && (t += 50),
  59. + e.xmp.enabled && (t += 2e4),
  60. + e.iptc.enabled && (t += 14e3),
  61. + e.icc.enabled && (t += 6e3),
  62. + t
  63. + );
  64. +}
  65. +const l = (e) => String.fromCharCode.apply(null, e),
  66. + d = "undefined" != typeof TextDecoder ? new TextDecoder("utf-8") : void 0;
  67. +class u {
  68. + static from(e, t) {
  69. + return e instanceof this && e.le === t ? e : new u(e, void 0, void 0, t);
  70. + }
  71. + constructor(e) {
  72. + let t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0,
  73. + i = arguments.length > 2 ? arguments[2] : void 0,
  74. + s = arguments.length > 3 ? arguments[3] : void 0;
  75. + if (
  76. + ("boolean" == typeof s && (this.le = s),
  77. + Array.isArray(e) && (e = new Uint8Array(e)),
  78. + 0 === e)
  79. + )
  80. + (this.byteOffset = 0), (this.byteLength = 0);
  81. + else if (e instanceof ArrayBuffer) {
  82. + void 0 === i && (i = e.byteLength - t);
  83. + let s = new DataView(e, t, i);
  84. + this._swapDataView(s);
  85. + } else if (
  86. + e instanceof Uint8Array ||
  87. + e instanceof DataView ||
  88. + e instanceof u
  89. + ) {
  90. + void 0 === i && (i = e.byteLength - t),
  91. + (t += e.byteOffset),
  92. + t + i > e.byteOffset + e.byteLength &&
  93. + f("Creating view outside of available memory in ArrayBuffer");
  94. + let s = new DataView(e.buffer, t, i);
  95. + this._swapDataView(s);
  96. + } else if ("number" == typeof e) {
  97. + let t = new DataView(new ArrayBuffer(e));
  98. + this._swapDataView(t);
  99. + } else f("Invalid input argument for BufferView: " + e);
  100. + }
  101. + _swapArrayBuffer(e) {
  102. + this._swapDataView(new DataView(e));
  103. + }
  104. + _swapBuffer(e) {
  105. + this._swapDataView(new DataView(e.buffer, e.byteOffset, e.byteLength));
  106. + }
  107. + _swapDataView(e) {
  108. + (this.dataView = e),
  109. + (this.buffer = e.buffer),
  110. + (this.byteOffset = e.byteOffset),
  111. + (this.byteLength = e.byteLength);
  112. + }
  113. + _lengthToEnd(e) {
  114. + return this.byteLength - e;
  115. + }
  116. + set(e, t) {
  117. + let i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : u;
  118. + return (
  119. + e instanceof DataView || e instanceof u
  120. + ? (e = new Uint8Array(e.buffer, e.byteOffset, e.byteLength))
  121. + : e instanceof ArrayBuffer && (e = new Uint8Array(e)),
  122. + e instanceof Uint8Array || f("BufferView.set(): Invalid data argument."),
  123. + this.toUint8().set(e, t),
  124. + new i(this, t, e.byteLength)
  125. + );
  126. + }
  127. + subarray(e, t) {
  128. + return (t = t || this._lengthToEnd(e)), new u(this, e, t);
  129. + }
  130. + toUint8() {
  131. + return new Uint8Array(this.buffer, this.byteOffset, this.byteLength);
  132. + }
  133. + getUint8Array(e, t) {
  134. + return new Uint8Array(this.buffer, this.byteOffset + e, t);
  135. + }
  136. + getString() {
  137. + let e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0,
  138. + t =
  139. + arguments.length > 1 && void 0 !== arguments[1]
  140. + ? arguments[1]
  141. + : this.byteLength,
  142. + i = this.getUint8Array(e, t);
  143. + return (
  144. + (s = i),
  145. + d
  146. + ? d.decode(s)
  147. + : r
  148. + ? Buffer.from(s).toString("utf8")
  149. + : decodeURIComponent(escape(l(s)))
  150. + );
  151. + var s;
  152. + }
  153. + getLatin1String() {
  154. + let e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0,
  155. + t =
  156. + arguments.length > 1 && void 0 !== arguments[1]
  157. + ? arguments[1]
  158. + : this.byteLength,
  159. + i = this.getUint8Array(e, t);
  160. + return l(i);
  161. + }
  162. + getUnicodeString() {
  163. + let e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0,
  164. + t =
  165. + arguments.length > 1 && void 0 !== arguments[1]
  166. + ? arguments[1]
  167. + : this.byteLength;
  168. + const i = [];
  169. + for (let s = 0; s < t && e + s < this.byteLength; s += 2)
  170. + i.push(this.getUint16(e + s));
  171. + return l(i);
  172. + }
  173. + getInt8(e) {
  174. + return this.dataView.getInt8(e);
  175. + }
  176. + getUint8(e) {
  177. + return this.dataView.getUint8(e);
  178. + }
  179. + getInt16(e) {
  180. + let t =
  181. + arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.le;
  182. + return this.dataView.getInt16(e, t);
  183. + }
  184. + getInt32(e) {
  185. + let t =
  186. + arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.le;
  187. + return this.dataView.getInt32(e, t);
  188. + }
  189. + getUint16(e) {
  190. + let t =
  191. + arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.le;
  192. + return this.dataView.getUint16(e, t);
  193. + }
  194. + getUint32(e) {
  195. + let t =
  196. + arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.le;
  197. + return this.dataView.getUint32(e, t);
  198. + }
  199. + getFloat32(e) {
  200. + let t =
  201. + arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.le;
  202. + return this.dataView.getFloat32(e, t);
  203. + }
  204. + getFloat64(e) {
  205. + let t =
  206. + arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.le;
  207. + return this.dataView.getFloat64(e, t);
  208. + }
  209. + getFloat(e) {
  210. + let t =
  211. + arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.le;
  212. + return this.dataView.getFloat32(e, t);
  213. + }
  214. + getDouble(e) {
  215. + let t =
  216. + arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.le;
  217. + return this.dataView.getFloat64(e, t);
  218. + }
  219. + getUintBytes(e, t, i) {
  220. + switch (t) {
  221. + case 1:
  222. + return this.getUint8(e, i);
  223. + case 2:
  224. + return this.getUint16(e, i);
  225. + case 4:
  226. + return this.getUint32(e, i);
  227. + case 8:
  228. + return this.getUint64 && this.getUint64(e, i);
  229. + }
  230. + }
  231. + getUint(e, t, i) {
  232. + switch (t) {
  233. + case 8:
  234. + return this.getUint8(e, i);
  235. + case 16:
  236. + return this.getUint16(e, i);
  237. + case 32:
  238. + return this.getUint32(e, i);
  239. + case 64:
  240. + return this.getUint64 && this.getUint64(e, i);
  241. + }
  242. + }
  243. + toString(e) {
  244. + return this.dataView.toString(e, this.constructor.name);
  245. + }
  246. + ensureChunk() {}
  247. +}
  248. +function p(e, t) {
  249. + f(`${e} '${t}' was not loaded, try using full build of exifr.`);
  250. +}
  251. +class c extends Map {
  252. + constructor(e) {
  253. + super(), (this.kind = e);
  254. + }
  255. + get(e, t) {
  256. + return (
  257. + this.has(e) || p(this.kind, e),
  258. + t &&
  259. + (e in t ||
  260. + (function (e, t) {
  261. + f(`Unknown ${e} '${t}'.`);
  262. + })(this.kind, e),
  263. + t[e].enabled || p(this.kind, e)),
  264. + super.get(e)
  265. + );
  266. + }
  267. + keyList() {
  268. + return Array.from(this.keys());
  269. + }
  270. +}
  271. +var g = new c("file parser"),
  272. + m = new c("segment parser"),
  273. + b = new c("file reader");
  274. +let y = t.fetch;
  275. +function w(e, t) {
  276. + return (s = e).startsWith("data:") || s.length > 1e4
  277. + ? v(e, t, "base64")
  278. + : n && e.includes("://")
  279. + ? k(e, t, "url", S)
  280. + : n
  281. + ? v(e, t, "fs")
  282. + : i
  283. + ? k(e, t, "url", S)
  284. + : void f("Invalid input argument");
  285. + var s;
  286. +}
  287. +async function k(e, t, i, s) {
  288. + return b.has(i)
  289. + ? v(e, t, i)
  290. + : s
  291. + ? (async function (e, t) {
  292. + let i = await t(e);
  293. + return new u(i);
  294. + })(e, s)
  295. + : void f(`Parser ${i} is not loaded`);
  296. +}
  297. +async function v(e, t, i) {
  298. + let s = new (b.get(i))(e, t);
  299. + return await s.read(), s;
  300. +}
  301. +const S = (e) => y(e).then((e) => e.arrayBuffer()),
  302. + O = (e) =>
  303. + new Promise((t, i) => {
  304. + let s = new FileReader();
  305. + (s.onloadend = () => t(s.result || new ArrayBuffer())),
  306. + (s.onerror = i),
  307. + s.readAsArrayBuffer(e);
  308. + });
  309. +const U = new Map(),
  310. + A = new Map(),
  311. + I = new Map(),
  312. + x = [
  313. + "chunked",
  314. + "firstChunkSize",
  315. + "firstChunkSizeNode",
  316. + "firstChunkSizeBrowser",
  317. + "chunkSize",
  318. + "chunkLimit",
  319. + ],
  320. + B = ["jfif", "xmp", "icc", "iptc", "ihdr"],
  321. + T = ["tiff", ...B],
  322. + V = ["ifd0", "ifd1", "exif", "gps", "interop"],
  323. + C = [...T, ...V],
  324. + F = ["makerNote", "userComment"],
  325. + P = ["translateKeys", "translateValues", "reviveValues", "multiSegment"],
  326. + L = [...P, "sanitize", "mergeOutput", "silentErrors"];
  327. +class z {
  328. + get translate() {
  329. + return this.translateKeys || this.translateValues || this.reviveValues;
  330. + }
  331. +}
  332. +class j extends z {
  333. + get needed() {
  334. + return this.enabled || this.deps.size > 0;
  335. + }
  336. + constructor(t, i, s, n) {
  337. + if (
  338. + (super(),
  339. + e(this, "enabled", !1),
  340. + e(this, "skip", new Set()),
  341. + e(this, "pick", new Set()),
  342. + e(this, "deps", new Set()),
  343. + e(this, "translateKeys", !1),
  344. + e(this, "translateValues", !1),
  345. + e(this, "reviveValues", !1),
  346. + (this.key = t),
  347. + (this.enabled = i),
  348. + (this.parse = this.enabled),
  349. + this.applyInheritables(n),
  350. + (this.canBeFiltered = V.includes(t)),
  351. + this.canBeFiltered && (this.dict = U.get(t)),
  352. + void 0 !== s)
  353. + )
  354. + if (Array.isArray(s))
  355. + (this.parse = this.enabled = !0),
  356. + this.canBeFiltered &&
  357. + s.length > 0 &&
  358. + this.translateTagSet(s, this.pick);
  359. + else if ("object" == typeof s) {
  360. + if (
  361. + ((this.enabled = !0),
  362. + (this.parse = !1 !== s.parse),
  363. + this.canBeFiltered)
  364. + ) {
  365. + let { pick: e, skip: t } = s;
  366. + e && e.length > 0 && this.translateTagSet(e, this.pick),
  367. + t && t.length > 0 && this.translateTagSet(t, this.skip);
  368. + }
  369. + this.applyInheritables(s);
  370. + } else
  371. + !0 === s || !1 === s
  372. + ? (this.parse = this.enabled = s)
  373. + : f(`Invalid options argument: ${s}`);
  374. + }
  375. + applyInheritables(e) {
  376. + let t, i;
  377. + for (t of P) (i = e[t]), void 0 !== i && (this[t] = i);
  378. + }
  379. + translateTagSet(e, t) {
  380. + if (this.dict) {
  381. + let i,
  382. + s,
  383. + { tagKeys: n, tagValues: r } = this.dict;
  384. + for (i of e)
  385. + "string" == typeof i
  386. + ? ((s = r.indexOf(i)),
  387. + -1 === s && (s = n.indexOf(Number(i))),
  388. + -1 !== s && t.add(Number(n[s])))
  389. + : t.add(i);
  390. + } else for (let i of e) t.add(i);
  391. + }
  392. + finalizeFilters() {
  393. + !this.enabled && this.deps.size > 0
  394. + ? ((this.enabled = !0), _(this.pick, this.deps))
  395. + : this.enabled && this.pick.size > 0 && _(this.pick, this.deps);
  396. + }
  397. +}
  398. +var M = {
  399. + jfif: !1,
  400. + tiff: !0,
  401. + xmp: !1,
  402. + icc: !1,
  403. + iptc: !1,
  404. + ifd0: !0,
  405. + ifd1: !1,
  406. + exif: !0,
  407. + gps: !0,
  408. + interop: !1,
  409. + ihdr: void 0,
  410. + makerNote: !1,
  411. + userComment: !1,
  412. + multiSegment: !1,
  413. + skip: [],
  414. + pick: [],
  415. + translateKeys: !0,
  416. + translateValues: !0,
  417. + reviveValues: !0,
  418. + sanitize: !0,
  419. + mergeOutput: !0,
  420. + silentErrors: !0,
  421. + chunked: !0,
  422. + firstChunkSize: void 0,
  423. + firstChunkSizeNode: 512,
  424. + firstChunkSizeBrowser: 65536,
  425. + chunkSize: 65536,
  426. + chunkLimit: 5,
  427. + },
  428. + E = new Map();
  429. +class N extends z {
  430. + static useCached(e) {
  431. + let t = E.get(e);
  432. + return void 0 !== t || ((t = new this(e)), E.set(e, t)), t;
  433. + }
  434. + constructor(e) {
  435. + super(),
  436. + !0 === e
  437. + ? this.setupFromTrue()
  438. + : void 0 === e
  439. + ? this.setupFromUndefined()
  440. + : Array.isArray(e)
  441. + ? this.setupFromArray(e)
  442. + : "object" == typeof e
  443. + ? this.setupFromObject(e)
  444. + : f(`Invalid options argument ${e}`),
  445. + void 0 === this.firstChunkSize &&
  446. + (this.firstChunkSize = i
  447. + ? this.firstChunkSizeBrowser
  448. + : this.firstChunkSizeNode),
  449. + this.mergeOutput && (this.ifd1.enabled = !1),
  450. + this.filterNestedSegmentTags(),
  451. + this.traverseTiffDependencyTree(),
  452. + this.checkLoadedPlugins();
  453. + }
  454. + setupFromUndefined() {
  455. + let e;
  456. + for (e of x) this[e] = M[e];
  457. + for (e of L) this[e] = M[e];
  458. + for (e of F) this[e] = M[e];
  459. + for (e of C) this[e] = new j(e, M[e], void 0, this);
  460. + }
  461. + setupFromTrue() {
  462. + let e;
  463. + for (e of x) this[e] = M[e];
  464. + for (e of L) this[e] = M[e];
  465. + for (e of F) this[e] = !0;
  466. + for (e of C) this[e] = new j(e, !0, void 0, this);
  467. + }
  468. + setupFromArray(e) {
  469. + let t;
  470. + for (t of x) this[t] = M[t];
  471. + for (t of L) this[t] = M[t];
  472. + for (t of F) this[t] = M[t];
  473. + for (t of C) this[t] = new j(t, !1, void 0, this);
  474. + this.setupGlobalFilters(e, void 0, V);
  475. + }
  476. + setupFromObject(e) {
  477. + let t;
  478. + for (t of ((V.ifd0 = V.ifd0 || V.image),
  479. + (V.ifd1 = V.ifd1 || V.thumbnail),
  480. + Object.assign(this, e),
  481. + x))
  482. + this[t] = $(e[t], M[t]);
  483. + for (t of L) this[t] = $(e[t], M[t]);
  484. + for (t of F) this[t] = $(e[t], M[t]);
  485. + for (t of T) this[t] = new j(t, M[t], e[t], this);
  486. + for (t of V) this[t] = new j(t, M[t], e[t], this.tiff);
  487. + this.setupGlobalFilters(e.pick, e.skip, V, C),
  488. + !0 === e.tiff
  489. + ? this.batchEnableWithBool(V, !0)
  490. + : !1 === e.tiff
  491. + ? this.batchEnableWithUserValue(V, e)
  492. + : Array.isArray(e.tiff)
  493. + ? this.setupGlobalFilters(e.tiff, void 0, V)
  494. + : "object" == typeof e.tiff &&
  495. + this.setupGlobalFilters(e.tiff.pick, e.tiff.skip, V);
  496. + }
  497. + batchEnableWithBool(e, t) {
  498. + for (let i of e) this[i].enabled = t;
  499. + }
  500. + batchEnableWithUserValue(e, t) {
  501. + for (let i of e) {
  502. + let e = t[i];
  503. + this[i].enabled = !1 !== e && void 0 !== e;
  504. + }
  505. + }
  506. + setupGlobalFilters(e, t, i) {
  507. + let s = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : i;
  508. + if (e && e.length) {
  509. + for (let e of s) this[e].enabled = !1;
  510. + let t = D(e, i);
  511. + for (let [e, i] of t) _(this[e].pick, i), (this[e].enabled = !0);
  512. + } else if (t && t.length) {
  513. + let e = D(t, i);
  514. + for (let [t, i] of e) _(this[t].skip, i);
  515. + }
  516. + }
  517. + filterNestedSegmentTags() {
  518. + let { ifd0: e, exif: t, xmp: i, iptc: s, icc: n } = this;
  519. + this.makerNote ? t.deps.add(37500) : t.skip.add(37500),
  520. + this.userComment ? t.deps.add(37510) : t.skip.add(37510),
  521. + i.enabled || e.skip.add(700),
  522. + s.enabled || e.skip.add(33723),
  523. + n.enabled || e.skip.add(34675);
  524. + }
  525. + traverseTiffDependencyTree() {
  526. + let { ifd0: e, exif: t, gps: i, interop: s } = this;
  527. + s.needed && (t.deps.add(40965), e.deps.add(40965)),
  528. + t.needed && e.deps.add(34665),
  529. + i.needed && e.deps.add(34853),
  530. + (this.tiff.enabled =
  531. + V.some((e) => !0 === this[e].enabled) ||
  532. + this.makerNote ||
  533. + this.userComment);
  534. + for (let e of V) this[e].finalizeFilters();
  535. + }
  536. + get onlyTiff() {
  537. + return (
  538. + !B.map((e) => this[e].enabled).some((e) => !0 === e) && this.tiff.enabled
  539. + );
  540. + }
  541. + checkLoadedPlugins() {
  542. + for (let e of T) this[e].enabled && !m.has(e) && p("segment parser", e);
  543. + }
  544. +}
  545. +function D(e, t) {
  546. + let i,
  547. + s,
  548. + n,
  549. + r,
  550. + a = [];
  551. + for (n of t) {
  552. + for (r of ((i = U.get(n)), (s = []), i))
  553. + (e.includes(r[0]) || e.includes(r[1])) && s.push(r[0]);
  554. + s.length && a.push([n, s]);
  555. + }
  556. + return a;
  557. +}
  558. +function $(e, t) {
  559. + return void 0 !== e ? e : void 0 !== t ? t : void 0;
  560. +}
  561. +function _(e, t) {
  562. + for (let i of t) e.add(i);
  563. +}
  564. +e(N, "default", M);
  565. +class X {
  566. + constructor(t) {
  567. + e(this, "parsers", {}),
  568. + e(this, "output", {}),
  569. + e(this, "errors", []),
  570. + e(this, "pushToErrors", (e) => this.errors.push(e)),
  571. + (this.options = N.useCached(t));
  572. + }
  573. + async read(e) {
  574. + this.file = await (function (e, t) {
  575. + return "string" == typeof e
  576. + ? w(e, t)
  577. + : i && !s && e instanceof HTMLImageElement
  578. + ? w(e.src, t)
  579. + : e instanceof Uint8Array ||
  580. + e instanceof ArrayBuffer ||
  581. + e instanceof DataView
  582. + ? new u(e)
  583. + : i && e instanceof Blob
  584. + ? k(e, t, "blob", O)
  585. + : void f("Invalid input argument");
  586. + })(e, this.options);
  587. + }
  588. + setup() {
  589. + if (this.fileParser) return;
  590. + let { file: e } = this,
  591. + t = e.getUint16(0);
  592. + for (let [i, s] of g)
  593. + if (s.canHandle(e, t))
  594. + return (
  595. + (this.fileParser = new s(this.options, this.file, this.parsers)),
  596. + (e[i] = !0)
  597. + );
  598. + this.file.close && this.file.close(), f("Unknown file format");
  599. + }
  600. + async parse() {
  601. + let { output: e, errors: t } = this;
  602. + return (
  603. + this.setup(),
  604. + this.options.silentErrors
  605. + ? (await this.executeParsers().catch(this.pushToErrors),
  606. + t.push(...this.fileParser.errors))
  607. + : await this.executeParsers(),
  608. + this.file.close && this.file.close(),
  609. + this.options.silentErrors && t.length > 0 && (e.errors = t),
  610. + h((i = e)) ? void 0 : i
  611. + );
  612. + var i;
  613. + }
  614. + async executeParsers() {
  615. + let { output: e } = this;
  616. + await this.fileParser.parse();
  617. + let t = Object.values(this.parsers).map(async (t) => {
  618. + let i = await t.parse();
  619. + t.assignToOutput(e, i);
  620. + });
  621. + this.options.silentErrors && (t = t.map((e) => e.catch(this.pushToErrors))),
  622. + await Promise.all(t);
  623. + }
  624. + async extractThumbnail() {
  625. + this.setup();
  626. + let { options: e, file: t } = this,
  627. + i = m.get("tiff", e);
  628. + var s;
  629. + if (
  630. + (t.tiff
  631. + ? (s = { start: 0, type: "tiff" })
  632. + : t.jpeg && (s = await this.fileParser.getOrFindSegment("tiff")),
  633. + void 0 === s)
  634. + )
  635. + return;
  636. + let n = await this.fileParser.ensureSegmentChunk(s),
  637. + r = (this.parsers.tiff = new i(n, e, t)),
  638. + a = await r.extractThumbnail();
  639. + return t.close && t.close(), a;
  640. + }
  641. +}
  642. +class H {
  643. + static findPosition(e, t) {
  644. + let i = e.getUint16(t + 2) + 2,
  645. + s =
  646. + "function" == typeof this.headerLength
  647. + ? this.headerLength(e, t, i)
  648. + : this.headerLength,
  649. + n = t + s,
  650. + r = i - s;
  651. + return {
  652. + offset: t,
  653. + length: i,
  654. + headerLength: s,
  655. + start: n,
  656. + size: r,
  657. + end: n + r,
  658. + };
  659. + }
  660. + static parse(e) {
  661. + let t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
  662. + return new this(e, new N({ [this.type]: t }), e).parse();
  663. + }
  664. + normalizeInput(e) {
  665. + return e instanceof u ? e : new u(e);
  666. + }
  667. + constructor(t) {
  668. + let i = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {},
  669. + s = arguments.length > 2 ? arguments[2] : void 0;
  670. + e(this, "errors", []),
  671. + e(this, "raw", new Map()),
  672. + e(this, "handleError", (e) => {
  673. + if (!this.options.silentErrors) throw e;
  674. + this.errors.push(e.message);
  675. + }),
  676. + (this.chunk = this.normalizeInput(t)),
  677. + (this.file = s),
  678. + (this.type = this.constructor.type),
  679. + (this.globalOptions = this.options = i),
  680. + (this.localOptions = i[this.type]),
  681. + (this.canTranslate = this.localOptions && this.localOptions.translate);
  682. + }
  683. + translate() {
  684. + this.canTranslate &&
  685. + (this.translated = this.translateBlock(this.raw, this.type));
  686. + }
  687. + get output() {
  688. + return this.translated
  689. + ? this.translated
  690. + : this.raw
  691. + ? Object.fromEntries(this.raw)
  692. + : void 0;
  693. + }
  694. + translateBlock(e, t) {
  695. + let i = I.get(t),
  696. + s = A.get(t),
  697. + n = U.get(t),
  698. + r = this.options[t],
  699. + a = r.reviveValues && !!i,
  700. + h = r.translateValues && !!s,
  701. + f = r.translateKeys && !!n,
  702. + o = {};
  703. + for (let [t, r] of e)
  704. + a && i.has(t)
  705. + ? (r = i.get(t)(r))
  706. + : h && s.has(t) && (r = this.translateValue(r, s.get(t))),
  707. + f && n.has(t) && (t = n.get(t) || t),
  708. + (o[t] = r);
  709. + return o;
  710. + }
  711. + translateValue(e, t) {
  712. + return t[e] || t.DEFAULT || e;
  713. + }
  714. + assignToOutput(e, t) {
  715. + this.assignObjectToOutput(e, this.constructor.type, t);
  716. + }
  717. + assignObjectToOutput(e, t, i) {
  718. + if (this.globalOptions.mergeOutput) return Object.assign(e, i);
  719. + e[t] ? Object.assign(e[t], i) : (e[t] = i);
  720. + }
  721. +}
  722. +e(H, "headerLength", 4),
  723. + e(H, "type", void 0),
  724. + e(H, "multiSegment", !1),
  725. + e(H, "canHandle", () => !1);
  726. +function W(e) {
  727. + return (
  728. + 192 === e ||
  729. + 194 === e ||
  730. + 196 === e ||
  731. + 219 === e ||
  732. + 221 === e ||
  733. + 218 === e ||
  734. + 254 === e
  735. + );
  736. +}
  737. +function Y(e) {
  738. + return e >= 224 && e <= 239;
  739. +}
  740. +function G(e, t, i) {
  741. + for (let [s, n] of m) if (n.canHandle(e, t, i)) return s;
  742. +}
  743. +class K extends class {
  744. + constructor(t, i, s) {
  745. + e(this, "errors", []),
  746. + e(this, "ensureSegmentChunk", async (e) => {
  747. + let t = e.start,
  748. + i = e.size || 65536;
  749. + if (this.file.chunked)
  750. + if (this.file.available(t, i)) e.chunk = this.file.subarray(t, i);
  751. + else
  752. + try {
  753. + e.chunk = await this.file.readChunk(t, i);
  754. + } catch (t) {
  755. + f(`Couldn't read segment: ${JSON.stringify(e)}. ${t.message}`);
  756. + }
  757. + else
  758. + this.file.byteLength > t + i
  759. + ? (e.chunk = this.file.subarray(t, i))
  760. + : void 0 === e.size
  761. + ? (e.chunk = this.file.subarray(t))
  762. + : f("Segment unreachable: " + JSON.stringify(e));
  763. + return e.chunk;
  764. + }),
  765. + this.extendOptions && this.extendOptions(t),
  766. + (this.options = t),
  767. + (this.file = i),
  768. + (this.parsers = s);
  769. + }
  770. + injectSegment(e, t) {
  771. + this.options[e].enabled && this.createParser(e, t);
  772. + }
  773. + createParser(e, t) {
  774. + let i = new (m.get(e))(t, this.options, this.file);
  775. + return (this.parsers[e] = i);
  776. + }
  777. + createParsers(e) {
  778. + for (let t of e) {
  779. + let { type: e, chunk: i } = t,
  780. + s = this.options[e];
  781. + if (s && s.enabled) {
  782. + let t = this.parsers[e];
  783. + (t && t.append) || t || this.createParser(e, i);
  784. + }
  785. + }
  786. + }
  787. + async readSegments(e) {
  788. + let t = e.map(this.ensureSegmentChunk);
  789. + await Promise.all(t);
  790. + }
  791. +} {
  792. + constructor() {
  793. + super(...arguments),
  794. + e(this, "appSegments", []),
  795. + e(this, "jpegSegments", []),
  796. + e(this, "unknownSegments", []);
  797. + }
  798. + static canHandle(e, t) {
  799. + return 65496 === t;
  800. + }
  801. + async parse() {
  802. + await this.findAppSegments(),
  803. + await this.readSegments(this.appSegments),
  804. + this.mergeMultiSegments(),
  805. + this.createParsers(this.mergedAppSegments || this.appSegments);
  806. + }
  807. + setupSegmentFinderArgs(e) {
  808. + !0 === e
  809. + ? ((this.findAll = !0), (this.wanted = new Set(m.keyList())))
  810. + : ((e =
  811. + void 0 === e
  812. + ? m.keyList().filter((e) => this.options[e].enabled)
  813. + : e.filter((e) => this.options[e].enabled && m.has(e))),
  814. + (this.findAll = !1),
  815. + (this.remaining = new Set(e)),
  816. + (this.wanted = new Set(e))),
  817. + (this.unfinishedMultiSegment = !1);
  818. + }
  819. + async findAppSegments() {
  820. + let e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0,
  821. + t = arguments.length > 1 ? arguments[1] : void 0;
  822. + this.setupSegmentFinderArgs(t);
  823. + let { file: i, findAll: s, wanted: n, remaining: r } = this;
  824. + if (
  825. + (!s &&
  826. + this.file.chunked &&
  827. + ((s = Array.from(n).some((e) => {
  828. + let t = m.get(e),
  829. + i = this.options[e];
  830. + return t.multiSegment && i.multiSegment;
  831. + })),
  832. + s && (await this.file.readWhole())),
  833. + (e = this.findAppSegmentsInRange(e, i.byteLength)),
  834. + !this.options.onlyTiff && i.chunked)
  835. + ) {
  836. + let t = !1;
  837. + for (
  838. + ;
  839. + r.size > 0 && !t && (i.canReadNextChunk || this.unfinishedMultiSegment);
  840. +
  841. + ) {
  842. + let { nextChunkOffset: s } = i,
  843. + n = this.appSegments.some(
  844. + (e) => !this.file.available(e.offset || e.start, e.length || e.size)
  845. + );
  846. + if (
  847. + ((t =
  848. + e > s && !n
  849. + ? !(await i.readNextChunk(e))
  850. + : !(await i.readNextChunk(s))),
  851. + (e = this.findAppSegmentsInRange(e, i.byteLength)),
  852. + void 0 === e)
  853. + )
  854. + return;
  855. + }
  856. + }
  857. + }
  858. + findAppSegmentsInRange(e, t) {
  859. + t -= 2;
  860. + let i,
  861. + s,
  862. + n,
  863. + r,
  864. + a,
  865. + h,
  866. + { file: f, findAll: o, wanted: l, remaining: d, options: u } = this;
  867. + for (; e < t; e++)
  868. + if (255 === f.getUint8(e))
  869. + if (((i = f.getUint8(e + 1)), Y(i))) {
  870. + if (
  871. + ((s = f.getUint16(e + 2)),
  872. + (n = G(f, e, s)),
  873. + n &&
  874. + l.has(n) &&
  875. + ((r = m.get(n)),
  876. + (a = r.findPosition(f, e)),
  877. + (h = u[n]),
  878. + (a.type = n),
  879. + this.appSegments.push(a),
  880. + !o &&
  881. + (r.multiSegment && h.multiSegment
  882. + ? ((this.unfinishedMultiSegment =
  883. + a.chunkNumber < a.chunkCount),
  884. + this.unfinishedMultiSegment || d.delete(n))
  885. + : d.delete(n),
  886. + 0 === d.size)))
  887. + )
  888. + break;
  889. + u.recordUnknownSegments &&
  890. + ((a = H.findPosition(f, e)),
  891. + (a.marker = i),
  892. + this.unknownSegments.push(a)),
  893. + (e += s + 1);
  894. + } else if (W(i)) {
  895. + if (((s = f.getUint16(e + 2)), 218 === i && !1 !== u.stopAfterSos))
  896. + return;
  897. + u.recordJpegSegments &&
  898. + this.jpegSegments.push({ offset: e, length: s, marker: i }),
  899. + (e += s + 1);
  900. + }
  901. + return e;
  902. + }
  903. + mergeMultiSegments() {
  904. + if (!this.appSegments.some((e) => e.multiSegment)) return;
  905. + let e = (function (e, t) {
  906. + let i,
  907. + s,
  908. + n,
  909. + r = new Map();
  910. + for (let a = 0; a < e.length; a++)
  911. + (i = e[a]),
  912. + (s = i[t]),
  913. + r.has(s) ? (n = r.get(s)) : r.set(s, (n = [])),
  914. + n.push(i);
  915. + return Array.from(r);
  916. + })(this.appSegments, "type");
  917. + this.mergedAppSegments = e.map((e) => {
  918. + let [t, i] = e,
  919. + s = m.get(t, this.options);
  920. + if (s.handleMultiSegments) {
  921. + return { type: t, chunk: s.handleMultiSegments(i) };
  922. + }
  923. + return i[0];
  924. + });
  925. + }
  926. + getSegment(e) {
  927. + return this.appSegments.find((t) => t.type === e);
  928. + }
  929. + async getOrFindSegment(e) {
  930. + let t = this.getSegment(e);
  931. + return (
  932. + void 0 === t &&
  933. + (await this.findAppSegments(0, [e]), (t = this.getSegment(e))),
  934. + t
  935. + );
  936. + }
  937. +}
  938. +e(K, "type", "jpeg"), g.set("jpeg", K);
  939. +const R = [void 0, 1, 1, 2, 4, 8, 1, 1, 2, 4, 8, 4, 8, 4];
  940. +class J extends H {
  941. + parseHeader() {
  942. + var e = this.chunk.getUint16();
  943. + 18761 === e ? (this.le = !0) : 19789 === e && (this.le = !1),
  944. + (this.chunk.le = this.le),
  945. + (this.headerParsed = !0);
  946. + }
  947. + parseTags(e, t) {
  948. + let i =
  949. + arguments.length > 2 && void 0 !== arguments[2]
  950. + ? arguments[2]
  951. + : new Map(),
  952. + { pick: s, skip: n } = this.options[t];
  953. + s = new Set(s);
  954. + let r = s.size > 0,
  955. + a = 0 === n.size,
  956. + h = this.chunk.getUint16(e);
  957. + e += 2;
  958. + for (let f = 0; f < h; f++) {
  959. + let h = this.chunk.getUint16(e);
  960. + if (r) {
  961. + if (
  962. + s.has(h) &&
  963. + (i.set(h, this.parseTag(e, h, t)), s.delete(h), 0 === s.size)
  964. + )
  965. + break;
  966. + } else (!a && n.has(h)) || i.set(h, this.parseTag(e, h, t));
  967. + e += 12;
  968. + }
  969. + return i;
  970. + }
  971. + parseTag(e, t, i) {
  972. + let { chunk: s } = this,
  973. + n = s.getUint16(e + 2),
  974. + r = s.getUint32(e + 4),
  975. + a = R[n];
  976. + if (
  977. + (a * r <= 4 ? (e += 8) : (e = s.getUint32(e + 8)),
  978. + (n < 1 || n > 13) &&
  979. + f(
  980. + `Invalid TIFF value type. block: ${i.toUpperCase()}, tag: ${t.toString(
  981. + 16
  982. + )}, type: ${n}, offset ${e}`
  983. + ),
  984. + e > s.byteLength &&
  985. + f(
  986. + `Invalid TIFF value offset. block: ${i.toUpperCase()}, tag: ${t.toString(
  987. + 16
  988. + )}, type: ${n}, offset ${e} is outside of chunk size ${s.byteLength}`
  989. + ),
  990. + 1 === n)
  991. + )
  992. + return s.getUint8Array(e, r);
  993. + if (2 === n)
  994. + return "" ===
  995. + (h = (function (e) {
  996. + for (; e.endsWith("\0"); ) e = e.slice(0, -1);
  997. + return e;
  998. + })((h = s.getString(e, r))).trim())
  999. + ? void 0
  1000. + : h;
  1001. + var h;
  1002. + if (7 === n) return s.getUint8Array(e, r);
  1003. + if (1 === r) return this.parseTagValue(n, e);
  1004. + {
  1005. + let t = (function (e) {
  1006. + switch (e) {
  1007. + case 1:
  1008. + return Uint8Array;
  1009. + case 3:
  1010. + return Uint16Array;
  1011. + case 4:
  1012. + return Uint32Array;
  1013. + case 5:
  1014. + case 10:
  1015. + default:
  1016. + return Array;
  1017. + case 6:
  1018. + return Int8Array;
  1019. + case 8:
  1020. + return Int16Array;
  1021. + case 9:
  1022. + return Int32Array;
  1023. + case 11:
  1024. + return Float32Array;
  1025. + case 12:
  1026. + return Float64Array;
  1027. + }
  1028. + })(n),
  1029. + i = new t(r),
  1030. + s = a;
  1031. + for (let t = 0; t < r; t++) (i[t] = this.parseTagValue(n, e)), (e += s);
  1032. + return i;
  1033. + }
  1034. + }
  1035. + parseTagValue(e, t) {
  1036. + let { chunk: i } = this;
  1037. + switch (e) {
  1038. + case 1:
  1039. + return i.getUint8(t);
  1040. + case 3:
  1041. + return i.getUint16(t);
  1042. + case 4:
  1043. + case 13:
  1044. + return i.getUint32(t);
  1045. + case 5:
  1046. + return i.getUint32(t) / i.getUint32(t + 4);
  1047. + case 6:
  1048. + return i.getInt8(t);
  1049. + case 8:
  1050. + return i.getInt16(t);
  1051. + case 9:
  1052. + return i.getInt32(t);
  1053. + case 10:
  1054. + return i.getInt32(t) / i.getInt32(t + 4);
  1055. + case 11:
  1056. + return i.getFloat(t);
  1057. + case 12:
  1058. + return i.getDouble(t);
  1059. + default:
  1060. + f(`Invalid tiff type ${e}`);
  1061. + }
  1062. + }
  1063. +}
  1064. +class q extends J {
  1065. + static canHandle(e, t) {
  1066. + return (
  1067. + 225 === e.getUint8(t + 1) &&
  1068. + 1165519206 === e.getUint32(t + 4) &&
  1069. + 0 === e.getUint16(t + 8)
  1070. + );
  1071. + }
  1072. + async parse() {
  1073. + this.parseHeader();
  1074. + let { options: e } = this;
  1075. + return (
  1076. + e.ifd0.enabled && (await this.parseIfd0Block()),
  1077. + e.exif.enabled && (await this.safeParse("parseExifBlock")),
  1078. + e.gps.enabled && (await this.safeParse("parseGpsBlock")),
  1079. + e.interop.enabled && (await this.safeParse("parseInteropBlock")),
  1080. + e.ifd1.enabled && (await this.safeParse("parseThumbnailBlock")),
  1081. + this.createOutput()
  1082. + );
  1083. + }
  1084. + safeParse(e) {
  1085. + let t = this[e]();
  1086. + return void 0 !== t.catch && (t = t.catch(this.handleError)), t;
  1087. + }
  1088. + findIfd0Offset() {
  1089. + void 0 === this.ifd0Offset && (this.ifd0Offset = this.chunk.getUint32(4));
  1090. + }
  1091. + findIfd1Offset() {
  1092. + if (void 0 === this.ifd1Offset) {
  1093. + this.findIfd0Offset();
  1094. + let e = this.chunk.getUint16(this.ifd0Offset),
  1095. + t = this.ifd0Offset + 2 + 12 * e;
  1096. + this.ifd1Offset = this.chunk.getUint32(t);
  1097. + }
  1098. + }
  1099. + parseBlock(e, t) {
  1100. + let i = new Map();
  1101. + return (this[t] = i), this.parseTags(e, t, i), i;
  1102. + }
  1103. + async parseIfd0Block() {
  1104. + if (this.ifd0) return;
  1105. + let { file: e } = this;
  1106. + this.findIfd0Offset(),
  1107. + this.ifd0Offset < 8 && f("Malformed EXIF data"),
  1108. + !e.chunked &&
  1109. + this.ifd0Offset > e.byteLength &&
  1110. + f(
  1111. + `IFD0 offset points to outside of file.\nthis.ifd0Offset: ${this.ifd0Offset}, file.byteLength: ${e.byteLength}`
  1112. + ),
  1113. + e.tiff && (await e.ensureChunk(this.ifd0Offset, o(this.options)));
  1114. + let t = this.parseBlock(this.ifd0Offset, "ifd0");
  1115. + return 0 !== t.size
  1116. + ? ((this.exifOffset = t.get(34665)),
  1117. + (this.interopOffset = t.get(40965)),
  1118. + (this.gpsOffset = t.get(34853)),
  1119. + (this.xmp = t.get(700)),
  1120. + (this.iptc = t.get(33723)),
  1121. + (this.icc = t.get(34675)),
  1122. + this.options.sanitize &&
  1123. + (t.delete(34665),
  1124. + t.delete(40965),
  1125. + t.delete(34853),
  1126. + t.delete(700),
  1127. + t.delete(33723),
  1128. + t.delete(34675)),
  1129. + t)
  1130. + : void 0;
  1131. + }
  1132. + async parseExifBlock() {
  1133. + if (this.exif) return;
  1134. + if (
  1135. + (this.ifd0 || (await this.parseIfd0Block()), void 0 === this.exifOffset)
  1136. + )
  1137. + return;
  1138. + this.file.tiff &&
  1139. + (await this.file.ensureChunk(this.exifOffset, o(this.options)));
  1140. + let e = this.parseBlock(this.exifOffset, "exif");
  1141. + return (
  1142. + this.interopOffset || (this.interopOffset = e.get(40965)),
  1143. + (this.makerNote = e.get(37500)),
  1144. + (this.userComment = e.get(37510)),
  1145. + this.options.sanitize &&
  1146. + (e.delete(40965), e.delete(37500), e.delete(37510)),
  1147. + this.unpack(e, 41728),
  1148. + this.unpack(e, 41729),
  1149. + e
  1150. + );
  1151. + }
  1152. + unpack(e, t) {
  1153. + let i = e.get(t);
  1154. + i && 1 === i.length && e.set(t, i[0]);
  1155. + }
  1156. + async parseGpsBlock() {
  1157. + if (this.gps) return;
  1158. + if ((this.ifd0 || (await this.parseIfd0Block()), void 0 === this.gpsOffset))
  1159. + return;
  1160. + let e = this.parseBlock(this.gpsOffset, "gps");
  1161. + return (
  1162. + e &&
  1163. + e.has(2) &&
  1164. + e.has(4) &&
  1165. + (e.set("latitude", Q(...e.get(2), e.get(1))),
  1166. + e.set("longitude", Q(...e.get(4), e.get(3)))),
  1167. + e
  1168. + );
  1169. + }
  1170. + async parseInteropBlock() {
  1171. + if (
  1172. + !this.interop &&
  1173. + (this.ifd0 || (await this.parseIfd0Block()),
  1174. + void 0 !== this.interopOffset ||
  1175. + this.exif ||
  1176. + (await this.parseExifBlock()),
  1177. + void 0 !== this.interopOffset)
  1178. + )
  1179. + return this.parseBlock(this.interopOffset, "interop");
  1180. + }
  1181. + async parseThumbnailBlock() {
  1182. + let e = arguments.length > 0 && void 0 !== arguments[0] && arguments[0];
  1183. + if (!this.ifd1 && !this.ifd1Parsed && (!this.options.mergeOutput || e))
  1184. + return (
  1185. + this.findIfd1Offset(),
  1186. + this.ifd1Offset > 0 &&
  1187. + (this.parseBlock(this.ifd1Offset, "ifd1"), (this.ifd1Parsed = !0)),
  1188. + this.ifd1
  1189. + );
  1190. + }
  1191. + async extractThumbnail() {
  1192. + if (
  1193. + (this.headerParsed || this.parseHeader(),
  1194. + this.ifd1Parsed || (await this.parseThumbnailBlock(!0)),
  1195. + void 0 === this.ifd1)
  1196. + )
  1197. + return;
  1198. + let e = this.ifd1.get(513),
  1199. + t = this.ifd1.get(514);
  1200. + return this.chunk.getUint8Array(e, t);
  1201. + }
  1202. + get image() {
  1203. + return this.ifd0;
  1204. + }
  1205. + get thumbnail() {
  1206. + return this.ifd1;
  1207. + }
  1208. + createOutput() {
  1209. + let e,
  1210. + t,
  1211. + i,
  1212. + s = {};
  1213. + for (t of V)
  1214. + if (((e = this[t]), !h(e)))
  1215. + if (
  1216. + ((i = this.canTranslate
  1217. + ? this.translateBlock(e, t)
  1218. + : Object.fromEntries(e)),
  1219. + this.options.mergeOutput)
  1220. + ) {
  1221. + if ("ifd1" === t) continue;
  1222. + Object.assign(s, i);
  1223. + } else s[t] = i;
  1224. + return (
  1225. + this.makerNote && (s.makerNote = this.makerNote),
  1226. + this.userComment && (s.userComment = this.userComment),
  1227. + s
  1228. + );
  1229. + }
  1230. + assignToOutput(e, t) {
  1231. + if (this.globalOptions.mergeOutput) Object.assign(e, t);
  1232. + else
  1233. + for (let [i, s] of Object.entries(t)) this.assignObjectToOutput(e, i, s);
  1234. + }
  1235. +}
  1236. +function Q(e, t, i, s) {
  1237. + var n = e + t / 60 + i / 3600;
  1238. + return ("S" !== s && "W" !== s) || (n *= -1), n;
  1239. +}
  1240. +e(q, "type", "tiff"), e(q, "headerLength", 10), m.set("tiff", q);
  1241. +const Z = Object.assign(
  1242. + {},
  1243. + {
  1244. + ifd0: !1,
  1245. + ifd1: !1,
  1246. + exif: !1,
  1247. + gps: !1,
  1248. + interop: !1,
  1249. + sanitize: !1,
  1250. + reviveValues: !0,
  1251. + translateKeys: !1,
  1252. + translateValues: !1,
  1253. + mergeOutput: !1,
  1254. + },
  1255. + { firstChunkSize: 4e4, ifd0: [274] }
  1256. +);
  1257. +const ee = Object.freeze({
  1258. + 1: { dimensionSwapped: !1, scaleX: 1, scaleY: 1, deg: 0, rad: 0 },
  1259. + 2: { dimensionSwapped: !1, scaleX: -1, scaleY: 1, deg: 0, rad: 0 },
  1260. + 3: {
  1261. + dimensionSwapped: !1,
  1262. + scaleX: 1,
  1263. + scaleY: 1,
  1264. + deg: 180,
  1265. + rad: (180 * Math.PI) / 180,
  1266. + },
  1267. + 4: {
  1268. + dimensionSwapped: !1,
  1269. + scaleX: -1,
  1270. + scaleY: 1,
  1271. + deg: 180,
  1272. + rad: (180 * Math.PI) / 180,
  1273. + },
  1274. + 5: {
  1275. + dimensionSwapped: !0,
  1276. + scaleX: 1,
  1277. + scaleY: -1,
  1278. + deg: 90,
  1279. + rad: (90 * Math.PI) / 180,
  1280. + },
  1281. + 6: {
  1282. + dimensionSwapped: !0,
  1283. + scaleX: 1,
  1284. + scaleY: 1,
  1285. + deg: 90,
  1286. + rad: (90 * Math.PI) / 180,
  1287. + },
  1288. + 7: {
  1289. + dimensionSwapped: !0,
  1290. + scaleX: 1,
  1291. + scaleY: -1,
  1292. + deg: 270,
  1293. + rad: (270 * Math.PI) / 180,
  1294. + },
  1295. + 8: {
  1296. + dimensionSwapped: !0,
  1297. + scaleX: 1,
  1298. + scaleY: 1,
  1299. + deg: 270,
  1300. + rad: (270 * Math.PI) / 180,
  1301. + },
  1302. +});
  1303. +let te = !0,
  1304. + ie = !0;
  1305. +if ("object" == typeof navigator) {
  1306. + let e = navigator.userAgent;
  1307. + if (e.includes("iPad") || e.includes("iPhone")) {
  1308. + let t = e.match(/OS (\d+)_(\d+)/);
  1309. + if (t) {
  1310. + let [, e, i] = t,
  1311. + s = Number(e) + 0.1 * Number(i);
  1312. + (te = s < 13.4), (ie = !1);
  1313. + }
  1314. + } else if (e.includes("OS X 10")) {
  1315. + let [, t] = e.match(/OS X 10[_.](\d+)/);
  1316. + te = ie = Number(t) < 15;
  1317. + }
  1318. + if (e.includes("Chrome/")) {
  1319. + let [, t] = e.match(/Chrome\/(\d+)/);
  1320. + te = ie = Number(t) < 81;
  1321. + } else if (e.includes("Firefox/")) {
  1322. + let [, t] = e.match(/Firefox\/(\d+)/);
  1323. + te = ie = Number(t) < 77;
  1324. + }
  1325. +}
  1326. +exports.rotation = async function (e) {
  1327. + let t = await (async function (e) {
  1328. + let t = new X(Z);
  1329. + await t.read(e);
  1330. + let i = await t.parse();
  1331. + if (i && i.ifd0) return i.ifd0[274];
  1332. + })(e);
  1333. + return Object.assign({ canvas: te, css: ie }, ee[t]);
  1334. +};
  1335. diff --git a/src/bundles/mini.mjs b/src/bundles/mini.mjs
  1336. index 7ce308ebd54354309f4da01196ba3b3f222a8e7e..bfef917357d6785b4cc0898ab71002b58bf11c9e 100644
  1337. --- a/src/bundles/mini.mjs
  1338. +++ b/src/bundles/mini.mjs
  1339. @@ -1,12 +1,5 @@
  1340. -export * from './nano.mjs'
  1341. -import * as nano from './nano.mjs'
  1342. -export default nano
  1343. -
  1344. -
  1345. -// Highlevel API: gps(), thumbnail(), thumbnailUrl(), orientation(), rotation()
  1346. -export * from '../highlevel/gps.mjs'
  1347. -export * from '../highlevel/thumb.mjs'
  1348. -export * from '../highlevel/orientation.mjs'
  1349. +import '../core.mjs'
  1350. +export { rotation } from '../highlevel/orientation.mjs'
  1351. // File Readers
  1352. import '../file-readers/BlobReader.mjs'