s3db.js 7.0.1 → 7.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- var S3DB=function(e,t,r,i,s,n,o,a,c,u,l,h,d){"use strict";function f(e){"string"!=typeof e&&(e=String(e));let t=0;for(let r=0;r<e.length;r++){const i=e.codePointAt(r);i<=127?t+=1:i<=2047?t+=2:i<=65535?t+=3:i<=1114111&&(t+=4,i>65535&&r++)}return t}function p(e){let t=0;for(const r of Object.keys(e))t+=f(r);return t}function g(e){return null==e?"":"boolean"==typeof e?e?"1":"0":"number"==typeof e?String(e):"string"==typeof e?e:Array.isArray(e)?0===e.length?"[]":e.map(e=>String(e)).join("|"):"object"==typeof e?JSON.stringify(e):String(e)}function m(e){const t={};for(const[r,i]of Object.entries(e)){const e=f(g(i));t[r]=e}return t}function y(e){const t=m(e);return Object.values(t).reduce((e,t)=>e+t,0)+p(e)}function b(e={}){const{version:t="1",timestamps:r=!1,id:i=""}=e,s={_v:String(t)};r&&(s.createdAt="2024-01-01T00:00:00.000Z",s.updatedAt="2024-01-01T00:00:00.000Z"),i&&(s.id=i);const n={};for(const[e,t]of Object.entries(s))n[e]=t;return y(n)}function w(e={}){const{s3Limit:t=2048,systemConfig:r={}}=e;return t-b(r)}const v=2047;var O=Object.freeze({__proto__:null,S3_METADATA_LIMIT_BYTES:v,handleGet:async function({resource:e,metadata:t,body:r}){return{metadata:t,body:r}},handleInsert:async function({resource:e,data:t,mappedData:r,originalData:i}){const s=y(r),n=w({s3Limit:v,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t.id}});if(s>n)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${s} bytes, effective limit: ${n} bytes, absolute limit: 2047 bytes`);return{mappedData:r,body:JSON.stringify(r)}},handleUpdate:async function({resource:e,id:t,data:r,mappedData:i,originalData:s}){const n=y(i),o=w({s3Limit:v,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t}});if(n>o)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${n} bytes, effective limit: ${o} bytes, absolute limit: 2047 bytes`);return{mappedData:i,body:JSON.stringify(i)}},handleUpsert:async function({resource:e,id:t,data:r,mappedData:i}){const s=y(i),n=w({s3Limit:v,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t}});if(s>n)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${s} bytes, effective limit: ${n} bytes, absolute limit: 2047 bytes`);return{mappedData:i,body:""}}});var k=Object.freeze({__proto__:null,handleGet:async function({resource:e,metadata:t,body:r}){return{metadata:t,body:r}},handleInsert:async function({resource:e,data:t,mappedData:r,originalData:i}){const s=y(r);return s>w({s3Limit:v,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t.id}})&&e.emit("exceedsLimit",{operation:"insert",totalSize:s,limit:2047,excess:s-2047,data:i||t}),{mappedData:r,body:JSON.stringify(t)}},handleUpdate:async function({resource:e,id:t,data:r,mappedData:i,originalData:s}){const n=y(i);return n>w({s3Limit:v,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t}})&&e.emit("exceedsLimit",{operation:"update",id:t,totalSize:n,limit:2047,excess:n-2047,data:s||r}),{mappedData:i,body:JSON.stringify(r)}},handleUpsert:async function({resource:e,id:t,data:r,mappedData:i,originalData:s}){const n=y(i);return n>w({s3Limit:v,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t}})&&e.emit("exceedsLimit",{operation:"upsert",id:t,totalSize:n,limit:2047,excess:n-2047,data:s||r}),{mappedData:i,body:JSON.stringify(r)}}});const S="$truncated",_="true",R=f(S)+f(_);async function j({resource:e,data:t,mappedData:r,originalData:i}){const s=w({s3Limit:v,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t.id}}),n=m(r),o=Object.entries(n).sort(([,e],[,t])=>e-t),a={};let c=0,u=!1;r._v&&(a._v=r._v,c+=n._v);for(const[e,t]of o){if("_v"===e)continue;const i=r[e];if(!(c+(t+(u?0:R))<=s)){const t=s-c-(u?0:R);if(t>0){const r=E(i,t);a[e]=r,u=!0,c+=f(r)}else a[e]="",u=!0;break}a[e]=i,c+=t}let l=y(a)+(u?R:0);for(;l>s;){const e=Object.keys(a).filter(e=>"_v"!==e&&"$truncated"!==e);if(0===e.length)break;a[e[e.length-1]]="",l=y(a)+R,u=!0}return u&&(a[S]=_),{mappedData:a,body:JSON.stringify(r)}}function E(e,t){if("string"==typeof e)return N(e,t);if("object"==typeof e&&null!==e){return N(JSON.stringify(e),t)}return N(String(e),t)}function N(e,t){const r=new TextEncoder;let i=r.encode(e);if(i.length<=t)return e;let s=e.length;for(;s>0;){const n=e.substring(0,s);if(i=r.encode(n),i.length<=t)return n;s--}return""}var A=Object.freeze({__proto__:null,handleGet:async function({resource:e,metadata:t,body:r}){return{metadata:t,body:r}},handleInsert:j,handleUpdate:async function({resource:e,id:t,data:r,mappedData:i,originalData:s}){return j({resource:e,data:r,mappedData:i,originalData:s})},handleUpsert:async function({resource:e,id:t,data:r,mappedData:i}){return j({resource:e,data:r,mappedData:i})}});function I(e){if(null==e){const e=new Error("fnOrPromise cannot be null or undefined");return e.stack=(new Error).stack,[!1,e,void 0]}if("function"==typeof e)try{const t=e();return null==t?[!0,null,t]:"function"==typeof t.then?t.then(e=>[!0,null,e]).catch(e=>{if(e instanceof Error&&Object.isExtensible(e)){const t=Object.getOwnPropertyDescriptor(e,"stack");if(t&&t.writable&&t.configurable&&e.hasOwnProperty("stack"))try{e.stack=(new Error).stack}catch(e){}}return[!1,e,void 0]}):[!0,null,t]}catch(e){if(e instanceof Error&&Object.isExtensible(e)){const t=Object.getOwnPropertyDescriptor(e,"stack");if(t&&t.writable&&t.configurable&&e.hasOwnProperty("stack"))try{e.stack=(new Error).stack}catch(e){}}return[!1,e,void 0]}return"function"==typeof e.then?Promise.resolve(e).then(e=>[!0,null,e]).catch(e=>{if(e instanceof Error&&Object.isExtensible(e)){const t=Object.getOwnPropertyDescriptor(e,"stack");if(t&&t.writable&&t.configurable&&e.hasOwnProperty("stack"))try{e.stack=(new Error).stack}catch(e){}}return[!1,e,void 0]}):[!0,null,e]}function D(e){try{return[!0,null,e()]}catch(e){return[!1,e,null]}}const x="$overflow",P="true",C=f(x)+f(P);async function T({resource:e,data:t,mappedData:r,originalData:i}){const s=w({s3Limit:v,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t.id}}),n=m(r),o=Object.entries(n).sort(([,e],[,t])=>e-t),a={},c={};let u=0,l=!1;r._v&&(a._v=r._v,u+=n._v);let h=s;for(const[e,t]of o)"_v"!==e&&(!l&&u+t>s&&(h-=C,l=!0),!l&&u+t<=h?(a[e]=r[e],u+=t):(c[e]=r[e],l=!0));l&&(a[x]=P);const d=Object.keys(c).length>0;let f=d?JSON.stringify(c):"";return d||(f="{}"),{mappedData:a,body:f}}async function L({resource:e,data:t,mappedData:r}){const i={_v:r._v||String(e.version)};i._map=JSON.stringify(e.schema.map);return{mappedData:i,body:JSON.stringify(r)}}const $={"user-managed":k,"enforce-limits":O,"truncate-data":A,"body-overflow":Object.freeze({__proto__:null,handleGet:async function({resource:e,metadata:t,body:r}){let i={};if(r&&""!==r.trim()){const[e,t,s]=D(()=>JSON.parse(r));i=e?s:{}}const s={...i,...t};return delete s.$overflow,{metadata:s,body:r}},handleInsert:T,handleUpdate:async function({resource:e,id:t,data:r,mappedData:i,originalData:s}){return T({resource:e,data:r,mappedData:i,originalData:s})},handleUpsert:async function({resource:e,id:t,data:r,mappedData:i}){return T({resource:e,data:r,mappedData:i})}}),"body-only":Object.freeze({__proto__:null,handleGet:async function({resource:e,metadata:t,body:r}){let i={};if(r&&""!==r.trim()){const[e,t,s]=D(()=>JSON.parse(r));i=e?s:{}}return{metadata:{...i,...t},body:r}},handleInsert:L,handleUpdate:async function({resource:e,id:t,data:r,mappedData:i}){const s={_v:i._v||String(e.version)};return s._map=JSON.stringify(e.schema.map),{mappedData:s,body:JSON.stringify(i)}},handleUpsert:async function({resource:e,id:t,data:r,mappedData:i}){return L({resource:e,data:r,mappedData:i})}})};function M(e){const t=$[e];if(!t)throw new Error(`Unknown behavior: ${e}. Available behaviors: ${Object.keys($).join(", ")}`);return t}const U=Object.keys($),q="user-managed",F="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",B=Object.fromEntries([...F].map((e,t)=>[e,t])),z=e=>{if("number"!=typeof e||isNaN(e))return"undefined";if(!isFinite(e))return"undefined";if(0===e)return F[0];if(e<0)return"-"+z(-Math.floor(e));e=Math.floor(e);let t="";for(;e;)t=F[e%62]+t,e=Math.floor(e/62);return t},V=e=>{if("string"!=typeof e)return NaN;if(""===e)return 0;let t=!1;"-"===e[0]&&(t=!0,e=e.slice(1));let r=0;for(let t=0;t<e.length;t++){const i=B[e[t]];if(void 0===i)return NaN;r=62*r+i}return t?-r:r},K=e=>{if("number"!=typeof e||isNaN(e))return"undefined";if(!isFinite(e))return"undefined";const t=e<0;e=Math.abs(e);const[r,i]=e.toString().split("."),s=z(Number(r));return i?(t?"-":"")+s+"."+i:(t?"-":"")+s},H=e=>{if("string"!=typeof e)return NaN;let t=!1;"-"===e[0]&&(t=!0,e=e.slice(1));const[r,i]=e.split("."),s=V(r);if(isNaN(s))return NaN;const n=i?Number(s+"."+i):s;return t?-n:n};class W extends Error{constructor({verbose:e,bucket:t,key:r,message:i,code:s,statusCode:n,requestId:o,awsMessage:a,original:c,commandName:u,commandInput:l,metadata:h,suggestion:d,...f}){e&&(i+=`\n\nVerbose:\n\n${JSON.stringify(f,null,2)}`),super(i),"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error(i).stack,super.name=this.constructor.name,this.name=this.constructor.name,this.bucket=t,this.key=r,this.thrownAt=new Date,this.code=s,this.statusCode=n,this.requestId=o,this.awsMessage=a,this.original=c,this.commandName=u,this.commandInput=l,this.metadata=h,this.suggestion=d,this.data={bucket:t,key:r,...f,verbose:e,message:i}}toJson(){return{name:this.name,message:this.message,code:this.code,statusCode:this.statusCode,requestId:this.requestId,awsMessage:this.awsMessage,bucket:this.bucket,key:this.key,thrownAt:this.thrownAt,commandName:this.commandName,commandInput:this.commandInput,metadata:this.metadata,suggestion:this.suggestion,data:this.data,original:this.original,stack:this.stack}}toString(){return`${this.name} | ${this.message}`}}class G extends W{constructor(e,t={}){let r,i,s,n,o,a;t.original&&(o=t.original,r=o.code||o.Code||o.name,i=o.statusCode||o.$metadata&&o.$metadata.httpStatusCode,s=o.requestId||o.$metadata&&o.$metadata.requestId,n=o.message,a=o.$metadata?{...o.$metadata}:void 0),super({message:e,...t,code:r,statusCode:i,requestId:s,awsMessage:n,original:o,metadata:a})}}class J extends G{constructor(e,t={}){super(e,t),Object.assign(this,t)}}class Y extends G{constructor(e,t={}){super(e,t),Object.assign(this,t)}}class Q extends G{constructor({bucket:e,resourceName:t,id:r,original:i,...s}){if("string"!=typeof r)throw new Error("id must be a string");if("string"!=typeof e)throw new Error("bucket must be a string");if("string"!=typeof t)throw new Error("resourceName must be a string");super(`Resource not found: ${t}/${r} [bucket:${e}]`,{bucket:e,resourceName:t,id:r,original:i,...s})}}class X extends G{constructor({bucket:e,original:t,...r}){if("string"!=typeof e)throw new Error("bucket must be a string");super(`Bucket does not exists [bucket:${e}]`,{bucket:e,original:t,...r})}}class Z extends G{constructor({bucket:e,key:t,resourceName:r,id:i,original:s,...n}){if("string"!=typeof t)throw new Error("key must be a string");if("string"!=typeof e)throw new Error("bucket must be a string");if(void 0!==i&&"string"!=typeof i)throw new Error("id must be a string");super(`No such key: ${t} [bucket:${e}]`,{bucket:e,key:t,resourceName:r,id:i,original:s,...n}),this.resourceName=r,this.id=i}}class ee extends G{constructor({bucket:e,key:t,resourceName:r,id:i,original:s,...n}){if("string"!=typeof t)throw new Error("key must be a string");if("string"!=typeof e)throw new Error("bucket must be a string");super(`Not found: ${t} [bucket:${e}]`,{bucket:e,key:t,resourceName:r,id:i,original:s,...n}),this.resourceName=r,this.id=i}}class te extends G{constructor({bucket:e,original:t,...r}){if("string"!=typeof e)throw new Error("bucket must be a string");super(`Missing metadata for bucket [bucket:${e}]`,{bucket:e,original:t,...r})}}class re extends G{constructor({bucket:e,resourceName:t,attributes:r,validation:i,message:s,original:n,...o}){if("string"!=typeof e)throw new Error("bucket must be a string");if("string"!=typeof t)throw new Error("resourceName must be a string");super(s||`Validation error: This item is not valid. Resource=${t} [bucket:${e}].\n${JSON.stringify(i,null,2)}`,{bucket:e,resourceName:t,attributes:r,validation:i,original:n,...o})}}class ie extends G{}const se={NotFound:ee,NoSuchKey:Z,UnknownError:ie,NoSuchBucket:X,MissingMetadata:te,InvalidResourceItem:re};function ne(e,t={}){const r=e.code||e.Code||e.name,i=e.$metadata?{...e.$metadata}:void 0,s=t.commandName,n=t.commandInput;let o;return"NoSuchKey"===r||"NotFound"===r?(o="Check if the key exists in the specified bucket and if your credentials have permission.",new Z({...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o})):"NoSuchBucket"===r?(o="Check if the bucket exists and if your credentials have permission.",new X({...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o})):"AccessDenied"===r||403===e.statusCode||"Forbidden"===r?(o="Check your credentials and bucket policy.",new Y("Access denied",{...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o})):"ValidationError"===r||400===e.statusCode?(o="Check the request parameters and payload.",new J("Validation error",{...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o})):"MissingMetadata"===r?(o="Check if the object metadata is present and valid.",new te({...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o})):(o="Check the error details and AWS documentation.",new ie("Unknown error",{...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o}))}class oe extends G{constructor(e,t={}){super(e,{...t,suggestion:"Check the connection string format and credentials."})}}class ae extends G{constructor(e,t={}){super(e,{...t,suggestion:"Check if the crypto library is available and input is valid."})}}class ce extends G{constructor(e,t={}){super(e,{...t,suggestion:"Check schema definition and input data."})}}class ue extends G{constructor(e,t={}){super(e,{...t,suggestion:t.suggestion||"Check resource configuration, attributes, and operation context."}),Object.assign(this,t)}}class le extends G{constructor(e,t={}){super(e,{...t,suggestion:t.suggestion||"Check partition definition, fields, and input values."})}}async function he(){let e;if("undefined"!=typeof process){const[t,r,i]=await I(async()=>{const{webcrypto:e}=await import("crypto");return e});if(!t)throw new ae("Crypto API not available",{original:r,context:"dynamicCrypto"});e=i}else"undefined"!=typeof window&&(e=window.crypto);if(!e)throw new ae("Could not load any crypto library",{context:"dynamicCrypto"});return e}async function de(e){const[t,r,i]=await I(he);if(!t)throw new ae("Crypto API not available",{original:r});const s=(new TextEncoder).encode(e),[n,o,a]=await I(()=>i.subtle.digest("SHA-256",s));if(!n)throw new ae("SHA-256 digest failed",{original:o,input:e});return Array.from(new Uint8Array(a)).map(e=>e.toString(16).padStart(2,"0")).join("")}async function fe(e,t){const[r,i,s]=await I(he);if(!r)throw new ae("Crypto API not available",{original:i});const n=s.getRandomValues(new Uint8Array(16)),[o,a,c]=await I(()=>me(t,n));if(!o)throw new ae("Key derivation failed",{original:a,passphrase:t,salt:n});const u=s.getRandomValues(new Uint8Array(12)),l=(new TextEncoder).encode(e),[h,d,f]=await I(()=>s.subtle.encrypt({name:"AES-GCM",iv:u},c,l));if(!h)throw new ae("Encryption failed",{original:d,content:e});const p=new Uint8Array(n.length+u.length+f.byteLength);return p.set(n),p.set(u,n.length),p.set(new Uint8Array(f),n.length+u.length),function(e){if("undefined"!=typeof process)return Buffer.from(e).toString("base64");{const[t,r,i]=D(()=>String.fromCharCode.apply(null,new Uint8Array(e)));if(!t)throw new ae("Failed to convert ArrayBuffer to base64 (browser)",{original:r});return window.btoa(i)}}(p)}async function pe(e,t){const[r,i,s]=await I(he);if(!r)throw new ae("Crypto API not available",{original:i});const n=function(e){if("undefined"!=typeof process)return new Uint8Array(Buffer.from(e,"base64"));{const[t,r,i]=D(()=>window.atob(e));if(!t)throw new ae("Failed to decode base64 (browser)",{original:r});const s=i.length,n=new Uint8Array(s);for(let e=0;e<s;e++)n[e]=i.charCodeAt(e);return n}}(e),o=n.slice(0,16),a=n.slice(16,28),c=n.slice(28),[u,l,h]=await I(()=>me(t,o));if(!u)throw new ae("Key derivation failed (decrypt)",{original:l,passphrase:t,salt:o});const[d,f,p]=await I(()=>s.subtle.decrypt({name:"AES-GCM",iv:a},h,c));if(!d)throw new ae("Decryption failed",{original:f,encryptedBase64:e});return(new TextDecoder).decode(p)}async function ge(e){if("undefined"==typeof process)throw new ae("MD5 hashing is only available in Node.js environment",{context:"md5"});const[t,r,i]=await I(async()=>{const{createHash:t}=await import("crypto");return t("md5").update(e).digest("base64")});if(!t)throw new ae("MD5 hashing failed",{original:r,data:e});return i}async function me(e,t){const[r,i,s]=await I(he);if(!r)throw new ae("Crypto API not available",{original:i});const n=(new TextEncoder).encode(e),[o,a,c]=await I(()=>s.subtle.importKey("raw",n,{name:"PBKDF2"},!1,["deriveKey"]));if(!o)throw new ae("importKey failed",{original:a,passphrase:e});const[u,l,h]=await I(()=>s.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:1e5,hash:"SHA-256"},c,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]));if(!u)throw new ae("deriveKey failed",{original:l,passphrase:e,salt:t});return h}const ye=t.customAlphabet(t.urlAlphabet,22),be=t.customAlphabet("ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789",16);var we;function ve(){}function Oe(){Oe.init.call(this)}function ke(e){return void 0===e._maxListeners?Oe.defaultMaxListeners:e._maxListeners}function Se(e,t,r,i){var s,n,o,a;if("function"!=typeof r)throw new TypeError('"listener" argument must be a function');if((n=e._events)?(n.newListener&&(e.emit("newListener",t,r.listener?r.listener:r),n=e._events),o=n[t]):(n=e._events=new ve,e._eventsCount=0),o){if("function"==typeof o?o=n[t]=i?[r,o]:[o,r]:i?o.unshift(r):o.push(r),!o.warned&&(s=ke(e))&&s>0&&o.length>s){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=n[t]=r,++e._eventsCount;return e}function _e(e,t,r){var i=!1;function s(){e.removeListener(t,s),i||(i=!0,r.apply(e,arguments))}return s.listener=r,s}function Re(e){var t=this._events;if(t){var r=t[e];if("function"==typeof r)return 1;if(r)return r.length}return 0}function je(e,t){for(var r=new Array(t);t--;)r[t]=e[t];return r}ve.prototype=Object.create(null),Oe.EventEmitter=Oe,Oe.usingDomains=!1,Oe.prototype.domain=void 0,Oe.prototype._events=void 0,Oe.prototype._maxListeners=void 0,Oe.defaultMaxListeners=10,Oe.init=function(){this.domain=null,Oe.usingDomains&&(!we.active||this instanceof we.Domain||(this.domain=we.active)),this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new ve,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},Oe.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},Oe.prototype.getMaxListeners=function(){return ke(this)},Oe.prototype.emit=function(e){var t,r,i,s,n,o,a,c="error"===e;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var u=new Error('Uncaught, unspecified "error" event. ('+t+")");throw u.context=t,u}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(r=o[e]))return!1;var l="function"==typeof r;switch(i=arguments.length){case 1:!function(e,t,r){if(t)e.call(r);else for(var i=e.length,s=je(e,i),n=0;n<i;++n)s[n].call(r)}(r,l,this);break;case 2:!function(e,t,r,i){if(t)e.call(r,i);else for(var s=e.length,n=je(e,s),o=0;o<s;++o)n[o].call(r,i)}(r,l,this,arguments[1]);break;case 3:!function(e,t,r,i,s){if(t)e.call(r,i,s);else for(var n=e.length,o=je(e,n),a=0;a<n;++a)o[a].call(r,i,s)}(r,l,this,arguments[1],arguments[2]);break;case 4:!function(e,t,r,i,s,n){if(t)e.call(r,i,s,n);else for(var o=e.length,a=je(e,o),c=0;c<o;++c)a[c].call(r,i,s,n)}(r,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(i-1),n=1;n<i;n++)s[n-1]=arguments[n];!function(e,t,r,i){if(t)e.apply(r,i);else for(var s=e.length,n=je(e,s),o=0;o<s;++o)n[o].apply(r,i)}(r,l,this,s)}return!0},Oe.prototype.addListener=function(e,t){return Se(this,e,t,!1)},Oe.prototype.on=Oe.prototype.addListener,Oe.prototype.prependListener=function(e,t){return Se(this,e,t,!0)},Oe.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,_e(this,e,t)),this},Oe.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,_e(this,e,t)),this},Oe.prototype.removeListener=function(e,t){var r,i,s,n,o;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(i=this._events))return this;if(!(r=i[e]))return this;if(r===t||r.listener&&r.listener===t)0===--this._eventsCount?this._events=new ve:(delete i[e],i.removeListener&&this.emit("removeListener",e,r.listener||t));else if("function"!=typeof r){for(s=-1,n=r.length;n-- >0;)if(r[n]===t||r[n].listener&&r[n].listener===t){o=r[n].listener,s=n;break}if(s<0)return this;if(1===r.length){if(r[0]=void 0,0===--this._eventsCount)return this._events=new ve,this;delete i[e]}else!function(e,t){for(var r=t,i=r+1,s=e.length;i<s;r+=1,i+=1)e[r]=e[i];e.pop()}(r,s);i.removeListener&&this.emit("removeListener",e,o||t)}return this},Oe.prototype.off=function(e,t){return this.removeListener(e,t)},Oe.prototype.removeAllListeners=function(e){var t,r;if(!(r=this._events))return this;if(!r.removeListener)return 0===arguments.length?(this._events=new ve,this._eventsCount=0):r[e]&&(0===--this._eventsCount?this._events=new ve:delete r[e]),this;if(0===arguments.length){for(var i,s=Object.keys(r),n=0;n<s.length;++n)"removeListener"!==(i=s[n])&&this.removeAllListeners(i);return this.removeAllListeners("removeListener"),this._events=new ve,this._eventsCount=0,this}if("function"==typeof(t=r[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},Oe.prototype.listeners=function(e){var t,r=this._events;return r&&(t=r[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),r=0;r<t.length;++r)t[r]=e[r].listener||e[r];return t}(t):[]},Oe.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):Re.call(e,t)},Oe.prototype.listenerCount=Re,Oe.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};class Ee extends Oe{constructor(e={}){super(),this.name=this.constructor.name,this.options=e,this.hooks=new Map}async setup(e){this.database=e,this.beforeSetup(),await this.onSetup(),this.afterSetup()}async start(){this.beforeStart(),await this.onStart(),this.afterStart()}async stop(){this.beforeStop(),await this.onStop(),this.afterStop()}async onSetup(){}async onStart(){}async onStop(){}addHook(e,t,r){this.hooks.has(e)||this.hooks.set(e,new Map);const i=this.hooks.get(e);i.has(t)||i.set(t,[]),i.get(t).push(r)}removeHook(e,t,r){const i=this.hooks.get(e);if(i&&i.has(t)){const e=i.get(t),s=e.indexOf(r);s>-1&&e.splice(s,1)}}wrapResourceMethod(e,t,r){const i=e[t];if(e._pluginWrappers||(e._pluginWrappers=new Map),e._pluginWrappers.has(t)||e._pluginWrappers.set(t,[]),e._pluginWrappers.get(t).push(r),!e[`_wrapped_${t}`]){e[`_wrapped_${t}`]=i;const r=i&&i._isMockFunction;e[t]=async function(...r){let i=await e[`_wrapped_${t}`](...r);for(const s of e._pluginWrappers.get(t))i=await s.call(this,i,r,t);return i},r&&(Object.setPrototypeOf(e[t],Object.getPrototypeOf(i)),Object.assign(e[t],i))}}addMiddleware(e,t,r){if(e._pluginMiddlewares||(e._pluginMiddlewares={}),!e._pluginMiddlewares[t]){e._pluginMiddlewares[t]=[];const r=e[t].bind(e);e[t]=async function(...i){let s=-1;const n=async(...i)=>(s++,s<e._pluginMiddlewares[t].length?await e._pluginMiddlewares[t][s].call(this,n,...i):await r(...i));return await n(...i)}}e._pluginMiddlewares[t].push(r)}getPartitionValues(e,t){if(!t.config?.partitions)return{};const r={};for(const[i,s]of Object.entries(t.config.partitions))if(s.fields){r[i]={};for(const[n,o]of Object.entries(s.fields)){const s=this.getNestedFieldValue(e,n);null!=s&&(r[i][n]=t.applyPartitionRule(s,o))}}else r[i]={};return r}getNestedFieldValue(e,t){if(!t.includes("."))return e[t]??null;const r=t.split(".");let i=e;for(const e of r){if(!i||"object"!=typeof i||!(e in i))return null;i=i[e]}return i??null}beforeSetup(){this.emit("plugin.beforeSetup",new Date)}afterSetup(){this.emit("plugin.afterSetup",new Date)}beforeStart(){this.emit("plugin.beforeStart",new Date)}afterStart(){this.emit("plugin.afterStart",new Date)}beforeStop(){this.emit("plugin.beforeStop",new Date)}afterStop(){this.emit("plugin.afterStop",new Date)}}const Ne={setup(e){},start(){},stop(){}};function Ae(e,t){for(var r=0,i=e.length-1;i>=0;i--){var s=e[i];"."===s?e.splice(i,1):".."===s?(e.splice(i,1),r++):r&&(e.splice(i,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}var Ie=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,De=function(e){return Ie.exec(e).slice(1)};function xe(){for(var e="",t=!1,r=arguments.length-1;r>=-1&&!t;r--){var i=r>=0?arguments[r]:"/";if("string"!=typeof i)throw new TypeError("Arguments to path.resolve must be strings");i&&(e=i+"/"+e,t="/"===i.charAt(0))}return(t?"/":"")+(e=Ae($e(e.split("/"),function(e){return!!e}),!t).join("/"))||"."}function Pe(e){var t=Ce(e),r="/"===Me(e,-1);return(e=Ae($e(e.split("/"),function(e){return!!e}),!t).join("/"))||t||(e="."),e&&r&&(e+="/"),(t?"/":"")+e}function Ce(e){return"/"===e.charAt(0)}function Te(){return Pe($e(Array.prototype.slice.call(arguments,0),function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))}var Le={extname:function(e){return De(e)[3]},basename:function(e,t){var r=De(e)[2];return t&&r.substr(-1*t.length)===t&&(r=r.substr(0,r.length-t.length)),r},dirname:function(e){var t=De(e),r=t[0],i=t[1];return r||i?(i&&(i=i.substr(0,i.length-1)),r+i):"."},sep:"/",delimiter:":",relative:function(e,t){function r(e){for(var t=0;t<e.length&&""===e[t];t++);for(var r=e.length-1;r>=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=xe(e).substr(1),t=xe(t).substr(1);for(var i=r(e.split("/")),s=r(t.split("/")),n=Math.min(i.length,s.length),o=n,a=0;a<n;a++)if(i[a]!==s[a]){o=a;break}var c=[];for(a=o;a<i.length;a++)c.push("..");return(c=c.concat(s.slice(o))).join("/")},join:Te,isAbsolute:Ce,normalize:Pe,resolve:xe};function $e(e,t){if(e.filter)return e.filter(t);for(var r=[],i=0;i<e.length;i++)t(e[i],i,e)&&r.push(e[i]);return r}var Me="b"==="ab".substr(-1)?function(e,t,r){return e.substr(t,r)}:function(e,t,r){return t<0&&(t=e.length+t),e.substr(t,r)};class Ue extends Oe{constructor(e={}){super(),this.config=e}async _set(e,t){}async _get(e){}async _del(e){}async _clear(e){}validateKey(e){if(null==e||"string"!=typeof e||!e)throw new Error("Invalid key")}async set(e,t){return this.validateKey(e),await this._set(e,t),this.emit("set",t),t}async get(e){this.validateKey(e);const t=await this._get(e);return this.emit("get",t),t}async del(e){this.validateKey(e);const t=await this._del(e);return this.emit("delete",t),t}async delete(e){return this.del(e)}async clear(e){const t=await this._clear(e);return this.emit("clear",t),t}}class qe extends Ue{constructor({client:e,keyPrefix:t="cache",ttl:r=0,prefix:i}){super({client:e,keyPrefix:t,ttl:r,prefix:i}),this.client=e,this.keyPrefix=t,this.config.ttl=r,this.config.client=e,this.config.prefix=void 0!==i?i:t+(t.endsWith("/")?"":"/")}async _set(e,t){let i=JSON.stringify(t);const s=i.length;return i=r.gzipSync(i).toString("base64"),this.client.putObject({key:Te(this.keyPrefix,e),body:i,contentEncoding:"gzip",contentType:"application/gzip",metadata:{compressor:"zlib",compressed:"true","client-id":this.client.id,"length-serialized":String(s),"length-compressed":String(i.length),"compression-gain":(i.length/s).toFixed(2)}})}async _get(e){const[t,s,n]=await I(async()=>{const{Body:t}=await this.client.getObject(Te(this.keyPrefix,e));let s=await i.streamToString(t);return s=Buffer.from(s,"base64"),s=r.unzipSync(s).toString(),JSON.parse(s)});if(t)return n;if("NoSuchKey"===s.name||"NotFound"===s.name)return null;throw s}async _del(e){return await this.client.deleteObject(Te(this.keyPrefix,e)),!0}async _clear(){const e=await this.client.getAllKeys({prefix:this.keyPrefix});await this.client.deleteObjects(e)}async size(){return(await this.keys()).length}async keys(){const e=await this.client.getAllKeys({prefix:this.keyPrefix}),t=this.keyPrefix.endsWith("/")?this.keyPrefix:this.keyPrefix+"/";return e.map(e=>e.startsWith(t)?e.slice(t.length):e)}}class Fe extends Ue{constructor(e={}){super(e),this.cache={},this.meta={},this.maxSize=e.maxSize||0,this.ttl=e.ttl||0}async _set(e,t){if(this.maxSize>0&&Object.keys(this.cache).length>=this.maxSize){const e=Object.entries(this.meta).sort((e,t)=>e[1].ts-t[1].ts)[0]?.[0];e&&(delete this.cache[e],delete this.meta[e])}return this.cache[e]=t,this.meta[e]={ts:Date.now()},t}async _get(e){if(!Object.prototype.hasOwnProperty.call(this.cache,e))return null;if(this.ttl>0){const t=Date.now(),r=this.meta[e];if(r&&t-r.ts>1e3*this.ttl)return delete this.cache[e],delete this.meta[e],null}return this.cache[e]}async _del(e){return delete this.cache[e],delete this.meta[e],!0}async _clear(e){if(!e)return this.cache={},this.meta={},!0;for(const t of Object.keys(this.cache))t.startsWith(e)&&(delete this.cache[t],delete this.meta[t]);return!0}async size(){return Object.keys(this.cache).length}async keys(){return Object.keys(this.cache)}}const Be={async setup(e){e&&e.client&&(this.client=e.client,this.map={PutObjectCommand:"put",GetObjectCommand:"get",HeadObjectCommand:"head",DeleteObjectCommand:"delete",DeleteObjectsCommand:"delete",ListObjectsV2Command:"list"},this.costs={total:0,prices:{put:5e-6,copy:5e-6,list:5e-6,post:5e-6,get:4e-4/1e3,select:4e-4/1e3,delete:4e-4/1e3,head:4e-4/1e3},requests:{total:0,put:0,post:0,copy:0,list:0,get:0,select:0,delete:0,head:0},events:{total:0,PutObjectCommand:0,GetObjectCommand:0,HeadObjectCommand:0,DeleteObjectCommand:0,DeleteObjectsCommand:0,ListObjectsV2Command:0}},this.client.costs=JSON.parse(JSON.stringify(this.costs)))},async start(){this.client&&(this.client.on("command.response",e=>this.addRequest(e,this.map[e])),this.client.on("command.error",e=>this.addRequest(e,this.map[e])))},addRequest(e,t){t&&(this.costs.events[e]++,this.costs.events.total++,this.costs.requests.total++,this.costs.requests[t]++,this.costs.total+=this.costs.prices[t],this.client&&this.client.costs&&(this.client.costs.events[e]++,this.client.costs.events.total++,this.client.costs.requests.total++,this.client.costs.requests[t]++,this.client.costs.total+=this.client.costs.prices[t]))}};class ze extends Oe{constructor(e={}){super(),this.config=e,this.name=this.constructor.name,this.enabled=!1!==e.enabled}async initialize(e){this.database=e,this.emit("initialized",{replicator:this.name})}async replicate(e,t,r,i){throw new Error(`replicate() method must be implemented by ${this.name}`)}async replicateBatch(e,t){throw new Error(`replicateBatch() method must be implemented by ${this.name}`)}async testConnection(){throw new Error(`testConnection() method must be implemented by ${this.name}`)}async getStatus(){return{name:this.name,config:this.config,connected:!1}}async cleanup(){this.emit("cleanup",{replicator:this.name})}validateConfig(){return{isValid:!0,errors:[]}}}const Ve="us-east-1",Ke="https://s3.us-east-1.amazonaws.com";class He{constructor(e){let t;const[r,i,s]=I(()=>new URL(e));if(!r)throw new oe("Invalid connection string: "+e,{original:i,input:e});t=s,this.region=Ve,"s3:"===t.protocol?this.defineFromS3(t):this.defineFromCustomUri(t);for(const[e,r]of t.searchParams.entries())this[e]=r}defineFromS3(e){const[t,r,i]=D(()=>decodeURIComponent(e.hostname));if(!t)throw new oe("Invalid bucket in connection string",{original:r,input:e.hostname});this.bucket=i||"s3db";const[s,n,o]=D(()=>decodeURIComponent(e.username));if(!s)throw new oe("Invalid accessKeyId in connection string",{original:n,input:e.username});this.accessKeyId=o;const[a,c,u]=D(()=>decodeURIComponent(e.password));if(!a)throw new oe("Invalid secretAccessKey in connection string",{original:c,input:e.password});if(this.secretAccessKey=u,this.endpoint=Ke,["/","",null].includes(e.pathname))this.keyPrefix="";else{let[,...t]=e.pathname.split("/");this.keyPrefix=[...t||[]].join("/")}}defineFromCustomUri(e){this.forcePathStyle=!0,this.endpoint=e.origin;const[t,r,i]=D(()=>decodeURIComponent(e.username));if(!t)throw new oe("Invalid accessKeyId in connection string",{original:r,input:e.username});this.accessKeyId=i;const[s,n,o]=D(()=>decodeURIComponent(e.password));if(!s)throw new oe("Invalid secretAccessKey in connection string",{original:n,input:e.password});if(this.secretAccessKey=o,["/","",null].includes(e.pathname))this.bucket="s3db",this.keyPrefix="";else{let[,t,...r]=e.pathname.split("/");if(t){const[e,r,i]=D(()=>decodeURIComponent(t));if(!e)throw new oe("Invalid bucket in connection string",{original:r,input:t});this.bucket=i}else this.bucket="s3db";this.keyPrefix=[...r||[]].join("/")}}}class We extends Oe{constructor({verbose:e=!1,id:t=null,AwsS3Client:r,connectionString:i,parallelism:s=10}){super(),this.verbose=e,this.id=t??ye(),this.parallelism=s,this.config=new He(i),this.client=r||this.createClient()}createClient(){let e={region:this.config.region,endpoint:this.config.endpoint};this.config.forcePathStyle&&(e.forcePathStyle=!0),this.config.accessKeyId&&(e.credentials={accessKeyId:this.config.accessKeyId,secretAccessKey:this.config.secretAccessKey});const t=new u.S3Client(e);return t.middlewareStack.add((e,t)=>async r=>{if("DeleteObjectsCommand"===t.commandName){const e=r.request.body;if(e&&"string"==typeof e){const t=await ge(e);r.request.headers["Content-MD5"]=t}}return e(r)},{step:"build",name:"addContentMd5ForDeleteObjects",priority:"high"}),t}async sendCommand(e){this.emit("command.request",e.constructor.name,e.input);const[t,r,i]=await I(()=>this.client.send(e));if(!t){throw ne(r,{bucket:this.config.bucket,key:e.input&&e.input.Key,commandName:e.constructor.name,commandInput:e.input})}return this.emit("command.response",e.constructor.name,i,e.input),i}async putObject({key:e,metadata:t,contentType:r,body:i,contentEncoding:s,contentLength:n}){const o="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";o&&Le.join(o,e);const a={};if(t)for(const[e,r]of Object.entries(t)){a[String(e).replace(/[^a-zA-Z0-9\-_]/g,"_")]=String(r)}const c={Bucket:this.config.bucket,Key:o?Le.join(o,e):e,Metadata:a,Body:i||Buffer.alloc(0)};let l,h;void 0!==r&&(c.ContentType=r),void 0!==s&&(c.ContentEncoding=s),void 0!==n&&(c.ContentLength=n);try{return l=await this.sendCommand(new u.PutObjectCommand(c)),l}catch(t){throw h=t,ne(t,{bucket:this.config.bucket,key:e,commandName:"PutObjectCommand",commandInput:c})}finally{this.emit("putObject",h||l,{key:e,metadata:t,contentType:r,body:i,contentEncoding:s,contentLength:n})}}async getObject(e){const t="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r={Bucket:this.config.bucket,Key:t?Le.join(t,e):e};let i,s;try{return i=await this.sendCommand(new u.GetObjectCommand(r)),i}catch(t){throw s=t,ne(t,{bucket:this.config.bucket,key:e,commandName:"GetObjectCommand",commandInput:r})}finally{this.emit("getObject",s||i,{key:e})}}async headObject(e){const t="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r={Bucket:this.config.bucket,Key:t?Le.join(t,e):e};let i,s;try{return i=await this.sendCommand(new u.HeadObjectCommand(r)),i}catch(t){throw s=t,ne(t,{bucket:this.config.bucket,key:e,commandName:"HeadObjectCommand",commandInput:r})}finally{this.emit("headObject",s||i,{key:e})}}async copyObject({from:e,to:t}){const r={Bucket:this.config.bucket,Key:this.config.keyPrefix?Le.join(this.config.keyPrefix,t):t,CopySource:Le.join(this.config.bucket,this.config.keyPrefix?Le.join(this.config.keyPrefix,e):e)};let i,s;try{return i=await this.sendCommand(new u.CopyObjectCommand(r)),i}catch(e){throw s=e,ne(e,{bucket:this.config.bucket,key:t,commandName:"CopyObjectCommand",commandInput:r})}finally{this.emit("copyObject",s||i,{from:e,to:t})}}async exists(e){const[t,r]=await I(()=>this.headObject(e));if(t)return!0;if("NoSuchKey"===r.name||"NotFound"===r.name)return!1;throw r}async deleteObject(e){const t="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";t&&Le.join(t,e);const r={Bucket:this.config.bucket,Key:t?Le.join(t,e):e};let i,s;try{return i=await this.sendCommand(new u.DeleteObjectCommand(r)),i}catch(t){throw s=t,ne(t,{bucket:this.config.bucket,key:e,commandName:"DeleteObjectCommand",commandInput:r})}finally{this.emit("deleteObject",s||i,{key:e})}}async deleteObjects(e){const t="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r=n.chunk(e,1e3),{results:i,errors:s}=await c.PromisePool.for(r).withConcurrency(this.parallelism).process(async e=>{for(const r of e)t&&Le.join(t,r),this.config.bucket,await this.exists(r);const r={Bucket:this.config.bucket,Delete:{Objects:e.map(e=>({Key:t?Le.join(t,e):e}))}};let i;const[s,n,o]=await I(()=>this.sendCommand(new u.DeleteObjectsCommand(r)));if(!s)throw n;return i=o,i&&i.Errors&&i.Errors.length,i&&i.Deleted&&(i.Deleted.length,e.length),i}),o={deleted:i,notFound:s};return this.emit("deleteObjects",o,e),o}async deleteAll({prefix:e}={}){const t="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";let r,i=0;do{const s=new u.ListObjectsV2Command({Bucket:this.config.bucket,Prefix:t?Le.join(t,e||""):e||"",ContinuationToken:r}),n=await this.client.send(s);if(n.Contents&&n.Contents.length>0){const t=new u.DeleteObjectsCommand({Bucket:this.config.bucket,Delete:{Objects:n.Contents.map(e=>({Key:e.Key}))}}),r=await this.client.send(t),s=r.Deleted?r.Deleted.length:0;i+=s,this.emit("deleteAll",{prefix:e,batch:s,total:i})}r=n.IsTruncated?n.NextContinuationToken:void 0}while(r);return this.emit("deleteAllComplete",{prefix:e,totalDeleted:i}),i}async moveObject({from:e,to:t}){const[r,i]=await I(async()=>{await this.copyObject({from:e,to:t}),await this.deleteObject(e)});if(!r)throw new ie("Unknown error in moveObject",{bucket:this.config.bucket,from:e,to:t,original:i});return!0}async listObjects({prefix:e,maxKeys:t=1e3,continuationToken:r}={}){const i={Bucket:this.config.bucket,MaxKeys:t,ContinuationToken:r,Prefix:this.config.keyPrefix?Le.join(this.config.keyPrefix,e||""):e||""},[s,n,o]=await I(()=>this.sendCommand(new u.ListObjectsV2Command(i)));if(!s)throw new ie("Unknown error in listObjects",{prefix:e,bucket:this.config.bucket,original:n});return this.emit("listObjects",o,i),o}async count({prefix:e}={}){let t,r=0,i=!0;for(;i;){const s={prefix:e,continuationToken:t},n=await this.listObjects(s);r+=n.KeyCount||0,i=n.IsTruncated||!1,t=n.NextContinuationToken}return this.emit("count",r,{prefix:e}),r}async getAllKeys({prefix:e}={}){let t,r=[],i=!0;for(;i;){const s={prefix:e,continuationToken:t},n=await this.listObjects(s);n.Contents&&(r=r.concat(n.Contents.map(e=>e.Key))),i=n.IsTruncated||!1,t=n.NextContinuationToken}return this.config.keyPrefix&&(r=r.map(e=>e.replace(this.config.keyPrefix,"")).map(e=>e.startsWith("/")?e.replace("/",""):e)),this.emit("getAllKeys",r,{prefix:e}),r}async getContinuationTokenAfterOffset(e={}){const{prefix:t,offset:r=1e3}=e;if(0===r)return null;let i,s=!0,n=0;for(;s;){const e={prefix:t,maxKeys:r<1e3?r:r-n>1e3?1e3:r-n,continuationToken:i},o=await this.listObjects(e);if(o.Contents&&(n+=o.Contents.length),s=o.IsTruncated||!1,i=o.NextContinuationToken,n>=r)break}return this.emit("getContinuationTokenAfterOffset",i||null,e),i||null}async getKeysPage(e={}){const{prefix:t,offset:r=0,amount:i=100}=e;let s,n=[],o=!0;if(r>0&&(s=await this.getContinuationTokenAfterOffset({prefix:t,offset:r}),!s))return this.emit("getKeysPage",[],e),[];for(;o;){const e={prefix:t,continuationToken:s},r=await this.listObjects(e);if(r.Contents&&(n=n.concat(r.Contents.map(e=>e.Key))),o=r.IsTruncated||!1,s=r.NextContinuationToken,n.length>=i){n=n.slice(0,i);break}}return this.config.keyPrefix&&(n=n.map(e=>e.replace(this.config.keyPrefix,"")).map(e=>e.startsWith("/")?e.replace("/",""):e)),this.emit("getKeysPage",n,e),n}async moveAllObjects({prefixFrom:e,prefixTo:t}){const r=await this.getAllKeys({prefix:e}),{results:i,errors:s}=await c.PromisePool.for(r).withConcurrency(this.parallelism).process(async r=>{const i=r.replace(e,t),[s,n]=await I(async()=>{await this.moveObject({from:r,to:i})});if(!s)throw new ie("Unknown error in moveAllObjects",{bucket:this.config.bucket,from:r,to:i,original:n});return i});if(this.emit("moveAllObjects",{results:i,errors:s},{prefixFrom:e,prefixTo:t}),s.length>0)throw new Error("Some objects could not be moved");return i}}async function Ge(e,t,r){if(!this.passphrase)return t.push(new J("Missing configuration for secrets encryption.",{actual:e,type:"encryptionKeyMissing",suggestion:"Provide a passphrase for secret encryption."})),e;const[i,s,n]=await I(()=>fe(String(e),this.passphrase));return i?n:(t.push(new J("Problem encrypting secret.",{actual:e,type:"encryptionProblem",error:s,suggestion:"Check the passphrase and input value."})),e)}async function Je(e,t,r){if(n.isString(e))return e;const[i,s,o]=D(()=>JSON.stringify(e));if(!i)throw new J("Failed to stringify JSON",{original:s,input:e});return o}class Ye extends h{constructor({options:e,passphrase:t,autoEncrypt:r=!0}={}){super(n.merge({},{useNewCustomCheckerFunction:!0,messages:{encryptionKeyMissing:"Missing configuration for secrets encryption.",encryptionProblem:"Problem encrypting secret. Actual: {actual}. Error: {error}"},defaults:{string:{trim:!0},object:{strict:"remove"},number:{convert:!0}}},e)),this.passphrase=t,this.autoEncrypt=r,this.alias("secret",{type:"string",custom:this.autoEncrypt?Ge:void 0,messages:{string:"The '{field}' field must be a string.",stringMin:"This secret '{field}' field length must be at least {expected} long."}}),this.alias("secretAny",{type:"any",custom:this.autoEncrypt?Ge:void 0}),this.alias("secretNumber",{type:"number",custom:this.autoEncrypt?Ge:void 0}),this.alias("json",{type:"any",custom:this.autoEncrypt?Je:void 0})}}const Qe=new Proxy(Ye,{instance:null,construct(e,t){return this.instance||(this.instance=new e(...t)),this.instance}});const Xe={trim:e=>null==e?e:e.trim(),encrypt:async(e,{passphrase:t})=>{if(null==e)return e;const[r,i,s]=await I(()=>fe(e,t));return r?s:e},decrypt:async(e,{passphrase:t})=>{if(null==e)return e;const[r,i,s]=await I(()=>pe(e,t));return r?"null"===s?null:"undefined"!==s?s:void 0:e},toString:e=>null==e?e:String(e),fromArray:(e,{separator:t})=>{if(null==e||!Array.isArray(e))return e;if(0===e.length)return"";return e.map(e=>"string"==typeof e?e.replace(/\\/g,"\\\\").replace(new RegExp(`\\${t}`,"g"),`\\${t}`):String(e)).join(t)},toArray:(e,{separator:t})=>{if(Array.isArray(e))return e;if(null==e)return e;if(""===e)return[];const r=[];let i="",s=0;const n=String(e);for(;s<n.length;)"\\"===n[s]&&s+1<n.length?(i+=n[s+1],s+=2):n[s]===t?(r.push(i),i="",s++):(i+=n[s],s++);return r.push(i),r},toJSON:e=>{if(null===e)return null;if(void 0===e)return;if("string"==typeof e){const[t,r,i]=D(()=>JSON.parse(e));return e}const[t,r,i]=D(()=>JSON.stringify(e));return t?i:e},fromJSON:e=>{if(null===e)return null;if(void 0===e)return;if("string"!=typeof e)return e;if(""===e)return"";const[t,r,i]=D(()=>JSON.parse(e));return t?i:e},toNumber:e=>n.isString(e)?e.includes(".")?parseFloat(e):parseInt(e):e,toBool:e=>[!0,1,"true","1","yes","y"].includes(e),fromBool:e=>[!0,1,"true","1","yes","y"].includes(e)?"1":"0",fromBase62:e=>{if(null==e||""===e)return e;if("number"==typeof e)return e;if("string"==typeof e){const t=V(e);return isNaN(t)?void 0:t}},toBase62:e=>{if(null==e||""===e)return e;if("number"==typeof e)return z(e);if("string"==typeof e){const t=Number(e);return isNaN(t)?e:z(t)}return e},fromBase62Decimal:e=>{if(null==e||""===e)return e;if("number"==typeof e)return e;if("string"==typeof e){const t=H(e);return isNaN(t)?void 0:t}},toBase62Decimal:e=>{if(null==e||""===e)return e;if("number"==typeof e)return K(e);if("string"==typeof e){const t=Number(e);return isNaN(t)?e:K(t)}return e},fromArrayOfNumbers:(e,{separator:t})=>{if(null==e||!Array.isArray(e))return e;if(0===e.length)return"";return e.map(e=>{if("number"==typeof e&&!isNaN(e))return z(e);const t=Number(e);return isNaN(t)?"":z(t)}).join(t)},toArrayOfNumbers:(e,{separator:t})=>{if(Array.isArray(e))return e.map(e=>"number"==typeof e?e:V(e));if(null==e)return e;if(""===e)return[];const r=String(e),i=[];let s="",n=0;for(;n<r.length;)"\\"===r[n]&&n+1<r.length?(s+=r[n+1],n+=2):r[n]===t?(i.push(s),s="",n++):(s+=r[n],n++);return i.push(s),i.map(e=>{if("number"==typeof e)return e;if("string"==typeof e&&""!==e){const t=V(e);return isNaN(t)?NaN:t}return NaN})},fromArrayOfDecimals:(e,{separator:t})=>{if(null==e||!Array.isArray(e))return e;if(0===e.length)return"";return e.map(e=>{if("number"==typeof e&&!isNaN(e))return K(e);const t=Number(e);return isNaN(t)?"":K(t)}).join(t)},toArrayOfDecimals:(e,{separator:t})=>{if(Array.isArray(e))return e.map(e=>"number"==typeof e?e:H(e));if(null==e)return e;if(""===e)return[];const r=String(e),i=[];let s="",n=0;for(;n<r.length;)"\\"===r[n]&&n+1<r.length?(s+=r[n+1],n+=2):r[n]===t?(i.push(s),s="",n++):(s+=r[n],n++);return i.push(s),i.map(e=>{if("number"==typeof e)return e;if("string"==typeof e&&""!==e){const t=H(e);return isNaN(t)?NaN:t}return NaN})}};class Ze{constructor(e){const{map:t,name:r,attributes:i,passphrase:s,version:o=1,options:a={}}=e;this.name=r,this.version=o,this.attributes=i||{},this.passphrase=s??"secret",this.options=n.merge({},this.defaultOptions(),a),this.allNestedObjectsOptional=this.options.allNestedObjectsOptional??!1;const c=this.preprocessAttributesForValidation(this.attributes);if(this.validator=new Qe({autoEncrypt:!1}).compile(n.merge({$$async:!0},c)),this.options.generateAutoHooks&&this.generateAutoHooks(),n.isEmpty(t)){const e=l.flatten(this.attributes,{safe:!0}),t=Object.keys(e).filter(e=>!e.includes("$$")),r=this.extractObjectKeys(this.attributes),i=[...new Set([...t,...r])],{mapping:s,reversedMapping:n}=function(e){const t={},r={};return e.forEach((e,i)=>{const s=z(i);t[e]=s,r[s]=e}),{mapping:t,reversedMapping:r}}(i);this.map=s,this.reversedMap=n}else this.map=t,this.reversedMap=n.invert(t)}defaultOptions(){return{autoEncrypt:!0,autoDecrypt:!0,arraySeparator:"|",generateAutoHooks:!0,hooks:{beforeMap:{},afterMap:{},beforeUnmap:{},afterUnmap:{}}}}addHook(e,t,r){this.options.hooks[e][t]||(this.options.hooks[e][t]=[]),this.options.hooks[e][t]=n.uniq([...this.options.hooks[e][t],r])}extractObjectKeys(e,t=""){const r=[];for(const[i,s]of Object.entries(e)){if(i.startsWith("$$"))continue;const e=t?`${t}.${i}`:i;"object"!=typeof s||null===s||Array.isArray(s)||(r.push(e),"object"===s.$$type&&r.push(...this.extractObjectKeys(s,e)))}return r}generateAutoHooks(){const e=l.flatten(n.cloneDeep(this.attributes),{safe:!0});for(const[t,r]of Object.entries(e))if(r.includes("array")){if(r.includes("items:string"))this.addHook("beforeMap",t,"fromArray"),this.addHook("afterUnmap",t,"toArray");else if(r.includes("items:number")){r.includes("integer:true")||r.includes("|integer:")||r.includes("|integer")?(this.addHook("beforeMap",t,"fromArrayOfNumbers"),this.addHook("afterUnmap",t,"toArrayOfNumbers")):(this.addHook("beforeMap",t,"fromArrayOfDecimals"),this.addHook("afterUnmap",t,"toArrayOfDecimals"))}}else if(r.includes("secret"))this.options.autoEncrypt&&this.addHook("beforeMap",t,"encrypt"),this.options.autoDecrypt&&this.addHook("afterUnmap",t,"decrypt");else{if(r.includes("number")){r.includes("integer:true")||r.includes("|integer:")||r.includes("|integer")?(this.addHook("beforeMap",t,"toBase62"),this.addHook("afterUnmap",t,"fromBase62")):(this.addHook("beforeMap",t,"toBase62Decimal"),this.addHook("afterUnmap",t,"fromBase62Decimal"));continue}r.includes("boolean")?(this.addHook("beforeMap",t,"fromBool"),this.addHook("afterUnmap",t,"toBool")):(r.includes("json")||"object"===r||r.includes("object"))&&(this.addHook("beforeMap",t,"toJSON"),this.addHook("afterUnmap",t,"fromJSON"))}}static import(e){let{map:t,name:r,options:i,version:s,attributes:o}=n.isString(e)?JSON.parse(e):e;const[a,c,u]=D(()=>Ze._importAttributes(o));if(!a)throw new ce("Failed to import schema attributes",{original:c,input:o});o=u;return new Ze({map:t,name:r,options:i,version:s,attributes:o})}static _importAttributes(e){if("string"==typeof e){const[t,r,i]=D(()=>JSON.parse(e));if(t&&"object"==typeof i&&null!==i){const[t,r,s]=D(()=>Ze._importAttributes(i));if(!t)throw new ce("Failed to parse nested schema attribute",{original:r,input:e});return s}return e}if(Array.isArray(e)){const[t,r,i]=D(()=>e.map(e=>Ze._importAttributes(e)));if(!t)throw new ce("Failed to import array schema attributes",{original:r,input:e});return i}if("object"==typeof e&&null!==e){const t={};for(const[r,i]of Object.entries(e)){const[e,s,n]=D(()=>Ze._importAttributes(i));if(!e)throw new ce("Failed to import object schema attribute",{original:s,key:r,input:i});t[r]=n}return t}return e}export(){return{version:this.version,name:this.name,options:this.options,attributes:this._exportAttributes(this.attributes),map:this.map}}_exportAttributes(e){if("string"==typeof e)return e;if(Array.isArray(e))return e.map(e=>this._exportAttributes(e));if("object"==typeof e&&null!==e){const t={};for(const[r,i]of Object.entries(e))t[r]=this._exportAttributes(i);return t}return e}async applyHooksActions(e,t){const r=n.cloneDeep(e);for(const[e,i]of Object.entries(this.options.hooks[t]))for(const t of i){const i=n.get(r,e);void 0!==i&&"function"==typeof Xe[t]&&n.set(r,e,await Xe[t](i,{passphrase:this.passphrase,separator:this.options.arraySeparator}))}return r}async validate(e,{mutateOriginal:t=!1}={}){let r=t?e:n.cloneDeep(e);return await this.validator(r)}async mapper(e){let t=n.cloneDeep(e);t=await this.applyHooksActions(t,"beforeMap");const r=l.flatten(t,{safe:!0}),i={_v:this.version+""};for(const[e,t]of Object.entries(r)){const r=this.map[e]||e,s=this.getAttributeDefinition(e);"number"==typeof t&&"string"==typeof s&&s.includes("number")?i[r]=z(t):"string"==typeof t?"[object Object]"===t?i[r]="{}":(t.startsWith("{")||t.startsWith("["),i[r]=t):Array.isArray(t)||"object"==typeof t&&null!==t?i[r]=JSON.stringify(t):i[r]=t}return await this.applyHooksActions(i,"afterMap"),i}async unmapper(e,t){let r=n.cloneDeep(e);delete r._v,r=await this.applyHooksActions(r,"beforeUnmap");const i=t?n.invert(t):this.reversedMap,s={};for(const[e,t]of Object.entries(r)){const r=i&&i[e]?i[e]:e;let n=t;const o=this.getAttributeDefinition(r);if("string"!=typeof o||!o.includes("number")||o.includes("array")||o.includes("decimal")){if("string"==typeof t)if("[object Object]"===t)n={};else if(t.startsWith("{")||t.startsWith("[")){const[e,r,i]=D(()=>JSON.parse(t));e&&(n=i)}}else"string"==typeof n&&""!==n?n=V(n):"number"==typeof n||(n=void 0);if(this.attributes&&"string"==typeof o&&o.includes("array"))if(Array.isArray(n));else if("string"==typeof n&&n.trim().startsWith("[")){const[e,t,r]=D(()=>JSON.parse(n));e&&Array.isArray(r)&&(n=r)}else n=Xe.toArray(n,{separator:this.options.arraySeparator});if(this.options.hooks&&this.options.hooks.afterUnmap&&this.options.hooks.afterUnmap[r])for(const e of this.options.hooks.afterUnmap[r])"function"==typeof Xe[e]&&(n=await Xe[e](n,{passphrase:this.passphrase,separator:this.options.arraySeparator}));s[r]=n}await this.applyHooksActions(s,"afterUnmap");const o=l.unflatten(s);for(const[t,r]of Object.entries(e))t.startsWith("$")&&(o[t]=r);return o}getAttributeDefinition(e){const t=e.split(".");let r=this.attributes;for(const e of t){if(!r)return;r=r[e]}return r}preprocessAttributesForValidation(e){const t={};for(const[r,i]of Object.entries(e))if("object"!=typeof i||null===i||Array.isArray(i))t[r]=i;else{const e=i.$$type&&i.$$type.includes("required"),s=i.$$type&&i.$$type.includes("optional"),n={type:"object",properties:this.preprocessAttributesForValidation(i),strict:!1};e||(s||this.allNestedObjectsOptional)&&(n.optional=!0),t[r]=n}return t}}var et="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},tt=[],rt=[],it="undefined"!=typeof Uint8Array?Uint8Array:Array,st=!1;function nt(){st=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0;t<64;++t)tt[t]=e[t],rt[e.charCodeAt(t)]=t;rt["-".charCodeAt(0)]=62,rt["_".charCodeAt(0)]=63}function ot(e){return tt[e>>18&63]+tt[e>>12&63]+tt[e>>6&63]+tt[63&e]}function at(e,t,r){for(var i,s=[],n=t;n<r;n+=3)i=(e[n]<<16)+(e[n+1]<<8)+e[n+2],s.push(ot(i));return s.join("")}function ct(e){var t;st||nt();for(var r=e.length,i=r%3,s="",n=[],o=16383,a=0,c=r-i;a<c;a+=o)n.push(at(e,a,a+o>c?c:a+o));return 1===i?(t=e[r-1],s+=tt[t>>2],s+=tt[t<<4&63],s+="=="):2===i&&(t=(e[r-2]<<8)+e[r-1],s+=tt[t>>10],s+=tt[t>>4&63],s+=tt[t<<2&63],s+="="),n.push(s),n.join("")}function ut(e,t,r,i,s){var n,o,a=8*s-i-1,c=(1<<a)-1,u=c>>1,l=-7,h=r?s-1:0,d=r?-1:1,f=e[t+h];for(h+=d,n=f&(1<<-l)-1,f>>=-l,l+=a;l>0;n=256*n+e[t+h],h+=d,l-=8);for(o=n&(1<<-l)-1,n>>=-l,l+=i;l>0;o=256*o+e[t+h],h+=d,l-=8);if(0===n)n=1-u;else{if(n===c)return o?NaN:1/0*(f?-1:1);o+=Math.pow(2,i),n-=u}return(f?-1:1)*o*Math.pow(2,n-i)}function lt(e,t,r,i,s,n){var o,a,c,u=8*n-s-1,l=(1<<u)-1,h=l>>1,d=23===s?Math.pow(2,-24)-Math.pow(2,-77):0,f=i?0:n-1,p=i?1:-1,g=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,o=l):(o=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-o))<1&&(o--,c*=2),(t+=o+h>=1?d/c:d*Math.pow(2,1-h))*c>=2&&(o++,c/=2),o+h>=l?(a=0,o=l):o+h>=1?(a=(t*c-1)*Math.pow(2,s),o+=h):(a=t*Math.pow(2,h-1)*Math.pow(2,s),o=0));s>=8;e[r+f]=255&a,f+=p,a/=256,s-=8);for(o=o<<s|a,u+=s;u>0;e[r+f]=255&o,f+=p,o/=256,u-=8);e[r+f-p]|=128*g}var ht={}.toString,dt=Array.isArray||function(e){return"[object Array]"==ht.call(e)};function ft(){return gt.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function pt(e,t){if(ft()<t)throw new RangeError("Invalid typed array length");return gt.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=gt.prototype:(null===e&&(e=new gt(t)),e.length=t),e}function gt(e,t,r){if(!(gt.TYPED_ARRAY_SUPPORT||this instanceof gt))return new gt(e,t,r);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return bt(this,e)}return mt(this,e,t,r)}function mt(e,t,r,i){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,r,i){if(t.byteLength,r<0||t.byteLength<r)throw new RangeError("'offset' is out of bounds");if(t.byteLength<r+(i||0))throw new RangeError("'length' is out of bounds");t=void 0===r&&void 0===i?new Uint8Array(t):void 0===i?new Uint8Array(t,r):new Uint8Array(t,r,i);gt.TYPED_ARRAY_SUPPORT?(e=t).__proto__=gt.prototype:e=wt(e,t);return e}(e,t,r,i):"string"==typeof t?function(e,t,r){"string"==typeof r&&""!==r||(r="utf8");if(!gt.isEncoding(r))throw new TypeError('"encoding" must be a valid string encoding');var i=0|kt(t,r);e=pt(e,i);var s=e.write(t,r);s!==i&&(e=e.slice(0,s));return e}(e,t,r):function(e,t){if(Ot(t)){var r=0|vt(t.length);return 0===(e=pt(e,r)).length||t.copy(e,0,0,r),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(i=t.length)!=i?pt(e,0):wt(e,t);if("Buffer"===t.type&&dt(t.data))return wt(e,t.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function yt(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function bt(e,t){if(yt(t),e=pt(e,t<0?0:0|vt(t)),!gt.TYPED_ARRAY_SUPPORT)for(var r=0;r<t;++r)e[r]=0;return e}function wt(e,t){var r=t.length<0?0:0|vt(t.length);e=pt(e,r);for(var i=0;i<r;i+=1)e[i]=255&t[i];return e}function vt(e){if(e>=ft())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+ft().toString(16)+" bytes");return 0|e}function Ot(e){return!(null==e||!e._isBuffer)}function kt(e,t){if(Ot(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return Jt(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return Yt(e).length;default:if(i)return Jt(e).length;t=(""+t).toLowerCase(),i=!0}}function St(e,t,r){var i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return Mt(this,t,r);case"utf8":case"utf-8":return Ct(this,t,r);case"ascii":return Lt(this,t,r);case"latin1":case"binary":return $t(this,t,r);case"base64":return Pt(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ut(this,t,r);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function _t(e,t,r){var i=e[t];e[t]=e[r],e[r]=i}function Rt(e,t,r,i,s){if(0===e.length)return-1;if("string"==typeof r?(i=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=s?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(s)return-1;r=e.length-1}else if(r<0){if(!s)return-1;r=0}if("string"==typeof t&&(t=gt.from(t,i)),Ot(t))return 0===t.length?-1:jt(e,t,r,i,s);if("number"==typeof t)return t&=255,gt.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?s?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):jt(e,[t],r,i,s);throw new TypeError("val must be string, number or Buffer")}function jt(e,t,r,i,s){var n,o=1,a=e.length,c=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;o=2,a/=2,c/=2,r/=2}function u(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(s){var l=-1;for(n=r;n<a;n++)if(u(e,n)===u(t,-1===l?0:n-l)){if(-1===l&&(l=n),n-l+1===c)return l*o}else-1!==l&&(n-=n-l),l=-1}else for(r+c>a&&(r=a-c),n=r;n>=0;n--){for(var h=!0,d=0;d<c;d++)if(u(e,n+d)!==u(t,d)){h=!1;break}if(h)return n}return-1}function Et(e,t,r,i){r=Number(r)||0;var s=e.length-r;i?(i=Number(i))>s&&(i=s):i=s;var n=t.length;if(n%2!=0)throw new TypeError("Invalid hex string");i>n/2&&(i=n/2);for(var o=0;o<i;++o){var a=parseInt(t.substr(2*o,2),16);if(isNaN(a))return o;e[r+o]=a}return o}function Nt(e,t,r,i){return Qt(Jt(t,e.length-r),e,r,i)}function At(e,t,r,i){return Qt(function(e){for(var t=[],r=0;r<e.length;++r)t.push(255&e.charCodeAt(r));return t}(t),e,r,i)}function It(e,t,r,i){return At(e,t,r,i)}function Dt(e,t,r,i){return Qt(Yt(t),e,r,i)}function xt(e,t,r,i){return Qt(function(e,t){for(var r,i,s,n=[],o=0;o<e.length&&!((t-=2)<0);++o)i=(r=e.charCodeAt(o))>>8,s=r%256,n.push(s),n.push(i);return n}(t,e.length-r),e,r,i)}function Pt(e,t,r){return 0===t&&r===e.length?ct(e):ct(e.slice(t,r))}function Ct(e,t,r){r=Math.min(e.length,r);for(var i=[],s=t;s<r;){var n,o,a,c,u=e[s],l=null,h=u>239?4:u>223?3:u>191?2:1;if(s+h<=r)switch(h){case 1:u<128&&(l=u);break;case 2:128==(192&(n=e[s+1]))&&(c=(31&u)<<6|63&n)>127&&(l=c);break;case 3:n=e[s+1],o=e[s+2],128==(192&n)&&128==(192&o)&&(c=(15&u)<<12|(63&n)<<6|63&o)>2047&&(c<55296||c>57343)&&(l=c);break;case 4:n=e[s+1],o=e[s+2],a=e[s+3],128==(192&n)&&128==(192&o)&&128==(192&a)&&(c=(15&u)<<18|(63&n)<<12|(63&o)<<6|63&a)>65535&&c<1114112&&(l=c)}null===l?(l=65533,h=1):l>65535&&(l-=65536,i.push(l>>>10&1023|55296),l=56320|1023&l),i.push(l),s+=h}return function(e){var t=e.length;if(t<=Tt)return String.fromCharCode.apply(String,e);var r="",i=0;for(;i<t;)r+=String.fromCharCode.apply(String,e.slice(i,i+=Tt));return r}(i)}gt.TYPED_ARRAY_SUPPORT=void 0===et.TYPED_ARRAY_SUPPORT||et.TYPED_ARRAY_SUPPORT,ft(),gt.poolSize=8192,gt._augment=function(e){return e.__proto__=gt.prototype,e},gt.from=function(e,t,r){return mt(null,e,t,r)},gt.TYPED_ARRAY_SUPPORT&&(gt.prototype.__proto__=Uint8Array.prototype,gt.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&gt[Symbol.species]),gt.alloc=function(e,t,r){return function(e,t,r,i){return yt(t),t<=0?pt(e,t):void 0!==r?"string"==typeof i?pt(e,t).fill(r,i):pt(e,t).fill(r):pt(e,t)}(null,e,t,r)},gt.allocUnsafe=function(e){return bt(null,e)},gt.allocUnsafeSlow=function(e){return bt(null,e)},gt.isBuffer=function(e){return null!=e&&(!!e._isBuffer||Xt(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&Xt(e.slice(0,0))}(e))},gt.compare=function(e,t){if(!Ot(e)||!Ot(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,i=t.length,s=0,n=Math.min(r,i);s<n;++s)if(e[s]!==t[s]){r=e[s],i=t[s];break}return r<i?-1:i<r?1:0},gt.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},gt.concat=function(e,t){if(!dt(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return gt.alloc(0);var r;if(void 0===t)for(t=0,r=0;r<e.length;++r)t+=e[r].length;var i=gt.allocUnsafe(t),s=0;for(r=0;r<e.length;++r){var n=e[r];if(!Ot(n))throw new TypeError('"list" argument must be an Array of Buffers');n.copy(i,s),s+=n.length}return i},gt.byteLength=kt,gt.prototype._isBuffer=!0,gt.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)_t(this,t,t+1);return this},gt.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)_t(this,t,t+3),_t(this,t+1,t+2);return this},gt.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)_t(this,t,t+7),_t(this,t+1,t+6),_t(this,t+2,t+5),_t(this,t+3,t+4);return this},gt.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?Ct(this,0,e):St.apply(this,arguments)},gt.prototype.equals=function(e){if(!Ot(e))throw new TypeError("Argument must be a Buffer");return this===e||0===gt.compare(this,e)},gt.prototype.inspect=function(){var e="";return this.length>0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),"<Buffer "+e+">"},gt.prototype.compare=function(e,t,r,i,s){if(!Ot(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===i&&(i=0),void 0===s&&(s=this.length),t<0||r>e.length||i<0||s>this.length)throw new RangeError("out of range index");if(i>=s&&t>=r)return 0;if(i>=s)return-1;if(t>=r)return 1;if(this===e)return 0;for(var n=(s>>>=0)-(i>>>=0),o=(r>>>=0)-(t>>>=0),a=Math.min(n,o),c=this.slice(i,s),u=e.slice(t,r),l=0;l<a;++l)if(c[l]!==u[l]){n=c[l],o=u[l];break}return n<o?-1:o<n?1:0},gt.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},gt.prototype.indexOf=function(e,t,r){return Rt(this,e,t,r,!0)},gt.prototype.lastIndexOf=function(e,t,r){return Rt(this,e,t,r,!1)},gt.prototype.write=function(e,t,r,i){if(void 0===t)i="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)i=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(r)?(r|=0,void 0===i&&(i="utf8")):(i=r,r=void 0)}var s=this.length-t;if((void 0===r||r>s)&&(r=s),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var n=!1;;)switch(i){case"hex":return Et(this,e,t,r);case"utf8":case"utf-8":return Nt(this,e,t,r);case"ascii":return At(this,e,t,r);case"latin1":case"binary":return It(this,e,t,r);case"base64":return Dt(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return xt(this,e,t,r);default:if(n)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),n=!0}},gt.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var Tt=4096;function Lt(e,t,r){var i="";r=Math.min(e.length,r);for(var s=t;s<r;++s)i+=String.fromCharCode(127&e[s]);return i}function $t(e,t,r){var i="";r=Math.min(e.length,r);for(var s=t;s<r;++s)i+=String.fromCharCode(e[s]);return i}function Mt(e,t,r){var i=e.length;(!t||t<0)&&(t=0),(!r||r<0||r>i)&&(r=i);for(var s="",n=t;n<r;++n)s+=Gt(e[n]);return s}function Ut(e,t,r){for(var i=e.slice(t,r),s="",n=0;n<i.length;n+=2)s+=String.fromCharCode(i[n]+256*i[n+1]);return s}function qt(e,t,r){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function Ft(e,t,r,i,s,n){if(!Ot(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>s||t<n)throw new RangeError('"value" argument is out of bounds');if(r+i>e.length)throw new RangeError("Index out of range")}function Bt(e,t,r,i){t<0&&(t=65535+t+1);for(var s=0,n=Math.min(e.length-r,2);s<n;++s)e[r+s]=(t&255<<8*(i?s:1-s))>>>8*(i?s:1-s)}function zt(e,t,r,i){t<0&&(t=4294967295+t+1);for(var s=0,n=Math.min(e.length-r,4);s<n;++s)e[r+s]=t>>>8*(i?s:3-s)&255}function Vt(e,t,r,i,s,n){if(r+i>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function Kt(e,t,r,i,s){return s||Vt(e,0,r,4),lt(e,t,r,i,23,4),r+4}function Ht(e,t,r,i,s){return s||Vt(e,0,r,8),lt(e,t,r,i,52,8),r+8}gt.prototype.slice=function(e,t){var r,i=this.length;if((e=~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),(t=void 0===t?i:~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),t<e&&(t=e),gt.TYPED_ARRAY_SUPPORT)(r=this.subarray(e,t)).__proto__=gt.prototype;else{var s=t-e;r=new gt(s,void 0);for(var n=0;n<s;++n)r[n]=this[n+e]}return r},gt.prototype.readUIntLE=function(e,t,r){e|=0,t|=0,r||qt(e,t,this.length);for(var i=this[e],s=1,n=0;++n<t&&(s*=256);)i+=this[e+n]*s;return i},gt.prototype.readUIntBE=function(e,t,r){e|=0,t|=0,r||qt(e,t,this.length);for(var i=this[e+--t],s=1;t>0&&(s*=256);)i+=this[e+--t]*s;return i},gt.prototype.readUInt8=function(e,t){return t||qt(e,1,this.length),this[e]},gt.prototype.readUInt16LE=function(e,t){return t||qt(e,2,this.length),this[e]|this[e+1]<<8},gt.prototype.readUInt16BE=function(e,t){return t||qt(e,2,this.length),this[e]<<8|this[e+1]},gt.prototype.readUInt32LE=function(e,t){return t||qt(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},gt.prototype.readUInt32BE=function(e,t){return t||qt(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},gt.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||qt(e,t,this.length);for(var i=this[e],s=1,n=0;++n<t&&(s*=256);)i+=this[e+n]*s;return i>=(s*=128)&&(i-=Math.pow(2,8*t)),i},gt.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||qt(e,t,this.length);for(var i=t,s=1,n=this[e+--i];i>0&&(s*=256);)n+=this[e+--i]*s;return n>=(s*=128)&&(n-=Math.pow(2,8*t)),n},gt.prototype.readInt8=function(e,t){return t||qt(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},gt.prototype.readInt16LE=function(e,t){t||qt(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},gt.prototype.readInt16BE=function(e,t){t||qt(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},gt.prototype.readInt32LE=function(e,t){return t||qt(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},gt.prototype.readInt32BE=function(e,t){return t||qt(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},gt.prototype.readFloatLE=function(e,t){return t||qt(e,4,this.length),ut(this,e,!0,23,4)},gt.prototype.readFloatBE=function(e,t){return t||qt(e,4,this.length),ut(this,e,!1,23,4)},gt.prototype.readDoubleLE=function(e,t){return t||qt(e,8,this.length),ut(this,e,!0,52,8)},gt.prototype.readDoubleBE=function(e,t){return t||qt(e,8,this.length),ut(this,e,!1,52,8)},gt.prototype.writeUIntLE=function(e,t,r,i){(e=+e,t|=0,r|=0,i)||Ft(this,e,t,r,Math.pow(2,8*r)-1,0);var s=1,n=0;for(this[t]=255&e;++n<r&&(s*=256);)this[t+n]=e/s&255;return t+r},gt.prototype.writeUIntBE=function(e,t,r,i){(e=+e,t|=0,r|=0,i)||Ft(this,e,t,r,Math.pow(2,8*r)-1,0);var s=r-1,n=1;for(this[t+s]=255&e;--s>=0&&(n*=256);)this[t+s]=e/n&255;return t+r},gt.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||Ft(this,e,t,1,255,0),gt.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},gt.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||Ft(this,e,t,2,65535,0),gt.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Bt(this,e,t,!0),t+2},gt.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||Ft(this,e,t,2,65535,0),gt.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Bt(this,e,t,!1),t+2},gt.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||Ft(this,e,t,4,4294967295,0),gt.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):zt(this,e,t,!0),t+4},gt.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||Ft(this,e,t,4,4294967295,0),gt.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):zt(this,e,t,!1),t+4},gt.prototype.writeIntLE=function(e,t,r,i){if(e=+e,t|=0,!i){var s=Math.pow(2,8*r-1);Ft(this,e,t,r,s-1,-s)}var n=0,o=1,a=0;for(this[t]=255&e;++n<r&&(o*=256);)e<0&&0===a&&0!==this[t+n-1]&&(a=1),this[t+n]=(e/o|0)-a&255;return t+r},gt.prototype.writeIntBE=function(e,t,r,i){if(e=+e,t|=0,!i){var s=Math.pow(2,8*r-1);Ft(this,e,t,r,s-1,-s)}var n=r-1,o=1,a=0;for(this[t+n]=255&e;--n>=0&&(o*=256);)e<0&&0===a&&0!==this[t+n+1]&&(a=1),this[t+n]=(e/o|0)-a&255;return t+r},gt.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||Ft(this,e,t,1,127,-128),gt.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},gt.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||Ft(this,e,t,2,32767,-32768),gt.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Bt(this,e,t,!0),t+2},gt.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||Ft(this,e,t,2,32767,-32768),gt.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Bt(this,e,t,!1),t+2},gt.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||Ft(this,e,t,4,2147483647,-2147483648),gt.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):zt(this,e,t,!0),t+4},gt.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||Ft(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),gt.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):zt(this,e,t,!1),t+4},gt.prototype.writeFloatLE=function(e,t,r){return Kt(this,e,t,!0,r)},gt.prototype.writeFloatBE=function(e,t,r){return Kt(this,e,t,!1,r)},gt.prototype.writeDoubleLE=function(e,t,r){return Ht(this,e,t,!0,r)},gt.prototype.writeDoubleBE=function(e,t,r){return Ht(this,e,t,!1,r)},gt.prototype.copy=function(e,t,r,i){if(r||(r=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<r&&(i=r),i===r)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-r&&(i=e.length-t+r);var s,n=i-r;if(this===e&&r<t&&t<i)for(s=n-1;s>=0;--s)e[s+t]=this[s+r];else if(n<1e3||!gt.TYPED_ARRAY_SUPPORT)for(s=0;s<n;++s)e[s+t]=this[s+r];else Uint8Array.prototype.set.call(e,this.subarray(r,r+n),t);return n},gt.prototype.fill=function(e,t,r,i){if("string"==typeof e){if("string"==typeof t?(i=t,t=0,r=this.length):"string"==typeof r&&(i=r,r=this.length),1===e.length){var s=e.charCodeAt(0);s<256&&(e=s)}if(void 0!==i&&"string"!=typeof i)throw new TypeError("encoding must be a string");if("string"==typeof i&&!gt.isEncoding(i))throw new TypeError("Unknown encoding: "+i)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<r)throw new RangeError("Out of range index");if(r<=t)return this;var n;if(t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(n=t;n<r;++n)this[n]=e;else{var o=Ot(e)?e:Jt(new gt(e,i).toString()),a=o.length;for(n=0;n<r-t;++n)this[n+t]=o[n%a]}return this};var Wt=/[^+\/0-9A-Za-z-_]/g;function Gt(e){return e<16?"0"+e.toString(16):e.toString(16)}function Jt(e,t){var r;t=t||1/0;for(var i=e.length,s=null,n=[],o=0;o<i;++o){if((r=e.charCodeAt(o))>55295&&r<57344){if(!s){if(r>56319){(t-=3)>-1&&n.push(239,191,189);continue}if(o+1===i){(t-=3)>-1&&n.push(239,191,189);continue}s=r;continue}if(r<56320){(t-=3)>-1&&n.push(239,191,189),s=r;continue}r=65536+(s-55296<<10|r-56320)}else s&&(t-=3)>-1&&n.push(239,191,189);if(s=null,r<128){if((t-=1)<0)break;n.push(r)}else if(r<2048){if((t-=2)<0)break;n.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;n.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;n.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return n}function Yt(e){return function(e){var t,r,i,s,n,o;st||nt();var a=e.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");n="="===e[a-2]?2:"="===e[a-1]?1:0,o=new it(3*a/4-n),i=n>0?a-4:a;var c=0;for(t=0,r=0;t<i;t+=4,r+=3)s=rt[e.charCodeAt(t)]<<18|rt[e.charCodeAt(t+1)]<<12|rt[e.charCodeAt(t+2)]<<6|rt[e.charCodeAt(t+3)],o[c++]=s>>16&255,o[c++]=s>>8&255,o[c++]=255&s;return 2===n?(s=rt[e.charCodeAt(t)]<<2|rt[e.charCodeAt(t+1)]>>4,o[c++]=255&s):1===n&&(s=rt[e.charCodeAt(t)]<<10|rt[e.charCodeAt(t+1)]<<4|rt[e.charCodeAt(t+2)]>>2,o[c++]=s>>8&255,o[c++]=255&s),o}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(Wt,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function Qt(e,t,r,i){for(var s=0;s<i&&!(s+r>=t.length||s>=e.length);++s)t[s+r]=e[s];return s}function Xt(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function Zt(){throw new Error("setTimeout has not been defined")}function er(){throw new Error("clearTimeout has not been defined")}var tr=Zt,rr=er;function ir(e){if(tr===setTimeout)return setTimeout(e,0);if((tr===Zt||!tr)&&setTimeout)return tr=setTimeout,setTimeout(e,0);try{return tr(e,0)}catch(t){try{return tr.call(null,e,0)}catch(t){return tr.call(this,e,0)}}}"function"==typeof et.setTimeout&&(tr=setTimeout),"function"==typeof et.clearTimeout&&(rr=clearTimeout);var sr,nr=[],or=!1,ar=-1;function cr(){or&&sr&&(or=!1,sr.length?nr=sr.concat(nr):ar=-1,nr.length&&ur())}function ur(){if(!or){var e=ir(cr);or=!0;for(var t=nr.length;t;){for(sr=nr,nr=[];++ar<t;)sr&&sr[ar].run();ar=-1,t=nr.length}sr=null,or=!1,function(e){if(rr===clearTimeout)return clearTimeout(e);if((rr===er||!rr)&&clearTimeout)return rr=clearTimeout,clearTimeout(e);try{return rr(e)}catch(t){try{return rr.call(null,e)}catch(t){return rr.call(this,e)}}}(e)}}function lr(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];nr.push(new hr(e,t)),1!==nr.length||or||ir(ur)}function hr(e,t){this.fun=e,this.array=t}hr.prototype.run=function(){this.fun.apply(null,this.array)};var dr=et.performance||{};dr.now||dr.mozNow||dr.msNow||dr.oNow||dr.webkitNow;var fr,pr={env:{}};fr="function"==typeof Object.create?function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:function(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e};var gr=/%[sdj%]/g;function mr(e){if(!Nr(e)){for(var t=[],r=0;r<arguments.length;r++)t.push(vr(arguments[r]));return t.join(" ")}r=1;for(var i=arguments,s=i.length,n=String(e).replace(gr,function(e){if("%%"===e)return"%";if(r>=s)return e;switch(e){case"%s":return String(i[r++]);case"%d":return Number(i[r++]);case"%j":try{return JSON.stringify(i[r++])}catch(e){return"[Circular]"}default:return e}}),o=i[r];r<s;o=i[++r])Er(o)||!Dr(o)?n+=" "+o:n+=" "+vr(o);return n}function yr(e,t){if(Ar(et.process))return function(){return yr(e,t).apply(this,arguments)};if(!0===pr.noDeprecation)return e;var r=!1;return function(){if(!r){if(pr.throwDeprecation)throw new Error(t);pr.traceDeprecation?console.trace(t):console.error(t),r=!0}return e.apply(this,arguments)}}var br,wr={};function vr(e,t){var r={seen:[],stylize:kr};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),jr(t)?r.showHidden=t:t&&function(e,t){if(!t||!Dr(t))return e;var r=Object.keys(t),i=r.length;for(;i--;)e[r[i]]=t[r[i]]}(r,t),Ar(r.showHidden)&&(r.showHidden=!1),Ar(r.depth)&&(r.depth=2),Ar(r.colors)&&(r.colors=!1),Ar(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=Or),Sr(r,e,r.depth)}function Or(e,t){var r=vr.styles[t];return r?"["+vr.colors[r][0]+"m"+e+"["+vr.colors[r][1]+"m":e}function kr(e,t){return e}function Sr(e,t,r){if(e.customInspect&&t&&Cr(t.inspect)&&t.inspect!==vr&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(r,e);return Nr(i)||(i=Sr(e,i,r)),i}var s=function(e,t){if(Ar(t))return e.stylize("undefined","undefined");if(Nr(t)){var r="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,"string")}if(i=t,"number"==typeof i)return e.stylize(""+t,"number");var i;if(jr(t))return e.stylize(""+t,"boolean");if(Er(t))return e.stylize("null","null")}(e,t);if(s)return s;var n=Object.keys(t),o=function(e){var t={};return e.forEach(function(e,r){t[e]=!0}),t}(n);if(e.showHidden&&(n=Object.getOwnPropertyNames(t)),Pr(t)&&(n.indexOf("message")>=0||n.indexOf("description")>=0))return _r(t);if(0===n.length){if(Cr(t)){var a=t.name?": "+t.name:"";return e.stylize("[Function"+a+"]","special")}if(Ir(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(xr(t))return e.stylize(Date.prototype.toString.call(t),"date");if(Pr(t))return _r(t)}var c,u,l="",h=!1,d=["{","}"];(c=t,Array.isArray(c)&&(h=!0,d=["[","]"]),Cr(t))&&(l=" [Function"+(t.name?": "+t.name:"")+"]");return Ir(t)&&(l=" "+RegExp.prototype.toString.call(t)),xr(t)&&(l=" "+Date.prototype.toUTCString.call(t)),Pr(t)&&(l=" "+_r(t)),0!==n.length||h&&0!=t.length?r<0?Ir(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special"):(e.seen.push(t),u=h?function(e,t,r,i,s){for(var n=[],o=0,a=t.length;o<a;++o)Lr(t,String(o))?n.push(Rr(e,t,r,i,String(o),!0)):n.push("");return s.forEach(function(s){s.match(/^\d+$/)||n.push(Rr(e,t,r,i,s,!0))}),n}(e,t,r,o,n):n.map(function(i){return Rr(e,t,r,o,i,h)}),e.seen.pop(),function(e,t,r){var i=e.reduce(function(e,t){return t.indexOf("\n"),e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);if(i>60)return r[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+r[1];return r[0]+t+" "+e.join(", ")+" "+r[1]}(u,l,d)):d[0]+l+d[1]}function _r(e){return"["+Error.prototype.toString.call(e)+"]"}function Rr(e,t,r,i,s,n){var o,a,c;if((c=Object.getOwnPropertyDescriptor(t,s)||{value:t[s]}).get?a=c.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):c.set&&(a=e.stylize("[Setter]","special")),Lr(i,s)||(o="["+s+"]"),a||(e.seen.indexOf(c.value)<0?(a=Er(r)?Sr(e,c.value,null):Sr(e,c.value,r-1)).indexOf("\n")>-1&&(a=n?a.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+a.split("\n").map(function(e){return" "+e}).join("\n")):a=e.stylize("[Circular]","special")),Ar(o)){if(n&&s.match(/^\d+$/))return a;(o=JSON.stringify(""+s)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=e.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=e.stylize(o,"string"))}return o+": "+a}function jr(e){return"boolean"==typeof e}function Er(e){return null===e}function Nr(e){return"string"==typeof e}function Ar(e){return void 0===e}function Ir(e){return Dr(e)&&"[object RegExp]"===Tr(e)}function Dr(e){return"object"==typeof e&&null!==e}function xr(e){return Dr(e)&&"[object Date]"===Tr(e)}function Pr(e){return Dr(e)&&("[object Error]"===Tr(e)||e instanceof Error)}function Cr(e){return"function"==typeof e}function Tr(e){return Object.prototype.toString.call(e)}function Lr(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function $r(){this.head=null,this.tail=null,this.length=0}vr.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},vr.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},$r.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},$r.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},$r.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},$r.prototype.clear=function(){this.head=this.tail=null,this.length=0},$r.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,r=""+t.data;t=t.next;)r+=e+t.data;return r},$r.prototype.concat=function(e){if(0===this.length)return gt.alloc(0);if(1===this.length)return this.head.data;for(var t=gt.allocUnsafe(e>>>0),r=this.head,i=0;r;)r.data.copy(t,i),i+=r.data.length,r=r.next;return t};var Mr=gt.isEncoding||function(e){switch(e&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function Ur(e){switch(this.encoding=(e||"utf8").toLowerCase().replace(/[-_]/,""),function(e){if(e&&!Mr(e))throw new Error("Unknown encoding: "+e)}(e),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=Fr;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=Br;break;default:return void(this.write=qr)}this.charBuffer=new gt(6),this.charReceived=0,this.charLength=0}function qr(e){return e.toString(this.encoding)}function Fr(e){this.charReceived=e.length%2,this.charLength=this.charReceived?2:0}function Br(e){this.charReceived=e.length%3,this.charLength=this.charReceived?3:0}Ur.prototype.write=function(e){for(var t="";this.charLength;){var r=e.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:e.length;if(e.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived<this.charLength)return"";if(e=e.slice(r,e.length),!((s=(t=this.charBuffer.slice(0,this.charLength).toString(this.encoding)).charCodeAt(t.length-1))>=55296&&s<=56319)){if(this.charReceived=this.charLength=0,0===e.length)return t;break}this.charLength+=this.surrogateSize,t=""}this.detectIncompleteChar(e);var i=e.length;this.charLength&&(e.copy(this.charBuffer,0,e.length-this.charReceived,i),i-=this.charReceived);var s;i=(t+=e.toString(this.encoding,0,i)).length-1;if((s=t.charCodeAt(i))>=55296&&s<=56319){var n=this.surrogateSize;return this.charLength+=n,this.charReceived+=n,this.charBuffer.copy(this.charBuffer,n,0,n),e.copy(this.charBuffer,0,0,n),t.substring(0,i)}return t},Ur.prototype.detectIncompleteChar=function(e){for(var t=e.length>=3?3:e.length;t>0;t--){var r=e[e.length-t];if(1==t&&r>>5==6){this.charLength=2;break}if(t<=2&&r>>4==14){this.charLength=3;break}if(t<=3&&r>>3==30){this.charLength=4;break}}this.charReceived=t},Ur.prototype.end=function(e){var t="";if(e&&e.length&&(t=this.write(e)),this.charReceived){var r=this.charReceived,i=this.charBuffer,s=this.encoding;t+=i.slice(0,r).toString(s)}return t},Kr.ReadableState=Vr;var zr=function(e){if(Ar(br)&&(br=pr.env.NODE_DEBUG||""),e=e.toUpperCase(),!wr[e])if(new RegExp("\\b"+e+"\\b","i").test(br)){wr[e]=function(){var t=mr.apply(null,arguments);console.error("%s %d: %s",e,0,t)}}else wr[e]=function(){};return wr[e]}("stream");function Vr(e,t){e=e||{},this.objectMode=!!e.objectMode,t instanceof wi&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var r=e.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:i,this.highWaterMark=~~this.highWaterMark,this.buffer=new $r,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(this.decoder=new Ur(e.encoding),this.encoding=e.encoding)}function Kr(e){if(!(this instanceof Kr))return new Kr(e);this._readableState=new Vr(e,this),this.readable=!0,e&&"function"==typeof e.read&&(this._read=e.read),Oe.call(this)}function Hr(e,t,r,i,s){var n=function(e,t){var r=null;gt.isBuffer(t)||"string"==typeof t||null==t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));return r}(t,r);if(n)e.emit("error",n);else if(null===r)t.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,Jr(e)}(e,t);else if(t.objectMode||r&&r.length>0)if(t.ended&&!s){var o=new Error("stream.push() after EOF");e.emit("error",o)}else if(t.endEmitted&&s){var a=new Error("stream.unshift() after end event");e.emit("error",a)}else{var c;!t.decoder||s||i||(r=t.decoder.write(r),c=!t.objectMode&&0===r.length),s||(t.reading=!1),c||(t.flowing&&0===t.length&&!t.sync?(e.emit("data",r),e.read(0)):(t.length+=t.objectMode?1:r.length,s?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&Jr(e))),function(e,t){t.readingMore||(t.readingMore=!0,lr(Qr,e,t))}(e,t)}else s||(t.reading=!1);return function(e){return!e.ended&&(e.needReadable||e.length<e.highWaterMark||0===e.length)}(t)}fr(Kr,Oe),Kr.prototype.push=function(e,t){var r=this._readableState;return r.objectMode||"string"!=typeof e||(t=t||r.defaultEncoding)!==r.encoding&&(e=gt.from(e,t),t=""),Hr(this,r,e,t,!1)},Kr.prototype.unshift=function(e){return Hr(this,this._readableState,e,"",!0)},Kr.prototype.isPaused=function(){return!1===this._readableState.flowing},Kr.prototype.setEncoding=function(e){return this._readableState.decoder=new Ur(e),this._readableState.encoding=e,this};var Wr=8388608;function Gr(e,t){return e<=0||0===t.length&&t.ended?0:t.objectMode?1:e!=e?t.flowing&&t.length?t.buffer.head.data.length:t.length:(e>t.highWaterMark&&(t.highWaterMark=function(e){return e>=Wr?e=Wr:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function Jr(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(zr("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?lr(Yr,e):Yr(e))}function Yr(e){zr("emit readable"),e.emit("readable"),ei(e)}function Qr(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length<t.highWaterMark&&(zr("maybeReadMore read 0"),e.read(0),r!==t.length);)r=t.length;t.readingMore=!1}function Xr(e){zr("readable nexttick read 0"),e.read(0)}function Zr(e,t){t.reading||(zr("resume read 0"),e.read(0)),t.resumeScheduled=!1,t.awaitDrain=0,e.emit("resume"),ei(e),t.flowing&&!t.reading&&e.read(0)}function ei(e){var t=e._readableState;for(zr("flow",t.flowing);t.flowing&&null!==e.read(););}function ti(e,t){return 0===t.length?null:(t.objectMode?r=t.buffer.shift():!e||e>=t.length?(r=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):r=function(e,t,r){var i;e<t.head.data.length?(i=t.head.data.slice(0,e),t.head.data=t.head.data.slice(e)):i=e===t.head.data.length?t.shift():r?function(e,t){var r=t.head,i=1,s=r.data;e-=s.length;for(;r=r.next;){var n=r.data,o=e>n.length?n.length:e;if(o===n.length?s+=n:s+=n.slice(0,e),0===(e-=o)){o===n.length?(++i,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=n.slice(o));break}++i}return t.length-=i,s}(e,t):function(e,t){var r=gt.allocUnsafe(e),i=t.head,s=1;i.data.copy(r),e-=i.data.length;for(;i=i.next;){var n=i.data,o=e>n.length?n.length:e;if(n.copy(r,r.length-e,0,o),0===(e-=o)){o===n.length?(++s,i.next?t.head=i.next:t.head=t.tail=null):(t.head=i,i.data=n.slice(o));break}++s}return t.length-=s,r}(e,t);return i}(e,t.buffer,t.decoder),r);var r}function ri(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,lr(ii,t,e))}function ii(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function si(e,t){for(var r=0,i=e.length;r<i;r++)if(e[r]===t)return r;return-1}function ni(){}function oi(e,t,r){this.chunk=e,this.encoding=t,this.callback=r,this.next=null}function ai(e,t){Object.defineProperty(this,"buffer",{get:yr(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")}),e=e||{},this.objectMode=!!e.objectMode,t instanceof wi&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var r=e.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:i,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var s=!1===e.decodeStrings;this.decodeStrings=!s,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var r=e._writableState,i=r.sync,s=r.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(r),t)!function(e,t,r,i,s){--t.pendingcb,r?lr(s,i):s(i);e._writableState.errorEmitted=!0,e.emit("error",i)}(e,r,i,t,s);else{var n=di(r);n||r.corked||r.bufferProcessing||!r.bufferedRequest||hi(e,r),i?lr(li,e,r,n,s):li(e,r,n,s)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new gi(this)}function ci(e){if(!(this instanceof ci||this instanceof wi))return new ci(e);this._writableState=new ai(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev)),Oe.call(this)}function ui(e,t,r,i,s,n,o){t.writelen=i,t.writecb=o,t.writing=!0,t.sync=!0,r?e._writev(s,t.onwrite):e._write(s,n,t.onwrite),t.sync=!1}function li(e,t,r,i){r||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,i(),pi(e,t)}function hi(e,t){t.bufferProcessing=!0;var r=t.bufferedRequest;if(e._writev&&r&&r.next){var i=t.bufferedRequestCount,s=new Array(i),n=t.corkedRequestsFree;n.entry=r;for(var o=0;r;)s[o]=r,r=r.next,o+=1;ui(e,t,!0,t.length,s,"",n.finish),t.pendingcb++,t.lastBufferedRequest=null,n.next?(t.corkedRequestsFree=n.next,n.next=null):t.corkedRequestsFree=new gi(t)}else{for(;r;){var a=r.chunk,c=r.encoding,u=r.callback;if(ui(e,t,!1,t.objectMode?1:a.length,a,c,u),r=r.next,t.writing)break}null===r&&(t.lastBufferedRequest=null)}t.bufferedRequestCount=0,t.bufferedRequest=r,t.bufferProcessing=!1}function di(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function fi(e,t){t.prefinished||(t.prefinished=!0,e.emit("prefinish"))}function pi(e,t){var r=di(t);return r&&(0===t.pendingcb?(fi(e,t),t.finished=!0,e.emit("finish")):fi(e,t)),r}function gi(e){var t=this;this.next=null,this.entry=null,this.finish=function(r){var i=t.entry;for(t.entry=null;i;){var s=i.callback;e.pendingcb--,s(r),i=i.next}e.corkedRequestsFree?e.corkedRequestsFree.next=t:e.corkedRequestsFree=t}}Kr.prototype.read=function(e){zr("read",e),e=parseInt(e,10);var t=this._readableState,r=e;if(0!==e&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return zr("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?ri(this):Jr(this),null;if(0===(e=Gr(e,t))&&t.ended)return 0===t.length&&ri(this),null;var i,s=t.needReadable;return zr("need readable",s),(0===t.length||t.length-e<t.highWaterMark)&&zr("length less than watermark",s=!0),t.ended||t.reading?zr("reading or ended",s=!1):s&&(zr("do read"),t.reading=!0,t.sync=!0,0===t.length&&(t.needReadable=!0),this._read(t.highWaterMark),t.sync=!1,t.reading||(e=Gr(r,t))),null===(i=e>0?ti(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&ri(this)),null!==i&&this.emit("data",i),i},Kr.prototype._read=function(e){this.emit("error",new Error("not implemented"))},Kr.prototype.pipe=function(e,t){var r=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=e;break;case 1:i.pipes=[i.pipes,e];break;default:i.pipes.push(e)}i.pipesCount+=1,zr("pipe count=%d opts=%j",i.pipesCount,t);var s=!t||!1!==t.end?o:u;function n(e){zr("onunpipe"),e===r&&u()}function o(){zr("onend"),e.end()}i.endEmitted?lr(s):r.once("end",s),e.on("unpipe",n);var a=function(e){return function(){var t=e._readableState;zr("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&e.listeners("data").length&&(t.flowing=!0,ei(e))}}(r);e.on("drain",a);var c=!1;function u(){zr("cleanup"),e.removeListener("close",f),e.removeListener("finish",p),e.removeListener("drain",a),e.removeListener("error",d),e.removeListener("unpipe",n),r.removeListener("end",o),r.removeListener("end",u),r.removeListener("data",h),c=!0,!i.awaitDrain||e._writableState&&!e._writableState.needDrain||a()}var l=!1;function h(t){zr("ondata"),l=!1,!1!==e.write(t)||l||((1===i.pipesCount&&i.pipes===e||i.pipesCount>1&&-1!==si(i.pipes,e))&&!c&&(zr("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,l=!0),r.pause())}function d(t){var r;zr("onerror",t),g(),e.removeListener("error",d),0===(r="error",e.listeners(r).length)&&e.emit("error",t)}function f(){e.removeListener("finish",p),g()}function p(){zr("onfinish"),e.removeListener("close",f),g()}function g(){zr("unpipe"),r.unpipe(e)}return r.on("data",h),function(e,t,r){if("function"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?Array.isArray(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}(e,"error",d),e.once("close",f),e.once("finish",p),e.emit("pipe",r),i.flowing||(zr("pipe resume"),r.resume()),e},Kr.prototype.unpipe=function(e){var t=this._readableState;if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this)),this;if(!e){var r=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var s=0;s<i;s++)r[s].emit("unpipe",this);return this}var n=si(t.pipes,e);return-1===n||(t.pipes.splice(n,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit("unpipe",this)),this},Kr.prototype.on=function(e,t){var r=Oe.prototype.on.call(this,e,t);if("data"===e)!1!==this._readableState.flowing&&this.resume();else if("readable"===e){var i=this._readableState;i.endEmitted||i.readableListening||(i.readableListening=i.needReadable=!0,i.emittedReadable=!1,i.reading?i.length&&Jr(this):lr(Xr,this))}return r},Kr.prototype.addListener=Kr.prototype.on,Kr.prototype.resume=function(){var e=this._readableState;return e.flowing||(zr("resume"),e.flowing=!0,function(e,t){t.resumeScheduled||(t.resumeScheduled=!0,lr(Zr,e,t))}(this,e)),this},Kr.prototype.pause=function(){return zr("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(zr("pause"),this._readableState.flowing=!1,this.emit("pause")),this},Kr.prototype.wrap=function(e){var t=this._readableState,r=!1,i=this;for(var s in e.on("end",function(){if(zr("wrapped end"),t.decoder&&!t.ended){var e=t.decoder.end();e&&e.length&&i.push(e)}i.push(null)}),e.on("data",function(s){(zr("wrapped data"),t.decoder&&(s=t.decoder.write(s)),t.objectMode&&null==s)||(t.objectMode||s&&s.length)&&(i.push(s)||(r=!0,e.pause()))}),e)void 0===this[s]&&"function"==typeof e[s]&&(this[s]=function(t){return function(){return e[t].apply(e,arguments)}}(s));return function(e,t){for(var r=0,i=e.length;r<i;r++)t(e[r],r)}(["error","close","destroy","pause","resume"],function(t){e.on(t,i.emit.bind(i,t))}),i._read=function(t){zr("wrapped _read",t),r&&(r=!1,e.resume())},i},Kr._fromList=ti,ci.WritableState=ai,fr(ci,Oe),ai.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},ci.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},ci.prototype.write=function(e,t,r){var i=this._writableState,s=!1;return"function"==typeof t&&(r=t,t=null),gt.isBuffer(e)?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=ni),i.ended?function(e,t){var r=new Error("write after end");e.emit("error",r),lr(t,r)}(this,r):function(e,t,r,i){var s=!0,n=!1;return null===r?n=new TypeError("May not write null values to stream"):gt.isBuffer(r)||"string"==typeof r||void 0===r||t.objectMode||(n=new TypeError("Invalid non-string/buffer chunk")),n&&(e.emit("error",n),lr(i,n),s=!1),s}(this,i,e,r)&&(i.pendingcb++,s=function(e,t,r,i,s){r=function(e,t,r){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=gt.from(t,r));return t}(t,r,i),gt.isBuffer(r)&&(i="buffer");var n=t.objectMode?1:r.length;t.length+=n;var o=t.length<t.highWaterMark;o||(t.needDrain=!0);if(t.writing||t.corked){var a=t.lastBufferedRequest;t.lastBufferedRequest=new oi(r,i,s),a?a.next=t.lastBufferedRequest:t.bufferedRequest=t.lastBufferedRequest,t.bufferedRequestCount+=1}else ui(e,t,!1,n,r,i,s);return o}(this,i,e,t,r)),s},ci.prototype.cork=function(){this._writableState.corked++},ci.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||hi(this,e))},ci.prototype.setDefaultEncoding=function(e){if("string"==typeof e&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},ci.prototype._write=function(e,t,r){r(new Error("not implemented"))},ci.prototype._writev=null,ci.prototype.end=function(e,t,r){var i=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!=e&&this.write(e,t),i.corked&&(i.corked=1,this.uncork()),i.ending||i.finished||function(e,t,r){t.ending=!0,pi(e,t),r&&(t.finished?lr(r):e.once("finish",r));t.ended=!0,e.writable=!1}(this,i,r)},fr(wi,Kr);for(var mi=Object.keys(ci.prototype),yi=0;yi<mi.length;yi++){var bi=mi[yi];wi.prototype[bi]||(wi.prototype[bi]=ci.prototype[bi])}function wi(e){if(!(this instanceof wi))return new wi(e);Kr.call(this,e),ci.call(this,e),e&&!1===e.readable&&(this.readable=!1),e&&!1===e.writable&&(this.writable=!1),this.allowHalfOpen=!0,e&&!1===e.allowHalfOpen&&(this.allowHalfOpen=!1),this.once("end",vi)}function vi(){this.allowHalfOpen||this._writableState.ended||lr(Oi,this)}function Oi(e){e.end()}function ki(e){this.afterTransform=function(t,r){return function(e,t,r){var i=e._transformState;i.transforming=!1;var s=i.writecb;if(!s)return e.emit("error",new Error("no writecb in Transform class"));i.writechunk=null,i.writecb=null,null!=r&&e.push(r);s(t);var n=e._readableState;n.reading=!1,(n.needReadable||n.length<n.highWaterMark)&&e._read(n.highWaterMark)}(e,t,r)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function Si(e){if(!(this instanceof Si))return new Si(e);wi.call(this,e),this._transformState=new ki(this);var t=this;this._readableState.needReadable=!0,this._readableState.sync=!1,e&&("function"==typeof e.transform&&(this._transform=e.transform),"function"==typeof e.flush&&(this._flush=e.flush)),this.once("prefinish",function(){"function"==typeof this._flush?this._flush(function(e){_i(t,e)}):_i(t)})}function _i(e,t){if(t)return e.emit("error",t);var r=e._writableState,i=e._transformState;if(r.length)throw new Error("Calling transform done when ws.length != 0");if(i.transforming)throw new Error("Calling transform done when still transforming");return e.push(null)}function Ri(e){if(!(this instanceof Ri))return new Ri(e);Si.call(this,e)}function ji(){Oe.call(this)}fr(Si,wi),Si.prototype.push=function(e,t){return this._transformState.needTransform=!1,wi.prototype.push.call(this,e,t)},Si.prototype._transform=function(e,t,r){throw new Error("Not implemented")},Si.prototype._write=function(e,t,r){var i=this._transformState;if(i.writecb=r,i.writechunk=e,i.writeencoding=t,!i.transforming){var s=this._readableState;(i.needTransform||s.needReadable||s.length<s.highWaterMark)&&this._read(s.highWaterMark)}},Si.prototype._read=function(e){var t=this._transformState;null!==t.writechunk&&t.writecb&&!t.transforming?(t.transforming=!0,this._transform(t.writechunk,t.writeencoding,t.afterTransform)):t.needTransform=!0},fr(Ri,Si),Ri.prototype._transform=function(e,t,r){r(null,e)},fr(ji,Oe),ji.Readable=Kr,ji.Writable=ci,ji.Duplex=wi,ji.Transform=Si,ji.PassThrough=Ri,ji.Stream=ji,ji.prototype.pipe=function(e,t){var r=this;function i(t){e.writable&&!1===e.write(t)&&r.pause&&r.pause()}function s(){r.readable&&r.resume&&r.resume()}r.on("data",i),e.on("drain",s),e._isStdio||t&&!1===t.end||(r.on("end",o),r.on("close",a));var n=!1;function o(){n||(n=!0,e.end())}function a(){n||(n=!0,"function"==typeof e.destroy&&e.destroy())}function c(e){if(u(),0===Oe.listenerCount(this,"error"))throw e}function u(){r.removeListener("data",i),e.removeListener("drain",s),r.removeListener("end",o),r.removeListener("close",a),r.removeListener("error",c),e.removeListener("error",c),r.removeListener("end",u),r.removeListener("close",u),e.removeListener("close",u)}return r.on("error",c),e.on("error",c),r.on("end",u),r.on("close",u),e.on("close",u),e.emit("pipe",r),e};class Ei extends Oe{constructor({resource:e}){super(),this.resource=e,this.client=e.client,this.stream=new d.ReadableStream({highWaterMark:3*this.client.parallelism,start:this._start.bind(this),pull:this._pull.bind(this),cancel:this._cancel.bind(this)})}build(){return this.stream.getReader()}async _start(e){this.controller=e,this.continuationToken=null,this.closeNextIteration=!1}async _pull(e){if(this.closeNextIteration)return void e.close();const t=await this.client.listObjects({prefix:`resource=${this.resource.name}`,continuationToken:this.continuationToken}),r=t?.Contents.map(e=>e.Key).map(e=>e.replace(this.client.config.keyPrefix,"")).map(e=>e.startsWith("/")?e.replace("/",""):e).map(e=>e.replace(`resource=${this.resource.name}/id=`,""));this.continuationToken=t.NextContinuationToken,this.enqueue(r),t.IsTruncated||(this.closeNextIteration=!0)}enqueue(e){e.forEach(e=>{this.controller.enqueue(e),this.emit("id",e)})}_cancel(e){}}class Ni extends Ei{enqueue(e){this.controller.enqueue(e),this.emit("page",e)}}class Ai extends Oe{constructor({resource:e,batchSize:t=10,concurrency:r=5}){if(super(),!e)throw new Error("Resource is required for ResourceReader");this.resource=e,this.client=e.client,this.batchSize=t,this.concurrency=r,this.input=new Ni({resource:this.resource}),this.transform=new Si({objectMode:!0,transform:this._transform.bind(this)}),this.input.on("data",e=>{this.transform.write(e)}),this.input.on("end",()=>{this.transform.end()}),this.input.on("error",e=>{this.emit("error",e)}),this.transform.on("data",e=>{this.emit("data",e)}),this.transform.on("end",()=>{this.emit("end")}),this.transform.on("error",e=>{this.emit("error",e)})}build(){return this}async _transform(e,t,r){const[i,s]=await I(async()=>{await c.PromisePool.for(e).withConcurrency(this.concurrency).handleError(async(e,t)=>{this.emit("error",e,t)}).process(async e=>{const t=await this.resource.get(e);return this.push(t),t})});r(s)}resume(){this.input.resume()}}class Ii extends Oe{constructor({resource:e,batchSize:t=10,concurrency:r=5}){super(),this.resource=e,this.client=e.client,this.batchSize=t,this.concurrency=r,this.buffer=[],this.writing=!1,this.writable=new ci({objectMode:!0,write:this._write.bind(this)}),this.writable.on("finish",()=>{this.emit("finish")}),this.writable.on("error",e=>{this.emit("error",e)})}build(){return this}write(e){return this.buffer.push(e),this._maybeWrite().catch(e=>{this.emit("error",e)}),!0}end(){this.ended=!0,this._maybeWrite().catch(e=>{this.emit("error",e)})}async _maybeWrite(){if(!this.writing&&(0!==this.buffer.length||this.ended)){for(this.writing=!0;this.buffer.length>0;){const e=this.buffer.splice(0,this.batchSize),[t,r]=await I(async()=>{await c.PromisePool.for(e).withConcurrency(this.concurrency).handleError(async(e,t)=>{this.emit("error",e,t)}).process(async e=>{const[t,r,i]=await I(async()=>await this.resource.insert(e));return t?i:(this.emit("error",r,e),null)})});t||this.emit("error",r)}this.writing=!1,this.ended&&this.writable.emit("finish")}}async _write(e,t,r){r()}}function Di(e){return new Promise((t,r)=>{if(!e)return r(new Error("streamToString: stream is undefined"));const i=[];e.on("data",e=>i.push(e)),e.on("error",r),e.on("end",()=>t(Buffer.concat(i).toString("utf-8")))})}class xi extends Oe{constructor(e={}){super(),this._instanceId=Math.random().toString(36).slice(2,8);const t=function(e){const t=[];e.name?"string"!=typeof e.name?t.push("Resource 'name' must be a string"):""===e.name.trim()&&t.push("Resource 'name' cannot be empty"):t.push("Resource 'name' is required");e.client||t.push("S3 'client' is required");e.attributes?"object"!=typeof e.attributes||Array.isArray(e.attributes)?t.push("Resource 'attributes' must be an object"):0===Object.keys(e.attributes).length&&t.push("Resource 'attributes' cannot be empty"):t.push("Resource 'attributes' are required");void 0!==e.version&&"string"!=typeof e.version&&t.push("Resource 'version' must be a string");void 0!==e.behavior&&"string"!=typeof e.behavior&&t.push("Resource 'behavior' must be a string");void 0!==e.passphrase&&"string"!=typeof e.passphrase&&t.push("Resource 'passphrase' must be a string");void 0!==e.parallelism&&("number"==typeof e.parallelism&&Number.isInteger(e.parallelism)?e.parallelism<1&&t.push("Resource 'parallelism' must be greater than 0"):t.push("Resource 'parallelism' must be an integer"));void 0===e.observers||Array.isArray(e.observers)||t.push("Resource 'observers' must be an array");const r=["cache","autoDecrypt","timestamps","paranoid","allNestedObjectsOptional"];for(const i of r)void 0!==e[i]&&"boolean"!=typeof e[i]&&t.push(`Resource '${i}' must be a boolean`);void 0!==e.idGenerator&&("function"!=typeof e.idGenerator&&"number"!=typeof e.idGenerator?t.push("Resource 'idGenerator' must be a function or a number (size)"):"number"==typeof e.idGenerator&&e.idGenerator<=0&&t.push("Resource 'idGenerator' size must be greater than 0"));void 0!==e.idSize&&("number"==typeof e.idSize&&Number.isInteger(e.idSize)?e.idSize<=0&&t.push("Resource 'idSize' must be greater than 0"):t.push("Resource 'idSize' must be an integer"));if(void 0!==e.partitions)if("object"!=typeof e.partitions||Array.isArray(e.partitions))t.push("Resource 'partitions' must be an object");else for(const[r,i]of Object.entries(e.partitions))if("object"!=typeof i||Array.isArray(i))t.push(`Partition '${r}' must be an object`);else if(i.fields)if("object"!=typeof i.fields||Array.isArray(i.fields))t.push(`Partition '${r}.fields' must be an object`);else for(const[e,s]of Object.entries(i.fields))"string"!=typeof s&&t.push(`Partition '${r}.fields.${e}' must be a string`);else t.push(`Partition '${r}' must have a 'fields' property`);if(void 0!==e.hooks)if("object"!=typeof e.hooks||Array.isArray(e.hooks))t.push("Resource 'hooks' must be an object");else{const r=["beforeInsert","afterInsert","beforeUpdate","afterUpdate","beforeDelete","afterDelete"];for(const[i,s]of Object.entries(e.hooks))if(r.includes(i))if(Array.isArray(s))for(let e=0;e<s.length;e++){const t=s[e];if("function"==typeof t);else if("string"==typeof t)continue}else t.push(`Resource 'hooks.${i}' must be an array`);else t.push(`Invalid hook event '${i}'. Valid events: ${r.join(", ")}`)}return{isValid:0===t.length,errors:t}}(e);if(!t.isValid)throw new ue(`Invalid Resource ${e.name} configuration`,{resourceName:e.name,validation:t.errors,operation:"constructor",suggestion:"Check resource config and attributes."});const{name:r,client:i,version:s="1",attributes:n={},behavior:o=q,passphrase:a="secret",parallelism:c=10,observers:u=[],cache:l=!1,autoDecrypt:h=!0,timestamps:d=!1,partitions:f={},paranoid:p=!0,allNestedObjectsOptional:g=!0,hooks:m={},idGenerator:y,idSize:b=22,versioningEnabled:w=!1}=e;if(this.name=r,this.client=i,this.version=s,this.behavior=o,this.observers=u,this.parallelism=c,this.passphrase=a??"secret",this.versioningEnabled=w,this.idGenerator=this.configureIdGenerator(y,b),this.config={cache:l,hooks:m,paranoid:p,timestamps:d,partitions:f,autoDecrypt:h,allNestedObjectsOptional:g},this.hooks={beforeInsert:[],afterInsert:[],beforeUpdate:[],afterUpdate:[],beforeDelete:[],afterDelete:[]},this.attributes=n||{},this.map=e.map,this.applyConfiguration({map:this.map}),m)for(const[e,t]of Object.entries(m))if(Array.isArray(t)&&this.hooks[e])for(const r of t)"function"==typeof r&&this.hooks[e].push(r.bind(this));this._initMiddleware()}configureIdGenerator(e,r){return"function"==typeof e?e:"number"==typeof e&&e>0?t.customAlphabet(t.urlAlphabet,e):"number"==typeof r&&r>0&&22!==r?t.customAlphabet(t.urlAlphabet,r):ye}get options(){return{timestamps:this.config.timestamps,partitions:this.config.partitions||{},cache:this.config.cache,autoDecrypt:this.config.autoDecrypt,paranoid:this.config.paranoid,allNestedObjectsOptional:this.config.allNestedObjectsOptional}}export(){const e=this.schema.export();return e.behavior=this.behavior,e.timestamps=this.config.timestamps,e.partitions=this.config.partitions||{},e.paranoid=this.config.paranoid,e.allNestedObjectsOptional=this.config.allNestedObjectsOptional,e.autoDecrypt=this.config.autoDecrypt,e.cache=this.config.cache,e.hooks=this.hooks,e.map=this.map,e}applyConfiguration({map:e}={}){this.config.timestamps&&(this.attributes.createdAt||(this.attributes.createdAt="string|optional"),this.attributes.updatedAt||(this.attributes.updatedAt="string|optional"),this.config.partitions||(this.config.partitions={}),this.config.partitions.byCreatedDate||(this.config.partitions.byCreatedDate={fields:{createdAt:"date|maxlength:10"}}),this.config.partitions.byUpdatedDate||(this.config.partitions.byUpdatedDate={fields:{updatedAt:"date|maxlength:10"}})),this.setupPartitionHooks(),this.versioningEnabled&&(this.config.partitions.byVersion||(this.config.partitions.byVersion={fields:{_v:"string"}})),this.schema=new Ze({name:this.name,attributes:this.attributes,passphrase:this.passphrase,version:this.version,options:{autoDecrypt:this.config.autoDecrypt,allNestedObjectsOptional:this.config.allNestedObjectsOptional},map:e||this.map}),this.validatePartitions()}updateAttributes(e){const t=this.attributes;return this.attributes=e,this.applyConfiguration({map:this.schema?.map}),{oldAttributes:t,newAttributes:e}}addHook(e,t){this.hooks[e]&&this.hooks[e].push(t.bind(this))}async executeHooks(e,t){if(!this.hooks[e])return t;let r=t;for(const t of this.hooks[e])r=await t(r);return r}setupPartitionHooks(){if(!this.config.partitions)return;const e=this.config.partitions;0!==Object.keys(e).length&&(this.hooks.afterInsert||(this.hooks.afterInsert=[]),this.hooks.afterInsert.push(async e=>(await this.createPartitionReferences(e),e)),this.hooks.afterDelete||(this.hooks.afterDelete=[]),this.hooks.afterDelete.push(async e=>(await this.deletePartitionReferences(e),e)))}async validate(e){const t={original:n.cloneDeep(e),isValid:!1,errors:[]},r=await this.schema.validate(e,{mutateOriginal:!1});return!0===r?t.isValid=!0:t.errors=r,t.data=e,t}validatePartitions(){if(!this.config.partitions)return;const e=this.config.partitions;if(0===Object.keys(e).length)return;const t=Object.keys(this.attributes||{});for(const[r,i]of Object.entries(e))if(i.fields)for(const e of Object.keys(i.fields))if(!this.fieldExistsInAttributes(e))throw new le(`Partition '${r}' uses field '${e}' which does not exist in resource attributes. Available fields: ${t.join(", ")}.`,{resourceName:this.name,partitionName:r,fieldName:e,availableFields:t,operation:"validatePartitions"})}fieldExistsInAttributes(e){if(e.startsWith("_"))return!0;if(!e.includes("."))return Object.keys(this.attributes||{}).includes(e);const t=e.split(".");let r=this.attributes||{};for(const e of t){if(!r||"object"!=typeof r||!(e in r))return!1;r=r[e]}return!0}applyPartitionRule(e,t){if(null==e)return e;let r=e;if("string"==typeof t&&t.includes("maxlength:")){const e=t.match(/maxlength:(\d+)/);if(e){const t=parseInt(e[1]);"string"==typeof r&&r.length>t&&(r=r.substring(0,t))}}if(t.includes("date"))if(r instanceof Date)r=r.toISOString().split("T")[0];else if("string"==typeof r)if(r.includes("T")&&r.includes("Z"))r=r.split("T")[0];else{const e=new Date(r);isNaN(e.getTime())||(r=e.toISOString().split("T")[0])}return r}getResourceKey(e){return Te("resource="+this.name,"data",`id=${e}`)}getPartitionKey({partitionName:e,id:t,data:r}){if(!this.config.partitions||!this.config.partitions[e])throw new le(`Partition '${e}' not found`,{resourceName:this.name,partitionName:e,operation:"getPartitionKey"});const i=this.config.partitions[e],s=[],n=Object.entries(i.fields).sort(([e],[t])=>e.localeCompare(t));for(const[e,t]of n){const i=this.getNestedFieldValue(r,e),n=this.applyPartitionRule(i,t);if(null==n)return null;s.push(`${e}=${n}`)}if(0===s.length)return null;const o=t||r?.id;return o?Te(`resource=${this.name}`,`partition=${e}`,...s,`id=${o}`):null}getNestedFieldValue(e,t){if(!t.includes("."))return e[t];const r=t.split(".");let i=e;for(const e of r){if(!i||"object"!=typeof i||!(e in i))return;i=i[e]}return i}calculateContentLength(e){return e?Buffer.isBuffer(e)?e.length:"string"==typeof e?Buffer.byteLength(e,"utf8"):"object"==typeof e?Buffer.byteLength(JSON.stringify(e),"utf8"):Buffer.byteLength(String(e),"utf8"):0}async insert({id:e,...t}){if(await this.exists(e))throw new Error(`Resource with id '${e}' already exists`);this.getResourceKey(e||"(auto)"),this.options.timestamps&&(t.createdAt=(new Date).toISOString(),t.updatedAt=(new Date).toISOString());const r={id:e,...this.applyDefaults(t)},i=await this.executeHooks("beforeInsert",r),s=Object.keys(i).filter(e=>!(e in r)||i[e]!==r[e]),n={};for(const e of s)n[e]=i[e];const{errors:o,isValid:a,data:c}=await this.validate(i);if(!a){const e=o&&o.length&&o[0].message?o[0].message:"Insert failed";throw new re({bucket:this.client.config.bucket,resourceName:this.name,attributes:i,validation:o,message:e})}const{id:u,...l}=c;Object.assign(l,n);const h=u||e||this.idGenerator(),d=await this.schema.mapper(l);d._v=String(this.version);const f=M(this.behavior),{mappedData:p,body:g}=await f.handleInsert({resource:this,data:l,mappedData:d,originalData:r}),m=p,b=this.getResourceKey(h);let v;if(g&&""!==g){const[e,t]=await I(()=>Promise.resolve(JSON.parse(g)));e&&(v="application/json")}if("body-only"===this.behavior&&(!g||""===g))throw new Error(`[Resource.insert] Tentativa de gravar objeto sem body! Dados: id=${h}, resource=${this.name}`);const[O,k,S]=await I(()=>this.client.putObject({key:b,body:g,contentType:v,metadata:m}));if(!O){const e=k&&k.message?k.message:"";if(e.includes("metadata headers exceed")||e.includes("Insert failed")){const e=y(m),t=w({s3Limit:2047,systemConfig:{version:this.version,timestamps:this.config.timestamps,id:h}}),r=e-t;throw k.totalSize=e,k.limit=2047,k.effectiveLimit=t,k.excess=r,new ue("metadata headers exceed",{resourceName:this.name,operation:"insert",id:h,totalSize:e,effectiveLimit:t,excess:r,suggestion:"Reduce metadata size or number of fields."})}throw ne(k,{bucket:this.client.config.bucket,key:b,resourceName:this.name,operation:"insert",id:h})}let _=await this.composeFullObjectFromWrite({id:h,metadata:m,body:g,behavior:this.behavior});const R=await this.executeHooks("afterInsert",_);return this.emit("insert",{..._,$before:{...r},$after:{...R}}),R}async get(e){if(n.isObject(e))throw new Error("id cannot be an object");if(n.isEmpty(e))throw new Error("id cannot be empty");const t=this.getResourceKey(e),[r,i,s]=await I(()=>this.client.getObject(t));if(!r)throw ne(i,{bucket:this.client.config.bucket,key:t,resourceName:this.name,operation:"get",id:e});if(0===s.ContentLength){const r=new Error(`No such key: ${t} [bucket:${this.client.config.bucket}]`);throw r.name="NoSuchKey",ne(r,{bucket:this.client.config.bucket,key:t,resourceName:this.name,operation:"get",id:e})}const o=s.Metadata?._v||this.version,a="string"==typeof o&&o.startsWith("v")?o.slice(1):o,c=await this.getSchemaForVersion(a);let u=await c.unmapper(s.Metadata);const l=M(this.behavior);let h="";if(s.ContentLength>0){const[e,r,i]=await I(()=>this.client.getObject(t));h=e?await Di(i.Body):""}const{metadata:d}=await l.handleGet({resource:this,metadata:u,body:h});let f=await this.composeFullObjectFromWrite({id:e,metadata:d,body:h,behavior:this.behavior});f._contentLength=s.ContentLength,f._lastModified=s.LastModified,f._hasContent=s.ContentLength>0,f._mimeType=s.ContentType||null,f._v=a,s.VersionId&&(f._versionId=s.VersionId),s.Expiration&&(f._expiresAt=s.Expiration),f._definitionHash=this.getDefinitionHash(),a!==this.version&&(f=await this.applyVersionMapping(f,a,this.version)),this.emit("get",f);return f}async exists(e){const t=this.getResourceKey(e),[r,i]=await I(()=>this.client.headObject(t));return r}async update(e,t){if(n.isEmpty(e))throw new Error("id cannot be empty");if(!await this.exists(e))throw new Error(`Resource with id '${e}' does not exist`);const r=await this.get(e),i=n.cloneDeep(t);let s=n.cloneDeep(r);for(const[e,t]of Object.entries(i))if(e.includes(".")){let r=s;const i=e.split(".");for(let e=0;e<i.length-1;e++)"object"==typeof r[i[e]]&&null!==r[i[e]]||(r[i[e]]={}),r=r[i[e]];r[i[i.length-1]]=n.cloneDeep(t)}else"object"!=typeof t||null===t||Array.isArray(t)?s[e]=n.cloneDeep(t):s[e]=n.merge({},s[e],t);if(this.config.timestamps){const e=(new Date).toISOString();s.updatedAt=e,s.metadata||(s.metadata={}),s.metadata.updatedAt=e}const o=await this.executeHooks("beforeUpdate",n.cloneDeep(s)),a={...r,...o,id:e},{isValid:c,errors:u,data:l}=await this.validate(n.cloneDeep(a));if(!c)throw new re({bucket:this.client.config.bucket,resourceName:this.name,attributes:o,validation:u,message:"validation: "+(u&&u.length?JSON.stringify(u):"unknown")});await this.schema.mapper(l);const h=M(this.behavior),d=await this.schema.mapper({...r,...o});d._v=String(this.version),await h.handleUpdate({resource:this,id:e,data:{...r,...o},mappedData:d,originalData:{...i,id:e}});const{id:f,...p}=l,g={...r,id:e},m={...p,id:e};await this.handlePartitionReferenceUpdates(g,m);const b=await this.schema.mapper(p);b._v=String(this.version);const v=M(this.behavior),{mappedData:O,body:k}=await v.handleUpdate({resource:this,id:e,data:p,mappedData:b,originalData:{...i,id:e}}),S=O,_=this.getResourceKey(e);let R,j=k;if(""===k&&"body-overflow"!==this.behavior){const[e,t,r]=await I(()=>this.client.getObject(_));if(e&&r.ContentLength>0){const e=Buffer.from(await r.Body.transformToByteArray()),t=e.toString(),[i,s]=await I(()=>Promise.resolve(JSON.parse(t)));i||(j=e,R=r.ContentType)}}let E=R;if(j&&""!==j&&!E){const[e,t]=await I(()=>Promise.resolve(JSON.parse(j)));e&&(E="application/json")}this.versioningEnabled&&r._v!==this.version&&await this.createHistoricalVersion(e,r);const[N,A]=await I(()=>this.client.putObject({key:_,body:j,contentType:E,metadata:S}));if(!N&&A&&A.message&&A.message.includes("metadata headers exceed")){const t=y(S),r=w({s3Limit:2047,systemConfig:{version:this.version,timestamps:this.config.timestamps,id:e}}),i=t-r;throw A.totalSize=t,A.limit=2047,A.effectiveLimit=r,A.excess=i,this.emit("exceedsLimit",{operation:"update",totalSize:t,limit:2047,effectiveLimit:r,excess:i,data:p}),new ue("metadata headers exceed",{resourceName:this.name,operation:"update",id:e,totalSize:t,effectiveLimit:r,excess:i,suggestion:"Reduce metadata size or number of fields."})}if(!N)throw ne(A,{bucket:this.client.config.bucket,key:_,resourceName:this.name,operation:"update",id:e});const D=await this.composeFullObjectFromWrite({id:e,metadata:S,body:j,behavior:this.behavior}),x=await this.executeHooks("afterUpdate",D);return this.emit("update",{...D,$before:{...r},$after:{...x}}),x}async delete(e){if(n.isEmpty(e))throw new Error("id cannot be empty");let t,r=null;const[i,s,o]=await I(()=>this.get(e));i?t=o:(t={id:e},r=s),await this.executeHooks("beforeDelete",t);const a=this.getResourceKey(e),[c,u,l]=await I(()=>this.client.deleteObject(a));if(this.emit("delete",{...t,$before:{...t},$after:null}),r)throw ne(r,{bucket:this.client.config.bucket,key:a,resourceName:this.name,operation:"delete",id:e});if(!c)throw ne(u,{key:a,resourceName:this.name,operation:"delete",id:e});return await this.executeHooks("afterDelete",t),l}async upsert({id:e,...t}){return await this.exists(e)?this.update(e,t):this.insert({id:e,...t})}async count({partition:e=null,partitionValues:t={}}={}){let r;if(e&&Object.keys(t).length>0){const i=this.config.partitions[e];if(!i)throw new le(`Partition '${e}' not found`,{resourceName:this.name,partitionName:e,operation:"count"});const s=[],n=Object.entries(i.fields).sort(([e],[t])=>e.localeCompare(t));for(const[e,r]of n){const i=t[e];if(null!=i){const t=this.applyPartitionRule(i,r);s.push(`${e}=${t}`)}}r=s.length>0?`resource=${this.name}/partition=${e}/${s.join("/")}`:`resource=${this.name}/partition=${e}`}else r=`resource=${this.name}/data`;const i=await this.client.count({prefix:r});return this.emit("count",i),i}async insertMany(e){const{results:t}=await c.PromisePool.for(e).withConcurrency(this.parallelism).handleError(async(e,t)=>{this.emit("error",e,t),this.observers.map(r=>r.emit("error",this.name,e,t))}).process(async e=>await this.insert(e));return this.emit("insertMany",e.length),t}async deleteMany(e){const t=n.chunk(e.map(e=>this.getResourceKey(e)),1e3);e.map(e=>this.getResourceKey(e));const{results:r}=await c.PromisePool.for(t).withConcurrency(this.parallelism).handleError(async(e,t)=>{this.emit("error",e,t),this.observers.map(r=>r.emit("error",this.name,e,t))}).process(async e=>{const t=await this.client.deleteObjects(e);return e.forEach(e=>{const t=e.split("/").find(e=>e.startsWith("id=")),r=t?t.replace("id=",""):null;r&&(this.emit("deleted",r),this.observers.map(e=>e.emit("deleted",this.name,r)))}),t});return this.emit("deleteMany",e.length),r}async deleteAll(){if(!1!==this.config.paranoid)throw new ue("deleteAll() is a dangerous operation and requires paranoid: false option.",{resourceName:this.name,operation:"deleteAll",paranoid:this.config.paranoid,suggestion:"Set paranoid: false to allow deleteAll."});const e=`resource=${this.name}/data`,t=await this.client.deleteAll({prefix:e});return this.emit("deleteAll",{version:this.version,prefix:e,deletedCount:t}),{deletedCount:t,version:this.version}}async deleteAllData(){if(!1!==this.config.paranoid)throw new ue("deleteAllData() is a dangerous operation and requires paranoid: false option.",{resourceName:this.name,operation:"deleteAllData",paranoid:this.config.paranoid,suggestion:"Set paranoid: false to allow deleteAllData."});const e=`resource=${this.name}`,t=await this.client.deleteAll({prefix:e});return this.emit("deleteAllData",{resource:this.name,prefix:e,deletedCount:t}),{deletedCount:t,resource:this.name}}async listIds({partition:e=null,partitionValues:t={},limit:r,offset:i=0}={}){let s;if(e&&Object.keys(t).length>0){if(!this.config.partitions||!this.config.partitions[e])throw new le(`Partition '${e}' not found`,{resourceName:this.name,partitionName:e,operation:"listIds"});const r=this.config.partitions[e],i=[],n=Object.entries(r.fields).sort(([e],[t])=>e.localeCompare(t));for(const[e,r]of n){const s=t[e];if(null!=s){const t=this.applyPartitionRule(s,r);i.push(`${e}=${t}`)}}s=i.length>0?`resource=${this.name}/partition=${e}/${i.join("/")}`:`resource=${this.name}/partition=${e}`}else s=`resource=${this.name}/data`;const n=(await this.client.getKeysPage({prefix:s,offset:i,amount:r||1e3})).map(e=>{const t=e.split("/").find(e=>e.startsWith("id="));return t?t.replace("id=",""):null}).filter(Boolean);return this.emit("listIds",n.length),n}async list({partition:e=null,partitionValues:t={},limit:r,offset:i=0}={}){const[s,n,o]=await I(async()=>e?await this.listPartition({partition:e,partitionValues:t,limit:r,offset:i}):await this.listMain({limit:r,offset:i}));return s?o:this.handleListError(n,{partition:e,partitionValues:t})}async listMain({limit:e,offset:t=0}){const[r,i,s]=await I(()=>this.listIds({limit:e,offset:t}));if(!r)throw i;const n=await this.processListResults(s,"main");return this.emit("list",{count:n.length,errors:0}),n}async listPartition({partition:e,partitionValues:t,limit:r,offset:i=0}){if(!this.config.partitions?.[e])return this.emit("list",{partition:e,partitionValues:t,count:0,errors:0}),[];const s=this.config.partitions[e],n=this.buildPartitionPrefix(e,s,t),[o,a,c]=await I(()=>this.client.getAllKeys({prefix:n}));if(!o)throw a;const u=this.extractIdsFromKeys(c).slice(i),l=r?u.slice(0,r):u,h=await this.processPartitionResults(l,e,s,c);return this.emit("list",{partition:e,partitionValues:t,count:h.length,errors:0}),h}buildPartitionPrefix(e,t,r){const i=[],s=Object.entries(t.fields).sort(([e],[t])=>e.localeCompare(t));for(const[e,t]of s){const s=r[e];if(null!=s){const r=this.applyPartitionRule(s,t);i.push(`${e}=${r}`)}}return i.length>0?`resource=${this.name}/partition=${e}/${i.join("/")}`:`resource=${this.name}/partition=${e}`}extractIdsFromKeys(e){return e.map(e=>{const t=e.split("/").find(e=>e.startsWith("id="));return t?t.replace("id=",""):null}).filter(Boolean)}async processListResults(e,t="main"){const{results:r,errors:i}=await c.PromisePool.for(e).withConcurrency(this.parallelism).handleError(async(e,t)=>{this.emit("error",e,content),this.observers.map(t=>t.emit("error",this.name,e,content))}).process(async e=>{const[r,i,s]=await I(()=>this.get(e));return r?s:this.handleResourceError(i,e,t)});return this.emit("list",{count:r.length,errors:0}),r}async processPartitionResults(e,t,r,i){const s=Object.entries(r.fields).sort(([e],[t])=>e.localeCompare(t)),{results:n,errors:o}=await c.PromisePool.for(e).withConcurrency(this.parallelism).handleError(async(e,t)=>{this.emit("error",e,content),this.observers.map(t=>t.emit("error",this.name,e,content))}).process(async e=>{const[r,n,o]=await I(async()=>{const r=this.extractPartitionValuesFromKey(e,i,s);return await this.getFromPartition({id:e,partitionName:t,partitionValues:r})});return r?o:this.handleResourceError(n,e,"partition")});return n.filter(e=>null!==e)}extractPartitionValuesFromKey(e,t,r){const i=t.find(t=>t.includes(`id=${e}`));if(!i)throw new le(`Partition key not found for ID ${e}`,{resourceName:this.name,id:e,operation:"extractPartitionValuesFromKey"});const s=i.split("/"),n={};for(const[e]of r){const t=s.find(t=>t.startsWith(`${e}=`));if(t){const r=t.replace(`${e}=`,"");n[e]=r}}return n}handleResourceError(e,t,r){if(e.message.includes("Cipher job failed")||e.message.includes("OperationError"))return{id:t,_decryptionFailed:!0,_error:e.message,..."partition"===r&&{_partition:r}};throw e}handleListError(e,{partition:t,partitionValues:r}){return e.message.includes("Partition '")&&e.message.includes("' not found"),this.emit("list",{partition:t,partitionValues:r,count:0,errors:1}),[]}async getMany(e){const{results:t,errors:r}=await c.PromisePool.for(e).withConcurrency(this.client.parallelism).handleError(async(e,t)=>(this.emit("error",e,content),this.observers.map(t=>t.emit("error",this.name,e,content)),{id:t,_error:e.message,_decryptionFailed:e.message.includes("Cipher job failed")||e.message.includes("OperationError")})).process(async e=>{const[t,r,i]=await I(()=>this.get(e));if(t)return i;if(r.message.includes("Cipher job failed")||r.message.includes("OperationError"))return{id:e,_decryptionFailed:!0,_error:r.message};throw r});return this.emit("getMany",e.length),t}async getAll(){const[e,t,r]=await I(()=>this.listIds());if(!e)throw t;const i=[];for(const e of r){const[t,r,s]=await I(()=>this.get(e));t&&i.push(s)}return i}async page({offset:e=0,size:t=100,partition:r=null,partitionValues:i={},skipCount:s=!1}={}){const[n,o,a]=await I(async()=>{let n=null,o=null;if(!s){const[e,s,a]=await I(()=>this.count({partition:r,partitionValues:i}));e?(n=a,o=Math.ceil(n/t)):(n=null,o=null)}const a=Math.floor(e/t);let c=[];if(t<=0)c=[];else{const[s,n,o]=await I(()=>this.list({partition:r,partitionValues:i,limit:t,offset:e}));c=s?o:[]}const u={items:c,totalItems:n,page:a,pageSize:t,totalPages:o,hasMore:c.length===t&&e+t<(n||1/0),_debug:{requestedSize:t,requestedOffset:e,actualItemsReturned:c.length,skipCount:s,hasTotalItems:null!==n}};return this.emit("page",u),u});return n?a:{items:[],totalItems:null,page:Math.floor(e/t),pageSize:t,totalPages:null,_debug:{requestedSize:t,requestedOffset:e,actualItemsReturned:0,skipCount:s,hasTotalItems:!1,error:o.message}}}readable(){return new Ai({resource:this}).build()}writable(){return new Ii({resource:this}).build()}async setContent({id:e,buffer:t,contentType:r="application/octet-stream"}){const[i,s,n]=await I(()=>this.get(e));if(!i||!n)throw new ue(`Resource with id '${e}' not found`,{resourceName:this.name,id:e,operation:"setContent"});const o={...n,_hasContent:!0,_contentLength:t.length,_mimeType:r},a=await this.schema.mapper(o),[c,u]=await I(()=>this.client.putObject({key:this.getResourceKey(e),metadata:a,body:t,contentType:r}));if(!c)throw u;return this.emit("setContent",{id:e,contentType:r,contentLength:t.length}),o}async content(e){const t=this.getResourceKey(e),[r,i,s]=await I(()=>this.client.getObject(t));if(!r){if("NoSuchKey"===i.name)return{buffer:null,contentType:null};throw i}const n=Buffer.from(await s.Body.transformToByteArray()),o=s.ContentType||null;return this.emit("content",e,n.length,o),{buffer:n,contentType:o}}async hasContent(e){const t=this.getResourceKey(e),[r,i,s]=await I(()=>this.client.headObject(t));return!!r&&s.ContentLength>0}async deleteContent(e){const t=this.getResourceKey(e),[r,i,s]=await I(()=>this.client.headObject(t));if(!r)throw i;const n=s.Metadata||{},[o,a,c]=await I(()=>this.client.putObject({key:t,body:"",metadata:n}));if(!o)throw a;return this.emit("deleteContent",e),c}getDefinitionHash(){const e={attributes:this.attributes,behavior:this.behavior},t=a(e);return`sha256:${o.createHash("sha256").update(t).digest("hex")}`}extractVersionFromKey(e){const t=e.split("/").find(e=>e.startsWith("v="));return t?t.replace("v=",""):null}async getSchemaForVersion(e){if(e===this.version)return this.schema;const[t,r,i]=await I(()=>Promise.resolve(new Ze({name:this.name,attributes:this.attributes,passphrase:this.passphrase,version:e,options:{...this.config,autoDecrypt:!0,autoEncrypt:!0}})));return t?i:this.schema}async createPartitionReferences(e){const t=this.config.partitions;if(t&&0!==Object.keys(t).length)for(const[r,i]of Object.entries(t)){const t=this.getPartitionKey({partitionName:r,id:e.id,data:e});if(t){const e={_v:String(this.version)};await this.client.putObject({key:t,metadata:e,body:"",contentType:void 0})}}}async deletePartitionReferences(e){const t=this.config.partitions;if(!t||0===Object.keys(t).length)return;const r=[];for(const[i,s]of Object.entries(t)){const t=this.getPartitionKey({partitionName:i,id:e.id,data:e});t&&r.push(t)}if(r.length>0){const[e,t]=await I(()=>this.client.deleteObjects(r))}}async query(e={},{limit:t=100,offset:r=0,partition:i=null,partitionValues:s={}}={}){if(0===Object.keys(e).length)return await this.list({partition:i,partitionValues:s,limit:t,offset:r});const n=[];let o=r;const a=Math.min(t,50);for(;n.length<t;){const t=await this.list({partition:i,partitionValues:s,limit:a,offset:o});if(0===t.length)break;const r=t.filter(t=>Object.entries(e).every(([e,r])=>t[e]===r));if(n.push(...r),o+=a,t.length<a)break}return n.slice(0,t)}async handlePartitionReferenceUpdates(e,t){const r=this.config.partitions;if(!r||0===Object.keys(r).length)return;for(const[i,s]of Object.entries(r)){const[r,n]=await I(()=>this.handlePartitionReferenceUpdate(i,s,e,t))}const i=t.id||e.id;for(const[e,s]of Object.entries(r)){const r=`resource=${this.name}/partition=${e}`;let s=[];const[n,o,a]=await I(()=>this.client.getAllKeys({prefix:r}));if(!n)continue;s=a;const c=this.getPartitionKey({partitionName:e,id:i,data:t});for(const e of s)if(e.endsWith(`/id=${i}`)&&e!==c){const[t,r]=await I(()=>this.client.deleteObject(e))}}}async handlePartitionReferenceUpdate(e,t,r,i){const s=i.id||r.id,n=this.getPartitionKey({partitionName:e,id:s,data:r}),o=this.getPartitionKey({partitionName:e,id:s,data:i});if(n!==o){if(n){const[e,t]=await I(async()=>{await this.client.deleteObject(n)})}if(o){const[e,t]=await I(async()=>{const e={_v:String(this.version)};await this.client.putObject({key:o,metadata:e,body:"",contentType:void 0})})}}else if(o){const[e,t]=await I(async()=>{const e={_v:String(this.version)};await this.client.putObject({key:o,metadata:e,body:"",contentType:void 0})})}}async updatePartitionReferences(e){const t=this.config.partitions;if(t&&0!==Object.keys(t).length)for(const[r,i]of Object.entries(t)){if(!i||!i.fields||"object"!=typeof i.fields)continue;const t=this.getPartitionKey({partitionName:r,id:e.id,data:e});if(t){const e={_v:String(this.version)},[r,i]=await I(async()=>{await this.client.putObject({key:t,metadata:e,body:"",contentType:void 0})})}}}async getFromPartition({id:e,partitionName:t,partitionValues:r={}}){if(!this.config.partitions||!this.config.partitions[t])throw new le(`Partition '${t}' not found`,{resourceName:this.name,partitionName:t,operation:"getFromPartition"});const i=this.config.partitions[t],s=[],n=Object.entries(i.fields).sort(([e],[t])=>e.localeCompare(t));for(const[e,t]of n){const i=r[e];if(null!=i){const r=this.applyPartitionRule(i,t);s.push(`${e}=${r}`)}}if(0===s.length)throw new le(`No partition values provided for partition '${t}'`,{resourceName:this.name,partitionName:t,operation:"getFromPartition"});const o=Te(`resource=${this.name}`,`partition=${t}`,...s,`id=${e}`),[a,c]=await I(async()=>{await this.client.headObject(o)});if(!a)throw new ue(`Resource with id '${e}' not found in partition '${t}'`,{resourceName:this.name,id:e,partitionName:t,operation:"getFromPartition"});const u=await this.get(e);return u._partition=t,u._partitionValues=r,this.emit("getFromPartition",u),u}async createHistoricalVersion(e,t){const r=Te(`resource=${this.name}`,"historical",`id=${e}`),i={...t,_v:t._v||this.version,_historicalTimestamp:(new Date).toISOString()},s=await this.schema.mapper(i),n=M(this.behavior),{mappedData:o,body:a}=await n.handleInsert({resource:this,data:i,mappedData:s}),c={...o,_v:t._v||this.version,_historicalTimestamp:i._historicalTimestamp};let u;if(a&&""!==a){const[e,t]=await I(()=>Promise.resolve(JSON.parse(a)));e&&(u="application/json")}await this.client.putObject({key:r,metadata:c,body:a,contentType:u})}async applyVersionMapping(e,t,r){if(t===r)return e;return{...e,_v:r,_originalVersion:t,_versionMapped:!0}}async composeFullObjectFromWrite({id:e,metadata:t,body:r,behavior:i}){const s={};t&&"true"===t.$truncated&&(s.$truncated="true"),t&&"true"===t.$overflow&&(s.$overflow="true");let n={};const[o,a,c]=await I(()=>this.schema.unmapper(t));n=o?c:t;const u=e=>{if(!e||"object"!=typeof e)return e;const t={};for(const[r,i]of Object.entries(e))r.startsWith("_")||(t[r]=i);return t},l=e=>{if("object"==typeof e&&null!==e)return e;if("string"==typeof e){if("[object Object]"===e)return{};if(e.startsWith("{")||e.startsWith("[")){const[t,r,i]=D(()=>JSON.parse(e));return t?i:e}return e}return e};if("body-overflow"===i){const i=t&&"true"===t.$overflow;let s={};if(i&&r){const[e,t,i]=await I(()=>Promise.resolve(JSON.parse(r)));if(e){const[e,t,r]=await I(()=>this.schema.unmapper(i));s=e?r:{}}}const o={...n,...s,id:e};Object.keys(o).forEach(e=>{o[e]=l(o[e])});const a=u(o);return i&&(a.$overflow="true"),a}if("body-only"===i){const[i,s,n]=await I(()=>Promise.resolve(r?JSON.parse(r):{}));let o=this.schema.map;if(t&&t._map){const[e,r,i]=await I(()=>Promise.resolve("string"==typeof t._map?JSON.parse(t._map):t._map));o=e?i:this.schema.map}const[a,c,u]=await I(()=>this.schema.unmapper(n,o)),h=a?{...u,id:e}:{id:e};return Object.keys(h).forEach(e=>{h[e]=l(h[e])}),h}const h={...n,id:e};Object.keys(h).forEach(e=>{h[e]=l(h[e])});const d=u(h);return s.$truncated&&(d.$truncated=s.$truncated),s.$overflow&&(d.$overflow=s.$overflow),d}emit(e,...t){return super.emit(e,...t)}async replace(e,t){await this.delete(e),await new Promise(e=>setTimeout(e,100));const r=Date.now();for(;Date.now()-r<5e3;){if(!await this.exists(e))break;await new Promise(e=>setTimeout(e,50))}try{return await this.insert({...t,id:e})}catch(r){if(r&&r.message&&r.message.includes("already exists")){return await this.update(e,t)}throw r}}_initMiddleware(){this._middlewares=new Map,this._middlewareMethods=["get","list","listIds","getAll","count","page","insert","update","delete","deleteMany","exists","getMany"];for(const e of this._middlewareMethods)this._middlewares.set(e,[]),this[`_original_${e}`]||(this[`_original_${e}`]=this[e].bind(this),this[e]=async(...t)=>{const r={resource:this,args:t,method:e};let i=-1;const s=this._middlewares.get(e),n=async t=>{if(t<=i)throw new Error("next() called multiple times");return i=t,t<s.length?await s[t](r,()=>n(t+1)):await this[`_original_${e}`](...r.args)};return await n(0)})}useMiddleware(e,t){if(this._middlewares||this._initMiddleware(),!this._middlewares.has(e))throw new ue(`No such method for middleware: ${e}`,{operation:"useMiddleware",method:e});this._middlewares.get(e).push(t)}applyDefaults(e){const t={...e};for(const[e,r]of Object.entries(this.attributes))if(void 0===t[e]&&"string"==typeof r&&r.includes("default:")){const i=r.match(/default:([^|]+)/);if(i){let s=i[1];r.includes("boolean")?s="true"===s:r.includes("number")&&(s=Number(s)),t[e]=s}}return t}}class Pi extends Oe{constructor(e){super(),this.version="1",this.s3dbVersion=(()=>{const[e,t,r]=I(()=>"7.0.1");return e?r:"latest"})(),this.resources={},this.savedMetadata=null,this.options=e,this.verbose=e.verbose||!1,this.parallelism=parseInt(e.parallelism+"")||10,this.plugins=e.plugins||[],this.pluginList=e.plugins||[],this.cache=e.cache,this.passphrase=e.passphrase||"secret",this.versioningEnabled=e.versioningEnabled||!1;let t=e.connectionString;if(!t&&(e.bucket||e.accessKeyId||e.secretAccessKey)){const{bucket:r,region:i,accessKeyId:s,secretAccessKey:n,endpoint:o,forcePathStyle:a}=e;if(o){const e=new URL(o);s&&(e.username=encodeURIComponent(s)),n&&(e.password=encodeURIComponent(n)),e.pathname=`/${r||"s3db"}`,a&&e.searchParams.set("forcePathStyle","true"),t=e.toString()}else if(s&&n){const e=new URLSearchParams;e.set("region",i||"us-east-1"),a&&e.set("forcePathStyle","true"),t=`s3://${encodeURIComponent(s)}:${encodeURIComponent(n)}@${r||"s3db"}?${e.toString()}`}}this.client=e.client||new We({verbose:this.verbose,parallelism:this.parallelism,connectionString:t}),this.bucket=this.client.bucket,this.keyPrefix=this.client.keyPrefix,this._exitListenerRegistered||(this._exitListenerRegistered=!0,process.on("exit",async()=>{if(this.isConnected())try{await this.disconnect()}catch(e){}}))}async connect(){await this.startPlugins();let e=null;if(await this.client.exists("s3db.json")){const t=await this.client.getObject("s3db.json");e=JSON.parse(await Di(t?.Body))}else e=this.blankMetadataStructure(),await this.uploadMetadataFile();this.savedMetadata=e;const t=this.detectDefinitionChanges(e);for(const[t,r]of Object.entries(e.resources||{})){const e=r.currentVersion||"v0",i=r.versions?.[e];i&&(this.resources[t]=new xi({name:t,client:this.client,database:this,version:e,attributes:i.attributes,behavior:i.behavior||"user-managed",parallelism:this.parallelism,passphrase:this.passphrase,observers:[this],cache:this.cache,timestamps:void 0!==i.timestamps&&i.timestamps,partitions:r.partitions||i.partitions||{},paranoid:void 0===i.paranoid||i.paranoid,allNestedObjectsOptional:void 0===i.allNestedObjectsOptional||i.allNestedObjectsOptional,autoDecrypt:void 0===i.autoDecrypt||i.autoDecrypt,hooks:i.hooks||{},versioningEnabled:this.versioningEnabled,map:i.map}))}t.length>0&&this.emit("resourceDefinitionsChanged",{changes:t,metadata:this.savedMetadata}),this.emit("connected",new Date)}detectDefinitionChanges(e){const t=[];for(const[r,i]of Object.entries(this.resources)){const s=this.generateDefinitionHash(i.export()),n=e.resources?.[r];if(n){const e=n.currentVersion||"v0",i=n.versions?.[e],o=i?.hash;o!==s&&t.push({type:"changed",resourceName:r,currentHash:s,savedHash:o,fromVersion:e,toVersion:this.getNextVersion(n.versions)})}else t.push({type:"new",resourceName:r,currentHash:s,savedHash:null})}for(const[r,i]of Object.entries(e.resources||{}))if(!this.resources[r]){const e=i.currentVersion||"v0",s=i.versions?.[e];t.push({type:"deleted",resourceName:r,currentHash:null,savedHash:s?.hash,deletedVersion:e})}return t}generateDefinitionHash(e,t=void 0){const r={...e.attributes};e.timestamps&&(delete r.createdAt,delete r.updatedAt);const i={attributes:r,behavior:t||e.behavior||"user-managed",partitions:e.partitions||{}},s=a(i);return`sha256:${o.createHash("sha256").update(s).digest("hex")}`}getNextVersion(e={}){const t=Object.keys(e).filter(e=>e.startsWith("v")).map(e=>parseInt(e.substring(1))).filter(e=>!isNaN(e));return`v${(t.length>0?Math.max(...t):-1)+1}`}async startPlugins(){const e=this;if(!n.isEmpty(this.pluginList)){const t=this.pluginList.map(e=>n.isFunction(e)?new e(this):e),r=t.map(async t=>{t.beforeSetup&&await t.beforeSetup(),await t.setup(e),t.afterSetup&&await t.afterSetup()});await Promise.all(r);const i=t.map(async e=>{e.beforeStart&&await e.beforeStart(),await e.start(),e.afterStart&&await e.afterStart()});await Promise.all(i)}}async usePlugin(e,t=null){const r=t||e.constructor.name.replace("Plugin","").toLowerCase();return this.plugins[r]=e,this.isConnected()&&(await e.setup(this),await e.start()),e}async uploadMetadataFile(){const e={version:this.version,s3dbVersion:this.s3dbVersion,lastUpdated:(new Date).toISOString(),resources:{}};Object.entries(this.resources).forEach(([t,r])=>{const i=r.export(),s=this.generateDefinitionHash(i),n=this.savedMetadata?.resources?.[t],o=n?.currentVersion||"v0",a=n?.versions?.[o];let c,u;a&&a.hash===s?(c=o,u=!1):(c=this.getNextVersion(n?.versions),u=!0),e.resources[t]={currentVersion:c,partitions:r.config.partitions||{},versions:{...n?.versions,[c]:{hash:s,attributes:i.attributes,behavior:i.behavior||"user-managed",timestamps:r.config.timestamps,partitions:r.config.partitions,paranoid:r.config.paranoid,allNestedObjectsOptional:r.config.allNestedObjectsOptional,autoDecrypt:r.config.autoDecrypt,cache:r.config.cache,hooks:r.config.hooks,createdAt:u?(new Date).toISOString():a?.createdAt}}},r.version!==c&&(r.version=c,r.emit("versionUpdated",{oldVersion:o,newVersion:c}))}),await this.client.putObject({key:"s3db.json",body:JSON.stringify(e,null,2),contentType:"application/json"}),this.savedMetadata=e,this.emit("metadataUploaded",e)}blankMetadataStructure(){return{version:"1",s3dbVersion:this.s3dbVersion,resources:{}}}resourceExists(e){return!!this.resources[e]}resourceExistsWithSameHash({name:e,attributes:t,behavior:r="user-managed",partitions:i={},options:s={}}){if(!this.resources[e])return{exists:!1,sameHash:!1,hash:null};const n=this.resources[e],o=this.generateDefinitionHash(n.export()),a=new xi({name:e,attributes:t,behavior:r,partitions:i,client:this.client,version:n.version,passphrase:this.passphrase,versioningEnabled:this.versioningEnabled,...s}),c=this.generateDefinitionHash(a.export());return{exists:!0,sameHash:o===c,hash:c,existingHash:o}}async createResource({name:e,attributes:t,behavior:r="user-managed",hooks:i,...s}){if(this.resources[e]){const n=this.resources[e];if(Object.assign(n.config,{cache:this.cache,...s}),r&&(n.behavior=r),n.versioningEnabled=this.versioningEnabled,n.updateAttributes(t),i)for(const[e,t]of Object.entries(i))if(Array.isArray(t)&&n.hooks[e])for(const r of t)"function"==typeof r&&n.hooks[e].push(r.bind(n));const o=this.generateDefinitionHash(n.export(),n.behavior),a=this.savedMetadata?.resources?.[e],c=a?.currentVersion||"v0",u=a?.versions?.[c];return u&&u.hash===o||await this.uploadMetadataFile(),this.emit("s3db.resourceUpdated",e),n}const n=this.savedMetadata?.resources?.[e],o=n?.currentVersion||"v0",a=new xi({name:e,client:this.client,version:void 0!==s.version?s.version:o,attributes:t,behavior:r,parallelism:this.parallelism,passphrase:void 0!==s.passphrase?s.passphrase:this.passphrase,observers:[this],cache:void 0!==s.cache?s.cache:this.cache,timestamps:void 0!==s.timestamps&&s.timestamps,partitions:s.partitions||{},paranoid:void 0===s.paranoid||s.paranoid,allNestedObjectsOptional:void 0===s.allNestedObjectsOptional||s.allNestedObjectsOptional,autoDecrypt:void 0===s.autoDecrypt||s.autoDecrypt,hooks:i||{},versioningEnabled:this.versioningEnabled,map:s.map,idGenerator:s.idGenerator,idSize:s.idSize});return a.database=this,this.resources[e]=a,await this.uploadMetadataFile(),this.emit("s3db.resourceCreated",e),a}resource(e){return this.resources[e]?this.resources[e]:Promise.reject(`resource ${e} does not exist`)}async listResources(){return Object.keys(this.resources).map(e=>({name:e}))}async getResource(e){if(!this.resources[e])throw new Q({bucket:this.client.config.bucket,resourceName:e,id:e});return this.resources[e]}get config(){return{version:this.version,s3dbVersion:this.s3dbVersion,bucket:this.bucket,keyPrefix:this.keyPrefix,parallelism:this.parallelism,verbose:this.verbose}}isConnected(){return!!this.savedMetadata}async disconnect(){try{if(this.pluginList&&this.pluginList.length>0){for(const e of this.pluginList)e&&"function"==typeof e.removeAllListeners&&e.removeAllListeners();const e=this.pluginList.map(async e=>{try{e&&"function"==typeof e.stop&&await e.stop()}catch(e){}});await Promise.all(e)}if(this.resources&&Object.keys(this.resources).length>0){for(const[e,t]of Object.entries(this.resources))try{t&&"function"==typeof t.removeAllListeners&&t.removeAllListeners(),t._pluginWrappers&&t._pluginWrappers.clear(),t._pluginMiddlewares&&(t._pluginMiddlewares={}),t.observers&&Array.isArray(t.observers)&&(t.observers=[])}catch(e){}Object.keys(this.resources).forEach(e=>delete this.resources[e])}this.client&&"function"==typeof this.client.removeAllListeners&&this.client.removeAllListeners(),this.removeAllListeners(),this.savedMetadata=null,this.plugins={},this.pluginList=[],this.emit("disconnected",new Date)}catch(e){}}}class Ci extends Pi{}function Ti(e){return"string"==typeof e?e.trim().toLowerCase():e}const Li={s3db:class extends ze{constructor(e={},t=[],r=null){super(e),this.instanceId=Math.random().toString(36).slice(2,10),this.client=r,this.connectionString=e.connectionString;let i=t;if(t)if(Array.isArray(t)){i={};for(const e of t)"string"==typeof e&&(i[Ti(e)]=e)}else"string"==typeof t&&(i[Ti(t)]=t);else i={};this.resourcesMap=this._normalizeResources(i)}_normalizeResources(e){if(!e)return{};if(Array.isArray(e)){const t={};for(const r of e)"string"==typeof r?t[Ti(r)]=r:Array.isArray(r)&&"string"==typeof r[0]?t[Ti(r[0])]=r:"object"==typeof r&&r.resource&&(t[Ti(r.resource)]={...r});return t}if("object"==typeof e){const t={};for(const[r,i]of Object.entries(e)){const e=Ti(r);"string"==typeof i?t[e]=i:Array.isArray(i)?t[e]=i.map(e=>"string"==typeof e||"function"==typeof e?e:"object"==typeof e&&e.resource?{...e}:e):"function"==typeof i?t[e]=i:"object"==typeof i&&i.resource&&(t[e]={...i})}return t}if("function"==typeof e)return e;if("string"==typeof e){return{[Ti(e)]:e}}return{}}validateConfig(){const e=[];return this.client||this.connectionString||e.push("You must provide a client or a connectionString"),(!this.resourcesMap||"object"==typeof this.resourcesMap&&0===Object.keys(this.resourcesMap).length)&&e.push("You must provide a resources map or array"),{isValid:0===e.length,errors:e}}async initialize(e){try{if(await super.initialize(e),this.client)this.targetDatabase=this.client;else{if(!this.connectionString)throw new Error("S3dbReplicator: No client or connectionString provided");{const e={connectionString:this.connectionString,region:this.region,keyPrefix:this.keyPrefix,verbose:this.config.verbose||!1};this.targetDatabase=new Ci(e),await this.targetDatabase.connect()}}this.emit("connected",{replicator:this.name,target:this.connectionString||"client-provided"})}catch(e){throw e}}async replicate({resource:e,operation:t,data:r,id:i}){const s=Ti(e),n=this._resolveDestResource(s,r),o=this._getDestResourceObj(n),a=this._applyTransformer(s,r);let c;if("insert"===t)c=await o.insert(a);else if("update"===t)c=await o.update(i,a);else{if("delete"!==t)throw new Error(`Invalid operation: ${t}. Supported operations are: insert, update, delete`);c=await o.delete(i)}return c}_applyTransformer(e,t){const r=Ti(e),i=this.resourcesMap[r];let s;return i?(Array.isArray(i)&&"function"==typeof i[1]?s=i[1](t):"function"==typeof i?s=i(t):"object"==typeof i?"function"==typeof i.transform?s=i.transform(t):"function"==typeof i.transformer&&(s=i.transformer(t)):s=t,s&&t&&t.id&&!s.id&&(s.id=t.id),!s&&t&&(s=t),s):t}_resolveDestResource(e,t){const r=Ti(e),i=this.resourcesMap[r];if(!i)return e;if(Array.isArray(i)){if("string"==typeof i[0])return i[0];if("object"==typeof i[0]&&i[0].resource)return i[0].resource;if("function"==typeof i[0])return e}return"string"==typeof i?i:"function"==typeof i?e:"object"==typeof i&&i.resource?i.resource:e}_getDestResourceObj(e){if(!this.client||!this.client.resources)return null;const t=Object.keys(this.client.resources),r=Ti(e),i=t.find(e=>Ti(e)===r);if(!i)throw new Error(`[S3dbReplicator] Destination resource not found: ${e}. Available: ${t.join(", ")}`);return this.client.resources[i]}async replicateBatch(e,t){if(!this.enabled||!this.shouldReplicateResource(e))return{skipped:!0,reason:"resource_not_included"};const r=[],i=[];for(const s of t){const[t,n,o]=await I(()=>this.replicate({resource:e,operation:s.operation,id:s.id,data:s.data,beforeData:s.beforeData}));t?r.push(o):i.push({id:s.id,error:n.message})}return this.emit("batch_replicated",{replicator:this.name,resourceName:e,total:t.length,successful:r.length,errors:i.length}),{success:0===i.length,results:r,errors:i,total:t.length}}async testConnection(){const[e,t]=await I(async()=>(this.targetDatabase||await this.initialize(this.database),await this.targetDatabase.listResources(),!0));return!!e||(this.emit("connection_error",{replicator:this.name,error:t.message}),!1)}async getStatus(){return{...await super.getStatus(),connected:!!this.targetDatabase,targetDatabase:this.connectionString||"client-provided",resources:Object.keys(this.resourcesMap||{}),totalreplicators:this.listenerCount("replicated"),totalErrors:this.listenerCount("replicator_error")}}async cleanup(){this.targetDatabase&&this.targetDatabase.removeAllListeners(),await super.cleanup()}shouldReplicateResource(e,t){const r=Ti(e),i=this.resourcesMap[r];if(!i)return!1;if(!t)return!0;if(Array.isArray(i)){for(const e of i)if("object"==typeof e&&e.resource){if(!e.actions||!Array.isArray(e.actions))return!0;if(e.actions.includes(t))return!0}else if("string"==typeof e||"function"==typeof e)return!0;return!1}return"object"==typeof i&&i.resource?!i.actions||!Array.isArray(i.actions)||i.actions.includes(t):"string"==typeof i||"function"==typeof i}},sqs:class extends ze{constructor(e={},t=[],r=null){if(super(e),this.resources=t,this.client=r,this.queueUrl=e.queueUrl,this.queues=e.queues||{},this.defaultQueue=e.defaultQueue||e.defaultQueueUrl||e.queueUrlDefault,this.region=e.region||"us-east-1",this.sqsClient=r||null,this.messageGroupId=e.messageGroupId,this.deduplicationId=e.deduplicationId,t&&"object"==typeof t)for(const[e,r]of Object.entries(t))r.queueUrl&&(this.queues[e]=r.queueUrl)}validateConfig(){const e=[];return this.queueUrl||0!==Object.keys(this.queues).length||this.defaultQueue||this.resourceQueueMap||e.push("Either queueUrl, queues object, defaultQueue, or resourceQueueMap must be provided"),{isValid:0===e.length,errors:e}}getQueueUrlsForResource(e){if(this.resourceQueueMap&&this.resourceQueueMap[e])return this.resourceQueueMap[e];if(this.queues[e])return[this.queues[e]];if(this.queueUrl)return[this.queueUrl];if(this.defaultQueue)return[this.defaultQueue];throw new Error(`No queue URL found for resource '${e}'`)}_applyTransformer(e,t){const r=this.resources[e];let i=t;return r?("function"==typeof r.transform?i=r.transform(t):"function"==typeof r.transformer&&(i=r.transformer(t)),i||t):t}createMessage(e,t,r,i,s=null){const n={resource:e,action:t,timestamp:(new Date).toISOString(),source:"s3db-replicator"};switch(t){case"insert":case"delete":default:return{...n,data:r};case"update":return{...n,before:s,data:r}}}async initialize(e,t){if(await super.initialize(e),!this.sqsClient){const[e,r,i]=await I(()=>import("@aws-sdk/client-sqs"));if(!e)throw this.emit("initialization_error",{replicator:this.name,error:r.message}),r;const{SQSClient:s}=i;this.sqsClient=t||new s({region:this.region,credentials:this.config.credentials}),this.emit("initialized",{replicator:this.name,queueUrl:this.queueUrl,queues:this.queues,defaultQueue:this.defaultQueue})}}async replicate(e,t,r,i,s=null){if(!this.enabled||!this.shouldReplicateResource(e))return{skipped:!0,reason:"resource_not_included"};const[n,o,a]=await I(async()=>{const{SendMessageCommand:n}=await import("@aws-sdk/client-sqs"),o=this.getQueueUrlsForResource(e),a=this._applyTransformer(e,r),c=this.createMessage(e,t,a,i,s),u=[];for(const r of o){const s=new n({QueueUrl:r,MessageBody:JSON.stringify(c),MessageGroupId:this.messageGroupId,MessageDeduplicationId:this.deduplicationId?`${e}:${t}:${i}`:void 0}),o=await this.sqsClient.send(s);u.push({queueUrl:r,messageId:o.MessageId}),this.emit("replicated",{replicator:this.name,resource:e,operation:t,id:i,queueUrl:r,messageId:o.MessageId,success:!0})}return{success:!0,results:u}});return n?a:(this.emit("replicator_error",{replicator:this.name,resource:e,operation:t,id:i,error:o.message}),{success:!1,error:o.message})}async replicateBatch(e,t){if(!this.enabled||!this.shouldReplicateResource(e))return{skipped:!0,reason:"resource_not_included"};const[r,i,s]=await I(async()=>{const{SendMessageBatchCommand:r}=await import("@aws-sdk/client-sqs"),i=this.getQueueUrlsForResource(e),s=[];for(let e=0;e<t.length;e+=10)s.push(t.slice(e,e+10));const n=[],o=[];for(const t of s){const[s,a]=await I(async()=>{const s=t.map((t,r)=>({Id:`${t.id}-${r}`,MessageBody:JSON.stringify(this.createMessage(e,t.operation,t.data,t.id,t.beforeData)),MessageGroupId:this.messageGroupId,MessageDeduplicationId:this.deduplicationId?`${e}:${t.operation}:${t.id}`:void 0})),o=new r({QueueUrl:i[0],Entries:s}),a=await this.sqsClient.send(o);n.push(a)});if(!s&&(o.push({batch:t.length,error:a.message}),a.message&&(a.message.includes("Batch error")||a.message.includes("Connection")||a.message.includes("Network"))))throw a}return this.emit("batch_replicated",{replicator:this.name,resource:e,queueUrl:i[0],total:t.length,successful:n.length,errors:o.length}),{success:0===o.length,results:n,errors:o,total:t.length,queueUrl:i[0]}});if(r)return s;const n=i?.message||i||"Unknown error";return this.emit("batch_replicator_error",{replicator:this.name,resource:e,error:n}),{success:!1,error:n}}async testConnection(){const[e,t]=await I(async()=>{this.sqsClient||await this.initialize(this.database);const{GetQueueAttributesCommand:e}=await import("@aws-sdk/client-sqs"),t=new e({QueueUrl:this.queueUrl,AttributeNames:["QueueArn"]});return await this.sqsClient.send(t),!0});return!!e||(this.emit("connection_error",{replicator:this.name,error:t.message}),!1)}async getStatus(){return{...await super.getStatus(),connected:!!this.sqsClient,queueUrl:this.queueUrl,region:this.region,resources:this.resources,totalreplicators:this.listenerCount("replicated"),totalErrors:this.listenerCount("replicator_error")}}async cleanup(){this.sqsClient&&this.sqsClient.destroy(),await super.cleanup()}shouldReplicateResource(e){return this.resourceQueueMap&&Object.keys(this.resourceQueueMap).includes(e)||this.queues&&Object.keys(this.queues).includes(e)||!(!this.defaultQueue&&!this.queueUrl)||this.resources&&Object.keys(this.resources).includes(e)||!1}},bigquery:class extends ze{constructor(e={},t={}){super(e),this.projectId=e.projectId,this.datasetId=e.datasetId,this.bigqueryClient=null,this.credentials=e.credentials,this.location=e.location||"US",this.logTable=e.logTable,this.resources=this.parseResourcesConfig(t)}parseResourcesConfig(e){const t={};for(const[r,i]of Object.entries(e))"string"==typeof i?t[r]=[{table:i,actions:["insert"]}]:Array.isArray(i)?t[r]=i.map(e=>"string"==typeof e?{table:e,actions:["insert"]}:{table:e.table,actions:e.actions||["insert"]}):"object"==typeof i&&(t[r]=[{table:i.table,actions:i.actions||["insert"]}]);return t}validateConfig(){const e=[];this.projectId||e.push("projectId is required"),this.datasetId||e.push("datasetId is required"),0===Object.keys(this.resources).length&&e.push("At least one resource must be configured");for(const[t,r]of Object.entries(this.resources))for(const i of r){i.table||e.push(`Table name is required for resource '${t}'`),Array.isArray(i.actions)&&0!==i.actions.length||e.push(`Actions array is required for resource '${t}'`);const r=["insert","update","delete"],s=i.actions.filter(e=>!r.includes(e));s.length>0&&e.push(`Invalid actions for resource '${t}': ${s.join(", ")}. Valid actions: ${r.join(", ")}`)}return{isValid:0===e.length,errors:e}}async initialize(e){await super.initialize(e);const[t,r,i]=await I(()=>import("@google-cloud/bigquery"));if(!t)throw this.emit("initialization_error",{replicator:this.name,error:r.message}),r;const{BigQuery:s}=i;this.bigqueryClient=new s({projectId:this.projectId,credentials:this.credentials,location:this.location}),this.emit("initialized",{replicator:this.name,projectId:this.projectId,datasetId:this.datasetId,resources:Object.keys(this.resources)})}shouldReplicateResource(e){return this.resources.hasOwnProperty(e)}shouldReplicateAction(e,t){return!!this.resources[e]&&this.resources[e].some(e=>e.actions.includes(t))}getTablesForResource(e,t){return this.resources[e]?this.resources[e].filter(e=>e.actions.includes(t)).map(e=>e.table):[]}async replicate(e,t,r,i,s=null){if(!this.enabled||!this.shouldReplicateResource(e))return{skipped:!0,reason:"resource_not_included"};if(!this.shouldReplicateAction(e,t))return{skipped:!0,reason:"action_not_included"};const n=this.getTablesForResource(e,t);if(0===n.length)return{skipped:!0,reason:"no_tables_for_action"};const o=[],a=[],[c,u,l]=await I(async()=>{const s=this.bigqueryClient.dataset(this.datasetId);for(const e of n){const[n,c]=await I(async()=>{const n=s.table(e);let a;if("insert"===t){const e={...r};a=await n.insert([e])}else if("update"===t){const t=Object.keys(r).filter(e=>"id"!==e),s=t.map(e=>`${e}=@${e}`).join(", "),n={id:i};t.forEach(e=>{n[e]=r[e]});const o=`UPDATE \`${this.projectId}.${this.datasetId}.${e}\` SET ${s} WHERE id=@id`,[c]=await this.bigqueryClient.createQueryJob({query:o,params:n});await c.getQueryResults(),a=[c]}else{if("delete"!==t)throw new Error(`Unsupported operation: ${t}`);{const t=`DELETE FROM \`${this.projectId}.${this.datasetId}.${e}\` WHERE id=@id`,[r]=await this.bigqueryClient.createQueryJob({query:t,params:{id:i}});await r.getQueryResults(),a=[r]}}o.push({table:e,success:!0,jobId:a[0]?.id})});n||a.push({table:e,error:c.message})}if(this.logTable){const[n,o]=await I(async()=>{const n=s.table(this.logTable);await n.insert([{resource_name:e,operation:t,record_id:i,data:JSON.stringify(r),timestamp:(new Date).toISOString(),source:"s3db-replicator"}])})}const c=0===a.length;return this.emit("replicated",{replicator:this.name,resourceName:e,operation:t,id:i,tables:n,results:o,errors:a,success:c}),{success:c,results:o,errors:a,tables:n}});return c?l:(this.emit("replicator_error",{replicator:this.name,resourceName:e,operation:t,id:i,error:u.message}),{success:!1,error:u.message})}async replicateBatch(e,t){const r=[],i=[];for(const s of t){const[t,n,o]=await I(()=>this.replicate(e,s.operation,s.data,s.id,s.beforeData));t?r.push(o):i.push({id:s.id,error:n.message})}return{success:0===i.length,results:r,errors:i}}async testConnection(){const[e,t]=await I(async()=>{this.bigqueryClient||await this.initialize();const e=this.bigqueryClient.dataset(this.datasetId);return await e.getMetadata(),!0});return!!e||(this.emit("connection_error",{replicator:this.name,error:t.message}),!1)}async cleanup(){}getStatus(){return{...super.getStatus(),projectId:this.projectId,datasetId:this.datasetId,resources:this.resources,logTable:this.logTable}}},postgres:class extends ze{constructor(e={},t={}){super(e),this.connectionString=e.connectionString,this.host=e.host,this.port=e.port||5432,this.database=e.database,this.user=e.user,this.password=e.password,this.client=null,this.ssl=e.ssl,this.logTable=e.logTable,this.resources=this.parseResourcesConfig(t)}parseResourcesConfig(e){const t={};for(const[r,i]of Object.entries(e))"string"==typeof i?t[r]=[{table:i,actions:["insert"]}]:Array.isArray(i)?t[r]=i.map(e=>"string"==typeof e?{table:e,actions:["insert"]}:{table:e.table,actions:e.actions||["insert"]}):"object"==typeof i&&(t[r]=[{table:i.table,actions:i.actions||["insert"]}]);return t}validateConfig(){const e=[];this.connectionString||this.host&&this.database||e.push("Either connectionString or host+database must be provided"),0===Object.keys(this.resources).length&&e.push("At least one resource must be configured");for(const[t,r]of Object.entries(this.resources))for(const i of r){i.table||e.push(`Table name is required for resource '${t}'`),Array.isArray(i.actions)&&0!==i.actions.length||e.push(`Actions array is required for resource '${t}'`);const r=["insert","update","delete"],s=i.actions.filter(e=>!r.includes(e));s.length>0&&e.push(`Invalid actions for resource '${t}': ${s.join(", ")}. Valid actions: ${r.join(", ")}`)}return{isValid:0===e.length,errors:e}}async initialize(e){await super.initialize(e);const[t,r,i]=await I(()=>import("pg"));if(!t)throw this.emit("initialization_error",{replicator:this.name,error:r.message}),r;const{Client:s}=i,n=this.connectionString?{connectionString:this.connectionString,ssl:this.ssl}:{host:this.host,port:this.port,database:this.database,user:this.user,password:this.password,ssl:this.ssl};this.client=new s(n),await this.client.connect(),this.logTable&&await this.createLogTableIfNotExists(),this.emit("initialized",{replicator:this.name,database:this.database||"postgres",resources:Object.keys(this.resources)})}async createLogTableIfNotExists(){const e=`\n CREATE TABLE IF NOT EXISTS ${this.logTable} (\n id SERIAL PRIMARY KEY,\n resource_name VARCHAR(255) NOT NULL,\n operation VARCHAR(50) NOT NULL,\n record_id VARCHAR(255) NOT NULL,\n data JSONB,\n timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n source VARCHAR(100) DEFAULT 's3db-replicator',\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n );\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_resource_name ON ${this.logTable}(resource_name);\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_operation ON ${this.logTable}(operation);\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_record_id ON ${this.logTable}(record_id);\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_timestamp ON ${this.logTable}(timestamp);\n `;await this.client.query(e)}shouldReplicateResource(e){return this.resources.hasOwnProperty(e)}shouldReplicateAction(e,t){return!!this.resources[e]&&this.resources[e].some(e=>e.actions.includes(t))}getTablesForResource(e,t){return this.resources[e]?this.resources[e].filter(e=>e.actions.includes(t)).map(e=>e.table):[]}async replicate(e,t,r,i,s=null){if(!this.enabled||!this.shouldReplicateResource(e))return{skipped:!0,reason:"resource_not_included"};if(!this.shouldReplicateAction(e,t))return{skipped:!0,reason:"action_not_included"};const n=this.getTablesForResource(e,t);if(0===n.length)return{skipped:!0,reason:"no_tables_for_action"};const o=[],a=[],[c,u,l]=await I(async()=>{for(const e of n){const[s,n]=await I(async()=>{let s;if("insert"===t){const t=Object.keys(r),i=t.map(e=>r[e]),n=t.map(e=>`"${e}"`).join(", "),o=t.map((e,t)=>`$${t+1}`).join(", "),a=`INSERT INTO ${e} (${n}) VALUES (${o}) ON CONFLICT (id) DO NOTHING RETURNING *`;s=await this.client.query(a,i)}else if("update"===t){const t=Object.keys(r).filter(e=>"id"!==e),n=t.map((e,t)=>`"${e}"=$${t+1}`).join(", "),o=t.map(e=>r[e]);o.push(i);const a=`UPDATE ${e} SET ${n} WHERE id=$${t.length+1} RETURNING *`;s=await this.client.query(a,o)}else{if("delete"!==t)throw new Error(`Unsupported operation: ${t}`);{const t=`DELETE FROM ${e} WHERE id=$1 RETURNING *`;s=await this.client.query(t,[i])}}o.push({table:e,success:!0,rows:s.rows,rowCount:s.rowCount})});s||a.push({table:e,error:n.message})}if(this.logTable){const[s,n]=await I(async()=>{await this.client.query(`INSERT INTO ${this.logTable} (resource_name, operation, record_id, data, timestamp, source) VALUES ($1, $2, $3, $4, $5, $6)`,[e,t,i,JSON.stringify(r),(new Date).toISOString(),"s3db-replicator"])})}const s=0===a.length;return this.emit("replicated",{replicator:this.name,resourceName:e,operation:t,id:i,tables:n,results:o,errors:a,success:s}),{success:s,results:o,errors:a,tables:n}});return c?l:(this.emit("replicator_error",{replicator:this.name,resourceName:e,operation:t,id:i,error:u.message}),{success:!1,error:u.message})}async replicateBatch(e,t){const r=[],i=[];for(const s of t){const[t,n,o]=await I(()=>this.replicate(e,s.operation,s.data,s.id,s.beforeData));t?r.push(o):i.push({id:s.id,error:n.message})}return{success:0===i.length,results:r,errors:i}}async testConnection(){const[e,t]=await I(async()=>(this.client||await this.initialize(),await this.client.query("SELECT 1"),!0));return!!e||(this.emit("connection_error",{replicator:this.name,error:t.message}),!1)}async cleanup(){this.client&&await this.client.end()}getStatus(){return{...super.getStatus(),database:this.database||"postgres",resources:this.resources,logTable:this.logTable}}}};function $i(e,t={},r=[],i=null){const s=Li[e];if(!s)throw new Error(`Unknown replicator driver: ${e}. Available drivers: ${Object.keys(Li).join(", ")}`);return new s(t,r,i)}function Mi(e){return"string"==typeof e?e.trim().toLowerCase():e}return e.AVAILABLE_BEHAVIORS=U,e.AuditPlugin=class extends Ee{constructor(e={}){super(e),this.auditResource=null,this.config={includeData:!1!==e.includeData,includePartitions:!1!==e.includePartitions,maxDataSize:e.maxDataSize||1e4,...e}}async onSetup(){const[e,t,r]=await I(()=>this.database.createResource({name:"audits",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",recordId:"string|required",userId:"string|optional",timestamp:"string|required",oldData:"string|optional",newData:"string|optional",partition:"string|optional",partitionValues:"string|optional",metadata:"string|optional"},behavior:"body-overflow"}));this.auditResource=e?r:this.database.resources.audits||null,(e||this.auditResource)&&(this.installDatabaseProxy(),this.installEventListeners())}async onStart(){}async onStop(){}installDatabaseProxy(){if(this.database._auditProxyInstalled)return;const e=this.installEventListenersForResource.bind(this);this.database._originalCreateResource=this.database.createResource,this.database.createResource=async function(...t){const r=await this._originalCreateResource(...t);return"audits"!==r.name&&e(r),r},this.database._auditProxyInstalled=!0}installEventListeners(){for(const e of Object.values(this.database.resources))"audits"!==e.name&&this.installEventListenersForResource(e)}installEventListenersForResource(e){e.on("insert",async t=>{const r=t.id||"auto-generated",i=this.config.includePartitions?this.getPartitionValues(t,e):null,s={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:e.name,operation:"insert",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:null,newData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(t)),partition:this.config.includePartitions?this.getPrimaryPartition(i):null,partitionValues:this.config.includePartitions&&i&&Object.keys(i).length>0?JSON.stringify(i):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(s).catch(console.error)}),e.on("update",async t=>{const r=t.id;let i=t.$before;if(this.config.includeData&&!i){const[t,s,n]=await I(()=>e.get(r));t&&(i=n)}const s=this.config.includePartitions?this.getPartitionValues(t,e):null,n={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:e.name,operation:"update",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:i&&!1===this.config.includeData?null:i?JSON.stringify(this.truncateData(i)):null,newData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(t)),partition:this.config.includePartitions?this.getPrimaryPartition(s):null,partitionValues:this.config.includePartitions&&s&&Object.keys(s).length>0?JSON.stringify(s):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(n).catch(console.error)}),e.on("delete",async t=>{const r=t.id;let i=t;if(this.config.includeData&&!i){const[t,s,n]=await I(()=>e.get(r));t&&(i=n)}const s=i&&this.config.includePartitions?this.getPartitionValues(i,e):null,n={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:e.name,operation:"delete",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:i&&!1===this.config.includeData?null:i?JSON.stringify(this.truncateData(i)):null,newData:null,partition:this.config.includePartitions?this.getPrimaryPartition(s):null,partitionValues:this.config.includePartitions&&s&&Object.keys(s).length>0?JSON.stringify(s):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(n).catch(console.error)}),e.useMiddleware("deleteMany",async(t,r)=>{const i=t.args[0],s={};if(this.config.includeData)for(const t of i){const[r,i,n]=await I(()=>e.get(t));s[t]=r?n:null}const n=await r();if(n&&n.length>0&&this.config.includeData)for(const t of i){const r=s[t],i=r&&this.config.includePartitions?this.getPartitionValues(r,e):null,n={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:e.name,operation:"delete",recordId:t,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(r)),newData:null,partition:this.config.includePartitions?this.getPrimaryPartition(i):null,partitionValues:this.config.includePartitions&&i&&Object.keys(i).length>0?JSON.stringify(i):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0",batchOperation:!0})};this.logAudit(n).catch(console.error)}return n})}getPartitionValues(e,t){if(!e)return null;const r=t.config?.partitions||{},i={};for(const[t,s]of Object.entries(r))if(s.fields){const r={};for(const[t,i]of Object.entries(s.fields)){const i=this.getNestedFieldValue(e,t);null!=i&&(r[t]=i)}Object.keys(r).length>0&&(i[t]=r)}return i}getNestedFieldValue(e,t){if(!t.includes("."))return e[t];const r=t.split(".");let i=e;for(const e of r){if(!i||"object"!=typeof i||!(e in i))return;i=i[e]}return i}getPrimaryPartition(e){if(!e)return null;const t=Object.keys(e);return t.length>0?t[0]:null}async logAudit(e){e.id||(e.id=`audit-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);return await this.auditResource.insert(e)}truncateData(e){if(!e)return e;const t={};for(const[r,i]of Object.entries(e))r.startsWith("_")||"$overflow"===r||(t[r]=i);const r=JSON.stringify(t);if(r.length<=this.config.maxDataSize)return t;let i={...t},s=JSON.stringify(i).length;const n=JSON.stringify({_truncated:!0,_originalSize:r.length,_truncatedAt:(new Date).toISOString()}).length,o=this.config.maxDataSize-n;for(const[e,t]of Object.entries(i))if("string"==typeof t&&s>o){const r=s-o,n=Math.max(0,t.length-r-3);n<t.length&&(i[e]=t.substring(0,n)+"...",s=JSON.stringify(i).length)}return{...i,_truncated:!0,_originalSize:r.length,_truncatedAt:(new Date).toISOString()}}async getAuditLogs(e={}){if(!this.auditResource)return[];const[t,r,i]=await I(async()=>{const{resourceName:t,operation:r,recordId:i,userId:s,partition:n,startDate:o,endDate:a,limit:c=100,offset:u=0}=e;let l=(await this.auditResource.getAll()).filter(e=>(!t||e.resourceName===t)&&((!r||e.operation===r)&&((!i||e.recordId===i)&&((!s||e.userId===s)&&((!n||e.partition===n)&&(!(o&&new Date(e.timestamp)<new Date(o))&&!(a&&new Date(e.timestamp)>new Date(a))))))));l.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp));return l.slice(u,u+c).map(e=>{const[t,,r]="string"==typeof e.oldData?D(()=>JSON.parse(e.oldData)):[!0,null,e.oldData],[i,,s]="string"==typeof e.newData?D(()=>JSON.parse(e.newData)):[!0,null,e.newData],[n,,o]=e.partitionValues&&"string"==typeof e.partitionValues?D(()=>JSON.parse(e.partitionValues)):[!0,null,e.partitionValues],[a,,c]=e.metadata&&"string"==typeof e.metadata?D(()=>JSON.parse(e.metadata)):[!0,null,e.metadata];return{...e,oldData:null===e.oldData||void 0===e.oldData||"null"===e.oldData?null:t?r:null,newData:null===e.newData||void 0===e.newData||"null"===e.newData?null:i?s:null,partitionValues:n?o:e.partitionValues,metadata:a?c:e.metadata}})});return t?i:[]}async getRecordHistory(e,t){return this.getAuditLogs({resourceName:e,recordId:t,limit:1e3})}async getPartitionHistory(e,t,r){return this.getAuditLogs({resourceName:e,partition:t,limit:1e3})}async getAuditStats(e={}){const{resourceName:t,startDate:r,endDate:i}=e,s=await this.getAuditLogs({resourceName:t,startDate:r,endDate:i,limit:1e4}),n={total:s.length,byOperation:{},byResource:{},byPartition:{},byUser:{},timeline:{}};for(const e of s)if(n.byOperation[e.operation]=(n.byOperation[e.operation]||0)+1,n.byResource[e.resourceName]=(n.byResource[e.resourceName]||0)+1,e.partition&&(n.byPartition[e.partition]=(n.byPartition[e.partition]||0)+1),n.byUser[e.userId]=(n.byUser[e.userId]||0)+1,e.timestamp){const t=e.timestamp.split("T")[0];n.timeline[t]=(n.timeline[t]||0)+1}return n}},e.AuthenticationError=class extends G{constructor(e,t={}){super(e,t),Object.assign(this,t)}},e.BaseError=W,e.CachePlugin=class extends Ee{constructor(e={}){super(e),this.driver=e.driver,this.config={includePartitions:!1!==e.includePartitions,...e}}async setup(e){await super.setup(e)}async onSetup(){this.config.driver?this.driver=this.config.driver:"memory"===this.config.driverType?this.driver=new Fe(this.config.memoryOptions||{}):this.driver=new qe({client:this.database.client,...this.config.s3Options||{}}),this.installDatabaseProxy(),this.installResourceHooks()}async onStart(){}async onStop(){}installDatabaseProxy(){if(this.database._cacheProxyInstalled)return;const e=this.installResourceHooks.bind(this);this.database._originalCreateResourceForCache=this.database.createResource,this.database.createResource=async function(...t){const r=await this._originalCreateResourceForCache(...t);return e(r),r},this.database._cacheProxyInstalled=!0}installResourceHooks(){for(const e of Object.values(this.database.resources))this.installResourceHooksForResource(e)}installResourceHooksForResource(e){if(!this.driver)return;Object.defineProperty(e,"cache",{value:this.driver,writable:!0,configurable:!0,enumerable:!1}),e.cacheKeyFor=async(t={})=>{const{action:r,params:i={},partition:s,partitionValues:n}=t;return this.generateCacheKey(e,r,i,s,n)};const t=["count","listIds","getMany","getAll","page","list","get"];for(const r of t)e.useMiddleware(r,async(t,i)=>{let s;if("getMany"===r)s=await e.cacheKeyFor({action:r,params:{ids:t.args[0]}});else if("page"===r){const{offset:i,size:n,partition:o,partitionValues:a}=t.args[0]||{};s=await e.cacheKeyFor({action:r,params:{offset:i,size:n},partition:o,partitionValues:a})}else if("list"===r||"listIds"===r||"count"===r){const{partition:i,partitionValues:n}=t.args[0]||{};s=await e.cacheKeyFor({action:r,partition:i,partitionValues:n})}else"getAll"===r?s=await e.cacheKeyFor({action:r}):"get"===r&&(s=await e.cacheKeyFor({action:r,params:{id:t.args[0]}}));const[n,o,a]=await I(()=>e.cache.get(s));if(n&&null!=a)return a;if(!n&&"NoSuchKey"!==o.name)throw o;const c=await i();return await e.cache.set(s,c),c});const r=["insert","update","delete","deleteMany"];for(const t of r)e.useMiddleware(t,async(r,i)=>{const s=await i();if("insert"===t)await this.clearCacheForResource(e,r.args[0]);else if("update"===t)await this.clearCacheForResource(e,{id:r.args[0],...r.args[1]});else if("delete"===t){let t={id:r.args[0]};if("function"==typeof e.get){const[i,s,n]=await I(()=>e.get(r.args[0]));i&&n&&(t=n)}await this.clearCacheForResource(e,t)}else"deleteMany"===t&&await this.clearCacheForResource(e);return s})}async clearCacheForResource(e,t){if(!e.cache)return;const r=`resource=${e.name}`;if(await e.cache.clear(r),!0===this.config.includePartitions&&e.config?.partitions&&Object.keys(e.config.partitions).length>0)if(t){const i=this.getPartitionValues(t,e);for(const[t,s]of Object.entries(i))if(s&&Object.keys(s).length>0&&Object.values(s).some(e=>null!=e)){const i=Te(r,`partition=${t}`);await e.cache.clear(i)}}else for(const t of Object.keys(e.config.partitions)){const i=Te(r,`partition=${t}`);await e.cache.clear(i)}}async generateCacheKey(e,t,r={},i=null,s=null){const n=[`resource=${e.name}`,`action=${t}`];if(i&&s&&Object.keys(s).length>0){n.push(`partition:${i}`);for(const[e,t]of Object.entries(s))null!=t&&n.push(`${e}:${t}`)}if(Object.keys(r).length>0){const e=await this.hashParams(r);n.push(e)}return Te(...n)+".json.gz"}async hashParams(e){const t=Object.keys(e).sort().map(t=>`${t}:${e[t]}`).join("|")||"empty";return await de(t)}async getCacheStats(){return this.driver?{size:await this.driver.size(),keys:await this.driver.keys(),driver:this.driver.constructor.name}:null}async clearAllCache(){if(this.driver)for(const e of Object.values(this.database.resources))if(e.cache){const t=`resource=${e.name}`;await e.cache.clear(t)}}async warmCache(e,t={}){const r=this.database.resources[e];if(!r)throw new Error(`Resource '${e}' not found`);const{includePartitions:i=!0}=t;if(await r.getAll(),i&&r.config.partitions)for(const[e,t]of Object.entries(r.config.partitions))if(t.fields){const t=await r.getAll(),i=Array.isArray(t)?t:[],s=new Set;for(const t of i.slice(0,10)){const i=this.getPartitionValues(t,r);i[e]&&s.add(JSON.stringify(i[e]))}for(const t of s){const i=JSON.parse(t);await r.list({partition:e,partitionValues:i})}}}},e.Client=We,e.ConnectionString=He,e.ConnectionStringError=oe,e.CostsPlugin=Be,e.CryptoError=ae,e.DEFAULT_BEHAVIOR=q,e.Database=Pi,e.DatabaseError=class extends G{constructor(e,t={}){super(e,t),Object.assign(this,t)}},e.EncryptionError=class extends G{constructor(e,t={}){super(e,t),Object.assign(this,t)}},e.ErrorMap=se,e.FullTextPlugin=class extends Ee{constructor(e={}){super(),this.indexResource=null,this.config={minWordLength:e.minWordLength||3,maxResults:e.maxResults||100,...e},this.indexes=new Map}async setup(e){this.database=e;const[t,r,i]=await I(()=>e.createResource({name:"fulltext_indexes",attributes:{id:"string|required",resourceName:"string|required",fieldName:"string|required",word:"string|required",recordIds:"json|required",count:"number|required",lastUpdated:"string|required"}}));this.indexResource=t?i:e.resources.fulltext_indexes,await this.loadIndexes(),this.installIndexingHooks()}async start(){}async stop(){await this.saveIndexes()}async loadIndexes(){if(!this.indexResource)return;const[e,t,r]=await I(()=>this.indexResource.getAll());if(e)for(const e of r){const t=`${e.resourceName}:${e.fieldName}:${e.word}`;this.indexes.set(t,{recordIds:e.recordIds||[],count:e.count||0})}}async saveIndexes(){if(!this.indexResource)return;const[e,t]=await I(async()=>{const e=await this.indexResource.getAll();for(const t of e)await this.indexResource.delete(t.id);for(const[e,t]of this.indexes.entries()){const[r,i,s]=e.split(":");await this.indexResource.insert({id:`index-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:r,fieldName:i,word:s,recordIds:t.recordIds,count:t.count,lastUpdated:(new Date).toISOString()})}})}installIndexingHooks(){this.database.plugins||(this.database.plugins={}),this.database.plugins.fulltext=this;for(const e of Object.values(this.database.resources))"fulltext_indexes"!==e.name&&this.installResourceHooks(e);this.database._fulltextProxyInstalled||(this.database._previousCreateResourceForFullText=this.database.createResource,this.database.createResource=async function(...e){const t=await this._previousCreateResourceForFullText(...e);return this.plugins?.fulltext&&"fulltext_indexes"!==t.name&&this.plugins.fulltext.installResourceHooks(t),t},this.database._fulltextProxyInstalled=!0);for(const e of Object.values(this.database.resources))"fulltext_indexes"!==e.name&&this.installResourceHooks(e)}installResourceHooks(e){e._insert=e.insert,e._update=e.update,e._delete=e.delete,e._deleteMany=e.deleteMany,this.wrapResourceMethod(e,"insert",async(t,r,i)=>{const[s]=r;return this.indexRecord(e.name,t.id,s).catch(console.error),t}),this.wrapResourceMethod(e,"update",async(t,r,i)=>{const[s,n]=r;return this.removeRecordFromIndex(e.name,s).catch(console.error),this.indexRecord(e.name,s,t).catch(console.error),t}),this.wrapResourceMethod(e,"delete",async(t,r,i)=>{const[s]=r;return this.removeRecordFromIndex(e.name,s).catch(console.error),t}),this.wrapResourceMethod(e,"deleteMany",async(t,r,i)=>{const[s]=r;for(const t of s)this.removeRecordFromIndex(e.name,t).catch(console.error);return t})}async indexRecord(e,t,r){const i=this.getIndexedFields(e);if(i&&0!==i.length)for(const s of i){const i=this.getFieldValue(r,s);if(!i)continue;const n=this.tokenize(i);for(const r of n){if(r.length<this.config.minWordLength)continue;const i=`${e}:${s}:${r.toLowerCase()}`,n=this.indexes.get(i)||{recordIds:[],count:0};n.recordIds.includes(t)||(n.recordIds.push(t),n.count=n.recordIds.length),this.indexes.set(i,n)}}}async removeRecordFromIndex(e,t){for(const[r,i]of this.indexes.entries())if(r.startsWith(`${e}:`)){const e=i.recordIds.indexOf(t);e>-1&&(i.recordIds.splice(e,1),i.count=i.recordIds.length,0===i.recordIds.length?this.indexes.delete(r):this.indexes.set(r,i))}}getFieldValue(e,t){if(!t.includes("."))return e&&void 0!==e[t]?e[t]:null;const r=t.split(".");let i=e;for(const e of r){if(!i||"object"!=typeof i||!(e in i))return null;i=i[e]}return i}tokenize(e){if(!e)return[];return String(e).toLowerCase().replace(/[^\w\s\u00C0-\u017F]/g," ").split(/\s+/).filter(e=>e.length>0)}getIndexedFields(e){if(this.config.fields)return this.config.fields;return{users:["name","email"],products:["name","description"],articles:["title","content"]}[e]||[]}async search(e,t,r={}){const{fields:i=null,limit:s=this.config.maxResults,offset:n=0,exactMatch:o=!1}=r;if(!t||0===t.trim().length)return[];const a=this.tokenize(t),c=new Map,u=i||this.getIndexedFields(e);if(0===u.length)return[];for(const t of a)if(!(t.length<this.config.minWordLength))for(const r of u)if(o){const i=`${e}:${r}:${t.toLowerCase()}`,s=this.indexes.get(i);if(s)for(const e of s.recordIds){const t=c.get(e)||0;c.set(e,t+1)}}else for(const[i,s]of this.indexes.entries())if(i.startsWith(`${e}:${r}:${t.toLowerCase()}`))for(const e of s.recordIds){const t=c.get(e)||0;c.set(e,t+1)}return Array.from(c.entries()).map(([e,t])=>({recordId:e,score:t})).sort((e,t)=>t.score-e.score).slice(n,n+s)}async searchRecords(e,t,r={}){const i=await this.search(e,t,r);if(0===i.length)return[];const s=this.database.resources[e];if(!s)throw new Error(`Resource '${e}' not found`);const n=i.map(e=>e.recordId);return(await s.getMany(n)).filter(e=>e&&"object"==typeof e).map(e=>{const t=i.find(t=>t.recordId===e.id);return{...e,_searchScore:t?t.score:0}}).sort((e,t)=>t._searchScore-e._searchScore)}async rebuildIndex(e){const t=this.database.resources[e];if(!t)throw new Error(`Resource '${e}' not found`);for(const[t]of this.indexes.entries())t.startsWith(`${e}:`)&&this.indexes.delete(t);const r=await t.getAll();for(let t=0;t<r.length;t+=100){const i=r.slice(t,t+100);for(const t of i){const[r,i]=await I(()=>this.indexRecord(e,t.id,t))}}await this.saveIndexes()}async getIndexStats(){const e={totalIndexes:this.indexes.size,resources:{},totalWords:0};for(const[t,r]of this.indexes.entries()){const[i,s]=t.split(":");e.resources[i]||(e.resources[i]={fields:{},totalRecords:new Set,totalWords:0}),e.resources[i].fields[s]||(e.resources[i].fields[s]={words:0,totalOccurrences:0}),e.resources[i].fields[s].words++,e.resources[i].fields[s].totalOccurrences+=r.count,e.resources[i].totalWords++;for(const t of r.recordIds)e.resources[i].totalRecords.add(t);e.totalWords++}for(const t in e.resources)e.resources[t].totalRecords=e.resources[t].totalRecords.size;return e}async rebuildAllIndexes({timeout:e}={}){return e?Promise.race([this._rebuildAllIndexesInternal(),new Promise((t,r)=>setTimeout(()=>r(new Error("Timeout")),e))]):this._rebuildAllIndexesInternal()}async _rebuildAllIndexesInternal(){const e=Object.keys(this.database.resources).filter(e=>"fulltext_indexes"!==e);for(const t of e){const[e,r]=await I(()=>this.rebuildIndex(t))}}async clearIndex(e){for(const[t]of this.indexes.entries())t.startsWith(`${e}:`)&&this.indexes.delete(t);await this.saveIndexes()}async clearAllIndexes(){this.indexes.clear(),await this.saveIndexes()}},e.InvalidResourceItem=re,e.MetricsPlugin=class extends Ee{constructor(e={}){super(),this.config={collectPerformance:!1!==e.collectPerformance,collectErrors:!1!==e.collectErrors,collectUsage:!1!==e.collectUsage,retentionDays:e.retentionDays||30,flushInterval:e.flushInterval||6e4,...e},this.metrics={operations:{insert:{count:0,totalTime:0,errors:0},update:{count:0,totalTime:0,errors:0},delete:{count:0,totalTime:0,errors:0},get:{count:0,totalTime:0,errors:0},list:{count:0,totalTime:0,errors:0},count:{count:0,totalTime:0,errors:0}},resources:{},errors:[],performance:[],startTime:(new Date).toISOString()},this.flushTimer=null}async setup(e){if(this.database=e,"test"===process.env.NODE_ENV)return;const[t,r]=await I(async()=>{const[t,r,i]=await I(()=>e.createResource({name:"metrics",attributes:{id:"string|required",type:"string|required",resourceName:"string",operation:"string",count:"number|required",totalTime:"number|required",errors:"number|required",avgTime:"number|required",timestamp:"string|required",metadata:"json"}}));this.metricsResource=t?i:e.resources.metrics;const[s,n,o]=await I(()=>e.createResource({name:"error_logs",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",error:"string|required",timestamp:"string|required",metadata:"json"}}));this.errorsResource=s?o:e.resources.error_logs;const[a,c,u]=await I(()=>e.createResource({name:"performance_logs",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",duration:"number|required",timestamp:"string|required",metadata:"json"}}));this.performanceResource=a?u:e.resources.performance_logs});t||(this.metricsResource=e.resources.metrics,this.errorsResource=e.resources.error_logs,this.performanceResource=e.resources.performance_logs),this.installMetricsHooks(),"test"!==process.env.NODE_ENV&&this.startFlushTimer()}async start(){}async stop(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),"test"!==process.env.NODE_ENV&&await this.flushMetrics()}installMetricsHooks(){for(const e of Object.values(this.database.resources))["metrics","error_logs","performance_logs"].includes(e.name)||this.installResourceHooks(e);this.database._createResource=this.database.createResource,this.database.createResource=async function(...e){const t=await this._createResource(...e);return this.plugins?.metrics&&!["metrics","error_logs","performance_logs"].includes(t.name)&&this.plugins.metrics.installResourceHooks(t),t}}installResourceHooks(e){e._insert=e.insert,e._update=e.update,e._delete=e.delete,e._deleteMany=e.deleteMany,e._get=e.get,e._getMany=e.getMany,e._getAll=e.getAll,e._list=e.list,e._listIds=e.listIds,e._count=e.count,e._page=e.page,e.insert=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._insert(...t));if(this.recordOperation(e.name,"insert",Date.now()-r,!i),i||this.recordError(e.name,"insert",s),!i)throw s;return n}.bind(this),e.update=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._update(...t));if(this.recordOperation(e.name,"update",Date.now()-r,!i),i||this.recordError(e.name,"update",s),!i)throw s;return n}.bind(this),e.delete=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._delete(...t));if(this.recordOperation(e.name,"delete",Date.now()-r,!i),i||this.recordError(e.name,"delete",s),!i)throw s;return n}.bind(this),e.deleteMany=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._deleteMany(...t));if(this.recordOperation(e.name,"delete",Date.now()-r,!i),i||this.recordError(e.name,"delete",s),!i)throw s;return n}.bind(this),e.get=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._get(...t));if(this.recordOperation(e.name,"get",Date.now()-r,!i),i||this.recordError(e.name,"get",s),!i)throw s;return n}.bind(this),e.getMany=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._getMany(...t));if(this.recordOperation(e.name,"get",Date.now()-r,!i),i||this.recordError(e.name,"get",s),!i)throw s;return n}.bind(this),e.getAll=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._getAll(...t));if(this.recordOperation(e.name,"list",Date.now()-r,!i),i||this.recordError(e.name,"list",s),!i)throw s;return n}.bind(this),e.list=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._list(...t));if(this.recordOperation(e.name,"list",Date.now()-r,!i),i||this.recordError(e.name,"list",s),!i)throw s;return n}.bind(this),e.listIds=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._listIds(...t));if(this.recordOperation(e.name,"list",Date.now()-r,!i),i||this.recordError(e.name,"list",s),!i)throw s;return n}.bind(this),e.count=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._count(...t));if(this.recordOperation(e.name,"count",Date.now()-r,!i),i||this.recordError(e.name,"count",s),!i)throw s;return n}.bind(this),e.page=async function(...t){const r=Date.now(),[i,s,n]=await I(()=>e._page(...t));if(this.recordOperation(e.name,"list",Date.now()-r,!i),i||this.recordError(e.name,"list",s),!i)throw s;return n}.bind(this)}recordOperation(e,t,r,i){this.metrics.operations[t]&&(this.metrics.operations[t].count++,this.metrics.operations[t].totalTime+=r,i&&this.metrics.operations[t].errors++),this.metrics.resources[e]||(this.metrics.resources[e]={insert:{count:0,totalTime:0,errors:0},update:{count:0,totalTime:0,errors:0},delete:{count:0,totalTime:0,errors:0},get:{count:0,totalTime:0,errors:0},list:{count:0,totalTime:0,errors:0},count:{count:0,totalTime:0,errors:0}}),this.metrics.resources[e][t]&&(this.metrics.resources[e][t].count++,this.metrics.resources[e][t].totalTime+=r,i&&this.metrics.resources[e][t].errors++),this.config.collectPerformance&&this.metrics.performance.push({resourceName:e,operation:t,duration:r,timestamp:(new Date).toISOString()})}recordError(e,t,r){this.config.collectErrors&&this.metrics.errors.push({resourceName:e,operation:t,error:r.message,stack:r.stack,timestamp:(new Date).toISOString()})}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.config.flushInterval>0&&(this.flushTimer=setInterval(()=>{this.flushMetrics().catch(console.error)},this.config.flushInterval))}async flushMetrics(){if(!this.metricsResource)return;const[e,t]=await I(async()=>{const e="test"===process.env.NODE_ENV?{}:{global:"true"},t="test"===process.env.NODE_ENV?{}:{perf:"true"},r="test"===process.env.NODE_ENV?{}:{error:"true"},i="test"===process.env.NODE_ENV?{}:{resource:"true"};for(const[t,r]of Object.entries(this.metrics.operations))r.count>0&&await this.metricsResource.insert({id:`metrics-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:"operation",resourceName:"global",operation:t,count:r.count,totalTime:r.totalTime,errors:r.errors,avgTime:r.count>0?r.totalTime/r.count:0,timestamp:(new Date).toISOString(),metadata:e});for(const[e,t]of Object.entries(this.metrics.resources))for(const[r,s]of Object.entries(t))s.count>0&&await this.metricsResource.insert({id:`metrics-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:"operation",resourceName:e,operation:r,count:s.count,totalTime:s.totalTime,errors:s.errors,avgTime:s.count>0?s.totalTime/s.count:0,timestamp:(new Date).toISOString(),metadata:i});if(this.config.collectPerformance&&this.metrics.performance.length>0)for(const e of this.metrics.performance)await this.performanceResource.insert({id:`perf-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:e.resourceName,operation:e.operation,duration:e.duration,timestamp:e.timestamp,metadata:t});if(this.config.collectErrors&&this.metrics.errors.length>0)for(const e of this.metrics.errors)await this.errorsResource.insert({id:`error-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:e.resourceName,operation:e.operation,error:e.error,stack:e.stack,timestamp:e.timestamp,metadata:r});this.resetMetrics()});e||console.error("Failed to flush metrics:",t)}resetMetrics(){for(const e of Object.keys(this.metrics.operations))this.metrics.operations[e]={count:0,totalTime:0,errors:0};for(const e of Object.keys(this.metrics.resources))for(const t of Object.keys(this.metrics.resources[e]))this.metrics.resources[e][t]={count:0,totalTime:0,errors:0};this.metrics.performance=[],this.metrics.errors=[]}async getMetrics(e={}){const{type:t="operation",resourceName:r,operation:i,startDate:s,endDate:n,limit:o=100,offset:a=0}=e;if(!this.metricsResource)return[];let c=(await this.metricsResource.getAll()).filter(e=>(!t||e.type===t)&&((!r||e.resourceName===r)&&((!i||e.operation===i)&&(!(s&&new Date(e.timestamp)<new Date(s))&&!(n&&new Date(e.timestamp)>new Date(n))))));return c.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp)),c.slice(a,a+o)}async getErrorLogs(e={}){if(!this.errorsResource)return[];const{resourceName:t,operation:r,startDate:i,endDate:s,limit:n=100,offset:o=0}=e;let a=(await this.errorsResource.getAll()).filter(e=>(!t||e.resourceName===t)&&((!r||e.operation===r)&&(!(i&&new Date(e.timestamp)<new Date(i))&&!(s&&new Date(e.timestamp)>new Date(s)))));return a.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp)),a.slice(o,o+n)}async getPerformanceLogs(e={}){if(!this.performanceResource)return[];const{resourceName:t,operation:r,startDate:i,endDate:s,limit:n=100,offset:o=0}=e;let a=(await this.performanceResource.getAll()).filter(e=>(!t||e.resourceName===t)&&((!r||e.operation===r)&&(!(i&&new Date(e.timestamp)<new Date(i))&&!(s&&new Date(e.timestamp)>new Date(s)))));return a.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp)),a.slice(o,o+n)}async getStats(){const e=new Date,t=new Date(e.getTime()-864e5),[r,i,s]=await Promise.all([this.getMetrics({startDate:t.toISOString()}),this.getErrorLogs({startDate:t.toISOString()}),this.getPerformanceLogs({startDate:t.toISOString()})]),n={period:"24h",totalOperations:0,totalErrors:i.length,avgResponseTime:0,operationsByType:{},resources:{},uptime:{startTime:this.metrics.startTime,duration:e.getTime()-new Date(this.metrics.startTime).getTime()}};for(const e of r)if("operation"===e.type){n.totalOperations+=e.count,n.operationsByType[e.operation]||(n.operationsByType[e.operation]={count:0,errors:0,avgTime:0}),n.operationsByType[e.operation].count+=e.count,n.operationsByType[e.operation].errors+=e.errors;const t=n.operationsByType[e.operation],r=t.count,i=(t.avgTime*(r-e.count)+e.totalTime)/r;t.avgTime=i}const o=r.reduce((e,t)=>e+t.totalTime,0),a=r.reduce((e,t)=>e+t.count,0);return n.avgResponseTime=a>0?o/a:0,n}async cleanupOldData(){const e=new Date;if(e.setDate(e.getDate()-this.config.retentionDays),this.metricsResource){const t=await this.getMetrics({endDate:e.toISOString()});for(const e of t)await this.metricsResource.delete(e.id)}if(this.errorsResource){const t=await this.getErrorLogs({endDate:e.toISOString()});for(const e of t)await this.errorsResource.delete(e.id)}if(this.performanceResource){const t=await this.getPerformanceLogs({endDate:e.toISOString()});for(const e of t)await this.performanceResource.delete(e.id)}}},e.MissingMetadata=te,e.NoSuchBucket=X,e.NoSuchKey=Z,e.NotFound=ee,e.PartitionError=le,e.PermissionError=Y,e.Plugin=Ee,e.PluginObject=Ne,e.ReplicatorPlugin=class extends Ee{constructor(e={}){if(super(),e.verbose&&console.log("[PLUGIN][CONSTRUCTOR] ReplicatorPlugin constructor called"),e.verbose&&console.log("[PLUGIN][constructor] New ReplicatorPlugin instance created with config:",e),!e.replicators||!Array.isArray(e.replicators))throw new Error("ReplicatorPlugin: replicators array is required");for(const t of e.replicators)if(!t.driver)throw new Error("ReplicatorPlugin: each replicator must have a driver");this.config={verbose:e.verbose??!1,persistReplicatorLog:e.persistReplicatorLog??!1,replicatorLogResource:e.replicatorLogResource??"replicator_logs",replicators:e.replicators||[]},this.replicators=[],this.queue=[],this.isProcessing=!1,this.stats={totalOperations:0,totalErrors:0,lastError:null},this._installedListeners=[]}async decompressData(e){return e}filterInternalFields(e){if(!e||"object"!=typeof e)return e;const t={};for(const[r,i]of Object.entries(e))r.startsWith("_")||"$overflow"===r||"$before"===r||"$after"===r||(t[r]=i);return t}installEventListeners(e){const t=this;t.config.verbose&&console.log("[PLUGIN] installEventListeners called for:",e&&e.name,{hasDatabase:!!e.database,sameDatabase:e.database===t.database,alreadyInstalled:e._replicatorListenersInstalled,resourceObj:e,resourceObjId:e&&e.id,resourceObjType:typeof e,resourceObjIs:e&&Object.is(e,t.database.resources&&t.database.resources[e.name]),resourceObjEq:e===(t.database.resources&&t.database.resources[e.name])}),e&&e.name!==t.config.replicatorLogResource&&e.database&&e.database===t.database&&(e._replicatorListenersInstalled||(e._replicatorListenersInstalled=!0,this._installedListeners.push(e),t.config.verbose&&console.log(`[PLUGIN] installEventListeners INSTALLED for resource: ${e&&e.name}`),e.on("insert",async r=>{t.config.verbose&&console.log("[PLUGIN] Listener INSERT on",e.name,"plugin.replicators.length:",t.replicators.length,t.replicators.map(e=>({id:e.id,driver:e.driver})));try{const i=await t.getCompleteData(e,r);t.config.verbose&&console.log(`[PLUGIN] Listener INSERT completeData for ${e.name} id=${r&&r.id}:`,i),await t.processReplicatorEvent(e.name,"insert",r.id,i,null)}catch(i){t.config.verbose&&console.error(`[PLUGIN] Listener INSERT error on ${e.name} id=${r&&r.id}:`,i)}}),e.on("update",async r=>{console.log("[PLUGIN][Listener][UPDATE][START] triggered for resource:",e.name,"data:",r);const i=r&&r.$before;t.config.verbose&&console.log("[PLUGIN] Listener UPDATE on",e.name,"plugin.replicators.length:",t.replicators.length,t.replicators.map(e=>({id:e.id,driver:e.driver})),"data:",r,"beforeData:",i);try{let s;const[n,o,a]=await I(()=>e.get(r.id));s=n&&a?a:r,await t.processReplicatorEvent(e.name,"update",r.id,s,i)}catch(i){t.config.verbose&&console.error(`[PLUGIN] Listener UPDATE erro em ${e.name} id=${r&&r.id}:`,i)}}),e.on("delete",async(r,i)=>{t.config.verbose&&console.log("[PLUGIN] Listener DELETE on",e.name,"plugin.replicators.length:",t.replicators.length,t.replicators.map(e=>({id:e.id,driver:e.driver})));try{await t.processReplicatorEvent(e.name,"delete",r.id,null,i)}catch(i){t.config.verbose&&console.error(`[PLUGIN] Listener DELETE erro em ${e.name} id=${r&&r.id}:`,i)}}),t.config.verbose&&console.log(`[PLUGIN] Listeners instalados para resource: ${e&&e.name} (insert: ${e.listenerCount("insert")}, update: ${e.listenerCount("update")}, delete: ${e.listenerCount("delete")})`)))}async getCompleteData(e,t){const[r,i,s]=await I(()=>e.get(t.id));return r?s:t}async setup(e){if(console.log("[PLUGIN][SETUP] setup called"),this.config.verbose&&console.log("[PLUGIN][setup] called with database:",e&&e.name),this.database=e,this.config.persistReplicatorLog){let t=e.resources[Mi(this.config.replicatorLogResource)];t||(t=await e.createResource({name:this.config.replicatorLogResource,behavior:"truncate-data",attributes:{id:"string|required",resource:"string|required",action:"string|required",data:"object",timestamp:"number|required",createdAt:"string|required"},partitions:{byDate:{fields:{createdAt:"string|maxlength:10"}}}}),this.config.verbose&&console.log("[PLUGIN] Log resource created:",this.config.replicatorLogResource,!!t)),e.resources[Mi(this.config.replicatorLogResource)]=t,this.replicatorLog=t,this.config.verbose&&console.log("[PLUGIN] Log resource created and registered:",this.config.replicatorLogResource,!!e.resources[Mi(this.config.replicatorLogResource)]),"function"==typeof e.uploadMetadataFile&&(await e.uploadMetadataFile(),this.config.verbose&&console.log("[PLUGIN] uploadMetadataFile called. database.resources keys:",Object.keys(e.resources)))}this.config.replicators&&this.config.replicators.length>0&&0===this.replicators.length&&(await this.initializeReplicators(),console.log("[PLUGIN][SETUP] after initializeReplicators, replicators.length:",this.replicators.length),this.config.verbose&&console.log("[PLUGIN][setup] After initializeReplicators, replicators.length:",this.replicators.length,this.replicators.map(e=>({id:e.id,driver:e.driver}))));for(const t in e.resources)Mi(t)!==Mi(this.config.replicatorLogResource)&&this.installEventListeners(e.resources[t]);e.on("connected",()=>{for(const t in e.resources)Mi(t)!==Mi(this.config.replicatorLogResource)&&this.installEventListeners(e.resources[t])});const t=e.createResource.bind(e);e.createResource=async e=>{this.config.verbose&&console.log("[PLUGIN] createResource proxy called for:",e&&e.name);const r=await t(e);return r&&r.name!==this.config.replicatorLogResource&&this.installEventListeners(r),r},e.on("s3db.resourceCreated",t=>{const r=e.resources[t];r&&r.name!==this.config.replicatorLogResource&&this.installEventListeners(r)}),e.on("s3db.resourceUpdated",t=>{const r=e.resources[t];r&&r.name!==this.config.replicatorLogResource&&this.installEventListeners(r)})}async initializeReplicators(){console.log("[PLUGIN][INIT] initializeReplicators called");for(const e of this.config.replicators)try{console.log("[PLUGIN][INIT] processing replicatorConfig:",e);const t=e.driver,r=e.resources,i=$i(t,e,r,e.client);i?(await i.initialize(this.database),this.replicators.push({id:Math.random().toString(36).slice(2),driver:t,config:e,resources:r,instance:i}),console.log("[PLUGIN][INIT] pushed replicator:",t,r)):console.log("[PLUGIN][INIT] createReplicator returned null/undefined for driver:",t)}catch(e){console.error("[PLUGIN][INIT] Error creating replicator:",e)}}async start(){}async stop(){}async processReplicatorEvent(e,t,r,i,s=null){if(this.config.verbose&&(console.log("[PLUGIN][processReplicatorEvent] replicators.length:",this.replicators.length,this.replicators.map(e=>({id:e.id,driver:e.driver}))),console.log(`[PLUGIN][processReplicatorEvent] operation: ${t}, resource: ${e}, recordId: ${r}, data:`,i,"beforeData:",s)),this.config.verbose&&console.log(`[PLUGIN] processReplicatorEvent: resource=${e} op=${t} id=${r} data=`,i),this.config.verbose&&console.log(`[PLUGIN] processReplicatorEvent: resource=${e} op=${t} replicators=${this.replicators.length}`),0===this.replicators.length)return void(this.config.verbose&&console.log("[PLUGIN] No replicators registered"));const o=this.replicators.filter(r=>{const i=r.instance.shouldReplicateResource(e,t);return this.config.verbose&&console.log(`[PLUGIN] Replicator ${r.driver} shouldReplicateResource(${e}, ${t}):`,i),i});if(this.config.verbose&&console.log(`[PLUGIN] processReplicatorEvent: applicableReplicators for resource=${e}:`,o.map(e=>e.driver)),0===o.length)return void(this.config.verbose&&console.log("[PLUGIN] No applicable replicators for resource",e));const a=this.filterInternalFields(n.isPlainObject(i)?i:{raw:i}),c=s?this.filterInternalFields(n.isPlainObject(s)?s:{raw:s}):null,u={id:`repl-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:e,operation:t,recordId:r,data:a,beforeData:c,timestamp:(new Date).toISOString(),attempts:0},l=await this.logreplicator(u),[h,d,f]=await I(async()=>this.processreplicatorItem(u));h?(l&&await this.updatereplicatorLog(l,{status:f.success?"success":"failed",attempts:1,error:f.success?"":JSON.stringify(f.results)}),this.stats.totalOperations++,f.success?this.stats.successfulOperations++:this.stats.failedOperations++):(l&&await this.updatereplicatorLog(l,{status:"failed",attempts:1,error:d.message}),this.stats.failedOperations++)}async processreplicatorItem(e){this.config.verbose&&console.log("[PLUGIN][processreplicatorItem] called with item:",e);const t=this.replicators.filter(t=>{const r=t.instance.shouldReplicateResource(e.resourceName,e.operation);return this.config.verbose&&console.log(`[PLUGIN] processreplicatorItem: Replicator ${t.driver} shouldReplicateResource(${e.resourceName}, ${e.operation}):`,r),r});if(this.config.verbose&&console.log(`[PLUGIN] processreplicatorItem: applicableReplicators for resource=${e.resourceName}:`,t.map(e=>e.driver)),0===t.length)return this.config.verbose&&console.log("[PLUGIN] processreplicatorItem: No applicable replicators for resource",e.resourceName),{success:!0,skipped:!0,reason:"no_applicable_replicators"};const r=[];for(const i of t){let t,s,n;this.config.verbose&&console.log("[PLUGIN] processReplicatorItem",{resource:e.resourceName,operation:e.operation,data:e.data,beforeData:e.beforeData,replicator:i.instance?.constructor?.name}),i.instance&&i.instance.constructor&&"S3dbReplicator"===i.instance.constructor.name?[s,n,t]=await I(()=>i.instance.replicate({resource:e.resourceName,operation:e.operation,data:e.data,id:e.recordId,beforeData:e.beforeData})):[s,n,t]=await I(()=>i.instance.replicate(e.resourceName,e.operation,e.data,e.recordId,e.beforeData)),r.push({replicatorId:i.id,driver:i.driver,success:t&&t.success,error:t&&t.error,skipped:t&&t.skipped})}return{success:r.every(e=>e.success||e.skipped),results:r}}async logreplicator(e){const t=this.replicatorLog||this.database.resources[Mi(this.config.replicatorLogResource)];if(!t)return this.config.verbose&&console.error("[PLUGIN] replicator log resource not found!"),this.database&&(this.config.verbose&&console.warn("[PLUGIN] database.resources keys:",Object.keys(this.database.resources)),this.database.options&&this.database.options.connectionString&&this.config.verbose&&console.warn("[PLUGIN] database connectionString:",this.database.options.connectionString)),void this.emit("replicator.log.failed",{error:"replicator log resource not found",item:e});const r={id:e.id||`repl-${Date.now()}-${Math.random().toString(36).slice(2)}`,resource:e.resource||e.resourceName||"",action:e.operation||e.action||"",data:e.data||{},timestamp:"number"==typeof e.timestamp?e.timestamp:Date.now(),createdAt:e.createdAt||(new Date).toISOString().slice(0,10)};try{await t.insert(r)}catch(t){this.config.verbose&&console.error("[PLUGIN] Error writing to replicator log:",t),this.emit("replicator.log.failed",{error:t,item:e})}}async updatereplicatorLog(e,t){if(!this.replicatorLog)return;const[r,i]=await I(async()=>{await this.replicatorLog.update(e,{...t,lastAttempt:(new Date).toISOString()})});r||this.emit("replicator.updateLog.failed",{error:i.message,logId:e,updates:t})}async getreplicatorStats(){return{replicators:await Promise.all(this.replicators.map(async e=>{const t=await e.instance.getStatus();return{id:e.id,driver:e.driver,config:e.config,status:t}})),queue:{length:this.queue.length,isProcessing:this.isProcessing},stats:this.stats,lastSync:this.stats.lastSync}}async getreplicatorLogs(e={}){if(!this.replicatorLog)return[];const{resourceName:t,operation:r,status:i,limit:s=100,offset:n=0}=e;let o={};t&&(o.resourceName=t),r&&(o.operation=r),i&&(o.status=i);return(await this.replicatorLog.list(o)).slice(n,n+s)}async retryFailedreplicators(){if(!this.replicatorLog)return{retried:0};const e=await this.replicatorLog.list({status:"failed"});let t=0;for(const r of e){const[e,i]=await I(async()=>{await this.processReplicatorEvent(r.resourceName,r.operation,r.recordId,r.data)});e?t++:this.config.verbose&&console.error("Failed to retry replicator:",i)}return{retried:t}}async syncAllData(e){const t=this.replicators.find(t=>t.id===e);if(!t)throw new Error(`Replicator not found: ${e}`);this.stats.lastSync=(new Date).toISOString();for(const r in this.database.resources)if(Mi(r)!==Mi("replicator_logs")&&t.instance.shouldReplicateResource(r)){this.emit("replicator.sync.resource",{resourceName:r,replicatorId:e});const i=this.database.resources[r],s=await i.getAll();for(const e of s)await t.instance.replicate(r,"insert",e,e.id)}this.emit("replicator.sync.completed",{replicatorId:e,stats:this.stats})}async cleanup(){if(this.config.verbose&&console.log("[PLUGIN][CLEANUP] Cleaning up ReplicatorPlugin"),this._installedListeners&&Array.isArray(this._installedListeners)){for(const e of this._installedListeners)e&&"function"==typeof e.removeAllListeners&&(e.removeAllListeners("insert"),e.removeAllListeners("update"),e.removeAllListeners("delete")),e._replicatorListenersInstalled=!1;this._installedListeners=[]}if(this.database&&"function"==typeof this.database.removeAllListeners&&this.database.removeAllListeners(),this.replicators&&Array.isArray(this.replicators)){for(const e of this.replicators)e.instance&&"function"==typeof e.instance.cleanup&&await e.instance.cleanup();this.replicators=[]}this.queue=[],this.isProcessing=!1,this.stats={totalOperations:0,totalErrors:0,lastError:null},this.config.verbose&&console.log("[PLUGIN][CLEANUP] ReplicatorPlugin cleanup complete")}},e.Resource=xi,e.ResourceError=ue,e.ResourceIdsPageReader=Ni,e.ResourceIdsReader=Ei,e.ResourceNotFound=Q,e.ResourceReader=Ai,e.ResourceWriter=Ii,e.S3_DEFAULT_ENDPOINT=Ke,e.S3_DEFAULT_REGION=Ve,e.S3db=Ci,e.S3dbError=G,e.Schema=Ze,e.SchemaActions=Xe,e.SchemaError=ce,e.UnknownError=ie,e.ValidationError=J,e.Validator=Ye,e.ValidatorManager=Qe,e.behaviors=$,e.calculateAttributeNamesSize=p,e.calculateAttributeSizes=m,e.calculateEffectiveLimit=w,e.calculateSystemOverhead=b,e.calculateTotalSize=y,e.calculateUTF8Bytes=f,e.decode=V,e.decodeDecimal=H,e.decrypt=pe,e.default=Ci,e.encode=z,e.encodeDecimal=K,e.encrypt=fe,e.getBehavior=M,e.getSizeBreakdown=function(e){const t=m(e),r=p(e),i=Object.values(t).reduce((e,t)=>e+t,0),s=i+r,n=Object.entries(t).sort(([,e],[,t])=>t-e).map(([e,t])=>({attribute:e,size:t,percentage:(t/s*100).toFixed(2)+"%"}));return{total:s,valueSizes:t,namesSize:r,valueTotal:i,breakdown:n,detailedBreakdown:{values:i,names:r,total:s}}},e.idGenerator=ye,e.mapAwsError=ne,e.md5=ge,e.passwordGenerator=be,e.sha256=de,e.streamToString=Di,e.transformValue=g,e.tryFn=I,e.tryFnSync=D,Object.defineProperty(e,"__esModule",{value:!0}),e}({},nanoid,zlib,index_js,0,lodashEs,crypto,jsonStableStringify,promisePool,clientS3,flat,FastestValidator,web);
1
+ var S3DB=function(e,t,r,i,s,n,o,a,c,u,l,h){"use strict";function d(e){"string"!=typeof e&&(e=String(e));let t=0;for(let r=0;r<e.length;r++){const i=e.codePointAt(r);i<=127?t+=1:i<=2047?t+=2:i<=65535?t+=3:i<=1114111&&(t+=4,i>65535&&r++)}return t}function f(e){let t=0;for(const r of Object.keys(e))t+=d(r);return t}function p(e){return null==e?"":"boolean"==typeof e?e?"1":"0":"number"==typeof e?String(e):"string"==typeof e?e:Array.isArray(e)?0===e.length?"[]":e.map(e=>String(e)).join("|"):"object"==typeof e?JSON.stringify(e):String(e)}function g(e){const t={};for(const[r,i]of Object.entries(e)){const e=d(p(i));t[r]=e}return t}function m(e){const t=g(e);return Object.values(t).reduce((e,t)=>e+t,0)+f(e)}function y(e={}){const{version:t="1",timestamps:r=!1,id:i=""}=e,s={_v:String(t)};r&&(s.createdAt="2024-01-01T00:00:00.000Z",s.updatedAt="2024-01-01T00:00:00.000Z"),i&&(s.id=i);const n={};for(const[e,t]of Object.entries(s))n[e]=t;return m(n)}function b(e={}){const{s3Limit:t=2048,systemConfig:r={}}=e;return t-y(r)}const w=2047;var v=Object.freeze({__proto__:null,S3_METADATA_LIMIT_BYTES:w,handleGet:async function({resource:e,metadata:t,body:r}){return{metadata:t,body:r}},handleInsert:async function({resource:e,data:t,mappedData:r,originalData:i}){const s=m(r),n=b({s3Limit:w,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t.id}});if(s>n)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${s} bytes, effective limit: ${n} bytes, absolute limit: 2047 bytes`);return{mappedData:r,body:JSON.stringify(r)}},handleUpdate:async function({resource:e,id:t,data:r,mappedData:i,originalData:s}){const n=m(i),o=b({s3Limit:w,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t}});if(n>o)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${n} bytes, effective limit: ${o} bytes, absolute limit: 2047 bytes`);return{mappedData:i,body:JSON.stringify(i)}},handleUpsert:async function({resource:e,id:t,data:r,mappedData:i}){const s=m(i),n=b({s3Limit:w,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t}});if(s>n)throw new Error(`S3 metadata size exceeds 2KB limit. Current size: ${s} bytes, effective limit: ${n} bytes, absolute limit: 2047 bytes`);return{mappedData:i,body:""}}});var O=Object.freeze({__proto__:null,handleGet:async function({resource:e,metadata:t,body:r}){return{metadata:t,body:r}},handleInsert:async function({resource:e,data:t,mappedData:r,originalData:i}){const s=m(r);return s>b({s3Limit:w,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t.id}})&&e.emit("exceedsLimit",{operation:"insert",totalSize:s,limit:2047,excess:s-2047,data:i||t}),{mappedData:r,body:JSON.stringify(t)}},handleUpdate:async function({resource:e,id:t,data:r,mappedData:i,originalData:s}){const n=m(i);return n>b({s3Limit:w,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t}})&&e.emit("exceedsLimit",{operation:"update",id:t,totalSize:n,limit:2047,excess:n-2047,data:s||r}),{mappedData:i,body:JSON.stringify(r)}},handleUpsert:async function({resource:e,id:t,data:r,mappedData:i,originalData:s}){const n=m(i);return n>b({s3Limit:w,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t}})&&e.emit("exceedsLimit",{operation:"upsert",id:t,totalSize:n,limit:2047,excess:n-2047,data:s||r}),{mappedData:i,body:JSON.stringify(r)}}});const k="$truncated",S="true",_=d(k)+d(S);async function R({resource:e,data:t,mappedData:r,originalData:i}){const s=b({s3Limit:w,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t.id}}),n=g(r),o=Object.entries(n).sort(([,e],[,t])=>e-t),a={};let c=0,u=!1;r._v&&(a._v=r._v,c+=n._v);for(const[e,t]of o){if("_v"===e)continue;const i=r[e];if(!(c+(t+(u?0:_))<=s)){const t=s-c-(u?0:_);if(t>0){const r=j(i,t);a[e]=r,u=!0,c+=d(r)}else a[e]="",u=!0;break}a[e]=i,c+=t}let l=m(a)+(u?_:0);for(;l>s;){const e=Object.keys(a).filter(e=>"_v"!==e&&"$truncated"!==e);if(0===e.length)break;a[e[e.length-1]]="",l=m(a)+_,u=!0}return u&&(a[k]=S),{mappedData:a,body:JSON.stringify(r)}}function j(e,t){if("string"==typeof e)return E(e,t);if("object"==typeof e&&null!==e){return E(JSON.stringify(e),t)}return E(String(e),t)}function E(e,t){const r=new TextEncoder;let i=r.encode(e);if(i.length<=t)return e;let s=e.length;for(;s>0;){const n=e.substring(0,s);if(i=r.encode(n),i.length<=t)return n;s--}return""}var N=Object.freeze({__proto__:null,handleGet:async function({resource:e,metadata:t,body:r}){return{metadata:t,body:r}},handleInsert:R,handleUpdate:async function({resource:e,id:t,data:r,mappedData:i,originalData:s}){return R({resource:e,data:r,mappedData:i,originalData:s})},handleUpsert:async function({resource:e,id:t,data:r,mappedData:i}){return R({resource:e,data:r,mappedData:i})}});function A(e){if(null==e){const e=new Error("fnOrPromise cannot be null or undefined");return e.stack=(new Error).stack,[!1,e,void 0]}if("function"==typeof e)try{const t=e();return null==t?[!0,null,t]:"function"==typeof t.then?t.then(e=>[!0,null,e]).catch(e=>{if(e instanceof Error&&Object.isExtensible(e)){const t=Object.getOwnPropertyDescriptor(e,"stack");if(t&&t.writable&&t.configurable&&e.hasOwnProperty("stack"))try{e.stack=(new Error).stack}catch(e){}}return[!1,e,void 0]}):[!0,null,t]}catch(e){if(e instanceof Error&&Object.isExtensible(e)){const t=Object.getOwnPropertyDescriptor(e,"stack");if(t&&t.writable&&t.configurable&&e.hasOwnProperty("stack"))try{e.stack=(new Error).stack}catch(e){}}return[!1,e,void 0]}return"function"==typeof e.then?Promise.resolve(e).then(e=>[!0,null,e]).catch(e=>{if(e instanceof Error&&Object.isExtensible(e)){const t=Object.getOwnPropertyDescriptor(e,"stack");if(t&&t.writable&&t.configurable&&e.hasOwnProperty("stack"))try{e.stack=(new Error).stack}catch(e){}}return[!1,e,void 0]}):[!0,null,e]}function I(e){try{return[!0,null,e()]}catch(e){return[!1,e,null]}}const D="$overflow",x="true",P=d(D)+d(x);async function C({resource:e,data:t,mappedData:r,originalData:i}){const s=b({s3Limit:w,systemConfig:{version:e.version,timestamps:e.config.timestamps,id:t.id}}),n=g(r),o=Object.entries(n).sort(([,e],[,t])=>e-t),a={},c={};let u=0,l=!1;r._v&&(a._v=r._v,u+=n._v);let h=s;for(const[e,t]of o)"_v"!==e&&(!l&&u+t>s&&(h-=P,l=!0),!l&&u+t<=h?(a[e]=r[e],u+=t):(c[e]=r[e],l=!0));l&&(a[D]=x);const d=Object.keys(c).length>0;let f=d?JSON.stringify(c):"";return d||(f="{}"),{mappedData:a,body:f}}async function T({resource:e,data:t,mappedData:r}){const i={_v:r._v||String(e.version)};i._map=JSON.stringify(e.schema.map);return{mappedData:i,body:JSON.stringify(r)}}const L={"user-managed":O,"enforce-limits":v,"truncate-data":N,"body-overflow":Object.freeze({__proto__:null,handleGet:async function({resource:e,metadata:t,body:r}){let i={};if(r&&""!==r.trim()){const[e,t,s]=I(()=>JSON.parse(r));i=e?s:{}}const s={...i,...t};return delete s.$overflow,{metadata:s,body:r}},handleInsert:C,handleUpdate:async function({resource:e,id:t,data:r,mappedData:i,originalData:s}){return C({resource:e,data:r,mappedData:i,originalData:s})},handleUpsert:async function({resource:e,id:t,data:r,mappedData:i}){return C({resource:e,data:r,mappedData:i})}}),"body-only":Object.freeze({__proto__:null,handleGet:async function({resource:e,metadata:t,body:r}){let i={};if(r&&""!==r.trim()){const[e,t,s]=I(()=>JSON.parse(r));i=e?s:{}}return{metadata:{...i,...t},body:r}},handleInsert:T,handleUpdate:async function({resource:e,id:t,data:r,mappedData:i}){const s={_v:i._v||String(e.version)};return s._map=JSON.stringify(e.schema.map),{mappedData:s,body:JSON.stringify(i)}},handleUpsert:async function({resource:e,id:t,data:r,mappedData:i}){return T({resource:e,data:r,mappedData:i})}})};function $(e){const t=L[e];if(!t)throw new Error(`Unknown behavior: ${e}. Available behaviors: ${Object.keys(L).join(", ")}`);return t}const M=Object.keys(L),U="user-managed",q="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",F=Object.fromEntries([...q].map((e,t)=>[e,t])),B=e=>{if("number"!=typeof e||isNaN(e))return"undefined";if(!isFinite(e))return"undefined";if(0===e)return q[0];if(e<0)return"-"+B(-Math.floor(e));e=Math.floor(e);let t="";for(;e;)t=q[e%62]+t,e=Math.floor(e/62);return t},z=e=>{if("string"!=typeof e)return NaN;if(""===e)return 0;let t=!1;"-"===e[0]&&(t=!0,e=e.slice(1));let r=0;for(let t=0;t<e.length;t++){const i=F[e[t]];if(void 0===i)return NaN;r=62*r+i}return t?-r:r},V=e=>{if("number"!=typeof e||isNaN(e))return"undefined";if(!isFinite(e))return"undefined";const t=e<0;e=Math.abs(e);const[r,i]=e.toString().split("."),s=B(Number(r));return i?(t?"-":"")+s+"."+i:(t?"-":"")+s},K=e=>{if("string"!=typeof e)return NaN;let t=!1;"-"===e[0]&&(t=!0,e=e.slice(1));const[r,i]=e.split("."),s=z(r);if(isNaN(s))return NaN;const n=i?Number(s+"."+i):s;return t?-n:n};class H extends Error{constructor({verbose:e,bucket:t,key:r,message:i,code:s,statusCode:n,requestId:o,awsMessage:a,original:c,commandName:u,commandInput:l,metadata:h,suggestion:d,...f}){e&&(i+=`\n\nVerbose:\n\n${JSON.stringify(f,null,2)}`),super(i),"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error(i).stack,super.name=this.constructor.name,this.name=this.constructor.name,this.bucket=t,this.key=r,this.thrownAt=new Date,this.code=s,this.statusCode=n,this.requestId=o,this.awsMessage=a,this.original=c,this.commandName=u,this.commandInput=l,this.metadata=h,this.suggestion=d,this.data={bucket:t,key:r,...f,verbose:e,message:i}}toJson(){return{name:this.name,message:this.message,code:this.code,statusCode:this.statusCode,requestId:this.requestId,awsMessage:this.awsMessage,bucket:this.bucket,key:this.key,thrownAt:this.thrownAt,commandName:this.commandName,commandInput:this.commandInput,metadata:this.metadata,suggestion:this.suggestion,data:this.data,original:this.original,stack:this.stack}}toString(){return`${this.name} | ${this.message}`}}class W extends H{constructor(e,t={}){let r,i,s,n,o,a;t.original&&(o=t.original,r=o.code||o.Code||o.name,i=o.statusCode||o.$metadata&&o.$metadata.httpStatusCode,s=o.requestId||o.$metadata&&o.$metadata.requestId,n=o.message,a=o.$metadata?{...o.$metadata}:void 0),super({message:e,...t,code:r,statusCode:i,requestId:s,awsMessage:n,original:o,metadata:a})}}class G extends W{constructor(e,t={}){super(e,t),Object.assign(this,t)}}class J extends W{constructor(e,t={}){super(e,t),Object.assign(this,t)}}class Y extends W{constructor({bucket:e,resourceName:t,id:r,original:i,...s}){if("string"!=typeof r)throw new Error("id must be a string");if("string"!=typeof e)throw new Error("bucket must be a string");if("string"!=typeof t)throw new Error("resourceName must be a string");super(`Resource not found: ${t}/${r} [bucket:${e}]`,{bucket:e,resourceName:t,id:r,original:i,...s})}}class Q extends W{constructor({bucket:e,original:t,...r}){if("string"!=typeof e)throw new Error("bucket must be a string");super(`Bucket does not exists [bucket:${e}]`,{bucket:e,original:t,...r})}}class X extends W{constructor({bucket:e,key:t,resourceName:r,id:i,original:s,...n}){if("string"!=typeof t)throw new Error("key must be a string");if("string"!=typeof e)throw new Error("bucket must be a string");if(void 0!==i&&"string"!=typeof i)throw new Error("id must be a string");super(`No such key: ${t} [bucket:${e}]`,{bucket:e,key:t,resourceName:r,id:i,original:s,...n}),this.resourceName=r,this.id=i}}class Z extends W{constructor({bucket:e,key:t,resourceName:r,id:i,original:s,...n}){if("string"!=typeof t)throw new Error("key must be a string");if("string"!=typeof e)throw new Error("bucket must be a string");super(`Not found: ${t} [bucket:${e}]`,{bucket:e,key:t,resourceName:r,id:i,original:s,...n}),this.resourceName=r,this.id=i}}class ee extends W{constructor({bucket:e,original:t,...r}){if("string"!=typeof e)throw new Error("bucket must be a string");super(`Missing metadata for bucket [bucket:${e}]`,{bucket:e,original:t,...r})}}class te extends W{constructor({bucket:e,resourceName:t,attributes:r,validation:i,message:s,original:n,...o}){if("string"!=typeof e)throw new Error("bucket must be a string");if("string"!=typeof t)throw new Error("resourceName must be a string");super(s||`Validation error: This item is not valid. Resource=${t} [bucket:${e}].\n${JSON.stringify(i,null,2)}`,{bucket:e,resourceName:t,attributes:r,validation:i,original:n,...o})}}class re extends W{}const ie={NotFound:Z,NoSuchKey:X,UnknownError:re,NoSuchBucket:Q,MissingMetadata:ee,InvalidResourceItem:te};function se(e,t={}){const r=e.code||e.Code||e.name,i=e.$metadata?{...e.$metadata}:void 0,s=t.commandName,n=t.commandInput;let o;return"NoSuchKey"===r||"NotFound"===r?(o="Check if the key exists in the specified bucket and if your credentials have permission.",new X({...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o})):"NoSuchBucket"===r?(o="Check if the bucket exists and if your credentials have permission.",new Q({...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o})):"AccessDenied"===r||403===e.statusCode||"Forbidden"===r?(o="Check your credentials and bucket policy.",new J("Access denied",{...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o})):"ValidationError"===r||400===e.statusCode?(o="Check the request parameters and payload.",new G("Validation error",{...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o})):"MissingMetadata"===r?(o="Check if the object metadata is present and valid.",new ee({...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o})):(o="Check the error details and AWS documentation.",new re("Unknown error",{...t,original:e,metadata:i,commandName:s,commandInput:n,suggestion:o}))}class ne extends W{constructor(e,t={}){super(e,{...t,suggestion:"Check the connection string format and credentials."})}}class oe extends W{constructor(e,t={}){super(e,{...t,suggestion:"Check if the crypto library is available and input is valid."})}}class ae extends W{constructor(e,t={}){super(e,{...t,suggestion:"Check schema definition and input data."})}}class ce extends W{constructor(e,t={}){super(e,{...t,suggestion:t.suggestion||"Check resource configuration, attributes, and operation context."}),Object.assign(this,t)}}class ue extends W{constructor(e,t={}){super(e,{...t,suggestion:t.suggestion||"Check partition definition, fields, and input values."})}}async function le(){let e;if("undefined"!=typeof process){const[t,r,i]=await A(async()=>{const{webcrypto:e}=await import("crypto");return e});if(!t)throw new oe("Crypto API not available",{original:r,context:"dynamicCrypto"});e=i}else"undefined"!=typeof window&&(e=window.crypto);if(!e)throw new oe("Could not load any crypto library",{context:"dynamicCrypto"});return e}async function he(e){const[t,r,i]=await A(le);if(!t)throw new oe("Crypto API not available",{original:r});const s=(new TextEncoder).encode(e),[n,o,a]=await A(()=>i.subtle.digest("SHA-256",s));if(!n)throw new oe("SHA-256 digest failed",{original:o,input:e});return Array.from(new Uint8Array(a)).map(e=>e.toString(16).padStart(2,"0")).join("")}async function de(e,t){const[r,i,s]=await A(le);if(!r)throw new oe("Crypto API not available",{original:i});const n=s.getRandomValues(new Uint8Array(16)),[o,a,c]=await A(()=>ge(t,n));if(!o)throw new oe("Key derivation failed",{original:a,passphrase:t,salt:n});const u=s.getRandomValues(new Uint8Array(12)),l=(new TextEncoder).encode(e),[h,d,f]=await A(()=>s.subtle.encrypt({name:"AES-GCM",iv:u},c,l));if(!h)throw new oe("Encryption failed",{original:d,content:e});const p=new Uint8Array(n.length+u.length+f.byteLength);return p.set(n),p.set(u,n.length),p.set(new Uint8Array(f),n.length+u.length),function(e){if("undefined"!=typeof process)return Buffer.from(e).toString("base64");{const[t,r,i]=I(()=>String.fromCharCode.apply(null,new Uint8Array(e)));if(!t)throw new oe("Failed to convert ArrayBuffer to base64 (browser)",{original:r});return window.btoa(i)}}(p)}async function fe(e,t){const[r,i,s]=await A(le);if(!r)throw new oe("Crypto API not available",{original:i});const n=function(e){if("undefined"!=typeof process)return new Uint8Array(Buffer.from(e,"base64"));{const[t,r,i]=I(()=>window.atob(e));if(!t)throw new oe("Failed to decode base64 (browser)",{original:r});const s=i.length,n=new Uint8Array(s);for(let e=0;e<s;e++)n[e]=i.charCodeAt(e);return n}}(e),o=n.slice(0,16),a=n.slice(16,28),c=n.slice(28),[u,l,h]=await A(()=>ge(t,o));if(!u)throw new oe("Key derivation failed (decrypt)",{original:l,passphrase:t,salt:o});const[d,f,p]=await A(()=>s.subtle.decrypt({name:"AES-GCM",iv:a},h,c));if(!d)throw new oe("Decryption failed",{original:f,encryptedBase64:e});return(new TextDecoder).decode(p)}async function pe(e){if("undefined"==typeof process)throw new oe("MD5 hashing is only available in Node.js environment",{context:"md5"});const[t,r,i]=await A(async()=>{const{createHash:t}=await import("crypto");return t("md5").update(e).digest("base64")});if(!t)throw new oe("MD5 hashing failed",{original:r,data:e});return i}async function ge(e,t){const[r,i,s]=await A(le);if(!r)throw new oe("Crypto API not available",{original:i});const n=(new TextEncoder).encode(e),[o,a,c]=await A(()=>s.subtle.importKey("raw",n,{name:"PBKDF2"},!1,["deriveKey"]));if(!o)throw new oe("importKey failed",{original:a,passphrase:e});const[u,l,h]=await A(()=>s.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:1e5,hash:"SHA-256"},c,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]));if(!u)throw new oe("deriveKey failed",{original:l,passphrase:e,salt:t});return h}const me=t.customAlphabet(t.urlAlphabet,22),ye=t.customAlphabet("ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789",16);var be;function we(){}function ve(){ve.init.call(this)}function Oe(e){return void 0===e._maxListeners?ve.defaultMaxListeners:e._maxListeners}function ke(e,t,r,i){var s,n,o,a;if("function"!=typeof r)throw new TypeError('"listener" argument must be a function');if((n=e._events)?(n.newListener&&(e.emit("newListener",t,r.listener?r.listener:r),n=e._events),o=n[t]):(n=e._events=new we,e._eventsCount=0),o){if("function"==typeof o?o=n[t]=i?[r,o]:[o,r]:i?o.unshift(r):o.push(r),!o.warned&&(s=Oe(e))&&s>0&&o.length>s){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+t+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,a=c,"function"==typeof console.warn?console.warn(a):console.log(a)}}else o=n[t]=r,++e._eventsCount;return e}function Se(e,t,r){var i=!1;function s(){e.removeListener(t,s),i||(i=!0,r.apply(e,arguments))}return s.listener=r,s}function _e(e){var t=this._events;if(t){var r=t[e];if("function"==typeof r)return 1;if(r)return r.length}return 0}function Re(e,t){for(var r=new Array(t);t--;)r[t]=e[t];return r}we.prototype=Object.create(null),ve.EventEmitter=ve,ve.usingDomains=!1,ve.prototype.domain=void 0,ve.prototype._events=void 0,ve.prototype._maxListeners=void 0,ve.defaultMaxListeners=10,ve.init=function(){this.domain=null,ve.usingDomains&&(!be.active||this instanceof be.Domain||(this.domain=be.active)),this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=new we,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},ve.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw new TypeError('"n" argument must be a positive number');return this._maxListeners=e,this},ve.prototype.getMaxListeners=function(){return Oe(this)},ve.prototype.emit=function(e){var t,r,i,s,n,o,a,c="error"===e;if(o=this._events)c=c&&null==o.error;else if(!c)return!1;if(a=this.domain,c){if(t=arguments[1],!a){if(t instanceof Error)throw t;var u=new Error('Uncaught, unspecified "error" event. ('+t+")");throw u.context=t,u}return t||(t=new Error('Uncaught, unspecified "error" event')),t.domainEmitter=this,t.domain=a,t.domainThrown=!1,a.emit("error",t),!1}if(!(r=o[e]))return!1;var l="function"==typeof r;switch(i=arguments.length){case 1:!function(e,t,r){if(t)e.call(r);else for(var i=e.length,s=Re(e,i),n=0;n<i;++n)s[n].call(r)}(r,l,this);break;case 2:!function(e,t,r,i){if(t)e.call(r,i);else for(var s=e.length,n=Re(e,s),o=0;o<s;++o)n[o].call(r,i)}(r,l,this,arguments[1]);break;case 3:!function(e,t,r,i,s){if(t)e.call(r,i,s);else for(var n=e.length,o=Re(e,n),a=0;a<n;++a)o[a].call(r,i,s)}(r,l,this,arguments[1],arguments[2]);break;case 4:!function(e,t,r,i,s,n){if(t)e.call(r,i,s,n);else for(var o=e.length,a=Re(e,o),c=0;c<o;++c)a[c].call(r,i,s,n)}(r,l,this,arguments[1],arguments[2],arguments[3]);break;default:for(s=new Array(i-1),n=1;n<i;n++)s[n-1]=arguments[n];!function(e,t,r,i){if(t)e.apply(r,i);else for(var s=e.length,n=Re(e,s),o=0;o<s;++o)n[o].apply(r,i)}(r,l,this,s)}return!0},ve.prototype.addListener=function(e,t){return ke(this,e,t,!1)},ve.prototype.on=ve.prototype.addListener,ve.prototype.prependListener=function(e,t){return ke(this,e,t,!0)},ve.prototype.once=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.on(e,Se(this,e,t)),this},ve.prototype.prependOnceListener=function(e,t){if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');return this.prependListener(e,Se(this,e,t)),this},ve.prototype.removeListener=function(e,t){var r,i,s,n,o;if("function"!=typeof t)throw new TypeError('"listener" argument must be a function');if(!(i=this._events))return this;if(!(r=i[e]))return this;if(r===t||r.listener&&r.listener===t)0===--this._eventsCount?this._events=new we:(delete i[e],i.removeListener&&this.emit("removeListener",e,r.listener||t));else if("function"!=typeof r){for(s=-1,n=r.length;n-- >0;)if(r[n]===t||r[n].listener&&r[n].listener===t){o=r[n].listener,s=n;break}if(s<0)return this;if(1===r.length){if(r[0]=void 0,0===--this._eventsCount)return this._events=new we,this;delete i[e]}else!function(e,t){for(var r=t,i=r+1,s=e.length;i<s;r+=1,i+=1)e[r]=e[i];e.pop()}(r,s);i.removeListener&&this.emit("removeListener",e,o||t)}return this},ve.prototype.off=function(e,t){return this.removeListener(e,t)},ve.prototype.removeAllListeners=function(e){var t,r;if(!(r=this._events))return this;if(!r.removeListener)return 0===arguments.length?(this._events=new we,this._eventsCount=0):r[e]&&(0===--this._eventsCount?this._events=new we:delete r[e]),this;if(0===arguments.length){for(var i,s=Object.keys(r),n=0;n<s.length;++n)"removeListener"!==(i=s[n])&&this.removeAllListeners(i);return this.removeAllListeners("removeListener"),this._events=new we,this._eventsCount=0,this}if("function"==typeof(t=r[e]))this.removeListener(e,t);else if(t)do{this.removeListener(e,t[t.length-1])}while(t[0]);return this},ve.prototype.listeners=function(e){var t,r=this._events;return r&&(t=r[e])?"function"==typeof t?[t.listener||t]:function(e){for(var t=new Array(e.length),r=0;r<t.length;++r)t[r]=e[r].listener||e[r];return t}(t):[]},ve.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):_e.call(e,t)},ve.prototype.listenerCount=_e,ve.prototype.eventNames=function(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};class je extends ve{constructor(e={}){super(),this.name=this.constructor.name,this.options=e,this.hooks=new Map}async setup(e){this.database=e,this.beforeSetup(),await this.onSetup(),this.afterSetup()}async start(){this.beforeStart(),await this.onStart(),this.afterStart()}async stop(){this.beforeStop(),await this.onStop(),this.afterStop()}async onSetup(){}async onStart(){}async onStop(){}addHook(e,t,r){this.hooks.has(e)||this.hooks.set(e,new Map);const i=this.hooks.get(e);i.has(t)||i.set(t,[]),i.get(t).push(r)}removeHook(e,t,r){const i=this.hooks.get(e);if(i&&i.has(t)){const e=i.get(t),s=e.indexOf(r);s>-1&&e.splice(s,1)}}wrapResourceMethod(e,t,r){const i=e[t];if(e._pluginWrappers||(e._pluginWrappers=new Map),e._pluginWrappers.has(t)||e._pluginWrappers.set(t,[]),e._pluginWrappers.get(t).push(r),!e[`_wrapped_${t}`]){e[`_wrapped_${t}`]=i;const r=i&&i._isMockFunction;e[t]=async function(...r){let i=await e[`_wrapped_${t}`](...r);for(const s of e._pluginWrappers.get(t))i=await s.call(this,i,r,t);return i},r&&(Object.setPrototypeOf(e[t],Object.getPrototypeOf(i)),Object.assign(e[t],i))}}addMiddleware(e,t,r){if(e._pluginMiddlewares||(e._pluginMiddlewares={}),!e._pluginMiddlewares[t]){e._pluginMiddlewares[t]=[];const r=e[t].bind(e);e[t]=async function(...i){let s=-1;const n=async(...i)=>(s++,s<e._pluginMiddlewares[t].length?await e._pluginMiddlewares[t][s].call(this,n,...i):await r(...i));return await n(...i)}}e._pluginMiddlewares[t].push(r)}getPartitionValues(e,t){if(!t.config?.partitions)return{};const r={};for(const[i,s]of Object.entries(t.config.partitions))if(s.fields){r[i]={};for(const[n,o]of Object.entries(s.fields)){const s=this.getNestedFieldValue(e,n);null!=s&&(r[i][n]=t.applyPartitionRule(s,o))}}else r[i]={};return r}getNestedFieldValue(e,t){if(!t.includes("."))return e[t]??null;const r=t.split(".");let i=e;for(const e of r){if(!i||"object"!=typeof i||!(e in i))return null;i=i[e]}return i??null}beforeSetup(){this.emit("plugin.beforeSetup",new Date)}afterSetup(){this.emit("plugin.afterSetup",new Date)}beforeStart(){this.emit("plugin.beforeStart",new Date)}afterStart(){this.emit("plugin.afterStart",new Date)}beforeStop(){this.emit("plugin.beforeStop",new Date)}afterStop(){this.emit("plugin.afterStop",new Date)}}const Ee={setup(e){},start(){},stop(){}};function Ne(e,t){for(var r=0,i=e.length-1;i>=0;i--){var s=e[i];"."===s?e.splice(i,1):".."===s?(e.splice(i,1),r++):r&&(e.splice(i,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}var Ae=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,Ie=function(e){return Ae.exec(e).slice(1)};function De(){for(var e="",t=!1,r=arguments.length-1;r>=-1&&!t;r--){var i=r>=0?arguments[r]:"/";if("string"!=typeof i)throw new TypeError("Arguments to path.resolve must be strings");i&&(e=i+"/"+e,t="/"===i.charAt(0))}return(t?"/":"")+(e=Ne(Le(e.split("/"),function(e){return!!e}),!t).join("/"))||"."}function xe(e){var t=Pe(e),r="/"===$e(e,-1);return(e=Ne(Le(e.split("/"),function(e){return!!e}),!t).join("/"))||t||(e="."),e&&r&&(e+="/"),(t?"/":"")+e}function Pe(e){return"/"===e.charAt(0)}function Ce(){return xe(Le(Array.prototype.slice.call(arguments,0),function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))}var Te={extname:function(e){return Ie(e)[3]},basename:function(e,t){var r=Ie(e)[2];return t&&r.substr(-1*t.length)===t&&(r=r.substr(0,r.length-t.length)),r},dirname:function(e){var t=Ie(e),r=t[0],i=t[1];return r||i?(i&&(i=i.substr(0,i.length-1)),r+i):"."},sep:"/",delimiter:":",relative:function(e,t){function r(e){for(var t=0;t<e.length&&""===e[t];t++);for(var r=e.length-1;r>=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=De(e).substr(1),t=De(t).substr(1);for(var i=r(e.split("/")),s=r(t.split("/")),n=Math.min(i.length,s.length),o=n,a=0;a<n;a++)if(i[a]!==s[a]){o=a;break}var c=[];for(a=o;a<i.length;a++)c.push("..");return(c=c.concat(s.slice(o))).join("/")},join:Ce,isAbsolute:Pe,normalize:xe,resolve:De};function Le(e,t){if(e.filter)return e.filter(t);for(var r=[],i=0;i<e.length;i++)t(e[i],i,e)&&r.push(e[i]);return r}var $e="b"==="ab".substr(-1)?function(e,t,r){return e.substr(t,r)}:function(e,t,r){return t<0&&(t=e.length+t),e.substr(t,r)};class Me extends ve{constructor(e={}){super(),this.config=e}async _set(e,t){}async _get(e){}async _del(e){}async _clear(e){}validateKey(e){if(null==e||"string"!=typeof e||!e)throw new Error("Invalid key")}async set(e,t){return this.validateKey(e),await this._set(e,t),this.emit("set",t),t}async get(e){this.validateKey(e);const t=await this._get(e);return this.emit("get",t),t}async del(e){this.validateKey(e);const t=await this._del(e);return this.emit("delete",t),t}async delete(e){return this.del(e)}async clear(e){const t=await this._clear(e);return this.emit("clear",t),t}}var Ue="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},qe=[],Fe=[],Be="undefined"!=typeof Uint8Array?Uint8Array:Array,ze=!1;function Ve(){ze=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0;t<64;++t)qe[t]=e[t],Fe[e.charCodeAt(t)]=t;Fe["-".charCodeAt(0)]=62,Fe["_".charCodeAt(0)]=63}function Ke(e){return qe[e>>18&63]+qe[e>>12&63]+qe[e>>6&63]+qe[63&e]}function He(e,t,r){for(var i,s=[],n=t;n<r;n+=3)i=(e[n]<<16)+(e[n+1]<<8)+e[n+2],s.push(Ke(i));return s.join("")}function We(e){var t;ze||Ve();for(var r=e.length,i=r%3,s="",n=[],o=16383,a=0,c=r-i;a<c;a+=o)n.push(He(e,a,a+o>c?c:a+o));return 1===i?(t=e[r-1],s+=qe[t>>2],s+=qe[t<<4&63],s+="=="):2===i&&(t=(e[r-2]<<8)+e[r-1],s+=qe[t>>10],s+=qe[t>>4&63],s+=qe[t<<2&63],s+="="),n.push(s),n.join("")}function Ge(e,t,r,i,s){var n,o,a=8*s-i-1,c=(1<<a)-1,u=c>>1,l=-7,h=r?s-1:0,d=r?-1:1,f=e[t+h];for(h+=d,n=f&(1<<-l)-1,f>>=-l,l+=a;l>0;n=256*n+e[t+h],h+=d,l-=8);for(o=n&(1<<-l)-1,n>>=-l,l+=i;l>0;o=256*o+e[t+h],h+=d,l-=8);if(0===n)n=1-u;else{if(n===c)return o?NaN:1/0*(f?-1:1);o+=Math.pow(2,i),n-=u}return(f?-1:1)*o*Math.pow(2,n-i)}function Je(e,t,r,i,s,n){var o,a,c,u=8*n-s-1,l=(1<<u)-1,h=l>>1,d=23===s?Math.pow(2,-24)-Math.pow(2,-77):0,f=i?0:n-1,p=i?1:-1,g=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(a=isNaN(t)?1:0,o=l):(o=Math.floor(Math.log(t)/Math.LN2),t*(c=Math.pow(2,-o))<1&&(o--,c*=2),(t+=o+h>=1?d/c:d*Math.pow(2,1-h))*c>=2&&(o++,c/=2),o+h>=l?(a=0,o=l):o+h>=1?(a=(t*c-1)*Math.pow(2,s),o+=h):(a=t*Math.pow(2,h-1)*Math.pow(2,s),o=0));s>=8;e[r+f]=255&a,f+=p,a/=256,s-=8);for(o=o<<s|a,u+=s;u>0;e[r+f]=255&o,f+=p,o/=256,u-=8);e[r+f-p]|=128*g}var Ye={}.toString,Qe=Array.isArray||function(e){return"[object Array]"==Ye.call(e)};function Xe(){return et.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Ze(e,t){if(Xe()<t)throw new RangeError("Invalid typed array length");return et.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=et.prototype:(null===e&&(e=new et(t)),e.length=t),e}function et(e,t,r){if(!(et.TYPED_ARRAY_SUPPORT||this instanceof et))return new et(e,t,r);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return it(this,e)}return tt(this,e,t,r)}function tt(e,t,r,i){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,r,i){if(t.byteLength,r<0||t.byteLength<r)throw new RangeError("'offset' is out of bounds");if(t.byteLength<r+(i||0))throw new RangeError("'length' is out of bounds");t=void 0===r&&void 0===i?new Uint8Array(t):void 0===i?new Uint8Array(t,r):new Uint8Array(t,r,i);et.TYPED_ARRAY_SUPPORT?(e=t).__proto__=et.prototype:e=st(e,t);return e}(e,t,r,i):"string"==typeof t?function(e,t,r){"string"==typeof r&&""!==r||(r="utf8");if(!et.isEncoding(r))throw new TypeError('"encoding" must be a valid string encoding');var i=0|at(t,r);e=Ze(e,i);var s=e.write(t,r);s!==i&&(e=e.slice(0,s));return e}(e,t,r):function(e,t){if(ot(t)){var r=0|nt(t.length);return 0===(e=Ze(e,r)).length||t.copy(e,0,0,r),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(i=t.length)!=i?Ze(e,0):st(e,t);if("Buffer"===t.type&&Qe(t.data))return st(e,t.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function rt(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function it(e,t){if(rt(t),e=Ze(e,t<0?0:0|nt(t)),!et.TYPED_ARRAY_SUPPORT)for(var r=0;r<t;++r)e[r]=0;return e}function st(e,t){var r=t.length<0?0:0|nt(t.length);e=Ze(e,r);for(var i=0;i<r;i+=1)e[i]=255&t[i];return e}function nt(e){if(e>=Xe())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Xe().toString(16)+" bytes");return 0|e}function ot(e){return!(null==e||!e._isBuffer)}function at(e,t){if(ot(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return Ct(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return Tt(e).length;default:if(i)return Ct(e).length;t=(""+t).toLowerCase(),i=!0}}function ct(e,t,r){var i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return St(this,t,r);case"utf8":case"utf-8":return wt(this,t,r);case"ascii":return Ot(this,t,r);case"latin1":case"binary":return kt(this,t,r);case"base64":return bt(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _t(this,t,r);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function ut(e,t,r){var i=e[t];e[t]=e[r],e[r]=i}function lt(e,t,r,i,s){if(0===e.length)return-1;if("string"==typeof r?(i=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=s?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(s)return-1;r=e.length-1}else if(r<0){if(!s)return-1;r=0}if("string"==typeof t&&(t=et.from(t,i)),ot(t))return 0===t.length?-1:ht(e,t,r,i,s);if("number"==typeof t)return t&=255,et.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?s?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):ht(e,[t],r,i,s);throw new TypeError("val must be string, number or Buffer")}function ht(e,t,r,i,s){var n,o=1,a=e.length,c=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;o=2,a/=2,c/=2,r/=2}function u(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(s){var l=-1;for(n=r;n<a;n++)if(u(e,n)===u(t,-1===l?0:n-l)){if(-1===l&&(l=n),n-l+1===c)return l*o}else-1!==l&&(n-=n-l),l=-1}else for(r+c>a&&(r=a-c),n=r;n>=0;n--){for(var h=!0,d=0;d<c;d++)if(u(e,n+d)!==u(t,d)){h=!1;break}if(h)return n}return-1}function dt(e,t,r,i){r=Number(r)||0;var s=e.length-r;i?(i=Number(i))>s&&(i=s):i=s;var n=t.length;if(n%2!=0)throw new TypeError("Invalid hex string");i>n/2&&(i=n/2);for(var o=0;o<i;++o){var a=parseInt(t.substr(2*o,2),16);if(isNaN(a))return o;e[r+o]=a}return o}function ft(e,t,r,i){return Lt(Ct(t,e.length-r),e,r,i)}function pt(e,t,r,i){return Lt(function(e){for(var t=[],r=0;r<e.length;++r)t.push(255&e.charCodeAt(r));return t}(t),e,r,i)}function gt(e,t,r,i){return pt(e,t,r,i)}function mt(e,t,r,i){return Lt(Tt(t),e,r,i)}function yt(e,t,r,i){return Lt(function(e,t){for(var r,i,s,n=[],o=0;o<e.length&&!((t-=2)<0);++o)i=(r=e.charCodeAt(o))>>8,s=r%256,n.push(s),n.push(i);return n}(t,e.length-r),e,r,i)}function bt(e,t,r){return 0===t&&r===e.length?We(e):We(e.slice(t,r))}function wt(e,t,r){r=Math.min(e.length,r);for(var i=[],s=t;s<r;){var n,o,a,c,u=e[s],l=null,h=u>239?4:u>223?3:u>191?2:1;if(s+h<=r)switch(h){case 1:u<128&&(l=u);break;case 2:128==(192&(n=e[s+1]))&&(c=(31&u)<<6|63&n)>127&&(l=c);break;case 3:n=e[s+1],o=e[s+2],128==(192&n)&&128==(192&o)&&(c=(15&u)<<12|(63&n)<<6|63&o)>2047&&(c<55296||c>57343)&&(l=c);break;case 4:n=e[s+1],o=e[s+2],a=e[s+3],128==(192&n)&&128==(192&o)&&128==(192&a)&&(c=(15&u)<<18|(63&n)<<12|(63&o)<<6|63&a)>65535&&c<1114112&&(l=c)}null===l?(l=65533,h=1):l>65535&&(l-=65536,i.push(l>>>10&1023|55296),l=56320|1023&l),i.push(l),s+=h}return function(e){var t=e.length;if(t<=vt)return String.fromCharCode.apply(String,e);var r="",i=0;for(;i<t;)r+=String.fromCharCode.apply(String,e.slice(i,i+=vt));return r}(i)}et.TYPED_ARRAY_SUPPORT=void 0===Ue.TYPED_ARRAY_SUPPORT||Ue.TYPED_ARRAY_SUPPORT,Xe(),et.poolSize=8192,et._augment=function(e){return e.__proto__=et.prototype,e},et.from=function(e,t,r){return tt(null,e,t,r)},et.TYPED_ARRAY_SUPPORT&&(et.prototype.__proto__=Uint8Array.prototype,et.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&et[Symbol.species]),et.alloc=function(e,t,r){return function(e,t,r,i){return rt(t),t<=0?Ze(e,t):void 0!==r?"string"==typeof i?Ze(e,t).fill(r,i):Ze(e,t).fill(r):Ze(e,t)}(null,e,t,r)},et.allocUnsafe=function(e){return it(null,e)},et.allocUnsafeSlow=function(e){return it(null,e)},et.isBuffer=function(e){return null!=e&&(!!e._isBuffer||$t(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&$t(e.slice(0,0))}(e))},et.compare=function(e,t){if(!ot(e)||!ot(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,i=t.length,s=0,n=Math.min(r,i);s<n;++s)if(e[s]!==t[s]){r=e[s],i=t[s];break}return r<i?-1:i<r?1:0},et.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},et.concat=function(e,t){if(!Qe(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return et.alloc(0);var r;if(void 0===t)for(t=0,r=0;r<e.length;++r)t+=e[r].length;var i=et.allocUnsafe(t),s=0;for(r=0;r<e.length;++r){var n=e[r];if(!ot(n))throw new TypeError('"list" argument must be an Array of Buffers');n.copy(i,s),s+=n.length}return i},et.byteLength=at,et.prototype._isBuffer=!0,et.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)ut(this,t,t+1);return this},et.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)ut(this,t,t+3),ut(this,t+1,t+2);return this},et.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)ut(this,t,t+7),ut(this,t+1,t+6),ut(this,t+2,t+5),ut(this,t+3,t+4);return this},et.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?wt(this,0,e):ct.apply(this,arguments)},et.prototype.equals=function(e){if(!ot(e))throw new TypeError("Argument must be a Buffer");return this===e||0===et.compare(this,e)},et.prototype.inspect=function(){var e="";return this.length>0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),"<Buffer "+e+">"},et.prototype.compare=function(e,t,r,i,s){if(!ot(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===i&&(i=0),void 0===s&&(s=this.length),t<0||r>e.length||i<0||s>this.length)throw new RangeError("out of range index");if(i>=s&&t>=r)return 0;if(i>=s)return-1;if(t>=r)return 1;if(this===e)return 0;for(var n=(s>>>=0)-(i>>>=0),o=(r>>>=0)-(t>>>=0),a=Math.min(n,o),c=this.slice(i,s),u=e.slice(t,r),l=0;l<a;++l)if(c[l]!==u[l]){n=c[l],o=u[l];break}return n<o?-1:o<n?1:0},et.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},et.prototype.indexOf=function(e,t,r){return lt(this,e,t,r,!0)},et.prototype.lastIndexOf=function(e,t,r){return lt(this,e,t,r,!1)},et.prototype.write=function(e,t,r,i){if(void 0===t)i="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)i=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(r)?(r|=0,void 0===i&&(i="utf8")):(i=r,r=void 0)}var s=this.length-t;if((void 0===r||r>s)&&(r=s),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var n=!1;;)switch(i){case"hex":return dt(this,e,t,r);case"utf8":case"utf-8":return ft(this,e,t,r);case"ascii":return pt(this,e,t,r);case"latin1":case"binary":return gt(this,e,t,r);case"base64":return mt(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return yt(this,e,t,r);default:if(n)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),n=!0}},et.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var vt=4096;function Ot(e,t,r){var i="";r=Math.min(e.length,r);for(var s=t;s<r;++s)i+=String.fromCharCode(127&e[s]);return i}function kt(e,t,r){var i="";r=Math.min(e.length,r);for(var s=t;s<r;++s)i+=String.fromCharCode(e[s]);return i}function St(e,t,r){var i=e.length;(!t||t<0)&&(t=0),(!r||r<0||r>i)&&(r=i);for(var s="",n=t;n<r;++n)s+=Pt(e[n]);return s}function _t(e,t,r){for(var i=e.slice(t,r),s="",n=0;n<i.length;n+=2)s+=String.fromCharCode(i[n]+256*i[n+1]);return s}function Rt(e,t,r){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function jt(e,t,r,i,s,n){if(!ot(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>s||t<n)throw new RangeError('"value" argument is out of bounds');if(r+i>e.length)throw new RangeError("Index out of range")}function Et(e,t,r,i){t<0&&(t=65535+t+1);for(var s=0,n=Math.min(e.length-r,2);s<n;++s)e[r+s]=(t&255<<8*(i?s:1-s))>>>8*(i?s:1-s)}function Nt(e,t,r,i){t<0&&(t=4294967295+t+1);for(var s=0,n=Math.min(e.length-r,4);s<n;++s)e[r+s]=t>>>8*(i?s:3-s)&255}function At(e,t,r,i,s,n){if(r+i>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function It(e,t,r,i,s){return s||At(e,0,r,4),Je(e,t,r,i,23,4),r+4}function Dt(e,t,r,i,s){return s||At(e,0,r,8),Je(e,t,r,i,52,8),r+8}et.prototype.slice=function(e,t){var r,i=this.length;if((e=~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),(t=void 0===t?i:~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),t<e&&(t=e),et.TYPED_ARRAY_SUPPORT)(r=this.subarray(e,t)).__proto__=et.prototype;else{var s=t-e;r=new et(s,void 0);for(var n=0;n<s;++n)r[n]=this[n+e]}return r},et.prototype.readUIntLE=function(e,t,r){e|=0,t|=0,r||Rt(e,t,this.length);for(var i=this[e],s=1,n=0;++n<t&&(s*=256);)i+=this[e+n]*s;return i},et.prototype.readUIntBE=function(e,t,r){e|=0,t|=0,r||Rt(e,t,this.length);for(var i=this[e+--t],s=1;t>0&&(s*=256);)i+=this[e+--t]*s;return i},et.prototype.readUInt8=function(e,t){return t||Rt(e,1,this.length),this[e]},et.prototype.readUInt16LE=function(e,t){return t||Rt(e,2,this.length),this[e]|this[e+1]<<8},et.prototype.readUInt16BE=function(e,t){return t||Rt(e,2,this.length),this[e]<<8|this[e+1]},et.prototype.readUInt32LE=function(e,t){return t||Rt(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},et.prototype.readUInt32BE=function(e,t){return t||Rt(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},et.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||Rt(e,t,this.length);for(var i=this[e],s=1,n=0;++n<t&&(s*=256);)i+=this[e+n]*s;return i>=(s*=128)&&(i-=Math.pow(2,8*t)),i},et.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||Rt(e,t,this.length);for(var i=t,s=1,n=this[e+--i];i>0&&(s*=256);)n+=this[e+--i]*s;return n>=(s*=128)&&(n-=Math.pow(2,8*t)),n},et.prototype.readInt8=function(e,t){return t||Rt(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},et.prototype.readInt16LE=function(e,t){t||Rt(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},et.prototype.readInt16BE=function(e,t){t||Rt(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},et.prototype.readInt32LE=function(e,t){return t||Rt(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},et.prototype.readInt32BE=function(e,t){return t||Rt(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},et.prototype.readFloatLE=function(e,t){return t||Rt(e,4,this.length),Ge(this,e,!0,23,4)},et.prototype.readFloatBE=function(e,t){return t||Rt(e,4,this.length),Ge(this,e,!1,23,4)},et.prototype.readDoubleLE=function(e,t){return t||Rt(e,8,this.length),Ge(this,e,!0,52,8)},et.prototype.readDoubleBE=function(e,t){return t||Rt(e,8,this.length),Ge(this,e,!1,52,8)},et.prototype.writeUIntLE=function(e,t,r,i){(e=+e,t|=0,r|=0,i)||jt(this,e,t,r,Math.pow(2,8*r)-1,0);var s=1,n=0;for(this[t]=255&e;++n<r&&(s*=256);)this[t+n]=e/s&255;return t+r},et.prototype.writeUIntBE=function(e,t,r,i){(e=+e,t|=0,r|=0,i)||jt(this,e,t,r,Math.pow(2,8*r)-1,0);var s=r-1,n=1;for(this[t+s]=255&e;--s>=0&&(n*=256);)this[t+s]=e/n&255;return t+r},et.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||jt(this,e,t,1,255,0),et.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},et.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||jt(this,e,t,2,65535,0),et.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Et(this,e,t,!0),t+2},et.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||jt(this,e,t,2,65535,0),et.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Et(this,e,t,!1),t+2},et.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||jt(this,e,t,4,4294967295,0),et.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):Nt(this,e,t,!0),t+4},et.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||jt(this,e,t,4,4294967295,0),et.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Nt(this,e,t,!1),t+4},et.prototype.writeIntLE=function(e,t,r,i){if(e=+e,t|=0,!i){var s=Math.pow(2,8*r-1);jt(this,e,t,r,s-1,-s)}var n=0,o=1,a=0;for(this[t]=255&e;++n<r&&(o*=256);)e<0&&0===a&&0!==this[t+n-1]&&(a=1),this[t+n]=(e/o|0)-a&255;return t+r},et.prototype.writeIntBE=function(e,t,r,i){if(e=+e,t|=0,!i){var s=Math.pow(2,8*r-1);jt(this,e,t,r,s-1,-s)}var n=r-1,o=1,a=0;for(this[t+n]=255&e;--n>=0&&(o*=256);)e<0&&0===a&&0!==this[t+n+1]&&(a=1),this[t+n]=(e/o|0)-a&255;return t+r},et.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||jt(this,e,t,1,127,-128),et.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},et.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||jt(this,e,t,2,32767,-32768),et.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Et(this,e,t,!0),t+2},et.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||jt(this,e,t,2,32767,-32768),et.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Et(this,e,t,!1),t+2},et.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||jt(this,e,t,4,2147483647,-2147483648),et.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):Nt(this,e,t,!0),t+4},et.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||jt(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),et.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Nt(this,e,t,!1),t+4},et.prototype.writeFloatLE=function(e,t,r){return It(this,e,t,!0,r)},et.prototype.writeFloatBE=function(e,t,r){return It(this,e,t,!1,r)},et.prototype.writeDoubleLE=function(e,t,r){return Dt(this,e,t,!0,r)},et.prototype.writeDoubleBE=function(e,t,r){return Dt(this,e,t,!1,r)},et.prototype.copy=function(e,t,r,i){if(r||(r=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<r&&(i=r),i===r)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-r&&(i=e.length-t+r);var s,n=i-r;if(this===e&&r<t&&t<i)for(s=n-1;s>=0;--s)e[s+t]=this[s+r];else if(n<1e3||!et.TYPED_ARRAY_SUPPORT)for(s=0;s<n;++s)e[s+t]=this[s+r];else Uint8Array.prototype.set.call(e,this.subarray(r,r+n),t);return n},et.prototype.fill=function(e,t,r,i){if("string"==typeof e){if("string"==typeof t?(i=t,t=0,r=this.length):"string"==typeof r&&(i=r,r=this.length),1===e.length){var s=e.charCodeAt(0);s<256&&(e=s)}if(void 0!==i&&"string"!=typeof i)throw new TypeError("encoding must be a string");if("string"==typeof i&&!et.isEncoding(i))throw new TypeError("Unknown encoding: "+i)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<r)throw new RangeError("Out of range index");if(r<=t)return this;var n;if(t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(n=t;n<r;++n)this[n]=e;else{var o=ot(e)?e:Ct(new et(e,i).toString()),a=o.length;for(n=0;n<r-t;++n)this[n+t]=o[n%a]}return this};var xt=/[^+\/0-9A-Za-z-_]/g;function Pt(e){return e<16?"0"+e.toString(16):e.toString(16)}function Ct(e,t){var r;t=t||1/0;for(var i=e.length,s=null,n=[],o=0;o<i;++o){if((r=e.charCodeAt(o))>55295&&r<57344){if(!s){if(r>56319){(t-=3)>-1&&n.push(239,191,189);continue}if(o+1===i){(t-=3)>-1&&n.push(239,191,189);continue}s=r;continue}if(r<56320){(t-=3)>-1&&n.push(239,191,189),s=r;continue}r=65536+(s-55296<<10|r-56320)}else s&&(t-=3)>-1&&n.push(239,191,189);if(s=null,r<128){if((t-=1)<0)break;n.push(r)}else if(r<2048){if((t-=2)<0)break;n.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;n.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;n.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return n}function Tt(e){return function(e){var t,r,i,s,n,o;ze||Ve();var a=e.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");n="="===e[a-2]?2:"="===e[a-1]?1:0,o=new Be(3*a/4-n),i=n>0?a-4:a;var c=0;for(t=0,r=0;t<i;t+=4,r+=3)s=Fe[e.charCodeAt(t)]<<18|Fe[e.charCodeAt(t+1)]<<12|Fe[e.charCodeAt(t+2)]<<6|Fe[e.charCodeAt(t+3)],o[c++]=s>>16&255,o[c++]=s>>8&255,o[c++]=255&s;return 2===n?(s=Fe[e.charCodeAt(t)]<<2|Fe[e.charCodeAt(t+1)]>>4,o[c++]=255&s):1===n&&(s=Fe[e.charCodeAt(t)]<<10|Fe[e.charCodeAt(t+1)]<<4|Fe[e.charCodeAt(t+2)]>>2,o[c++]=s>>8&255,o[c++]=255&s),o}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(xt,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function Lt(e,t,r,i){for(var s=0;s<i&&!(s+r>=t.length||s>=e.length);++s)t[s+r]=e[s];return s}function $t(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function Mt(){throw new Error("setTimeout has not been defined")}function Ut(){throw new Error("clearTimeout has not been defined")}var qt=Mt,Ft=Ut;function Bt(e){if(qt===setTimeout)return setTimeout(e,0);if((qt===Mt||!qt)&&setTimeout)return qt=setTimeout,setTimeout(e,0);try{return qt(e,0)}catch(t){try{return qt.call(null,e,0)}catch(t){return qt.call(this,e,0)}}}"function"==typeof Ue.setTimeout&&(qt=setTimeout),"function"==typeof Ue.clearTimeout&&(Ft=clearTimeout);var zt,Vt=[],Kt=!1,Ht=-1;function Wt(){Kt&&zt&&(Kt=!1,zt.length?Vt=zt.concat(Vt):Ht=-1,Vt.length&&Gt())}function Gt(){if(!Kt){var e=Bt(Wt);Kt=!0;for(var t=Vt.length;t;){for(zt=Vt,Vt=[];++Ht<t;)zt&&zt[Ht].run();Ht=-1,t=Vt.length}zt=null,Kt=!1,function(e){if(Ft===clearTimeout)return clearTimeout(e);if((Ft===Ut||!Ft)&&clearTimeout)return Ft=clearTimeout,clearTimeout(e);try{return Ft(e)}catch(t){try{return Ft.call(null,e)}catch(t){return Ft.call(this,e)}}}(e)}}function Jt(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];Vt.push(new Yt(e,t)),1!==Vt.length||Kt||Bt(Gt)}function Yt(e,t){this.fun=e,this.array=t}Yt.prototype.run=function(){this.fun.apply(null,this.array)};var Qt=Ue.performance||{};Qt.now||Qt.mozNow||Qt.msNow||Qt.oNow||Qt.webkitNow;var Xt,Zt={env:{}};Xt="function"==typeof Object.create?function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:function(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype,e.prototype=new r,e.prototype.constructor=e};var er=/%[sdj%]/g;function tr(e){if(!fr(e)){for(var t=[],r=0;r<arguments.length;r++)t.push(nr(arguments[r]));return t.join(" ")}r=1;for(var i=arguments,s=i.length,n=String(e).replace(er,function(e){if("%%"===e)return"%";if(r>=s)return e;switch(e){case"%s":return String(i[r++]);case"%d":return Number(i[r++]);case"%j":try{return JSON.stringify(i[r++])}catch(e){return"[Circular]"}default:return e}}),o=i[r];r<s;o=i[++r])dr(o)||!mr(o)?n+=" "+o:n+=" "+nr(o);return n}function rr(e,t){if(pr(Ue.process))return function(){return rr(e,t).apply(this,arguments)};if(!0===Zt.noDeprecation)return e;var r=!1;return function(){if(!r){if(Zt.throwDeprecation)throw new Error(t);Zt.traceDeprecation?console.trace(t):console.error(t),r=!0}return e.apply(this,arguments)}}var ir,sr={};function nr(e,t){var r={seen:[],stylize:ar};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),hr(t)?r.showHidden=t:t&&function(e,t){if(!t||!mr(t))return e;var r=Object.keys(t),i=r.length;for(;i--;)e[r[i]]=t[r[i]]}(r,t),pr(r.showHidden)&&(r.showHidden=!1),pr(r.depth)&&(r.depth=2),pr(r.colors)&&(r.colors=!1),pr(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=or),cr(r,e,r.depth)}function or(e,t){var r=nr.styles[t];return r?"["+nr.colors[r][0]+"m"+e+"["+nr.colors[r][1]+"m":e}function ar(e,t){return e}function cr(e,t,r){if(e.customInspect&&t&&wr(t.inspect)&&t.inspect!==nr&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(r,e);return fr(i)||(i=cr(e,i,r)),i}var s=function(e,t){if(pr(t))return e.stylize("undefined","undefined");if(fr(t)){var r="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,"string")}if(i=t,"number"==typeof i)return e.stylize(""+t,"number");var i;if(hr(t))return e.stylize(""+t,"boolean");if(dr(t))return e.stylize("null","null")}(e,t);if(s)return s;var n=Object.keys(t),o=function(e){var t={};return e.forEach(function(e,r){t[e]=!0}),t}(n);if(e.showHidden&&(n=Object.getOwnPropertyNames(t)),br(t)&&(n.indexOf("message")>=0||n.indexOf("description")>=0))return ur(t);if(0===n.length){if(wr(t)){var a=t.name?": "+t.name:"";return e.stylize("[Function"+a+"]","special")}if(gr(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(yr(t))return e.stylize(Date.prototype.toString.call(t),"date");if(br(t))return ur(t)}var c,u,l="",h=!1,d=["{","}"];(c=t,Array.isArray(c)&&(h=!0,d=["[","]"]),wr(t))&&(l=" [Function"+(t.name?": "+t.name:"")+"]");return gr(t)&&(l=" "+RegExp.prototype.toString.call(t)),yr(t)&&(l=" "+Date.prototype.toUTCString.call(t)),br(t)&&(l=" "+ur(t)),0!==n.length||h&&0!=t.length?r<0?gr(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special"):(e.seen.push(t),u=h?function(e,t,r,i,s){for(var n=[],o=0,a=t.length;o<a;++o)Or(t,String(o))?n.push(lr(e,t,r,i,String(o),!0)):n.push("");return s.forEach(function(s){s.match(/^\d+$/)||n.push(lr(e,t,r,i,s,!0))}),n}(e,t,r,o,n):n.map(function(i){return lr(e,t,r,o,i,h)}),e.seen.pop(),function(e,t,r){var i=e.reduce(function(e,t){return t.indexOf("\n"),e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);if(i>60)return r[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+r[1];return r[0]+t+" "+e.join(", ")+" "+r[1]}(u,l,d)):d[0]+l+d[1]}function ur(e){return"["+Error.prototype.toString.call(e)+"]"}function lr(e,t,r,i,s,n){var o,a,c;if((c=Object.getOwnPropertyDescriptor(t,s)||{value:t[s]}).get?a=c.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):c.set&&(a=e.stylize("[Setter]","special")),Or(i,s)||(o="["+s+"]"),a||(e.seen.indexOf(c.value)<0?(a=dr(r)?cr(e,c.value,null):cr(e,c.value,r-1)).indexOf("\n")>-1&&(a=n?a.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+a.split("\n").map(function(e){return" "+e}).join("\n")):a=e.stylize("[Circular]","special")),pr(o)){if(n&&s.match(/^\d+$/))return a;(o=JSON.stringify(""+s)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=e.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=e.stylize(o,"string"))}return o+": "+a}function hr(e){return"boolean"==typeof e}function dr(e){return null===e}function fr(e){return"string"==typeof e}function pr(e){return void 0===e}function gr(e){return mr(e)&&"[object RegExp]"===vr(e)}function mr(e){return"object"==typeof e&&null!==e}function yr(e){return mr(e)&&"[object Date]"===vr(e)}function br(e){return mr(e)&&("[object Error]"===vr(e)||e instanceof Error)}function wr(e){return"function"==typeof e}function vr(e){return Object.prototype.toString.call(e)}function Or(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function kr(){this.head=null,this.tail=null,this.length=0}nr.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},nr.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},kr.prototype.push=function(e){var t={data:e,next:null};this.length>0?this.tail.next=t:this.head=t,this.tail=t,++this.length},kr.prototype.unshift=function(e){var t={data:e,next:this.head};0===this.length&&(this.tail=t),this.head=t,++this.length},kr.prototype.shift=function(){if(0!==this.length){var e=this.head.data;return 1===this.length?this.head=this.tail=null:this.head=this.head.next,--this.length,e}},kr.prototype.clear=function(){this.head=this.tail=null,this.length=0},kr.prototype.join=function(e){if(0===this.length)return"";for(var t=this.head,r=""+t.data;t=t.next;)r+=e+t.data;return r},kr.prototype.concat=function(e){if(0===this.length)return et.alloc(0);if(1===this.length)return this.head.data;for(var t=et.allocUnsafe(e>>>0),r=this.head,i=0;r;)r.data.copy(t,i),i+=r.data.length,r=r.next;return t};var Sr=et.isEncoding||function(e){switch(e&&e.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function _r(e){switch(this.encoding=(e||"utf8").toLowerCase().replace(/[-_]/,""),function(e){if(e&&!Sr(e))throw new Error("Unknown encoding: "+e)}(e),this.encoding){case"utf8":this.surrogateSize=3;break;case"ucs2":case"utf16le":this.surrogateSize=2,this.detectIncompleteChar=jr;break;case"base64":this.surrogateSize=3,this.detectIncompleteChar=Er;break;default:return void(this.write=Rr)}this.charBuffer=new et(6),this.charReceived=0,this.charLength=0}function Rr(e){return e.toString(this.encoding)}function jr(e){this.charReceived=e.length%2,this.charLength=this.charReceived?2:0}function Er(e){this.charReceived=e.length%3,this.charLength=this.charReceived?3:0}_r.prototype.write=function(e){for(var t="";this.charLength;){var r=e.length>=this.charLength-this.charReceived?this.charLength-this.charReceived:e.length;if(e.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived<this.charLength)return"";if(e=e.slice(r,e.length),!((s=(t=this.charBuffer.slice(0,this.charLength).toString(this.encoding)).charCodeAt(t.length-1))>=55296&&s<=56319)){if(this.charReceived=this.charLength=0,0===e.length)return t;break}this.charLength+=this.surrogateSize,t=""}this.detectIncompleteChar(e);var i=e.length;this.charLength&&(e.copy(this.charBuffer,0,e.length-this.charReceived,i),i-=this.charReceived);var s;i=(t+=e.toString(this.encoding,0,i)).length-1;if((s=t.charCodeAt(i))>=55296&&s<=56319){var n=this.surrogateSize;return this.charLength+=n,this.charReceived+=n,this.charBuffer.copy(this.charBuffer,n,0,n),e.copy(this.charBuffer,0,0,n),t.substring(0,i)}return t},_r.prototype.detectIncompleteChar=function(e){for(var t=e.length>=3?3:e.length;t>0;t--){var r=e[e.length-t];if(1==t&&r>>5==6){this.charLength=2;break}if(t<=2&&r>>4==14){this.charLength=3;break}if(t<=3&&r>>3==30){this.charLength=4;break}}this.charReceived=t},_r.prototype.end=function(e){var t="";if(e&&e.length&&(t=this.write(e)),this.charReceived){var r=this.charReceived,i=this.charBuffer,s=this.encoding;t+=i.slice(0,r).toString(s)}return t},Ir.ReadableState=Ar;var Nr=function(e){if(pr(ir)&&(ir=Zt.env.NODE_DEBUG||""),e=e.toUpperCase(),!sr[e])if(new RegExp("\\b"+e+"\\b","i").test(ir)){sr[e]=function(){var t=tr.apply(null,arguments);console.error("%s %d: %s",e,0,t)}}else sr[e]=function(){};return sr[e]}("stream");function Ar(e,t){e=e||{},this.objectMode=!!e.objectMode,t instanceof si&&(this.objectMode=this.objectMode||!!e.readableObjectMode);var r=e.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:i,this.highWaterMark=~~this.highWaterMark,this.buffer=new kr,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.defaultEncoding=e.defaultEncoding||"utf8",this.ranOut=!1,this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,e.encoding&&(this.decoder=new _r(e.encoding),this.encoding=e.encoding)}function Ir(e){if(!(this instanceof Ir))return new Ir(e);this._readableState=new Ar(e,this),this.readable=!0,e&&"function"==typeof e.read&&(this._read=e.read),ve.call(this)}function Dr(e,t,r,i,s){var n=function(e,t){var r=null;et.isBuffer(t)||"string"==typeof t||null==t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk"));return r}(t,r);if(n)e.emit("error",n);else if(null===r)t.reading=!1,function(e,t){if(t.ended)return;if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,Cr(e)}(e,t);else if(t.objectMode||r&&r.length>0)if(t.ended&&!s){var o=new Error("stream.push() after EOF");e.emit("error",o)}else if(t.endEmitted&&s){var a=new Error("stream.unshift() after end event");e.emit("error",a)}else{var c;!t.decoder||s||i||(r=t.decoder.write(r),c=!t.objectMode&&0===r.length),s||(t.reading=!1),c||(t.flowing&&0===t.length&&!t.sync?(e.emit("data",r),e.read(0)):(t.length+=t.objectMode?1:r.length,s?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&Cr(e))),function(e,t){t.readingMore||(t.readingMore=!0,Jt(Lr,e,t))}(e,t)}else s||(t.reading=!1);return function(e){return!e.ended&&(e.needReadable||e.length<e.highWaterMark||0===e.length)}(t)}Xt(Ir,ve),Ir.prototype.push=function(e,t){var r=this._readableState;return r.objectMode||"string"!=typeof e||(t=t||r.defaultEncoding)!==r.encoding&&(e=et.from(e,t),t=""),Dr(this,r,e,t,!1)},Ir.prototype.unshift=function(e){return Dr(this,this._readableState,e,"",!0)},Ir.prototype.isPaused=function(){return!1===this._readableState.flowing},Ir.prototype.setEncoding=function(e){return this._readableState.decoder=new _r(e),this._readableState.encoding=e,this};var xr=8388608;function Pr(e,t){return e<=0||0===t.length&&t.ended?0:t.objectMode?1:e!=e?t.flowing&&t.length?t.buffer.head.data.length:t.length:(e>t.highWaterMark&&(t.highWaterMark=function(e){return e>=xr?e=xr:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}(e)),e<=t.length?e:t.ended?t.length:(t.needReadable=!0,0))}function Cr(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(Nr("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?Jt(Tr,e):Tr(e))}function Tr(e){Nr("emit readable"),e.emit("readable"),Ur(e)}function Lr(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length<t.highWaterMark&&(Nr("maybeReadMore read 0"),e.read(0),r!==t.length);)r=t.length;t.readingMore=!1}function $r(e){Nr("readable nexttick read 0"),e.read(0)}function Mr(e,t){t.reading||(Nr("resume read 0"),e.read(0)),t.resumeScheduled=!1,t.awaitDrain=0,e.emit("resume"),Ur(e),t.flowing&&!t.reading&&e.read(0)}function Ur(e){var t=e._readableState;for(Nr("flow",t.flowing);t.flowing&&null!==e.read(););}function qr(e,t){return 0===t.length?null:(t.objectMode?r=t.buffer.shift():!e||e>=t.length?(r=t.decoder?t.buffer.join(""):1===t.buffer.length?t.buffer.head.data:t.buffer.concat(t.length),t.buffer.clear()):r=function(e,t,r){var i;e<t.head.data.length?(i=t.head.data.slice(0,e),t.head.data=t.head.data.slice(e)):i=e===t.head.data.length?t.shift():r?function(e,t){var r=t.head,i=1,s=r.data;e-=s.length;for(;r=r.next;){var n=r.data,o=e>n.length?n.length:e;if(o===n.length?s+=n:s+=n.slice(0,e),0===(e-=o)){o===n.length?(++i,r.next?t.head=r.next:t.head=t.tail=null):(t.head=r,r.data=n.slice(o));break}++i}return t.length-=i,s}(e,t):function(e,t){var r=et.allocUnsafe(e),i=t.head,s=1;i.data.copy(r),e-=i.data.length;for(;i=i.next;){var n=i.data,o=e>n.length?n.length:e;if(n.copy(r,r.length-e,0,o),0===(e-=o)){o===n.length?(++s,i.next?t.head=i.next:t.head=t.tail=null):(t.head=i,i.data=n.slice(o));break}++s}return t.length-=s,r}(e,t);return i}(e,t.buffer,t.decoder),r);var r}function Fr(e){var t=e._readableState;if(t.length>0)throw new Error('"endReadable()" called on non-empty stream');t.endEmitted||(t.ended=!0,Jt(Br,t,e))}function Br(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function zr(e,t){for(var r=0,i=e.length;r<i;r++)if(e[r]===t)return r;return-1}function Vr(){}function Kr(e,t,r){this.chunk=e,this.encoding=t,this.callback=r,this.next=null}function Hr(e,t){Object.defineProperty(this,"buffer",{get:rr(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")}),e=e||{},this.objectMode=!!e.objectMode,t instanceof si&&(this.objectMode=this.objectMode||!!e.writableObjectMode);var r=e.highWaterMark,i=this.objectMode?16:16384;this.highWaterMark=r||0===r?r:i,this.highWaterMark=~~this.highWaterMark,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1;var s=!1===e.decodeStrings;this.decodeStrings=!s,this.defaultEncoding=e.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(e){!function(e,t){var r=e._writableState,i=r.sync,s=r.writecb;if(function(e){e.writing=!1,e.writecb=null,e.length-=e.writelen,e.writelen=0}(r),t)!function(e,t,r,i,s){--t.pendingcb,r?Jt(s,i):s(i);e._writableState.errorEmitted=!0,e.emit("error",i)}(e,r,i,t,s);else{var n=Qr(r);n||r.corked||r.bufferProcessing||!r.bufferedRequest||Yr(e,r),i?Jt(Jr,e,r,n,s):Jr(e,r,n,s)}}(t,e)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.bufferedRequestCount=0,this.corkedRequestsFree=new ei(this)}function Wr(e){if(!(this instanceof Wr||this instanceof si))return new Wr(e);this._writableState=new Hr(e,this),this.writable=!0,e&&("function"==typeof e.write&&(this._write=e.write),"function"==typeof e.writev&&(this._writev=e.writev)),ve.call(this)}function Gr(e,t,r,i,s,n,o){t.writelen=i,t.writecb=o,t.writing=!0,t.sync=!0,r?e._writev(s,t.onwrite):e._write(s,n,t.onwrite),t.sync=!1}function Jr(e,t,r,i){r||function(e,t){0===t.length&&t.needDrain&&(t.needDrain=!1,e.emit("drain"))}(e,t),t.pendingcb--,i(),Zr(e,t)}function Yr(e,t){t.bufferProcessing=!0;var r=t.bufferedRequest;if(e._writev&&r&&r.next){var i=t.bufferedRequestCount,s=new Array(i),n=t.corkedRequestsFree;n.entry=r;for(var o=0;r;)s[o]=r,r=r.next,o+=1;Gr(e,t,!0,t.length,s,"",n.finish),t.pendingcb++,t.lastBufferedRequest=null,n.next?(t.corkedRequestsFree=n.next,n.next=null):t.corkedRequestsFree=new ei(t)}else{for(;r;){var a=r.chunk,c=r.encoding,u=r.callback;if(Gr(e,t,!1,t.objectMode?1:a.length,a,c,u),r=r.next,t.writing)break}null===r&&(t.lastBufferedRequest=null)}t.bufferedRequestCount=0,t.bufferedRequest=r,t.bufferProcessing=!1}function Qr(e){return e.ending&&0===e.length&&null===e.bufferedRequest&&!e.finished&&!e.writing}function Xr(e,t){t.prefinished||(t.prefinished=!0,e.emit("prefinish"))}function Zr(e,t){var r=Qr(t);return r&&(0===t.pendingcb?(Xr(e,t),t.finished=!0,e.emit("finish")):Xr(e,t)),r}function ei(e){var t=this;this.next=null,this.entry=null,this.finish=function(r){var i=t.entry;for(t.entry=null;i;){var s=i.callback;e.pendingcb--,s(r),i=i.next}e.corkedRequestsFree?e.corkedRequestsFree.next=t:e.corkedRequestsFree=t}}Ir.prototype.read=function(e){Nr("read",e),e=parseInt(e,10);var t=this._readableState,r=e;if(0!==e&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return Nr("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?Fr(this):Cr(this),null;if(0===(e=Pr(e,t))&&t.ended)return 0===t.length&&Fr(this),null;var i,s=t.needReadable;return Nr("need readable",s),(0===t.length||t.length-e<t.highWaterMark)&&Nr("length less than watermark",s=!0),t.ended||t.reading?Nr("reading or ended",s=!1):s&&(Nr("do read"),t.reading=!0,t.sync=!0,0===t.length&&(t.needReadable=!0),this._read(t.highWaterMark),t.sync=!1,t.reading||(e=Pr(r,t))),null===(i=e>0?qr(e,t):null)?(t.needReadable=!0,e=0):t.length-=e,0===t.length&&(t.ended||(t.needReadable=!0),r!==e&&t.ended&&Fr(this)),null!==i&&this.emit("data",i),i},Ir.prototype._read=function(e){this.emit("error",new Error("not implemented"))},Ir.prototype.pipe=function(e,t){var r=this,i=this._readableState;switch(i.pipesCount){case 0:i.pipes=e;break;case 1:i.pipes=[i.pipes,e];break;default:i.pipes.push(e)}i.pipesCount+=1,Nr("pipe count=%d opts=%j",i.pipesCount,t);var s=!t||!1!==t.end?o:u;function n(e){Nr("onunpipe"),e===r&&u()}function o(){Nr("onend"),e.end()}i.endEmitted?Jt(s):r.once("end",s),e.on("unpipe",n);var a=function(e){return function(){var t=e._readableState;Nr("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,0===t.awaitDrain&&e.listeners("data").length&&(t.flowing=!0,Ur(e))}}(r);e.on("drain",a);var c=!1;function u(){Nr("cleanup"),e.removeListener("close",f),e.removeListener("finish",p),e.removeListener("drain",a),e.removeListener("error",d),e.removeListener("unpipe",n),r.removeListener("end",o),r.removeListener("end",u),r.removeListener("data",h),c=!0,!i.awaitDrain||e._writableState&&!e._writableState.needDrain||a()}var l=!1;function h(t){Nr("ondata"),l=!1,!1!==e.write(t)||l||((1===i.pipesCount&&i.pipes===e||i.pipesCount>1&&-1!==zr(i.pipes,e))&&!c&&(Nr("false write response, pause",r._readableState.awaitDrain),r._readableState.awaitDrain++,l=!0),r.pause())}function d(t){var r;Nr("onerror",t),g(),e.removeListener("error",d),0===(r="error",e.listeners(r).length)&&e.emit("error",t)}function f(){e.removeListener("finish",p),g()}function p(){Nr("onfinish"),e.removeListener("close",f),g()}function g(){Nr("unpipe"),r.unpipe(e)}return r.on("data",h),function(e,t,r){if("function"==typeof e.prependListener)return e.prependListener(t,r);e._events&&e._events[t]?Array.isArray(e._events[t])?e._events[t].unshift(r):e._events[t]=[r,e._events[t]]:e.on(t,r)}(e,"error",d),e.once("close",f),e.once("finish",p),e.emit("pipe",r),i.flowing||(Nr("pipe resume"),r.resume()),e},Ir.prototype.unpipe=function(e){var t=this._readableState;if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes||(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this)),this;if(!e){var r=t.pipes,i=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var s=0;s<i;s++)r[s].emit("unpipe",this);return this}var n=zr(t.pipes,e);return-1===n||(t.pipes.splice(n,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit("unpipe",this)),this},Ir.prototype.on=function(e,t){var r=ve.prototype.on.call(this,e,t);if("data"===e)!1!==this._readableState.flowing&&this.resume();else if("readable"===e){var i=this._readableState;i.endEmitted||i.readableListening||(i.readableListening=i.needReadable=!0,i.emittedReadable=!1,i.reading?i.length&&Cr(this):Jt($r,this))}return r},Ir.prototype.addListener=Ir.prototype.on,Ir.prototype.resume=function(){var e=this._readableState;return e.flowing||(Nr("resume"),e.flowing=!0,function(e,t){t.resumeScheduled||(t.resumeScheduled=!0,Jt(Mr,e,t))}(this,e)),this},Ir.prototype.pause=function(){return Nr("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(Nr("pause"),this._readableState.flowing=!1,this.emit("pause")),this},Ir.prototype.wrap=function(e){var t=this._readableState,r=!1,i=this;for(var s in e.on("end",function(){if(Nr("wrapped end"),t.decoder&&!t.ended){var e=t.decoder.end();e&&e.length&&i.push(e)}i.push(null)}),e.on("data",function(s){(Nr("wrapped data"),t.decoder&&(s=t.decoder.write(s)),t.objectMode&&null==s)||(t.objectMode||s&&s.length)&&(i.push(s)||(r=!0,e.pause()))}),e)void 0===this[s]&&"function"==typeof e[s]&&(this[s]=function(t){return function(){return e[t].apply(e,arguments)}}(s));return function(e,t){for(var r=0,i=e.length;r<i;r++)t(e[r],r)}(["error","close","destroy","pause","resume"],function(t){e.on(t,i.emit.bind(i,t))}),i._read=function(t){Nr("wrapped _read",t),r&&(r=!1,e.resume())},i},Ir._fromList=qr,Wr.WritableState=Hr,Xt(Wr,ve),Hr.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},Wr.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))},Wr.prototype.write=function(e,t,r){var i=this._writableState,s=!1;return"function"==typeof t&&(r=t,t=null),et.isBuffer(e)?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=Vr),i.ended?function(e,t){var r=new Error("write after end");e.emit("error",r),Jt(t,r)}(this,r):function(e,t,r,i){var s=!0,n=!1;return null===r?n=new TypeError("May not write null values to stream"):et.isBuffer(r)||"string"==typeof r||void 0===r||t.objectMode||(n=new TypeError("Invalid non-string/buffer chunk")),n&&(e.emit("error",n),Jt(i,n),s=!1),s}(this,i,e,r)&&(i.pendingcb++,s=function(e,t,r,i,s){r=function(e,t,r){e.objectMode||!1===e.decodeStrings||"string"!=typeof t||(t=et.from(t,r));return t}(t,r,i),et.isBuffer(r)&&(i="buffer");var n=t.objectMode?1:r.length;t.length+=n;var o=t.length<t.highWaterMark;o||(t.needDrain=!0);if(t.writing||t.corked){var a=t.lastBufferedRequest;t.lastBufferedRequest=new Kr(r,i,s),a?a.next=t.lastBufferedRequest:t.bufferedRequest=t.lastBufferedRequest,t.bufferedRequestCount+=1}else Gr(e,t,!1,n,r,i,s);return o}(this,i,e,t,r)),s},Wr.prototype.cork=function(){this._writableState.corked++},Wr.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||Yr(this,e))},Wr.prototype.setDefaultEncoding=function(e){if("string"==typeof e&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+e);return this._writableState.defaultEncoding=e,this},Wr.prototype._write=function(e,t,r){r(new Error("not implemented"))},Wr.prototype._writev=null,Wr.prototype.end=function(e,t,r){var i=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!=e&&this.write(e,t),i.corked&&(i.corked=1,this.uncork()),i.ending||i.finished||function(e,t,r){t.ending=!0,Zr(e,t),r&&(t.finished?Jt(r):e.once("finish",r));t.ended=!0,e.writable=!1}(this,i,r)},Xt(si,Ir);for(var ti=Object.keys(Wr.prototype),ri=0;ri<ti.length;ri++){var ii=ti[ri];si.prototype[ii]||(si.prototype[ii]=Wr.prototype[ii])}function si(e){if(!(this instanceof si))return new si(e);Ir.call(this,e),Wr.call(this,e),e&&!1===e.readable&&(this.readable=!1),e&&!1===e.writable&&(this.writable=!1),this.allowHalfOpen=!0,e&&!1===e.allowHalfOpen&&(this.allowHalfOpen=!1),this.once("end",ni)}function ni(){this.allowHalfOpen||this._writableState.ended||Jt(oi,this)}function oi(e){e.end()}function ai(e){this.afterTransform=function(t,r){return function(e,t,r){var i=e._transformState;i.transforming=!1;var s=i.writecb;if(!s)return e.emit("error",new Error("no writecb in Transform class"));i.writechunk=null,i.writecb=null,null!=r&&e.push(r);s(t);var n=e._readableState;n.reading=!1,(n.needReadable||n.length<n.highWaterMark)&&e._read(n.highWaterMark)}(e,t,r)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function ci(e){if(!(this instanceof ci))return new ci(e);si.call(this,e),this._transformState=new ai(this);var t=this;this._readableState.needReadable=!0,this._readableState.sync=!1,e&&("function"==typeof e.transform&&(this._transform=e.transform),"function"==typeof e.flush&&(this._flush=e.flush)),this.once("prefinish",function(){"function"==typeof this._flush?this._flush(function(e){ui(t,e)}):ui(t)})}function ui(e,t){if(t)return e.emit("error",t);var r=e._writableState,i=e._transformState;if(r.length)throw new Error("Calling transform done when ws.length != 0");if(i.transforming)throw new Error("Calling transform done when still transforming");return e.push(null)}function li(e){if(!(this instanceof li))return new li(e);ci.call(this,e)}function hi(){ve.call(this)}Xt(ci,si),ci.prototype.push=function(e,t){return this._transformState.needTransform=!1,si.prototype.push.call(this,e,t)},ci.prototype._transform=function(e,t,r){throw new Error("Not implemented")},ci.prototype._write=function(e,t,r){var i=this._transformState;if(i.writecb=r,i.writechunk=e,i.writeencoding=t,!i.transforming){var s=this._readableState;(i.needTransform||s.needReadable||s.length<s.highWaterMark)&&this._read(s.highWaterMark)}},ci.prototype._read=function(e){var t=this._transformState;null!==t.writechunk&&t.writecb&&!t.transforming?(t.transforming=!0,this._transform(t.writechunk,t.writeencoding,t.afterTransform)):t.needTransform=!0},Xt(li,ci),li.prototype._transform=function(e,t,r){r(null,e)},Xt(hi,ve),hi.Readable=Ir,hi.Writable=Wr,hi.Duplex=si,hi.Transform=ci,hi.PassThrough=li,hi.Stream=hi,hi.prototype.pipe=function(e,t){var r=this;function i(t){e.writable&&!1===e.write(t)&&r.pause&&r.pause()}function s(){r.readable&&r.resume&&r.resume()}r.on("data",i),e.on("drain",s),e._isStdio||t&&!1===t.end||(r.on("end",o),r.on("close",a));var n=!1;function o(){n||(n=!0,e.end())}function a(){n||(n=!0,"function"==typeof e.destroy&&e.destroy())}function c(e){if(u(),0===ve.listenerCount(this,"error"))throw e}function u(){r.removeListener("data",i),e.removeListener("drain",s),r.removeListener("end",o),r.removeListener("close",a),r.removeListener("error",c),e.removeListener("error",c),r.removeListener("end",u),r.removeListener("close",u),e.removeListener("close",u)}return r.on("error",c),e.on("error",c),r.on("end",u),r.on("close",u),e.on("close",u),e.emit("pipe",r),e};class di extends ve{constructor({resource:e}){super(),this.resource=e,this.client=e.client,this.stream=new s.ReadableStream({highWaterMark:3*this.client.parallelism,start:this._start.bind(this),pull:this._pull.bind(this),cancel:this._cancel.bind(this)})}build(){return this.stream.getReader()}async _start(e){this.controller=e,this.continuationToken=null,this.closeNextIteration=!1}async _pull(e){if(this.closeNextIteration)return void e.close();const t=await this.client.listObjects({prefix:`resource=${this.resource.name}`,continuationToken:this.continuationToken}),r=t?.Contents.map(e=>e.Key).map(e=>e.replace(this.client.config.keyPrefix,"")).map(e=>e.startsWith("/")?e.replace("/",""):e).map(e=>e.replace(`resource=${this.resource.name}/id=`,""));this.continuationToken=t.NextContinuationToken,this.enqueue(r),t.IsTruncated||(this.closeNextIteration=!0)}enqueue(e){e.forEach(e=>{this.controller.enqueue(e),this.emit("id",e)})}_cancel(e){}}class fi extends di{enqueue(e){this.controller.enqueue(e),this.emit("page",e)}}class pi extends ve{constructor({resource:e,batchSize:t=10,concurrency:r=5}){if(super(),!e)throw new Error("Resource is required for ResourceReader");this.resource=e,this.client=e.client,this.batchSize=t,this.concurrency=r,this.input=new fi({resource:this.resource}),this.transform=new ci({objectMode:!0,transform:this._transform.bind(this)}),this.input.on("data",e=>{this.transform.write(e)}),this.input.on("end",()=>{this.transform.end()}),this.input.on("error",e=>{this.emit("error",e)}),this.transform.on("data",e=>{this.emit("data",e)}),this.transform.on("end",()=>{this.emit("end")}),this.transform.on("error",e=>{this.emit("error",e)})}build(){return this}async _transform(e,t,r){const[s,n]=await A(async()=>{await i.PromisePool.for(e).withConcurrency(this.concurrency).handleError(async(e,t)=>{this.emit("error",e,t)}).process(async e=>{const t=await this.resource.get(e);return this.push(t),t})});r(n)}resume(){this.input.resume()}}class gi extends ve{constructor({resource:e,batchSize:t=10,concurrency:r=5}){super(),this.resource=e,this.client=e.client,this.batchSize=t,this.concurrency=r,this.buffer=[],this.writing=!1,this.writable=new Wr({objectMode:!0,write:this._write.bind(this)}),this.writable.on("finish",()=>{this.emit("finish")}),this.writable.on("error",e=>{this.emit("error",e)})}build(){return this}write(e){return this.buffer.push(e),this._maybeWrite().catch(e=>{this.emit("error",e)}),!0}end(){this.ended=!0,this._maybeWrite().catch(e=>{this.emit("error",e)})}async _maybeWrite(){if(!this.writing&&(0!==this.buffer.length||this.ended)){for(this.writing=!0;this.buffer.length>0;){const e=this.buffer.splice(0,this.batchSize),[t,r]=await A(async()=>{await i.PromisePool.for(e).withConcurrency(this.concurrency).handleError(async(e,t)=>{this.emit("error",e,t)}).process(async e=>{const[t,r,i]=await A(async()=>await this.resource.insert(e));return t?i:(this.emit("error",r,e),null)})});t||this.emit("error",r)}this.writing=!1,this.ended&&this.writable.emit("finish")}}async _write(e,t,r){r()}}function mi(e){return new Promise((t,r)=>{if(!e)return r(new Error("streamToString: stream is undefined"));const i=[];e.on("data",e=>i.push(e)),e.on("error",r),e.on("end",()=>t(Buffer.concat(i).toString("utf-8")))})}class yi extends Me{constructor({client:e,keyPrefix:t="cache",ttl:r=0,prefix:i}){super({client:e,keyPrefix:t,ttl:r,prefix:i}),this.client=e,this.keyPrefix=t,this.config.ttl=r,this.config.client=e,this.config.prefix=void 0!==i?i:t+(t.endsWith("/")?"":"/")}async _set(e,t){let i=JSON.stringify(t);const s=i.length;return i=r.gzipSync(i).toString("base64"),this.client.putObject({key:Ce(this.keyPrefix,e),body:i,contentEncoding:"gzip",contentType:"application/gzip",metadata:{compressor:"zlib",compressed:"true","client-id":this.client.id,"length-serialized":String(s),"length-compressed":String(i.length),"compression-gain":(i.length/s).toFixed(2)}})}async _get(e){const[t,i,s]=await A(async()=>{const{Body:t}=await this.client.getObject(Ce(this.keyPrefix,e));let i=await mi(t);return i=Buffer.from(i,"base64"),i=r.unzipSync(i).toString(),JSON.parse(i)});if(t)return s;if("NoSuchKey"===i.name||"NotFound"===i.name)return null;throw i}async _del(e){return await this.client.deleteObject(Ce(this.keyPrefix,e)),!0}async _clear(){const e=await this.client.getAllKeys({prefix:this.keyPrefix});await this.client.deleteObjects(e)}async size(){return(await this.keys()).length}async keys(){const e=await this.client.getAllKeys({prefix:this.keyPrefix}),t=this.keyPrefix.endsWith("/")?this.keyPrefix:this.keyPrefix+"/";return e.map(e=>e.startsWith(t)?e.slice(t.length):e)}}class bi extends Me{constructor(e={}){super(e),this.cache={},this.meta={},this.maxSize=e.maxSize||0,this.ttl=e.ttl||0}async _set(e,t){if(this.maxSize>0&&Object.keys(this.cache).length>=this.maxSize){const e=Object.entries(this.meta).sort((e,t)=>e[1].ts-t[1].ts)[0]?.[0];e&&(delete this.cache[e],delete this.meta[e])}return this.cache[e]=t,this.meta[e]={ts:Date.now()},t}async _get(e){if(!Object.prototype.hasOwnProperty.call(this.cache,e))return null;if(this.ttl>0){const t=Date.now(),r=this.meta[e];if(r&&t-r.ts>1e3*this.ttl)return delete this.cache[e],delete this.meta[e],null}return this.cache[e]}async _del(e){return delete this.cache[e],delete this.meta[e],!0}async _clear(e){if(!e)return this.cache={},this.meta={},!0;for(const t of Object.keys(this.cache))t.startsWith(e)&&(delete this.cache[t],delete this.meta[t]);return!0}async size(){return Object.keys(this.cache).length}async keys(){return Object.keys(this.cache)}}const wi={async setup(e){e&&e.client&&(this.client=e.client,this.map={PutObjectCommand:"put",GetObjectCommand:"get",HeadObjectCommand:"head",DeleteObjectCommand:"delete",DeleteObjectsCommand:"delete",ListObjectsV2Command:"list"},this.costs={total:0,prices:{put:5e-6,copy:5e-6,list:5e-6,post:5e-6,get:4e-4/1e3,select:4e-4/1e3,delete:4e-4/1e3,head:4e-4/1e3},requests:{total:0,put:0,post:0,copy:0,list:0,get:0,select:0,delete:0,head:0},events:{total:0,PutObjectCommand:0,GetObjectCommand:0,HeadObjectCommand:0,DeleteObjectCommand:0,DeleteObjectsCommand:0,ListObjectsV2Command:0}},this.client.costs=JSON.parse(JSON.stringify(this.costs)))},async start(){this.client&&(this.client.on("command.response",e=>this.addRequest(e,this.map[e])),this.client.on("command.error",e=>this.addRequest(e,this.map[e])))},addRequest(e,t){t&&(this.costs.events[e]++,this.costs.events.total++,this.costs.requests.total++,this.costs.requests[t]++,this.costs.total+=this.costs.prices[t],this.client&&this.client.costs&&(this.client.costs.events[e]++,this.client.costs.events.total++,this.client.costs.requests.total++,this.client.costs.requests[t]++,this.client.costs.total+=this.client.costs.prices[t]))}};class vi extends ve{constructor(e={}){super(),this.config=e,this.name=this.constructor.name,this.enabled=!1!==e.enabled}async initialize(e){this.database=e,this.emit("initialized",{replicator:this.name})}async replicate(e,t,r,i){throw new Error(`replicate() method must be implemented by ${this.name}`)}async replicateBatch(e,t){throw new Error(`replicateBatch() method must be implemented by ${this.name}`)}async testConnection(){throw new Error(`testConnection() method must be implemented by ${this.name}`)}async getStatus(){return{name:this.name,config:this.config,connected:!1}}async cleanup(){this.emit("cleanup",{replicator:this.name})}validateConfig(){return{isValid:!0,errors:[]}}}const Oi="us-east-1",ki="https://s3.us-east-1.amazonaws.com";class Si{constructor(e){let t;const[r,i,s]=A(()=>new URL(e));if(!r)throw new ne("Invalid connection string: "+e,{original:i,input:e});t=s,this.region=Oi,"s3:"===t.protocol?this.defineFromS3(t):this.defineFromCustomUri(t);for(const[e,r]of t.searchParams.entries())this[e]=r}defineFromS3(e){const[t,r,i]=I(()=>decodeURIComponent(e.hostname));if(!t)throw new ne("Invalid bucket in connection string",{original:r,input:e.hostname});this.bucket=i||"s3db";const[s,n,o]=I(()=>decodeURIComponent(e.username));if(!s)throw new ne("Invalid accessKeyId in connection string",{original:n,input:e.username});this.accessKeyId=o;const[a,c,u]=I(()=>decodeURIComponent(e.password));if(!a)throw new ne("Invalid secretAccessKey in connection string",{original:c,input:e.password});if(this.secretAccessKey=u,this.endpoint=ki,["/","",null].includes(e.pathname))this.keyPrefix="";else{let[,...t]=e.pathname.split("/");this.keyPrefix=[...t||[]].join("/")}}defineFromCustomUri(e){this.forcePathStyle=!0,this.endpoint=e.origin;const[t,r,i]=I(()=>decodeURIComponent(e.username));if(!t)throw new ne("Invalid accessKeyId in connection string",{original:r,input:e.username});this.accessKeyId=i;const[s,n,o]=I(()=>decodeURIComponent(e.password));if(!s)throw new ne("Invalid secretAccessKey in connection string",{original:n,input:e.password});if(this.secretAccessKey=o,["/","",null].includes(e.pathname))this.bucket="s3db",this.keyPrefix="";else{let[,t,...r]=e.pathname.split("/");if(t){const[e,r,i]=I(()=>decodeURIComponent(t));if(!e)throw new ne("Invalid bucket in connection string",{original:r,input:t});this.bucket=i}else this.bucket="s3db";this.keyPrefix=[...r||[]].join("/")}}}class _i extends ve{constructor({verbose:e=!1,id:t=null,AwsS3Client:r,connectionString:i,parallelism:s=10}){super(),this.verbose=e,this.id=t??me(),this.parallelism=s,this.config=new Si(i),this.client=r||this.createClient()}createClient(){let e={region:this.config.region,endpoint:this.config.endpoint};this.config.forcePathStyle&&(e.forcePathStyle=!0),this.config.accessKeyId&&(e.credentials={accessKeyId:this.config.accessKeyId,secretAccessKey:this.config.secretAccessKey});const t=new u.S3Client(e);return t.middlewareStack.add((e,t)=>async r=>{if("DeleteObjectsCommand"===t.commandName){const e=r.request.body;if(e&&"string"==typeof e){const t=await pe(e);r.request.headers["Content-MD5"]=t}}return e(r)},{step:"build",name:"addContentMd5ForDeleteObjects",priority:"high"}),t}async sendCommand(e){this.emit("command.request",e.constructor.name,e.input);const[t,r,i]=await A(()=>this.client.send(e));if(!t){throw se(r,{bucket:this.config.bucket,key:e.input&&e.input.Key,commandName:e.constructor.name,commandInput:e.input})}return this.emit("command.response",e.constructor.name,i,e.input),i}async putObject({key:e,metadata:t,contentType:r,body:i,contentEncoding:s,contentLength:n}){const o="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";o&&Te.join(o,e);const a={};if(t)for(const[e,r]of Object.entries(t)){a[String(e).replace(/[^a-zA-Z0-9\-_]/g,"_")]=String(r)}const c={Bucket:this.config.bucket,Key:o?Te.join(o,e):e,Metadata:a,Body:i||Buffer.alloc(0)};let l,h;void 0!==r&&(c.ContentType=r),void 0!==s&&(c.ContentEncoding=s),void 0!==n&&(c.ContentLength=n);try{return l=await this.sendCommand(new u.PutObjectCommand(c)),l}catch(t){throw h=t,se(t,{bucket:this.config.bucket,key:e,commandName:"PutObjectCommand",commandInput:c})}finally{this.emit("putObject",h||l,{key:e,metadata:t,contentType:r,body:i,contentEncoding:s,contentLength:n})}}async getObject(e){const t="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r={Bucket:this.config.bucket,Key:t?Te.join(t,e):e};let i,s;try{return i=await this.sendCommand(new u.GetObjectCommand(r)),i}catch(t){throw s=t,se(t,{bucket:this.config.bucket,key:e,commandName:"GetObjectCommand",commandInput:r})}finally{this.emit("getObject",s||i,{key:e})}}async headObject(e){const t="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r={Bucket:this.config.bucket,Key:t?Te.join(t,e):e};let i,s;try{return i=await this.sendCommand(new u.HeadObjectCommand(r)),i}catch(t){throw s=t,se(t,{bucket:this.config.bucket,key:e,commandName:"HeadObjectCommand",commandInput:r})}finally{this.emit("headObject",s||i,{key:e})}}async copyObject({from:e,to:t}){const r={Bucket:this.config.bucket,Key:this.config.keyPrefix?Te.join(this.config.keyPrefix,t):t,CopySource:Te.join(this.config.bucket,this.config.keyPrefix?Te.join(this.config.keyPrefix,e):e)};let i,s;try{return i=await this.sendCommand(new u.CopyObjectCommand(r)),i}catch(e){throw s=e,se(e,{bucket:this.config.bucket,key:t,commandName:"CopyObjectCommand",commandInput:r})}finally{this.emit("copyObject",s||i,{from:e,to:t})}}async exists(e){const[t,r]=await A(()=>this.headObject(e));if(t)return!0;if("NoSuchKey"===r.name||"NotFound"===r.name)return!1;throw r}async deleteObject(e){const t="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";t&&Te.join(t,e);const r={Bucket:this.config.bucket,Key:t?Te.join(t,e):e};let i,s;try{return i=await this.sendCommand(new u.DeleteObjectCommand(r)),i}catch(t){throw s=t,se(t,{bucket:this.config.bucket,key:e,commandName:"DeleteObjectCommand",commandInput:r})}finally{this.emit("deleteObject",s||i,{key:e})}}async deleteObjects(e){const t="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"",r=o.chunk(e,1e3),{results:s,errors:n}=await i.PromisePool.for(r).withConcurrency(this.parallelism).process(async e=>{for(const r of e)t&&Te.join(t,r),this.config.bucket,await this.exists(r);const r={Bucket:this.config.bucket,Delete:{Objects:e.map(e=>({Key:t?Te.join(t,e):e}))}};let i;const[s,n,o]=await A(()=>this.sendCommand(new u.DeleteObjectsCommand(r)));if(!s)throw n;return i=o,i&&i.Errors&&i.Errors.length,i&&i.Deleted&&(i.Deleted.length,e.length),i}),a={deleted:s,notFound:n};return this.emit("deleteObjects",a,e),a}async deleteAll({prefix:e}={}){const t="string"==typeof this.config.keyPrefix?this.config.keyPrefix:"";let r,i=0;do{const s=new u.ListObjectsV2Command({Bucket:this.config.bucket,Prefix:t?Te.join(t,e||""):e||"",ContinuationToken:r}),n=await this.client.send(s);if(n.Contents&&n.Contents.length>0){const t=new u.DeleteObjectsCommand({Bucket:this.config.bucket,Delete:{Objects:n.Contents.map(e=>({Key:e.Key}))}}),r=await this.client.send(t),s=r.Deleted?r.Deleted.length:0;i+=s,this.emit("deleteAll",{prefix:e,batch:s,total:i})}r=n.IsTruncated?n.NextContinuationToken:void 0}while(r);return this.emit("deleteAllComplete",{prefix:e,totalDeleted:i}),i}async moveObject({from:e,to:t}){const[r,i]=await A(async()=>{await this.copyObject({from:e,to:t}),await this.deleteObject(e)});if(!r)throw new re("Unknown error in moveObject",{bucket:this.config.bucket,from:e,to:t,original:i});return!0}async listObjects({prefix:e,maxKeys:t=1e3,continuationToken:r}={}){const i={Bucket:this.config.bucket,MaxKeys:t,ContinuationToken:r,Prefix:this.config.keyPrefix?Te.join(this.config.keyPrefix,e||""):e||""},[s,n,o]=await A(()=>this.sendCommand(new u.ListObjectsV2Command(i)));if(!s)throw new re("Unknown error in listObjects",{prefix:e,bucket:this.config.bucket,original:n});return this.emit("listObjects",o,i),o}async count({prefix:e}={}){let t,r=0,i=!0;for(;i;){const s={prefix:e,continuationToken:t},n=await this.listObjects(s);r+=n.KeyCount||0,i=n.IsTruncated||!1,t=n.NextContinuationToken}return this.emit("count",r,{prefix:e}),r}async getAllKeys({prefix:e}={}){let t,r=[],i=!0;for(;i;){const s={prefix:e,continuationToken:t},n=await this.listObjects(s);n.Contents&&(r=r.concat(n.Contents.map(e=>e.Key))),i=n.IsTruncated||!1,t=n.NextContinuationToken}return this.config.keyPrefix&&(r=r.map(e=>e.replace(this.config.keyPrefix,"")).map(e=>e.startsWith("/")?e.replace("/",""):e)),this.emit("getAllKeys",r,{prefix:e}),r}async getContinuationTokenAfterOffset(e={}){const{prefix:t,offset:r=1e3}=e;if(0===r)return null;let i,s=!0,n=0;for(;s;){const e={prefix:t,maxKeys:r<1e3?r:r-n>1e3?1e3:r-n,continuationToken:i},o=await this.listObjects(e);if(o.Contents&&(n+=o.Contents.length),s=o.IsTruncated||!1,i=o.NextContinuationToken,n>=r)break}return this.emit("getContinuationTokenAfterOffset",i||null,e),i||null}async getKeysPage(e={}){const{prefix:t,offset:r=0,amount:i=100}=e;let s,n=[],o=!0;if(r>0&&(s=await this.getContinuationTokenAfterOffset({prefix:t,offset:r}),!s))return this.emit("getKeysPage",[],e),[];for(;o;){const e={prefix:t,continuationToken:s},r=await this.listObjects(e);if(r.Contents&&(n=n.concat(r.Contents.map(e=>e.Key))),o=r.IsTruncated||!1,s=r.NextContinuationToken,n.length>=i){n=n.slice(0,i);break}}return this.config.keyPrefix&&(n=n.map(e=>e.replace(this.config.keyPrefix,"")).map(e=>e.startsWith("/")?e.replace("/",""):e)),this.emit("getKeysPage",n,e),n}async moveAllObjects({prefixFrom:e,prefixTo:t}){const r=await this.getAllKeys({prefix:e}),{results:s,errors:n}=await i.PromisePool.for(r).withConcurrency(this.parallelism).process(async r=>{const i=r.replace(e,t),[s,n]=await A(async()=>{await this.moveObject({from:r,to:i})});if(!s)throw new re("Unknown error in moveAllObjects",{bucket:this.config.bucket,from:r,to:i,original:n});return i});if(this.emit("moveAllObjects",{results:s,errors:n},{prefixFrom:e,prefixTo:t}),n.length>0)throw new Error("Some objects could not be moved");return s}}async function Ri(e,t,r){if(!this.passphrase)return t.push(new G("Missing configuration for secrets encryption.",{actual:e,type:"encryptionKeyMissing",suggestion:"Provide a passphrase for secret encryption."})),e;const[i,s,n]=await A(()=>de(String(e),this.passphrase));return i?n:(t.push(new G("Problem encrypting secret.",{actual:e,type:"encryptionProblem",error:s,suggestion:"Check the passphrase and input value."})),e)}async function ji(e,t,r){if(o.isString(e))return e;const[i,s,n]=I(()=>JSON.stringify(e));if(!i)throw new G("Failed to stringify JSON",{original:s,input:e});return n}class Ei extends h{constructor({options:e,passphrase:t,autoEncrypt:r=!0}={}){super(o.merge({},{useNewCustomCheckerFunction:!0,messages:{encryptionKeyMissing:"Missing configuration for secrets encryption.",encryptionProblem:"Problem encrypting secret. Actual: {actual}. Error: {error}"},defaults:{string:{trim:!0},object:{strict:"remove"},number:{convert:!0}}},e)),this.passphrase=t,this.autoEncrypt=r,this.alias("secret",{type:"string",custom:this.autoEncrypt?Ri:void 0,messages:{string:"The '{field}' field must be a string.",stringMin:"This secret '{field}' field length must be at least {expected} long."}}),this.alias("secretAny",{type:"any",custom:this.autoEncrypt?Ri:void 0}),this.alias("secretNumber",{type:"number",custom:this.autoEncrypt?Ri:void 0}),this.alias("json",{type:"any",custom:this.autoEncrypt?ji:void 0})}}const Ni=new Proxy(Ei,{instance:null,construct(e,t){return this.instance||(this.instance=new e(...t)),this.instance}});const Ai={trim:e=>null==e?e:e.trim(),encrypt:async(e,{passphrase:t})=>{if(null==e)return e;const[r,i,s]=await A(()=>de(e,t));return r?s:e},decrypt:async(e,{passphrase:t})=>{if(null==e)return e;const[r,i,s]=await A(()=>fe(e,t));return r?"null"===s?null:"undefined"!==s?s:void 0:e},toString:e=>null==e?e:String(e),fromArray:(e,{separator:t})=>{if(null==e||!Array.isArray(e))return e;if(0===e.length)return"";return e.map(e=>"string"==typeof e?e.replace(/\\/g,"\\\\").replace(new RegExp(`\\${t}`,"g"),`\\${t}`):String(e)).join(t)},toArray:(e,{separator:t})=>{if(Array.isArray(e))return e;if(null==e)return e;if(""===e)return[];const r=[];let i="",s=0;const n=String(e);for(;s<n.length;)"\\"===n[s]&&s+1<n.length?(i+=n[s+1],s+=2):n[s]===t?(r.push(i),i="",s++):(i+=n[s],s++);return r.push(i),r},toJSON:e=>{if(null===e)return null;if(void 0===e)return;if("string"==typeof e){const[t,r,i]=I(()=>JSON.parse(e));return e}const[t,r,i]=I(()=>JSON.stringify(e));return t?i:e},fromJSON:e=>{if(null===e)return null;if(void 0===e)return;if("string"!=typeof e)return e;if(""===e)return"";const[t,r,i]=I(()=>JSON.parse(e));return t?i:e},toNumber:e=>o.isString(e)?e.includes(".")?parseFloat(e):parseInt(e):e,toBool:e=>[!0,1,"true","1","yes","y"].includes(e),fromBool:e=>[!0,1,"true","1","yes","y"].includes(e)?"1":"0",fromBase62:e=>{if(null==e||""===e)return e;if("number"==typeof e)return e;if("string"==typeof e){const t=z(e);return isNaN(t)?void 0:t}},toBase62:e=>{if(null==e||""===e)return e;if("number"==typeof e)return B(e);if("string"==typeof e){const t=Number(e);return isNaN(t)?e:B(t)}return e},fromBase62Decimal:e=>{if(null==e||""===e)return e;if("number"==typeof e)return e;if("string"==typeof e){const t=K(e);return isNaN(t)?void 0:t}},toBase62Decimal:e=>{if(null==e||""===e)return e;if("number"==typeof e)return V(e);if("string"==typeof e){const t=Number(e);return isNaN(t)?e:V(t)}return e},fromArrayOfNumbers:(e,{separator:t})=>{if(null==e||!Array.isArray(e))return e;if(0===e.length)return"";return e.map(e=>{if("number"==typeof e&&!isNaN(e))return B(e);const t=Number(e);return isNaN(t)?"":B(t)}).join(t)},toArrayOfNumbers:(e,{separator:t})=>{if(Array.isArray(e))return e.map(e=>"number"==typeof e?e:z(e));if(null==e)return e;if(""===e)return[];const r=String(e),i=[];let s="",n=0;for(;n<r.length;)"\\"===r[n]&&n+1<r.length?(s+=r[n+1],n+=2):r[n]===t?(i.push(s),s="",n++):(s+=r[n],n++);return i.push(s),i.map(e=>{if("number"==typeof e)return e;if("string"==typeof e&&""!==e){const t=z(e);return isNaN(t)?NaN:t}return NaN})},fromArrayOfDecimals:(e,{separator:t})=>{if(null==e||!Array.isArray(e))return e;if(0===e.length)return"";return e.map(e=>{if("number"==typeof e&&!isNaN(e))return V(e);const t=Number(e);return isNaN(t)?"":V(t)}).join(t)},toArrayOfDecimals:(e,{separator:t})=>{if(Array.isArray(e))return e.map(e=>"number"==typeof e?e:K(e));if(null==e)return e;if(""===e)return[];const r=String(e),i=[];let s="",n=0;for(;n<r.length;)"\\"===r[n]&&n+1<r.length?(s+=r[n+1],n+=2):r[n]===t?(i.push(s),s="",n++):(s+=r[n],n++);return i.push(s),i.map(e=>{if("number"==typeof e)return e;if("string"==typeof e&&""!==e){const t=K(e);return isNaN(t)?NaN:t}return NaN})}};class Ii{constructor(e){const{map:t,name:r,attributes:i,passphrase:s,version:n=1,options:a={}}=e;this.name=r,this.version=n,this.attributes=i||{},this.passphrase=s??"secret",this.options=o.merge({},this.defaultOptions(),a),this.allNestedObjectsOptional=this.options.allNestedObjectsOptional??!1;const c=this.preprocessAttributesForValidation(this.attributes);if(this.validator=new Ni({autoEncrypt:!1}).compile(o.merge({$$async:!0},c)),this.options.generateAutoHooks&&this.generateAutoHooks(),o.isEmpty(t)){const e=l.flatten(this.attributes,{safe:!0}),t=Object.keys(e).filter(e=>!e.includes("$$")),r=this.extractObjectKeys(this.attributes),i=[...new Set([...t,...r])],{mapping:s,reversedMapping:n}=function(e){const t={},r={};return e.forEach((e,i)=>{const s=B(i);t[e]=s,r[s]=e}),{mapping:t,reversedMapping:r}}(i);this.map=s,this.reversedMap=n}else this.map=t,this.reversedMap=o.invert(t)}defaultOptions(){return{autoEncrypt:!0,autoDecrypt:!0,arraySeparator:"|",generateAutoHooks:!0,hooks:{beforeMap:{},afterMap:{},beforeUnmap:{},afterUnmap:{}}}}addHook(e,t,r){this.options.hooks[e][t]||(this.options.hooks[e][t]=[]),this.options.hooks[e][t]=o.uniq([...this.options.hooks[e][t],r])}extractObjectKeys(e,t=""){const r=[];for(const[i,s]of Object.entries(e)){if(i.startsWith("$$"))continue;const e=t?`${t}.${i}`:i;"object"!=typeof s||null===s||Array.isArray(s)||(r.push(e),"object"===s.$$type&&r.push(...this.extractObjectKeys(s,e)))}return r}generateAutoHooks(){const e=l.flatten(o.cloneDeep(this.attributes),{safe:!0});for(const[t,r]of Object.entries(e))if(r.includes("array")){if(r.includes("items:string"))this.addHook("beforeMap",t,"fromArray"),this.addHook("afterUnmap",t,"toArray");else if(r.includes("items:number")){r.includes("integer:true")||r.includes("|integer:")||r.includes("|integer")?(this.addHook("beforeMap",t,"fromArrayOfNumbers"),this.addHook("afterUnmap",t,"toArrayOfNumbers")):(this.addHook("beforeMap",t,"fromArrayOfDecimals"),this.addHook("afterUnmap",t,"toArrayOfDecimals"))}}else if(r.includes("secret"))this.options.autoEncrypt&&this.addHook("beforeMap",t,"encrypt"),this.options.autoDecrypt&&this.addHook("afterUnmap",t,"decrypt");else{if(r.includes("number")){r.includes("integer:true")||r.includes("|integer:")||r.includes("|integer")?(this.addHook("beforeMap",t,"toBase62"),this.addHook("afterUnmap",t,"fromBase62")):(this.addHook("beforeMap",t,"toBase62Decimal"),this.addHook("afterUnmap",t,"fromBase62Decimal"));continue}r.includes("boolean")?(this.addHook("beforeMap",t,"fromBool"),this.addHook("afterUnmap",t,"toBool")):(r.includes("json")||"object"===r||r.includes("object"))&&(this.addHook("beforeMap",t,"toJSON"),this.addHook("afterUnmap",t,"fromJSON"))}}static import(e){let{map:t,name:r,options:i,version:s,attributes:n}=o.isString(e)?JSON.parse(e):e;const[a,c,u]=I(()=>Ii._importAttributes(n));if(!a)throw new ae("Failed to import schema attributes",{original:c,input:n});n=u;return new Ii({map:t,name:r,options:i,version:s,attributes:n})}static _importAttributes(e){if("string"==typeof e){const[t,r,i]=I(()=>JSON.parse(e));if(t&&"object"==typeof i&&null!==i){const[t,r,s]=I(()=>Ii._importAttributes(i));if(!t)throw new ae("Failed to parse nested schema attribute",{original:r,input:e});return s}return e}if(Array.isArray(e)){const[t,r,i]=I(()=>e.map(e=>Ii._importAttributes(e)));if(!t)throw new ae("Failed to import array schema attributes",{original:r,input:e});return i}if("object"==typeof e&&null!==e){const t={};for(const[r,i]of Object.entries(e)){const[e,s,n]=I(()=>Ii._importAttributes(i));if(!e)throw new ae("Failed to import object schema attribute",{original:s,key:r,input:i});t[r]=n}return t}return e}export(){return{version:this.version,name:this.name,options:this.options,attributes:this._exportAttributes(this.attributes),map:this.map}}_exportAttributes(e){if("string"==typeof e)return e;if(Array.isArray(e))return e.map(e=>this._exportAttributes(e));if("object"==typeof e&&null!==e){const t={};for(const[r,i]of Object.entries(e))t[r]=this._exportAttributes(i);return t}return e}async applyHooksActions(e,t){const r=o.cloneDeep(e);for(const[e,i]of Object.entries(this.options.hooks[t]))for(const t of i){const i=o.get(r,e);void 0!==i&&"function"==typeof Ai[t]&&o.set(r,e,await Ai[t](i,{passphrase:this.passphrase,separator:this.options.arraySeparator}))}return r}async validate(e,{mutateOriginal:t=!1}={}){let r=t?e:o.cloneDeep(e);return await this.validator(r)}async mapper(e){let t=o.cloneDeep(e);t=await this.applyHooksActions(t,"beforeMap");const r=l.flatten(t,{safe:!0}),i={_v:this.version+""};for(const[e,t]of Object.entries(r)){const r=this.map[e]||e,s=this.getAttributeDefinition(e);"number"==typeof t&&"string"==typeof s&&s.includes("number")?i[r]=B(t):"string"==typeof t?"[object Object]"===t?i[r]="{}":(t.startsWith("{")||t.startsWith("["),i[r]=t):Array.isArray(t)||"object"==typeof t&&null!==t?i[r]=JSON.stringify(t):i[r]=t}return await this.applyHooksActions(i,"afterMap"),i}async unmapper(e,t){let r=o.cloneDeep(e);delete r._v,r=await this.applyHooksActions(r,"beforeUnmap");const i=t?o.invert(t):this.reversedMap,s={};for(const[e,t]of Object.entries(r)){const r=i&&i[e]?i[e]:e;let n=t;const o=this.getAttributeDefinition(r);if("string"!=typeof o||!o.includes("number")||o.includes("array")||o.includes("decimal")){if("string"==typeof t)if("[object Object]"===t)n={};else if(t.startsWith("{")||t.startsWith("[")){const[e,r,i]=I(()=>JSON.parse(t));e&&(n=i)}}else"string"==typeof n&&""!==n?n=z(n):"number"==typeof n||(n=void 0);if(this.attributes&&"string"==typeof o&&o.includes("array"))if(Array.isArray(n));else if("string"==typeof n&&n.trim().startsWith("[")){const[e,t,r]=I(()=>JSON.parse(n));e&&Array.isArray(r)&&(n=r)}else n=Ai.toArray(n,{separator:this.options.arraySeparator});if(this.options.hooks&&this.options.hooks.afterUnmap&&this.options.hooks.afterUnmap[r])for(const e of this.options.hooks.afterUnmap[r])"function"==typeof Ai[e]&&(n=await Ai[e](n,{passphrase:this.passphrase,separator:this.options.arraySeparator}));s[r]=n}await this.applyHooksActions(s,"afterUnmap");const n=l.unflatten(s);for(const[t,r]of Object.entries(e))t.startsWith("$")&&(n[t]=r);return n}getAttributeDefinition(e){const t=e.split(".");let r=this.attributes;for(const e of t){if(!r)return;r=r[e]}return r}preprocessAttributesForValidation(e){const t={};for(const[r,i]of Object.entries(e))if("object"!=typeof i||null===i||Array.isArray(i))t[r]=i;else{const e=i.$$type&&i.$$type.includes("required"),s=i.$$type&&i.$$type.includes("optional"),n={type:"object",properties:this.preprocessAttributesForValidation(i),strict:!1};e||(s||this.allNestedObjectsOptional)&&(n.optional=!0),t[r]=n}return t}}class Di extends ve{constructor(e={}){super(),this._instanceId=Math.random().toString(36).slice(2,8);const t=function(e){const t=[];e.name?"string"!=typeof e.name?t.push("Resource 'name' must be a string"):""===e.name.trim()&&t.push("Resource 'name' cannot be empty"):t.push("Resource 'name' is required");e.client||t.push("S3 'client' is required");e.attributes?"object"!=typeof e.attributes||Array.isArray(e.attributes)?t.push("Resource 'attributes' must be an object"):0===Object.keys(e.attributes).length&&t.push("Resource 'attributes' cannot be empty"):t.push("Resource 'attributes' are required");void 0!==e.version&&"string"!=typeof e.version&&t.push("Resource 'version' must be a string");void 0!==e.behavior&&"string"!=typeof e.behavior&&t.push("Resource 'behavior' must be a string");void 0!==e.passphrase&&"string"!=typeof e.passphrase&&t.push("Resource 'passphrase' must be a string");void 0!==e.parallelism&&("number"==typeof e.parallelism&&Number.isInteger(e.parallelism)?e.parallelism<1&&t.push("Resource 'parallelism' must be greater than 0"):t.push("Resource 'parallelism' must be an integer"));void 0===e.observers||Array.isArray(e.observers)||t.push("Resource 'observers' must be an array");const r=["cache","autoDecrypt","timestamps","paranoid","allNestedObjectsOptional"];for(const i of r)void 0!==e[i]&&"boolean"!=typeof e[i]&&t.push(`Resource '${i}' must be a boolean`);void 0!==e.idGenerator&&("function"!=typeof e.idGenerator&&"number"!=typeof e.idGenerator?t.push("Resource 'idGenerator' must be a function or a number (size)"):"number"==typeof e.idGenerator&&e.idGenerator<=0&&t.push("Resource 'idGenerator' size must be greater than 0"));void 0!==e.idSize&&("number"==typeof e.idSize&&Number.isInteger(e.idSize)?e.idSize<=0&&t.push("Resource 'idSize' must be greater than 0"):t.push("Resource 'idSize' must be an integer"));if(void 0!==e.partitions)if("object"!=typeof e.partitions||Array.isArray(e.partitions))t.push("Resource 'partitions' must be an object");else for(const[r,i]of Object.entries(e.partitions))if("object"!=typeof i||Array.isArray(i))t.push(`Partition '${r}' must be an object`);else if(i.fields)if("object"!=typeof i.fields||Array.isArray(i.fields))t.push(`Partition '${r}.fields' must be an object`);else for(const[e,s]of Object.entries(i.fields))"string"!=typeof s&&t.push(`Partition '${r}.fields.${e}' must be a string`);else t.push(`Partition '${r}' must have a 'fields' property`);if(void 0!==e.hooks)if("object"!=typeof e.hooks||Array.isArray(e.hooks))t.push("Resource 'hooks' must be an object");else{const r=["beforeInsert","afterInsert","beforeUpdate","afterUpdate","beforeDelete","afterDelete"];for(const[i,s]of Object.entries(e.hooks))if(r.includes(i))if(Array.isArray(s))for(let e=0;e<s.length;e++){const t=s[e];if("function"==typeof t);else if("string"==typeof t)continue}else t.push(`Resource 'hooks.${i}' must be an array`);else t.push(`Invalid hook event '${i}'. Valid events: ${r.join(", ")}`)}return{isValid:0===t.length,errors:t}}(e);if(!t.isValid)throw new ce(`Invalid Resource ${e.name} configuration`,{resourceName:e.name,validation:t.errors,operation:"constructor",suggestion:"Check resource config and attributes."});const{name:r,client:i,version:s="1",attributes:n={},behavior:o=U,passphrase:a="secret",parallelism:c=10,observers:u=[],cache:l=!1,autoDecrypt:h=!0,timestamps:d=!1,partitions:f={},paranoid:p=!0,allNestedObjectsOptional:g=!0,hooks:m={},idGenerator:y,idSize:b=22,versioningEnabled:w=!1}=e;if(this.name=r,this.client=i,this.version=s,this.behavior=o,this.observers=u,this.parallelism=c,this.passphrase=a??"secret",this.versioningEnabled=w,this.idGenerator=this.configureIdGenerator(y,b),this.config={cache:l,hooks:m,paranoid:p,timestamps:d,partitions:f,autoDecrypt:h,allNestedObjectsOptional:g},this.hooks={beforeInsert:[],afterInsert:[],beforeUpdate:[],afterUpdate:[],beforeDelete:[],afterDelete:[]},this.attributes=n||{},this.map=e.map,this.applyConfiguration({map:this.map}),m)for(const[e,t]of Object.entries(m))if(Array.isArray(t)&&this.hooks[e])for(const r of t)"function"==typeof r&&this.hooks[e].push(r.bind(this));this._initMiddleware()}configureIdGenerator(e,r){return"function"==typeof e?e:"number"==typeof e&&e>0?t.customAlphabet(t.urlAlphabet,e):"number"==typeof r&&r>0&&22!==r?t.customAlphabet(t.urlAlphabet,r):me}get options(){return{timestamps:this.config.timestamps,partitions:this.config.partitions||{},cache:this.config.cache,autoDecrypt:this.config.autoDecrypt,paranoid:this.config.paranoid,allNestedObjectsOptional:this.config.allNestedObjectsOptional}}export(){const e=this.schema.export();return e.behavior=this.behavior,e.timestamps=this.config.timestamps,e.partitions=this.config.partitions||{},e.paranoid=this.config.paranoid,e.allNestedObjectsOptional=this.config.allNestedObjectsOptional,e.autoDecrypt=this.config.autoDecrypt,e.cache=this.config.cache,e.hooks=this.hooks,e.map=this.map,e}applyConfiguration({map:e}={}){this.config.timestamps&&(this.attributes.createdAt||(this.attributes.createdAt="string|optional"),this.attributes.updatedAt||(this.attributes.updatedAt="string|optional"),this.config.partitions||(this.config.partitions={}),this.config.partitions.byCreatedDate||(this.config.partitions.byCreatedDate={fields:{createdAt:"date|maxlength:10"}}),this.config.partitions.byUpdatedDate||(this.config.partitions.byUpdatedDate={fields:{updatedAt:"date|maxlength:10"}})),this.setupPartitionHooks(),this.versioningEnabled&&(this.config.partitions.byVersion||(this.config.partitions.byVersion={fields:{_v:"string"}})),this.schema=new Ii({name:this.name,attributes:this.attributes,passphrase:this.passphrase,version:this.version,options:{autoDecrypt:this.config.autoDecrypt,allNestedObjectsOptional:this.config.allNestedObjectsOptional},map:e||this.map}),this.validatePartitions()}updateAttributes(e){const t=this.attributes;return this.attributes=e,this.applyConfiguration({map:this.schema?.map}),{oldAttributes:t,newAttributes:e}}addHook(e,t){this.hooks[e]&&this.hooks[e].push(t.bind(this))}async executeHooks(e,t){if(!this.hooks[e])return t;let r=t;for(const t of this.hooks[e])r=await t(r);return r}setupPartitionHooks(){if(!this.config.partitions)return;const e=this.config.partitions;0!==Object.keys(e).length&&(this.hooks.afterInsert||(this.hooks.afterInsert=[]),this.hooks.afterInsert.push(async e=>(await this.createPartitionReferences(e),e)),this.hooks.afterDelete||(this.hooks.afterDelete=[]),this.hooks.afterDelete.push(async e=>(await this.deletePartitionReferences(e),e)))}async validate(e){const t={original:o.cloneDeep(e),isValid:!1,errors:[]},r=await this.schema.validate(e,{mutateOriginal:!1});return!0===r?t.isValid=!0:t.errors=r,t.data=e,t}validatePartitions(){if(!this.config.partitions)return;const e=this.config.partitions;if(0===Object.keys(e).length)return;const t=Object.keys(this.attributes||{});for(const[r,i]of Object.entries(e))if(i.fields)for(const e of Object.keys(i.fields))if(!this.fieldExistsInAttributes(e))throw new ue(`Partition '${r}' uses field '${e}' which does not exist in resource attributes. Available fields: ${t.join(", ")}.`,{resourceName:this.name,partitionName:r,fieldName:e,availableFields:t,operation:"validatePartitions"})}fieldExistsInAttributes(e){if(e.startsWith("_"))return!0;if(!e.includes("."))return Object.keys(this.attributes||{}).includes(e);const t=e.split(".");let r=this.attributes||{};for(const e of t){if(!r||"object"!=typeof r||!(e in r))return!1;r=r[e]}return!0}applyPartitionRule(e,t){if(null==e)return e;let r=e;if("string"==typeof t&&t.includes("maxlength:")){const e=t.match(/maxlength:(\d+)/);if(e){const t=parseInt(e[1]);"string"==typeof r&&r.length>t&&(r=r.substring(0,t))}}if(t.includes("date"))if(r instanceof Date)r=r.toISOString().split("T")[0];else if("string"==typeof r)if(r.includes("T")&&r.includes("Z"))r=r.split("T")[0];else{const e=new Date(r);isNaN(e.getTime())||(r=e.toISOString().split("T")[0])}return r}getResourceKey(e){return Ce("resource="+this.name,"data",`id=${e}`)}getPartitionKey({partitionName:e,id:t,data:r}){if(!this.config.partitions||!this.config.partitions[e])throw new ue(`Partition '${e}' not found`,{resourceName:this.name,partitionName:e,operation:"getPartitionKey"});const i=this.config.partitions[e],s=[],n=Object.entries(i.fields).sort(([e],[t])=>e.localeCompare(t));for(const[e,t]of n){const i=this.getNestedFieldValue(r,e),n=this.applyPartitionRule(i,t);if(null==n)return null;s.push(`${e}=${n}`)}if(0===s.length)return null;const o=t||r?.id;return o?Ce(`resource=${this.name}`,`partition=${e}`,...s,`id=${o}`):null}getNestedFieldValue(e,t){if(!t.includes("."))return e[t];const r=t.split(".");let i=e;for(const e of r){if(!i||"object"!=typeof i||!(e in i))return;i=i[e]}return i}calculateContentLength(e){return e?Buffer.isBuffer(e)?e.length:"string"==typeof e?Buffer.byteLength(e,"utf8"):"object"==typeof e?Buffer.byteLength(JSON.stringify(e),"utf8"):Buffer.byteLength(String(e),"utf8"):0}async insert({id:e,...t}){if(await this.exists(e))throw new Error(`Resource with id '${e}' already exists`);this.getResourceKey(e||"(auto)"),this.options.timestamps&&(t.createdAt=(new Date).toISOString(),t.updatedAt=(new Date).toISOString());const r={id:e,...this.applyDefaults(t)},i=await this.executeHooks("beforeInsert",r),s=Object.keys(i).filter(e=>!(e in r)||i[e]!==r[e]),n={};for(const e of s)n[e]=i[e];const{errors:o,isValid:a,data:c}=await this.validate(i);if(!a){const e=o&&o.length&&o[0].message?o[0].message:"Insert failed";throw new te({bucket:this.client.config.bucket,resourceName:this.name,attributes:i,validation:o,message:e})}const{id:u,...l}=c;Object.assign(l,n);const h=u||e||this.idGenerator(),d=await this.schema.mapper(l);d._v=String(this.version);const f=$(this.behavior),{mappedData:p,body:g}=await f.handleInsert({resource:this,data:l,mappedData:d,originalData:r}),y=p,w=this.getResourceKey(h);let v;if(g&&""!==g){const[e,t]=await A(()=>Promise.resolve(JSON.parse(g)));e&&(v="application/json")}if("body-only"===this.behavior&&(!g||""===g))throw new Error(`[Resource.insert] Tentativa de gravar objeto sem body! Dados: id=${h}, resource=${this.name}`);const[O,k,S]=await A(()=>this.client.putObject({key:w,body:g,contentType:v,metadata:y}));if(!O){const e=k&&k.message?k.message:"";if(e.includes("metadata headers exceed")||e.includes("Insert failed")){const e=m(y),t=b({s3Limit:2047,systemConfig:{version:this.version,timestamps:this.config.timestamps,id:h}}),r=e-t;throw k.totalSize=e,k.limit=2047,k.effectiveLimit=t,k.excess=r,new ce("metadata headers exceed",{resourceName:this.name,operation:"insert",id:h,totalSize:e,effectiveLimit:t,excess:r,suggestion:"Reduce metadata size or number of fields."})}throw se(k,{bucket:this.client.config.bucket,key:w,resourceName:this.name,operation:"insert",id:h})}let _=await this.composeFullObjectFromWrite({id:h,metadata:y,body:g,behavior:this.behavior});const R=await this.executeHooks("afterInsert",_);return this.emit("insert",{..._,$before:{...r},$after:{...R}}),R}async get(e){if(o.isObject(e))throw new Error("id cannot be an object");if(o.isEmpty(e))throw new Error("id cannot be empty");const t=this.getResourceKey(e),[r,i,s]=await A(()=>this.client.getObject(t));if(!r)throw se(i,{bucket:this.client.config.bucket,key:t,resourceName:this.name,operation:"get",id:e});if(0===s.ContentLength){const r=new Error(`No such key: ${t} [bucket:${this.client.config.bucket}]`);throw r.name="NoSuchKey",se(r,{bucket:this.client.config.bucket,key:t,resourceName:this.name,operation:"get",id:e})}const n=s.Metadata?._v||this.version,a="string"==typeof n&&n.startsWith("v")?n.slice(1):n,c=await this.getSchemaForVersion(a);let u=await c.unmapper(s.Metadata);const l=$(this.behavior);let h="";if(s.ContentLength>0){const[e,r,i]=await A(()=>this.client.getObject(t));h=e?await mi(i.Body):""}const{metadata:d}=await l.handleGet({resource:this,metadata:u,body:h});let f=await this.composeFullObjectFromWrite({id:e,metadata:d,body:h,behavior:this.behavior});f._contentLength=s.ContentLength,f._lastModified=s.LastModified,f._hasContent=s.ContentLength>0,f._mimeType=s.ContentType||null,f._v=a,s.VersionId&&(f._versionId=s.VersionId),s.Expiration&&(f._expiresAt=s.Expiration),f._definitionHash=this.getDefinitionHash(),a!==this.version&&(f=await this.applyVersionMapping(f,a,this.version)),this.emit("get",f);return f}async exists(e){const t=this.getResourceKey(e),[r,i]=await A(()=>this.client.headObject(t));return r}async update(e,t){if(o.isEmpty(e))throw new Error("id cannot be empty");if(!await this.exists(e))throw new Error(`Resource with id '${e}' does not exist`);const r=await this.get(e),i=o.cloneDeep(t);let s=o.cloneDeep(r);for(const[e,t]of Object.entries(i))if(e.includes(".")){let r=s;const i=e.split(".");for(let e=0;e<i.length-1;e++)"object"==typeof r[i[e]]&&null!==r[i[e]]||(r[i[e]]={}),r=r[i[e]];r[i[i.length-1]]=o.cloneDeep(t)}else"object"!=typeof t||null===t||Array.isArray(t)?s[e]=o.cloneDeep(t):s[e]=o.merge({},s[e],t);if(this.config.timestamps){const e=(new Date).toISOString();s.updatedAt=e,s.metadata||(s.metadata={}),s.metadata.updatedAt=e}const n=await this.executeHooks("beforeUpdate",o.cloneDeep(s)),a={...r,...n,id:e},{isValid:c,errors:u,data:l}=await this.validate(o.cloneDeep(a));if(!c)throw new te({bucket:this.client.config.bucket,resourceName:this.name,attributes:n,validation:u,message:"validation: "+(u&&u.length?JSON.stringify(u):"unknown")});await this.schema.mapper(l);const h=$(this.behavior),d=await this.schema.mapper({...r,...n});d._v=String(this.version),await h.handleUpdate({resource:this,id:e,data:{...r,...n},mappedData:d,originalData:{...i,id:e}});const{id:f,...p}=l,g={...r,id:e},y={...p,id:e};await this.handlePartitionReferenceUpdates(g,y);const w=await this.schema.mapper(p);w._v=String(this.version);const v=$(this.behavior),{mappedData:O,body:k}=await v.handleUpdate({resource:this,id:e,data:p,mappedData:w,originalData:{...i,id:e}}),S=O,_=this.getResourceKey(e);let R,j=k;if(""===k&&"body-overflow"!==this.behavior){const[e,t,r]=await A(()=>this.client.getObject(_));if(e&&r.ContentLength>0){const e=Buffer.from(await r.Body.transformToByteArray()),t=e.toString(),[i,s]=await A(()=>Promise.resolve(JSON.parse(t)));i||(j=e,R=r.ContentType)}}let E=R;if(j&&""!==j&&!E){const[e,t]=await A(()=>Promise.resolve(JSON.parse(j)));e&&(E="application/json")}this.versioningEnabled&&r._v!==this.version&&await this.createHistoricalVersion(e,r);const[N,I]=await A(()=>this.client.putObject({key:_,body:j,contentType:E,metadata:S}));if(!N&&I&&I.message&&I.message.includes("metadata headers exceed")){const t=m(S),r=b({s3Limit:2047,systemConfig:{version:this.version,timestamps:this.config.timestamps,id:e}}),i=t-r;throw I.totalSize=t,I.limit=2047,I.effectiveLimit=r,I.excess=i,this.emit("exceedsLimit",{operation:"update",totalSize:t,limit:2047,effectiveLimit:r,excess:i,data:p}),new ce("metadata headers exceed",{resourceName:this.name,operation:"update",id:e,totalSize:t,effectiveLimit:r,excess:i,suggestion:"Reduce metadata size or number of fields."})}if(!N)throw se(I,{bucket:this.client.config.bucket,key:_,resourceName:this.name,operation:"update",id:e});const D=await this.composeFullObjectFromWrite({id:e,metadata:S,body:j,behavior:this.behavior}),x=await this.executeHooks("afterUpdate",D);return this.emit("update",{...D,$before:{...r},$after:{...x}}),x}async delete(e){if(o.isEmpty(e))throw new Error("id cannot be empty");let t,r=null;const[i,s,n]=await A(()=>this.get(e));i?t=n:(t={id:e},r=s),await this.executeHooks("beforeDelete",t);const a=this.getResourceKey(e),[c,u,l]=await A(()=>this.client.deleteObject(a));if(this.emit("delete",{...t,$before:{...t},$after:null}),r)throw se(r,{bucket:this.client.config.bucket,key:a,resourceName:this.name,operation:"delete",id:e});if(!c)throw se(u,{key:a,resourceName:this.name,operation:"delete",id:e});return await this.executeHooks("afterDelete",t),l}async upsert({id:e,...t}){return await this.exists(e)?this.update(e,t):this.insert({id:e,...t})}async count({partition:e=null,partitionValues:t={}}={}){let r;if(e&&Object.keys(t).length>0){const i=this.config.partitions[e];if(!i)throw new ue(`Partition '${e}' not found`,{resourceName:this.name,partitionName:e,operation:"count"});const s=[],n=Object.entries(i.fields).sort(([e],[t])=>e.localeCompare(t));for(const[e,r]of n){const i=t[e];if(null!=i){const t=this.applyPartitionRule(i,r);s.push(`${e}=${t}`)}}r=s.length>0?`resource=${this.name}/partition=${e}/${s.join("/")}`:`resource=${this.name}/partition=${e}`}else r=`resource=${this.name}/data`;const i=await this.client.count({prefix:r});return this.emit("count",i),i}async insertMany(e){const{results:t}=await i.PromisePool.for(e).withConcurrency(this.parallelism).handleError(async(e,t)=>{this.emit("error",e,t),this.observers.map(r=>r.emit("error",this.name,e,t))}).process(async e=>await this.insert(e));return this.emit("insertMany",e.length),t}async deleteMany(e){const t=o.chunk(e.map(e=>this.getResourceKey(e)),1e3);e.map(e=>this.getResourceKey(e));const{results:r}=await i.PromisePool.for(t).withConcurrency(this.parallelism).handleError(async(e,t)=>{this.emit("error",e,t),this.observers.map(r=>r.emit("error",this.name,e,t))}).process(async e=>{const t=await this.client.deleteObjects(e);return e.forEach(e=>{const t=e.split("/").find(e=>e.startsWith("id=")),r=t?t.replace("id=",""):null;r&&(this.emit("deleted",r),this.observers.map(e=>e.emit("deleted",this.name,r)))}),t});return this.emit("deleteMany",e.length),r}async deleteAll(){if(!1!==this.config.paranoid)throw new ce("deleteAll() is a dangerous operation and requires paranoid: false option.",{resourceName:this.name,operation:"deleteAll",paranoid:this.config.paranoid,suggestion:"Set paranoid: false to allow deleteAll."});const e=`resource=${this.name}/data`,t=await this.client.deleteAll({prefix:e});return this.emit("deleteAll",{version:this.version,prefix:e,deletedCount:t}),{deletedCount:t,version:this.version}}async deleteAllData(){if(!1!==this.config.paranoid)throw new ce("deleteAllData() is a dangerous operation and requires paranoid: false option.",{resourceName:this.name,operation:"deleteAllData",paranoid:this.config.paranoid,suggestion:"Set paranoid: false to allow deleteAllData."});const e=`resource=${this.name}`,t=await this.client.deleteAll({prefix:e});return this.emit("deleteAllData",{resource:this.name,prefix:e,deletedCount:t}),{deletedCount:t,resource:this.name}}async listIds({partition:e=null,partitionValues:t={},limit:r,offset:i=0}={}){let s;if(e&&Object.keys(t).length>0){if(!this.config.partitions||!this.config.partitions[e])throw new ue(`Partition '${e}' not found`,{resourceName:this.name,partitionName:e,operation:"listIds"});const r=this.config.partitions[e],i=[],n=Object.entries(r.fields).sort(([e],[t])=>e.localeCompare(t));for(const[e,r]of n){const s=t[e];if(null!=s){const t=this.applyPartitionRule(s,r);i.push(`${e}=${t}`)}}s=i.length>0?`resource=${this.name}/partition=${e}/${i.join("/")}`:`resource=${this.name}/partition=${e}`}else s=`resource=${this.name}/data`;const n=(await this.client.getKeysPage({prefix:s,offset:i,amount:r||1e3})).map(e=>{const t=e.split("/").find(e=>e.startsWith("id="));return t?t.replace("id=",""):null}).filter(Boolean);return this.emit("listIds",n.length),n}async list({partition:e=null,partitionValues:t={},limit:r,offset:i=0}={}){const[s,n,o]=await A(async()=>e?await this.listPartition({partition:e,partitionValues:t,limit:r,offset:i}):await this.listMain({limit:r,offset:i}));return s?o:this.handleListError(n,{partition:e,partitionValues:t})}async listMain({limit:e,offset:t=0}){const[r,i,s]=await A(()=>this.listIds({limit:e,offset:t}));if(!r)throw i;const n=await this.processListResults(s,"main");return this.emit("list",{count:n.length,errors:0}),n}async listPartition({partition:e,partitionValues:t,limit:r,offset:i=0}){if(!this.config.partitions?.[e])return this.emit("list",{partition:e,partitionValues:t,count:0,errors:0}),[];const s=this.config.partitions[e],n=this.buildPartitionPrefix(e,s,t),[o,a,c]=await A(()=>this.client.getAllKeys({prefix:n}));if(!o)throw a;const u=this.extractIdsFromKeys(c).slice(i),l=r?u.slice(0,r):u,h=await this.processPartitionResults(l,e,s,c);return this.emit("list",{partition:e,partitionValues:t,count:h.length,errors:0}),h}buildPartitionPrefix(e,t,r){const i=[],s=Object.entries(t.fields).sort(([e],[t])=>e.localeCompare(t));for(const[e,t]of s){const s=r[e];if(null!=s){const r=this.applyPartitionRule(s,t);i.push(`${e}=${r}`)}}return i.length>0?`resource=${this.name}/partition=${e}/${i.join("/")}`:`resource=${this.name}/partition=${e}`}extractIdsFromKeys(e){return e.map(e=>{const t=e.split("/").find(e=>e.startsWith("id="));return t?t.replace("id=",""):null}).filter(Boolean)}async processListResults(e,t="main"){const{results:r,errors:s}=await i.PromisePool.for(e).withConcurrency(this.parallelism).handleError(async(e,t)=>{this.emit("error",e,content),this.observers.map(t=>t.emit("error",this.name,e,content))}).process(async e=>{const[r,i,s]=await A(()=>this.get(e));return r?s:this.handleResourceError(i,e,t)});return this.emit("list",{count:r.length,errors:0}),r}async processPartitionResults(e,t,r,s){const n=Object.entries(r.fields).sort(([e],[t])=>e.localeCompare(t)),{results:o,errors:a}=await i.PromisePool.for(e).withConcurrency(this.parallelism).handleError(async(e,t)=>{this.emit("error",e,content),this.observers.map(t=>t.emit("error",this.name,e,content))}).process(async e=>{const[r,i,o]=await A(async()=>{const r=this.extractPartitionValuesFromKey(e,s,n);return await this.getFromPartition({id:e,partitionName:t,partitionValues:r})});return r?o:this.handleResourceError(i,e,"partition")});return o.filter(e=>null!==e)}extractPartitionValuesFromKey(e,t,r){const i=t.find(t=>t.includes(`id=${e}`));if(!i)throw new ue(`Partition key not found for ID ${e}`,{resourceName:this.name,id:e,operation:"extractPartitionValuesFromKey"});const s=i.split("/"),n={};for(const[e]of r){const t=s.find(t=>t.startsWith(`${e}=`));if(t){const r=t.replace(`${e}=`,"");n[e]=r}}return n}handleResourceError(e,t,r){if(e.message.includes("Cipher job failed")||e.message.includes("OperationError"))return{id:t,_decryptionFailed:!0,_error:e.message,..."partition"===r&&{_partition:r}};throw e}handleListError(e,{partition:t,partitionValues:r}){return e.message.includes("Partition '")&&e.message.includes("' not found"),this.emit("list",{partition:t,partitionValues:r,count:0,errors:1}),[]}async getMany(e){const{results:t,errors:r}=await i.PromisePool.for(e).withConcurrency(this.client.parallelism).handleError(async(e,t)=>(this.emit("error",e,content),this.observers.map(t=>t.emit("error",this.name,e,content)),{id:t,_error:e.message,_decryptionFailed:e.message.includes("Cipher job failed")||e.message.includes("OperationError")})).process(async e=>{const[t,r,i]=await A(()=>this.get(e));if(t)return i;if(r.message.includes("Cipher job failed")||r.message.includes("OperationError"))return{id:e,_decryptionFailed:!0,_error:r.message};throw r});return this.emit("getMany",e.length),t}async getAll(){const[e,t,r]=await A(()=>this.listIds());if(!e)throw t;const i=[];for(const e of r){const[t,r,s]=await A(()=>this.get(e));t&&i.push(s)}return i}async page({offset:e=0,size:t=100,partition:r=null,partitionValues:i={},skipCount:s=!1}={}){const[n,o,a]=await A(async()=>{let n=null,o=null;if(!s){const[e,s,a]=await A(()=>this.count({partition:r,partitionValues:i}));e?(n=a,o=Math.ceil(n/t)):(n=null,o=null)}const a=Math.floor(e/t);let c=[];if(t<=0)c=[];else{const[s,n,o]=await A(()=>this.list({partition:r,partitionValues:i,limit:t,offset:e}));c=s?o:[]}const u={items:c,totalItems:n,page:a,pageSize:t,totalPages:o,hasMore:c.length===t&&e+t<(n||1/0),_debug:{requestedSize:t,requestedOffset:e,actualItemsReturned:c.length,skipCount:s,hasTotalItems:null!==n}};return this.emit("page",u),u});return n?a:{items:[],totalItems:null,page:Math.floor(e/t),pageSize:t,totalPages:null,_debug:{requestedSize:t,requestedOffset:e,actualItemsReturned:0,skipCount:s,hasTotalItems:!1,error:o.message}}}readable(){return new pi({resource:this}).build()}writable(){return new gi({resource:this}).build()}async setContent({id:e,buffer:t,contentType:r="application/octet-stream"}){const[i,s,n]=await A(()=>this.get(e));if(!i||!n)throw new ce(`Resource with id '${e}' not found`,{resourceName:this.name,id:e,operation:"setContent"});const o={...n,_hasContent:!0,_contentLength:t.length,_mimeType:r},a=await this.schema.mapper(o),[c,u]=await A(()=>this.client.putObject({key:this.getResourceKey(e),metadata:a,body:t,contentType:r}));if(!c)throw u;return this.emit("setContent",{id:e,contentType:r,contentLength:t.length}),o}async content(e){const t=this.getResourceKey(e),[r,i,s]=await A(()=>this.client.getObject(t));if(!r){if("NoSuchKey"===i.name)return{buffer:null,contentType:null};throw i}const n=Buffer.from(await s.Body.transformToByteArray()),o=s.ContentType||null;return this.emit("content",e,n.length,o),{buffer:n,contentType:o}}async hasContent(e){const t=this.getResourceKey(e),[r,i,s]=await A(()=>this.client.headObject(t));return!!r&&s.ContentLength>0}async deleteContent(e){const t=this.getResourceKey(e),[r,i,s]=await A(()=>this.client.headObject(t));if(!r)throw i;const n=s.Metadata||{},[o,a,c]=await A(()=>this.client.putObject({key:t,body:"",metadata:n}));if(!o)throw a;return this.emit("deleteContent",e),c}getDefinitionHash(){const e={attributes:this.attributes,behavior:this.behavior},t=c(e);return`sha256:${a.createHash("sha256").update(t).digest("hex")}`}extractVersionFromKey(e){const t=e.split("/").find(e=>e.startsWith("v="));return t?t.replace("v=",""):null}async getSchemaForVersion(e){if(e===this.version)return this.schema;const[t,r,i]=await A(()=>Promise.resolve(new Ii({name:this.name,attributes:this.attributes,passphrase:this.passphrase,version:e,options:{...this.config,autoDecrypt:!0,autoEncrypt:!0}})));return t?i:this.schema}async createPartitionReferences(e){const t=this.config.partitions;if(t&&0!==Object.keys(t).length)for(const[r,i]of Object.entries(t)){const t=this.getPartitionKey({partitionName:r,id:e.id,data:e});if(t){const e={_v:String(this.version)};await this.client.putObject({key:t,metadata:e,body:"",contentType:void 0})}}}async deletePartitionReferences(e){const t=this.config.partitions;if(!t||0===Object.keys(t).length)return;const r=[];for(const[i,s]of Object.entries(t)){const t=this.getPartitionKey({partitionName:i,id:e.id,data:e});t&&r.push(t)}if(r.length>0){const[e,t]=await A(()=>this.client.deleteObjects(r))}}async query(e={},{limit:t=100,offset:r=0,partition:i=null,partitionValues:s={}}={}){if(0===Object.keys(e).length)return await this.list({partition:i,partitionValues:s,limit:t,offset:r});const n=[];let o=r;const a=Math.min(t,50);for(;n.length<t;){const t=await this.list({partition:i,partitionValues:s,limit:a,offset:o});if(0===t.length)break;const r=t.filter(t=>Object.entries(e).every(([e,r])=>t[e]===r));if(n.push(...r),o+=a,t.length<a)break}return n.slice(0,t)}async handlePartitionReferenceUpdates(e,t){const r=this.config.partitions;if(!r||0===Object.keys(r).length)return;for(const[i,s]of Object.entries(r)){const[r,n]=await A(()=>this.handlePartitionReferenceUpdate(i,s,e,t))}const i=t.id||e.id;for(const[e,s]of Object.entries(r)){const r=`resource=${this.name}/partition=${e}`;let s=[];const[n,o,a]=await A(()=>this.client.getAllKeys({prefix:r}));if(!n)continue;s=a;const c=this.getPartitionKey({partitionName:e,id:i,data:t});for(const e of s)if(e.endsWith(`/id=${i}`)&&e!==c){const[t,r]=await A(()=>this.client.deleteObject(e))}}}async handlePartitionReferenceUpdate(e,t,r,i){const s=i.id||r.id,n=this.getPartitionKey({partitionName:e,id:s,data:r}),o=this.getPartitionKey({partitionName:e,id:s,data:i});if(n!==o){if(n){const[e,t]=await A(async()=>{await this.client.deleteObject(n)})}if(o){const[e,t]=await A(async()=>{const e={_v:String(this.version)};await this.client.putObject({key:o,metadata:e,body:"",contentType:void 0})})}}else if(o){const[e,t]=await A(async()=>{const e={_v:String(this.version)};await this.client.putObject({key:o,metadata:e,body:"",contentType:void 0})})}}async updatePartitionReferences(e){const t=this.config.partitions;if(t&&0!==Object.keys(t).length)for(const[r,i]of Object.entries(t)){if(!i||!i.fields||"object"!=typeof i.fields)continue;const t=this.getPartitionKey({partitionName:r,id:e.id,data:e});if(t){const e={_v:String(this.version)},[r,i]=await A(async()=>{await this.client.putObject({key:t,metadata:e,body:"",contentType:void 0})})}}}async getFromPartition({id:e,partitionName:t,partitionValues:r={}}){if(!this.config.partitions||!this.config.partitions[t])throw new ue(`Partition '${t}' not found`,{resourceName:this.name,partitionName:t,operation:"getFromPartition"});const i=this.config.partitions[t],s=[],n=Object.entries(i.fields).sort(([e],[t])=>e.localeCompare(t));for(const[e,t]of n){const i=r[e];if(null!=i){const r=this.applyPartitionRule(i,t);s.push(`${e}=${r}`)}}if(0===s.length)throw new ue(`No partition values provided for partition '${t}'`,{resourceName:this.name,partitionName:t,operation:"getFromPartition"});const o=Ce(`resource=${this.name}`,`partition=${t}`,...s,`id=${e}`),[a,c]=await A(async()=>{await this.client.headObject(o)});if(!a)throw new ce(`Resource with id '${e}' not found in partition '${t}'`,{resourceName:this.name,id:e,partitionName:t,operation:"getFromPartition"});const u=await this.get(e);return u._partition=t,u._partitionValues=r,this.emit("getFromPartition",u),u}async createHistoricalVersion(e,t){const r=Ce(`resource=${this.name}`,"historical",`id=${e}`),i={...t,_v:t._v||this.version,_historicalTimestamp:(new Date).toISOString()},s=await this.schema.mapper(i),n=$(this.behavior),{mappedData:o,body:a}=await n.handleInsert({resource:this,data:i,mappedData:s}),c={...o,_v:t._v||this.version,_historicalTimestamp:i._historicalTimestamp};let u;if(a&&""!==a){const[e,t]=await A(()=>Promise.resolve(JSON.parse(a)));e&&(u="application/json")}await this.client.putObject({key:r,metadata:c,body:a,contentType:u})}async applyVersionMapping(e,t,r){if(t===r)return e;return{...e,_v:r,_originalVersion:t,_versionMapped:!0}}async composeFullObjectFromWrite({id:e,metadata:t,body:r,behavior:i}){const s={};t&&"true"===t.$truncated&&(s.$truncated="true"),t&&"true"===t.$overflow&&(s.$overflow="true");let n={};const[o,a,c]=await A(()=>this.schema.unmapper(t));n=o?c:t;const u=e=>{if(!e||"object"!=typeof e)return e;const t={};for(const[r,i]of Object.entries(e))r.startsWith("_")||(t[r]=i);return t},l=e=>{if("object"==typeof e&&null!==e)return e;if("string"==typeof e){if("[object Object]"===e)return{};if(e.startsWith("{")||e.startsWith("[")){const[t,r,i]=I(()=>JSON.parse(e));return t?i:e}return e}return e};if("body-overflow"===i){const i=t&&"true"===t.$overflow;let s={};if(i&&r){const[e,t,i]=await A(()=>Promise.resolve(JSON.parse(r)));if(e){const[e,t,r]=await A(()=>this.schema.unmapper(i));s=e?r:{}}}const o={...n,...s,id:e};Object.keys(o).forEach(e=>{o[e]=l(o[e])});const a=u(o);return i&&(a.$overflow="true"),a}if("body-only"===i){const[i,s,n]=await A(()=>Promise.resolve(r?JSON.parse(r):{}));let o=this.schema.map;if(t&&t._map){const[e,r,i]=await A(()=>Promise.resolve("string"==typeof t._map?JSON.parse(t._map):t._map));o=e?i:this.schema.map}const[a,c,u]=await A(()=>this.schema.unmapper(n,o)),h=a?{...u,id:e}:{id:e};return Object.keys(h).forEach(e=>{h[e]=l(h[e])}),h}const h={...n,id:e};Object.keys(h).forEach(e=>{h[e]=l(h[e])});const d=u(h);return s.$truncated&&(d.$truncated=s.$truncated),s.$overflow&&(d.$overflow=s.$overflow),d}emit(e,...t){return super.emit(e,...t)}async replace(e,t){await this.delete(e),await new Promise(e=>setTimeout(e,100));const r=Date.now();for(;Date.now()-r<5e3;){if(!await this.exists(e))break;await new Promise(e=>setTimeout(e,50))}try{return await this.insert({...t,id:e})}catch(r){if(r&&r.message&&r.message.includes("already exists")){return await this.update(e,t)}throw r}}_initMiddleware(){this._middlewares=new Map,this._middlewareMethods=["get","list","listIds","getAll","count","page","insert","update","delete","deleteMany","exists","getMany"];for(const e of this._middlewareMethods)this._middlewares.set(e,[]),this[`_original_${e}`]||(this[`_original_${e}`]=this[e].bind(this),this[e]=async(...t)=>{const r={resource:this,args:t,method:e};let i=-1;const s=this._middlewares.get(e),n=async t=>{if(t<=i)throw new Error("next() called multiple times");return i=t,t<s.length?await s[t](r,()=>n(t+1)):await this[`_original_${e}`](...r.args)};return await n(0)})}useMiddleware(e,t){if(this._middlewares||this._initMiddleware(),!this._middlewares.has(e))throw new ce(`No such method for middleware: ${e}`,{operation:"useMiddleware",method:e});this._middlewares.get(e).push(t)}applyDefaults(e){const t={...e};for(const[e,r]of Object.entries(this.attributes))if(void 0===t[e]&&"string"==typeof r&&r.includes("default:")){const i=r.match(/default:([^|]+)/);if(i){let s=i[1];r.includes("boolean")?s="true"===s:r.includes("number")&&(s=Number(s)),t[e]=s}}return t}}class xi extends ve{constructor(e){super(),this.version="1",this.s3dbVersion=(()=>{const[e,t,r]=A(()=>"7.0.2");return e?r:"latest"})(),this.resources={},this.savedMetadata=null,this.options=e,this.verbose=e.verbose||!1,this.parallelism=parseInt(e.parallelism+"")||10,this.plugins=e.plugins||[],this.pluginList=e.plugins||[],this.cache=e.cache,this.passphrase=e.passphrase||"secret",this.versioningEnabled=e.versioningEnabled||!1;let t=e.connectionString;if(!t&&(e.bucket||e.accessKeyId||e.secretAccessKey)){const{bucket:r,region:i,accessKeyId:s,secretAccessKey:n,endpoint:o,forcePathStyle:a}=e;if(o){const e=new URL(o);s&&(e.username=encodeURIComponent(s)),n&&(e.password=encodeURIComponent(n)),e.pathname=`/${r||"s3db"}`,a&&e.searchParams.set("forcePathStyle","true"),t=e.toString()}else if(s&&n){const e=new URLSearchParams;e.set("region",i||"us-east-1"),a&&e.set("forcePathStyle","true"),t=`s3://${encodeURIComponent(s)}:${encodeURIComponent(n)}@${r||"s3db"}?${e.toString()}`}}this.client=e.client||new _i({verbose:this.verbose,parallelism:this.parallelism,connectionString:t}),this.bucket=this.client.bucket,this.keyPrefix=this.client.keyPrefix,this._exitListenerRegistered||(this._exitListenerRegistered=!0,process.on("exit",async()=>{if(this.isConnected())try{await this.disconnect()}catch(e){}}))}async connect(){await this.startPlugins();let e=null;if(await this.client.exists("s3db.json")){const t=await this.client.getObject("s3db.json");e=JSON.parse(await mi(t?.Body))}else e=this.blankMetadataStructure(),await this.uploadMetadataFile();this.savedMetadata=e;const t=this.detectDefinitionChanges(e);for(const[t,r]of Object.entries(e.resources||{})){const e=r.currentVersion||"v0",i=r.versions?.[e];i&&(this.resources[t]=new Di({name:t,client:this.client,database:this,version:e,attributes:i.attributes,behavior:i.behavior||"user-managed",parallelism:this.parallelism,passphrase:this.passphrase,observers:[this],cache:this.cache,timestamps:void 0!==i.timestamps&&i.timestamps,partitions:r.partitions||i.partitions||{},paranoid:void 0===i.paranoid||i.paranoid,allNestedObjectsOptional:void 0===i.allNestedObjectsOptional||i.allNestedObjectsOptional,autoDecrypt:void 0===i.autoDecrypt||i.autoDecrypt,hooks:i.hooks||{},versioningEnabled:this.versioningEnabled,map:i.map}))}t.length>0&&this.emit("resourceDefinitionsChanged",{changes:t,metadata:this.savedMetadata}),this.emit("connected",new Date)}detectDefinitionChanges(e){const t=[];for(const[r,i]of Object.entries(this.resources)){const s=this.generateDefinitionHash(i.export()),n=e.resources?.[r];if(n){const e=n.currentVersion||"v0",i=n.versions?.[e],o=i?.hash;o!==s&&t.push({type:"changed",resourceName:r,currentHash:s,savedHash:o,fromVersion:e,toVersion:this.getNextVersion(n.versions)})}else t.push({type:"new",resourceName:r,currentHash:s,savedHash:null})}for(const[r,i]of Object.entries(e.resources||{}))if(!this.resources[r]){const e=i.currentVersion||"v0",s=i.versions?.[e];t.push({type:"deleted",resourceName:r,currentHash:null,savedHash:s?.hash,deletedVersion:e})}return t}generateDefinitionHash(e,t=void 0){const r={...e.attributes};e.timestamps&&(delete r.createdAt,delete r.updatedAt);const i={attributes:r,behavior:t||e.behavior||"user-managed",partitions:e.partitions||{}},s=c(i);return`sha256:${a.createHash("sha256").update(s).digest("hex")}`}getNextVersion(e={}){const t=Object.keys(e).filter(e=>e.startsWith("v")).map(e=>parseInt(e.substring(1))).filter(e=>!isNaN(e));return`v${(t.length>0?Math.max(...t):-1)+1}`}async startPlugins(){const e=this;if(!o.isEmpty(this.pluginList)){const t=this.pluginList.map(e=>o.isFunction(e)?new e(this):e),r=t.map(async t=>{t.beforeSetup&&await t.beforeSetup(),await t.setup(e),t.afterSetup&&await t.afterSetup()});await Promise.all(r);const i=t.map(async e=>{e.beforeStart&&await e.beforeStart(),await e.start(),e.afterStart&&await e.afterStart()});await Promise.all(i)}}async usePlugin(e,t=null){const r=t||e.constructor.name.replace("Plugin","").toLowerCase();return this.plugins[r]=e,this.isConnected()&&(await e.setup(this),await e.start()),e}async uploadMetadataFile(){const e={version:this.version,s3dbVersion:this.s3dbVersion,lastUpdated:(new Date).toISOString(),resources:{}};Object.entries(this.resources).forEach(([t,r])=>{const i=r.export(),s=this.generateDefinitionHash(i),n=this.savedMetadata?.resources?.[t],o=n?.currentVersion||"v0",a=n?.versions?.[o];let c,u;a&&a.hash===s?(c=o,u=!1):(c=this.getNextVersion(n?.versions),u=!0),e.resources[t]={currentVersion:c,partitions:r.config.partitions||{},versions:{...n?.versions,[c]:{hash:s,attributes:i.attributes,behavior:i.behavior||"user-managed",timestamps:r.config.timestamps,partitions:r.config.partitions,paranoid:r.config.paranoid,allNestedObjectsOptional:r.config.allNestedObjectsOptional,autoDecrypt:r.config.autoDecrypt,cache:r.config.cache,hooks:r.config.hooks,createdAt:u?(new Date).toISOString():a?.createdAt}}},r.version!==c&&(r.version=c,r.emit("versionUpdated",{oldVersion:o,newVersion:c}))}),await this.client.putObject({key:"s3db.json",body:JSON.stringify(e,null,2),contentType:"application/json"}),this.savedMetadata=e,this.emit("metadataUploaded",e)}blankMetadataStructure(){return{version:"1",s3dbVersion:this.s3dbVersion,resources:{}}}resourceExists(e){return!!this.resources[e]}resourceExistsWithSameHash({name:e,attributes:t,behavior:r="user-managed",partitions:i={},options:s={}}){if(!this.resources[e])return{exists:!1,sameHash:!1,hash:null};const n=this.resources[e],o=this.generateDefinitionHash(n.export()),a=new Di({name:e,attributes:t,behavior:r,partitions:i,client:this.client,version:n.version,passphrase:this.passphrase,versioningEnabled:this.versioningEnabled,...s}),c=this.generateDefinitionHash(a.export());return{exists:!0,sameHash:o===c,hash:c,existingHash:o}}async createResource({name:e,attributes:t,behavior:r="user-managed",hooks:i,...s}){if(this.resources[e]){const n=this.resources[e];if(Object.assign(n.config,{cache:this.cache,...s}),r&&(n.behavior=r),n.versioningEnabled=this.versioningEnabled,n.updateAttributes(t),i)for(const[e,t]of Object.entries(i))if(Array.isArray(t)&&n.hooks[e])for(const r of t)"function"==typeof r&&n.hooks[e].push(r.bind(n));const o=this.generateDefinitionHash(n.export(),n.behavior),a=this.savedMetadata?.resources?.[e],c=a?.currentVersion||"v0",u=a?.versions?.[c];return u&&u.hash===o||await this.uploadMetadataFile(),this.emit("s3db.resourceUpdated",e),n}const n=this.savedMetadata?.resources?.[e],o=n?.currentVersion||"v0",a=new Di({name:e,client:this.client,version:void 0!==s.version?s.version:o,attributes:t,behavior:r,parallelism:this.parallelism,passphrase:void 0!==s.passphrase?s.passphrase:this.passphrase,observers:[this],cache:void 0!==s.cache?s.cache:this.cache,timestamps:void 0!==s.timestamps&&s.timestamps,partitions:s.partitions||{},paranoid:void 0===s.paranoid||s.paranoid,allNestedObjectsOptional:void 0===s.allNestedObjectsOptional||s.allNestedObjectsOptional,autoDecrypt:void 0===s.autoDecrypt||s.autoDecrypt,hooks:i||{},versioningEnabled:this.versioningEnabled,map:s.map,idGenerator:s.idGenerator,idSize:s.idSize});return a.database=this,this.resources[e]=a,await this.uploadMetadataFile(),this.emit("s3db.resourceCreated",e),a}resource(e){return this.resources[e]?this.resources[e]:Promise.reject(`resource ${e} does not exist`)}async listResources(){return Object.keys(this.resources).map(e=>({name:e}))}async getResource(e){if(!this.resources[e])throw new Y({bucket:this.client.config.bucket,resourceName:e,id:e});return this.resources[e]}get config(){return{version:this.version,s3dbVersion:this.s3dbVersion,bucket:this.bucket,keyPrefix:this.keyPrefix,parallelism:this.parallelism,verbose:this.verbose}}isConnected(){return!!this.savedMetadata}async disconnect(){try{if(this.pluginList&&this.pluginList.length>0){for(const e of this.pluginList)e&&"function"==typeof e.removeAllListeners&&e.removeAllListeners();const e=this.pluginList.map(async e=>{try{e&&"function"==typeof e.stop&&await e.stop()}catch(e){}});await Promise.all(e)}if(this.resources&&Object.keys(this.resources).length>0){for(const[e,t]of Object.entries(this.resources))try{t&&"function"==typeof t.removeAllListeners&&t.removeAllListeners(),t._pluginWrappers&&t._pluginWrappers.clear(),t._pluginMiddlewares&&(t._pluginMiddlewares={}),t.observers&&Array.isArray(t.observers)&&(t.observers=[])}catch(e){}Object.keys(this.resources).forEach(e=>delete this.resources[e])}this.client&&"function"==typeof this.client.removeAllListeners&&this.client.removeAllListeners(),this.removeAllListeners(),this.savedMetadata=null,this.plugins={},this.pluginList=[],this.emit("disconnected",new Date)}catch(e){}}}class Pi extends xi{}function Ci(e){return"string"==typeof e?e.trim().toLowerCase():e}const Ti={s3db:class extends vi{constructor(e={},t=[],r=null){super(e),this.instanceId=Math.random().toString(36).slice(2,10),this.client=r,this.connectionString=e.connectionString;let i=t;if(t)if(Array.isArray(t)){i={};for(const e of t)"string"==typeof e&&(i[Ci(e)]=e)}else"string"==typeof t&&(i[Ci(t)]=t);else i={};this.resourcesMap=this._normalizeResources(i)}_normalizeResources(e){if(!e)return{};if(Array.isArray(e)){const t={};for(const r of e)"string"==typeof r?t[Ci(r)]=r:Array.isArray(r)&&"string"==typeof r[0]?t[Ci(r[0])]=r:"object"==typeof r&&r.resource&&(t[Ci(r.resource)]={...r});return t}if("object"==typeof e){const t={};for(const[r,i]of Object.entries(e)){const e=Ci(r);"string"==typeof i?t[e]=i:Array.isArray(i)?t[e]=i.map(e=>"string"==typeof e||"function"==typeof e?e:"object"==typeof e&&e.resource?{...e}:e):"function"==typeof i?t[e]=i:"object"==typeof i&&i.resource&&(t[e]={...i})}return t}if("function"==typeof e)return e;if("string"==typeof e){return{[Ci(e)]:e}}return{}}validateConfig(){const e=[];return this.client||this.connectionString||e.push("You must provide a client or a connectionString"),(!this.resourcesMap||"object"==typeof this.resourcesMap&&0===Object.keys(this.resourcesMap).length)&&e.push("You must provide a resources map or array"),{isValid:0===e.length,errors:e}}async initialize(e){try{if(await super.initialize(e),this.client)this.targetDatabase=this.client;else{if(!this.connectionString)throw new Error("S3dbReplicator: No client or connectionString provided");{const e={connectionString:this.connectionString,region:this.region,keyPrefix:this.keyPrefix,verbose:this.config.verbose||!1};this.targetDatabase=new Pi(e),await this.targetDatabase.connect()}}this.emit("connected",{replicator:this.name,target:this.connectionString||"client-provided"})}catch(e){throw e}}async replicate({resource:e,operation:t,data:r,id:i}){const s=Ci(e),n=this._resolveDestResource(s,r),o=this._getDestResourceObj(n),a=this._applyTransformer(s,r);let c;if("insert"===t)c=await o.insert(a);else if("update"===t)c=await o.update(i,a);else{if("delete"!==t)throw new Error(`Invalid operation: ${t}. Supported operations are: insert, update, delete`);c=await o.delete(i)}return c}_applyTransformer(e,t){const r=Ci(e),i=this.resourcesMap[r];let s;return i?(Array.isArray(i)&&"function"==typeof i[1]?s=i[1](t):"function"==typeof i?s=i(t):"object"==typeof i?"function"==typeof i.transform?s=i.transform(t):"function"==typeof i.transformer&&(s=i.transformer(t)):s=t,s&&t&&t.id&&!s.id&&(s.id=t.id),!s&&t&&(s=t),s):t}_resolveDestResource(e,t){const r=Ci(e),i=this.resourcesMap[r];if(!i)return e;if(Array.isArray(i)){if("string"==typeof i[0])return i[0];if("object"==typeof i[0]&&i[0].resource)return i[0].resource;if("function"==typeof i[0])return e}return"string"==typeof i?i:"function"==typeof i?e:"object"==typeof i&&i.resource?i.resource:e}_getDestResourceObj(e){if(!this.client||!this.client.resources)return null;const t=Object.keys(this.client.resources),r=Ci(e),i=t.find(e=>Ci(e)===r);if(!i)throw new Error(`[S3dbReplicator] Destination resource not found: ${e}. Available: ${t.join(", ")}`);return this.client.resources[i]}async replicateBatch(e,t){if(!this.enabled||!this.shouldReplicateResource(e))return{skipped:!0,reason:"resource_not_included"};const r=[],i=[];for(const s of t){const[t,n,o]=await A(()=>this.replicate({resource:e,operation:s.operation,id:s.id,data:s.data,beforeData:s.beforeData}));t?r.push(o):i.push({id:s.id,error:n.message})}return this.emit("batch_replicated",{replicator:this.name,resourceName:e,total:t.length,successful:r.length,errors:i.length}),{success:0===i.length,results:r,errors:i,total:t.length}}async testConnection(){const[e,t]=await A(async()=>(this.targetDatabase||await this.initialize(this.database),await this.targetDatabase.listResources(),!0));return!!e||(this.emit("connection_error",{replicator:this.name,error:t.message}),!1)}async getStatus(){return{...await super.getStatus(),connected:!!this.targetDatabase,targetDatabase:this.connectionString||"client-provided",resources:Object.keys(this.resourcesMap||{}),totalreplicators:this.listenerCount("replicated"),totalErrors:this.listenerCount("replicator_error")}}async cleanup(){this.targetDatabase&&this.targetDatabase.removeAllListeners(),await super.cleanup()}shouldReplicateResource(e,t){const r=Ci(e),i=this.resourcesMap[r];if(!i)return!1;if(!t)return!0;if(Array.isArray(i)){for(const e of i)if("object"==typeof e&&e.resource){if(!e.actions||!Array.isArray(e.actions))return!0;if(e.actions.includes(t))return!0}else if("string"==typeof e||"function"==typeof e)return!0;return!1}return"object"==typeof i&&i.resource?!i.actions||!Array.isArray(i.actions)||i.actions.includes(t):"string"==typeof i||"function"==typeof i}},sqs:class extends vi{constructor(e={},t=[],r=null){if(super(e),this.resources=t,this.client=r,this.queueUrl=e.queueUrl,this.queues=e.queues||{},this.defaultQueue=e.defaultQueue||e.defaultQueueUrl||e.queueUrlDefault,this.region=e.region||"us-east-1",this.sqsClient=r||null,this.messageGroupId=e.messageGroupId,this.deduplicationId=e.deduplicationId,t&&"object"==typeof t)for(const[e,r]of Object.entries(t))r.queueUrl&&(this.queues[e]=r.queueUrl)}validateConfig(){const e=[];return this.queueUrl||0!==Object.keys(this.queues).length||this.defaultQueue||this.resourceQueueMap||e.push("Either queueUrl, queues object, defaultQueue, or resourceQueueMap must be provided"),{isValid:0===e.length,errors:e}}getQueueUrlsForResource(e){if(this.resourceQueueMap&&this.resourceQueueMap[e])return this.resourceQueueMap[e];if(this.queues[e])return[this.queues[e]];if(this.queueUrl)return[this.queueUrl];if(this.defaultQueue)return[this.defaultQueue];throw new Error(`No queue URL found for resource '${e}'`)}_applyTransformer(e,t){const r=this.resources[e];let i=t;return r?("function"==typeof r.transform?i=r.transform(t):"function"==typeof r.transformer&&(i=r.transformer(t)),i||t):t}createMessage(e,t,r,i,s=null){const n={resource:e,action:t,timestamp:(new Date).toISOString(),source:"s3db-replicator"};switch(t){case"insert":case"delete":default:return{...n,data:r};case"update":return{...n,before:s,data:r}}}async initialize(e,t){if(await super.initialize(e),!this.sqsClient){const[e,r,i]=await A(()=>import("@aws-sdk/client-sqs"));if(!e)throw this.emit("initialization_error",{replicator:this.name,error:r.message}),r;const{SQSClient:s}=i;this.sqsClient=t||new s({region:this.region,credentials:this.config.credentials}),this.emit("initialized",{replicator:this.name,queueUrl:this.queueUrl,queues:this.queues,defaultQueue:this.defaultQueue})}}async replicate(e,t,r,i,s=null){if(!this.enabled||!this.shouldReplicateResource(e))return{skipped:!0,reason:"resource_not_included"};const[n,o,a]=await A(async()=>{const{SendMessageCommand:n}=await import("@aws-sdk/client-sqs"),o=this.getQueueUrlsForResource(e),a=this._applyTransformer(e,r),c=this.createMessage(e,t,a,i,s),u=[];for(const r of o){const s=new n({QueueUrl:r,MessageBody:JSON.stringify(c),MessageGroupId:this.messageGroupId,MessageDeduplicationId:this.deduplicationId?`${e}:${t}:${i}`:void 0}),o=await this.sqsClient.send(s);u.push({queueUrl:r,messageId:o.MessageId}),this.emit("replicated",{replicator:this.name,resource:e,operation:t,id:i,queueUrl:r,messageId:o.MessageId,success:!0})}return{success:!0,results:u}});return n?a:(this.emit("replicator_error",{replicator:this.name,resource:e,operation:t,id:i,error:o.message}),{success:!1,error:o.message})}async replicateBatch(e,t){if(!this.enabled||!this.shouldReplicateResource(e))return{skipped:!0,reason:"resource_not_included"};const[r,i,s]=await A(async()=>{const{SendMessageBatchCommand:r}=await import("@aws-sdk/client-sqs"),i=this.getQueueUrlsForResource(e),s=[];for(let e=0;e<t.length;e+=10)s.push(t.slice(e,e+10));const n=[],o=[];for(const t of s){const[s,a]=await A(async()=>{const s=t.map((t,r)=>({Id:`${t.id}-${r}`,MessageBody:JSON.stringify(this.createMessage(e,t.operation,t.data,t.id,t.beforeData)),MessageGroupId:this.messageGroupId,MessageDeduplicationId:this.deduplicationId?`${e}:${t.operation}:${t.id}`:void 0})),o=new r({QueueUrl:i[0],Entries:s}),a=await this.sqsClient.send(o);n.push(a)});if(!s&&(o.push({batch:t.length,error:a.message}),a.message&&(a.message.includes("Batch error")||a.message.includes("Connection")||a.message.includes("Network"))))throw a}return this.emit("batch_replicated",{replicator:this.name,resource:e,queueUrl:i[0],total:t.length,successful:n.length,errors:o.length}),{success:0===o.length,results:n,errors:o,total:t.length,queueUrl:i[0]}});if(r)return s;const n=i?.message||i||"Unknown error";return this.emit("batch_replicator_error",{replicator:this.name,resource:e,error:n}),{success:!1,error:n}}async testConnection(){const[e,t]=await A(async()=>{this.sqsClient||await this.initialize(this.database);const{GetQueueAttributesCommand:e}=await import("@aws-sdk/client-sqs"),t=new e({QueueUrl:this.queueUrl,AttributeNames:["QueueArn"]});return await this.sqsClient.send(t),!0});return!!e||(this.emit("connection_error",{replicator:this.name,error:t.message}),!1)}async getStatus(){return{...await super.getStatus(),connected:!!this.sqsClient,queueUrl:this.queueUrl,region:this.region,resources:this.resources,totalreplicators:this.listenerCount("replicated"),totalErrors:this.listenerCount("replicator_error")}}async cleanup(){this.sqsClient&&this.sqsClient.destroy(),await super.cleanup()}shouldReplicateResource(e){return this.resourceQueueMap&&Object.keys(this.resourceQueueMap).includes(e)||this.queues&&Object.keys(this.queues).includes(e)||!(!this.defaultQueue&&!this.queueUrl)||this.resources&&Object.keys(this.resources).includes(e)||!1}},bigquery:class extends vi{constructor(e={},t={}){super(e),this.projectId=e.projectId,this.datasetId=e.datasetId,this.bigqueryClient=null,this.credentials=e.credentials,this.location=e.location||"US",this.logTable=e.logTable,this.resources=this.parseResourcesConfig(t)}parseResourcesConfig(e){const t={};for(const[r,i]of Object.entries(e))"string"==typeof i?t[r]=[{table:i,actions:["insert"]}]:Array.isArray(i)?t[r]=i.map(e=>"string"==typeof e?{table:e,actions:["insert"]}:{table:e.table,actions:e.actions||["insert"]}):"object"==typeof i&&(t[r]=[{table:i.table,actions:i.actions||["insert"]}]);return t}validateConfig(){const e=[];this.projectId||e.push("projectId is required"),this.datasetId||e.push("datasetId is required"),0===Object.keys(this.resources).length&&e.push("At least one resource must be configured");for(const[t,r]of Object.entries(this.resources))for(const i of r){i.table||e.push(`Table name is required for resource '${t}'`),Array.isArray(i.actions)&&0!==i.actions.length||e.push(`Actions array is required for resource '${t}'`);const r=["insert","update","delete"],s=i.actions.filter(e=>!r.includes(e));s.length>0&&e.push(`Invalid actions for resource '${t}': ${s.join(", ")}. Valid actions: ${r.join(", ")}`)}return{isValid:0===e.length,errors:e}}async initialize(e){await super.initialize(e);const[t,r,i]=await A(()=>import("@google-cloud/bigquery"));if(!t)throw this.emit("initialization_error",{replicator:this.name,error:r.message}),r;const{BigQuery:s}=i;this.bigqueryClient=new s({projectId:this.projectId,credentials:this.credentials,location:this.location}),this.emit("initialized",{replicator:this.name,projectId:this.projectId,datasetId:this.datasetId,resources:Object.keys(this.resources)})}shouldReplicateResource(e){return this.resources.hasOwnProperty(e)}shouldReplicateAction(e,t){return!!this.resources[e]&&this.resources[e].some(e=>e.actions.includes(t))}getTablesForResource(e,t){return this.resources[e]?this.resources[e].filter(e=>e.actions.includes(t)).map(e=>e.table):[]}async replicate(e,t,r,i,s=null){if(!this.enabled||!this.shouldReplicateResource(e))return{skipped:!0,reason:"resource_not_included"};if(!this.shouldReplicateAction(e,t))return{skipped:!0,reason:"action_not_included"};const n=this.getTablesForResource(e,t);if(0===n.length)return{skipped:!0,reason:"no_tables_for_action"};const o=[],a=[],[c,u,l]=await A(async()=>{const s=this.bigqueryClient.dataset(this.datasetId);for(const e of n){const[n,c]=await A(async()=>{const n=s.table(e);let a;if("insert"===t){const e={...r};a=await n.insert([e])}else if("update"===t){const t=Object.keys(r).filter(e=>"id"!==e),s=t.map(e=>`${e}=@${e}`).join(", "),n={id:i};t.forEach(e=>{n[e]=r[e]});const o=`UPDATE \`${this.projectId}.${this.datasetId}.${e}\` SET ${s} WHERE id=@id`,[c]=await this.bigqueryClient.createQueryJob({query:o,params:n});await c.getQueryResults(),a=[c]}else{if("delete"!==t)throw new Error(`Unsupported operation: ${t}`);{const t=`DELETE FROM \`${this.projectId}.${this.datasetId}.${e}\` WHERE id=@id`,[r]=await this.bigqueryClient.createQueryJob({query:t,params:{id:i}});await r.getQueryResults(),a=[r]}}o.push({table:e,success:!0,jobId:a[0]?.id})});n||a.push({table:e,error:c.message})}if(this.logTable){const[n,o]=await A(async()=>{const n=s.table(this.logTable);await n.insert([{resource_name:e,operation:t,record_id:i,data:JSON.stringify(r),timestamp:(new Date).toISOString(),source:"s3db-replicator"}])})}const c=0===a.length;return this.emit("replicated",{replicator:this.name,resourceName:e,operation:t,id:i,tables:n,results:o,errors:a,success:c}),{success:c,results:o,errors:a,tables:n}});return c?l:(this.emit("replicator_error",{replicator:this.name,resourceName:e,operation:t,id:i,error:u.message}),{success:!1,error:u.message})}async replicateBatch(e,t){const r=[],i=[];for(const s of t){const[t,n,o]=await A(()=>this.replicate(e,s.operation,s.data,s.id,s.beforeData));t?r.push(o):i.push({id:s.id,error:n.message})}return{success:0===i.length,results:r,errors:i}}async testConnection(){const[e,t]=await A(async()=>{this.bigqueryClient||await this.initialize();const e=this.bigqueryClient.dataset(this.datasetId);return await e.getMetadata(),!0});return!!e||(this.emit("connection_error",{replicator:this.name,error:t.message}),!1)}async cleanup(){}getStatus(){return{...super.getStatus(),projectId:this.projectId,datasetId:this.datasetId,resources:this.resources,logTable:this.logTable}}},postgres:class extends vi{constructor(e={},t={}){super(e),this.connectionString=e.connectionString,this.host=e.host,this.port=e.port||5432,this.database=e.database,this.user=e.user,this.password=e.password,this.client=null,this.ssl=e.ssl,this.logTable=e.logTable,this.resources=this.parseResourcesConfig(t)}parseResourcesConfig(e){const t={};for(const[r,i]of Object.entries(e))"string"==typeof i?t[r]=[{table:i,actions:["insert"]}]:Array.isArray(i)?t[r]=i.map(e=>"string"==typeof e?{table:e,actions:["insert"]}:{table:e.table,actions:e.actions||["insert"]}):"object"==typeof i&&(t[r]=[{table:i.table,actions:i.actions||["insert"]}]);return t}validateConfig(){const e=[];this.connectionString||this.host&&this.database||e.push("Either connectionString or host+database must be provided"),0===Object.keys(this.resources).length&&e.push("At least one resource must be configured");for(const[t,r]of Object.entries(this.resources))for(const i of r){i.table||e.push(`Table name is required for resource '${t}'`),Array.isArray(i.actions)&&0!==i.actions.length||e.push(`Actions array is required for resource '${t}'`);const r=["insert","update","delete"],s=i.actions.filter(e=>!r.includes(e));s.length>0&&e.push(`Invalid actions for resource '${t}': ${s.join(", ")}. Valid actions: ${r.join(", ")}`)}return{isValid:0===e.length,errors:e}}async initialize(e){await super.initialize(e);const[t,r,i]=await A(()=>import("pg"));if(!t)throw this.emit("initialization_error",{replicator:this.name,error:r.message}),r;const{Client:s}=i,n=this.connectionString?{connectionString:this.connectionString,ssl:this.ssl}:{host:this.host,port:this.port,database:this.database,user:this.user,password:this.password,ssl:this.ssl};this.client=new s(n),await this.client.connect(),this.logTable&&await this.createLogTableIfNotExists(),this.emit("initialized",{replicator:this.name,database:this.database||"postgres",resources:Object.keys(this.resources)})}async createLogTableIfNotExists(){const e=`\n CREATE TABLE IF NOT EXISTS ${this.logTable} (\n id SERIAL PRIMARY KEY,\n resource_name VARCHAR(255) NOT NULL,\n operation VARCHAR(50) NOT NULL,\n record_id VARCHAR(255) NOT NULL,\n data JSONB,\n timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n source VARCHAR(100) DEFAULT 's3db-replicator',\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n );\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_resource_name ON ${this.logTable}(resource_name);\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_operation ON ${this.logTable}(operation);\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_record_id ON ${this.logTable}(record_id);\n CREATE INDEX IF NOT EXISTS idx_${this.logTable}_timestamp ON ${this.logTable}(timestamp);\n `;await this.client.query(e)}shouldReplicateResource(e){return this.resources.hasOwnProperty(e)}shouldReplicateAction(e,t){return!!this.resources[e]&&this.resources[e].some(e=>e.actions.includes(t))}getTablesForResource(e,t){return this.resources[e]?this.resources[e].filter(e=>e.actions.includes(t)).map(e=>e.table):[]}async replicate(e,t,r,i,s=null){if(!this.enabled||!this.shouldReplicateResource(e))return{skipped:!0,reason:"resource_not_included"};if(!this.shouldReplicateAction(e,t))return{skipped:!0,reason:"action_not_included"};const n=this.getTablesForResource(e,t);if(0===n.length)return{skipped:!0,reason:"no_tables_for_action"};const o=[],a=[],[c,u,l]=await A(async()=>{for(const e of n){const[s,n]=await A(async()=>{let s;if("insert"===t){const t=Object.keys(r),i=t.map(e=>r[e]),n=t.map(e=>`"${e}"`).join(", "),o=t.map((e,t)=>`$${t+1}`).join(", "),a=`INSERT INTO ${e} (${n}) VALUES (${o}) ON CONFLICT (id) DO NOTHING RETURNING *`;s=await this.client.query(a,i)}else if("update"===t){const t=Object.keys(r).filter(e=>"id"!==e),n=t.map((e,t)=>`"${e}"=$${t+1}`).join(", "),o=t.map(e=>r[e]);o.push(i);const a=`UPDATE ${e} SET ${n} WHERE id=$${t.length+1} RETURNING *`;s=await this.client.query(a,o)}else{if("delete"!==t)throw new Error(`Unsupported operation: ${t}`);{const t=`DELETE FROM ${e} WHERE id=$1 RETURNING *`;s=await this.client.query(t,[i])}}o.push({table:e,success:!0,rows:s.rows,rowCount:s.rowCount})});s||a.push({table:e,error:n.message})}if(this.logTable){const[s,n]=await A(async()=>{await this.client.query(`INSERT INTO ${this.logTable} (resource_name, operation, record_id, data, timestamp, source) VALUES ($1, $2, $3, $4, $5, $6)`,[e,t,i,JSON.stringify(r),(new Date).toISOString(),"s3db-replicator"])})}const s=0===a.length;return this.emit("replicated",{replicator:this.name,resourceName:e,operation:t,id:i,tables:n,results:o,errors:a,success:s}),{success:s,results:o,errors:a,tables:n}});return c?l:(this.emit("replicator_error",{replicator:this.name,resourceName:e,operation:t,id:i,error:u.message}),{success:!1,error:u.message})}async replicateBatch(e,t){const r=[],i=[];for(const s of t){const[t,n,o]=await A(()=>this.replicate(e,s.operation,s.data,s.id,s.beforeData));t?r.push(o):i.push({id:s.id,error:n.message})}return{success:0===i.length,results:r,errors:i}}async testConnection(){const[e,t]=await A(async()=>(this.client||await this.initialize(),await this.client.query("SELECT 1"),!0));return!!e||(this.emit("connection_error",{replicator:this.name,error:t.message}),!1)}async cleanup(){this.client&&await this.client.end()}getStatus(){return{...super.getStatus(),database:this.database||"postgres",resources:this.resources,logTable:this.logTable}}}};function Li(e,t={},r=[],i=null){const s=Ti[e];if(!s)throw new Error(`Unknown replicator driver: ${e}. Available drivers: ${Object.keys(Ti).join(", ")}`);return new s(t,r,i)}function $i(e){return"string"==typeof e?e.trim().toLowerCase():e}return e.AVAILABLE_BEHAVIORS=M,e.AuditPlugin=class extends je{constructor(e={}){super(e),this.auditResource=null,this.config={includeData:!1!==e.includeData,includePartitions:!1!==e.includePartitions,maxDataSize:e.maxDataSize||1e4,...e}}async onSetup(){const[e,t,r]=await A(()=>this.database.createResource({name:"audits",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",recordId:"string|required",userId:"string|optional",timestamp:"string|required",oldData:"string|optional",newData:"string|optional",partition:"string|optional",partitionValues:"string|optional",metadata:"string|optional"},behavior:"body-overflow"}));this.auditResource=e?r:this.database.resources.audits||null,(e||this.auditResource)&&(this.installDatabaseProxy(),this.installEventListeners())}async onStart(){}async onStop(){}installDatabaseProxy(){if(this.database._auditProxyInstalled)return;const e=this.installEventListenersForResource.bind(this);this.database._originalCreateResource=this.database.createResource,this.database.createResource=async function(...t){const r=await this._originalCreateResource(...t);return"audits"!==r.name&&e(r),r},this.database._auditProxyInstalled=!0}installEventListeners(){for(const e of Object.values(this.database.resources))"audits"!==e.name&&this.installEventListenersForResource(e)}installEventListenersForResource(e){e.on("insert",async t=>{const r=t.id||"auto-generated",i=this.config.includePartitions?this.getPartitionValues(t,e):null,s={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:e.name,operation:"insert",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:null,newData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(t)),partition:this.config.includePartitions?this.getPrimaryPartition(i):null,partitionValues:this.config.includePartitions&&i&&Object.keys(i).length>0?JSON.stringify(i):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(s).catch(console.error)}),e.on("update",async t=>{const r=t.id;let i=t.$before;if(this.config.includeData&&!i){const[t,s,n]=await A(()=>e.get(r));t&&(i=n)}const s=this.config.includePartitions?this.getPartitionValues(t,e):null,n={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:e.name,operation:"update",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:i&&!1===this.config.includeData?null:i?JSON.stringify(this.truncateData(i)):null,newData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(t)),partition:this.config.includePartitions?this.getPrimaryPartition(s):null,partitionValues:this.config.includePartitions&&s&&Object.keys(s).length>0?JSON.stringify(s):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(n).catch(console.error)}),e.on("delete",async t=>{const r=t.id;let i=t;if(this.config.includeData&&!i){const[t,s,n]=await A(()=>e.get(r));t&&(i=n)}const s=i&&this.config.includePartitions?this.getPartitionValues(i,e):null,n={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:e.name,operation:"delete",recordId:r,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:i&&!1===this.config.includeData?null:i?JSON.stringify(this.truncateData(i)):null,newData:null,partition:this.config.includePartitions?this.getPrimaryPartition(s):null,partitionValues:this.config.includePartitions&&s&&Object.keys(s).length>0?JSON.stringify(s):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0"})};this.logAudit(n).catch(console.error)}),e.useMiddleware("deleteMany",async(t,r)=>{const i=t.args[0],s={};if(this.config.includeData)for(const t of i){const[r,i,n]=await A(()=>e.get(t));s[t]=r?n:null}const n=await r();if(n&&n.length>0&&this.config.includeData)for(const t of i){const r=s[t],i=r&&this.config.includePartitions?this.getPartitionValues(r,e):null,n={id:`audit-${Date.now()}-${Math.random().toString(36).substring(2,11)}`,resourceName:e.name,operation:"delete",recordId:t,userId:this.getCurrentUserId?.()||"system",timestamp:(new Date).toISOString(),oldData:!1===this.config.includeData?null:JSON.stringify(this.truncateData(r)),newData:null,partition:this.config.includePartitions?this.getPrimaryPartition(i):null,partitionValues:this.config.includePartitions&&i&&Object.keys(i).length>0?JSON.stringify(i):null,metadata:JSON.stringify({source:"audit-plugin",version:"2.0",batchOperation:!0})};this.logAudit(n).catch(console.error)}return n})}getPartitionValues(e,t){if(!e)return null;const r=t.config?.partitions||{},i={};for(const[t,s]of Object.entries(r))if(s.fields){const r={};for(const[t,i]of Object.entries(s.fields)){const i=this.getNestedFieldValue(e,t);null!=i&&(r[t]=i)}Object.keys(r).length>0&&(i[t]=r)}return i}getNestedFieldValue(e,t){if(!t.includes("."))return e[t];const r=t.split(".");let i=e;for(const e of r){if(!i||"object"!=typeof i||!(e in i))return;i=i[e]}return i}getPrimaryPartition(e){if(!e)return null;const t=Object.keys(e);return t.length>0?t[0]:null}async logAudit(e){e.id||(e.id=`audit-${Date.now()}-${Math.random().toString(36).slice(2,8)}`);return await this.auditResource.insert(e)}truncateData(e){if(!e)return e;const t={};for(const[r,i]of Object.entries(e))r.startsWith("_")||"$overflow"===r||(t[r]=i);const r=JSON.stringify(t);if(r.length<=this.config.maxDataSize)return t;let i={...t},s=JSON.stringify(i).length;const n=JSON.stringify({_truncated:!0,_originalSize:r.length,_truncatedAt:(new Date).toISOString()}).length,o=this.config.maxDataSize-n;for(const[e,t]of Object.entries(i))if("string"==typeof t&&s>o){const r=s-o,n=Math.max(0,t.length-r-3);n<t.length&&(i[e]=t.substring(0,n)+"...",s=JSON.stringify(i).length)}return{...i,_truncated:!0,_originalSize:r.length,_truncatedAt:(new Date).toISOString()}}async getAuditLogs(e={}){if(!this.auditResource)return[];const[t,r,i]=await A(async()=>{const{resourceName:t,operation:r,recordId:i,userId:s,partition:n,startDate:o,endDate:a,limit:c=100,offset:u=0}=e;let l=(await this.auditResource.getAll()).filter(e=>(!t||e.resourceName===t)&&((!r||e.operation===r)&&((!i||e.recordId===i)&&((!s||e.userId===s)&&((!n||e.partition===n)&&(!(o&&new Date(e.timestamp)<new Date(o))&&!(a&&new Date(e.timestamp)>new Date(a))))))));l.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp));return l.slice(u,u+c).map(e=>{const[t,,r]="string"==typeof e.oldData?I(()=>JSON.parse(e.oldData)):[!0,null,e.oldData],[i,,s]="string"==typeof e.newData?I(()=>JSON.parse(e.newData)):[!0,null,e.newData],[n,,o]=e.partitionValues&&"string"==typeof e.partitionValues?I(()=>JSON.parse(e.partitionValues)):[!0,null,e.partitionValues],[a,,c]=e.metadata&&"string"==typeof e.metadata?I(()=>JSON.parse(e.metadata)):[!0,null,e.metadata];return{...e,oldData:null===e.oldData||void 0===e.oldData||"null"===e.oldData?null:t?r:null,newData:null===e.newData||void 0===e.newData||"null"===e.newData?null:i?s:null,partitionValues:n?o:e.partitionValues,metadata:a?c:e.metadata}})});return t?i:[]}async getRecordHistory(e,t){return this.getAuditLogs({resourceName:e,recordId:t,limit:1e3})}async getPartitionHistory(e,t,r){return this.getAuditLogs({resourceName:e,partition:t,limit:1e3})}async getAuditStats(e={}){const{resourceName:t,startDate:r,endDate:i}=e,s=await this.getAuditLogs({resourceName:t,startDate:r,endDate:i,limit:1e4}),n={total:s.length,byOperation:{},byResource:{},byPartition:{},byUser:{},timeline:{}};for(const e of s)if(n.byOperation[e.operation]=(n.byOperation[e.operation]||0)+1,n.byResource[e.resourceName]=(n.byResource[e.resourceName]||0)+1,e.partition&&(n.byPartition[e.partition]=(n.byPartition[e.partition]||0)+1),n.byUser[e.userId]=(n.byUser[e.userId]||0)+1,e.timestamp){const t=e.timestamp.split("T")[0];n.timeline[t]=(n.timeline[t]||0)+1}return n}},e.AuthenticationError=class extends W{constructor(e,t={}){super(e,t),Object.assign(this,t)}},e.BaseError=H,e.CachePlugin=class extends je{constructor(e={}){super(e),this.driver=e.driver,this.config={includePartitions:!1!==e.includePartitions,...e}}async setup(e){await super.setup(e)}async onSetup(){this.config.driver?this.driver=this.config.driver:"memory"===this.config.driverType?this.driver=new bi(this.config.memoryOptions||{}):this.driver=new yi({client:this.database.client,...this.config.s3Options||{}}),this.installDatabaseProxy(),this.installResourceHooks()}async onStart(){}async onStop(){}installDatabaseProxy(){if(this.database._cacheProxyInstalled)return;const e=this.installResourceHooks.bind(this);this.database._originalCreateResourceForCache=this.database.createResource,this.database.createResource=async function(...t){const r=await this._originalCreateResourceForCache(...t);return e(r),r},this.database._cacheProxyInstalled=!0}installResourceHooks(){for(const e of Object.values(this.database.resources))this.installResourceHooksForResource(e)}installResourceHooksForResource(e){if(!this.driver)return;Object.defineProperty(e,"cache",{value:this.driver,writable:!0,configurable:!0,enumerable:!1}),e.cacheKeyFor=async(t={})=>{const{action:r,params:i={},partition:s,partitionValues:n}=t;return this.generateCacheKey(e,r,i,s,n)};const t=["count","listIds","getMany","getAll","page","list","get"];for(const r of t)e.useMiddleware(r,async(t,i)=>{let s;if("getMany"===r)s=await e.cacheKeyFor({action:r,params:{ids:t.args[0]}});else if("page"===r){const{offset:i,size:n,partition:o,partitionValues:a}=t.args[0]||{};s=await e.cacheKeyFor({action:r,params:{offset:i,size:n},partition:o,partitionValues:a})}else if("list"===r||"listIds"===r||"count"===r){const{partition:i,partitionValues:n}=t.args[0]||{};s=await e.cacheKeyFor({action:r,partition:i,partitionValues:n})}else"getAll"===r?s=await e.cacheKeyFor({action:r}):"get"===r&&(s=await e.cacheKeyFor({action:r,params:{id:t.args[0]}}));const[n,o,a]=await A(()=>e.cache.get(s));if(n&&null!=a)return a;if(!n&&"NoSuchKey"!==o.name)throw o;const c=await i();return await e.cache.set(s,c),c});const r=["insert","update","delete","deleteMany"];for(const t of r)e.useMiddleware(t,async(r,i)=>{const s=await i();if("insert"===t)await this.clearCacheForResource(e,r.args[0]);else if("update"===t)await this.clearCacheForResource(e,{id:r.args[0],...r.args[1]});else if("delete"===t){let t={id:r.args[0]};if("function"==typeof e.get){const[i,s,n]=await A(()=>e.get(r.args[0]));i&&n&&(t=n)}await this.clearCacheForResource(e,t)}else"deleteMany"===t&&await this.clearCacheForResource(e);return s})}async clearCacheForResource(e,t){if(!e.cache)return;const r=`resource=${e.name}`;if(await e.cache.clear(r),!0===this.config.includePartitions&&e.config?.partitions&&Object.keys(e.config.partitions).length>0)if(t){const i=this.getPartitionValues(t,e);for(const[t,s]of Object.entries(i))if(s&&Object.keys(s).length>0&&Object.values(s).some(e=>null!=e)){const i=Ce(r,`partition=${t}`);await e.cache.clear(i)}}else for(const t of Object.keys(e.config.partitions)){const i=Ce(r,`partition=${t}`);await e.cache.clear(i)}}async generateCacheKey(e,t,r={},i=null,s=null){const n=[`resource=${e.name}`,`action=${t}`];if(i&&s&&Object.keys(s).length>0){n.push(`partition:${i}`);for(const[e,t]of Object.entries(s))null!=t&&n.push(`${e}:${t}`)}if(Object.keys(r).length>0){const e=await this.hashParams(r);n.push(e)}return Ce(...n)+".json.gz"}async hashParams(e){const t=Object.keys(e).sort().map(t=>`${t}:${e[t]}`).join("|")||"empty";return await he(t)}async getCacheStats(){return this.driver?{size:await this.driver.size(),keys:await this.driver.keys(),driver:this.driver.constructor.name}:null}async clearAllCache(){if(this.driver)for(const e of Object.values(this.database.resources))if(e.cache){const t=`resource=${e.name}`;await e.cache.clear(t)}}async warmCache(e,t={}){const r=this.database.resources[e];if(!r)throw new Error(`Resource '${e}' not found`);const{includePartitions:i=!0}=t;if(await r.getAll(),i&&r.config.partitions)for(const[e,t]of Object.entries(r.config.partitions))if(t.fields){const t=await r.getAll(),i=Array.isArray(t)?t:[],s=new Set;for(const t of i.slice(0,10)){const i=this.getPartitionValues(t,r);i[e]&&s.add(JSON.stringify(i[e]))}for(const t of s){const i=JSON.parse(t);await r.list({partition:e,partitionValues:i})}}}},e.Client=_i,e.ConnectionString=Si,e.ConnectionStringError=ne,e.CostsPlugin=wi,e.CryptoError=oe,e.DEFAULT_BEHAVIOR=U,e.Database=xi,e.DatabaseError=class extends W{constructor(e,t={}){super(e,t),Object.assign(this,t)}},e.EncryptionError=class extends W{constructor(e,t={}){super(e,t),Object.assign(this,t)}},e.ErrorMap=ie,e.FullTextPlugin=class extends je{constructor(e={}){super(),this.indexResource=null,this.config={minWordLength:e.minWordLength||3,maxResults:e.maxResults||100,...e},this.indexes=new Map}async setup(e){this.database=e;const[t,r,i]=await A(()=>e.createResource({name:"fulltext_indexes",attributes:{id:"string|required",resourceName:"string|required",fieldName:"string|required",word:"string|required",recordIds:"json|required",count:"number|required",lastUpdated:"string|required"}}));this.indexResource=t?i:e.resources.fulltext_indexes,await this.loadIndexes(),this.installIndexingHooks()}async start(){}async stop(){await this.saveIndexes()}async loadIndexes(){if(!this.indexResource)return;const[e,t,r]=await A(()=>this.indexResource.getAll());if(e)for(const e of r){const t=`${e.resourceName}:${e.fieldName}:${e.word}`;this.indexes.set(t,{recordIds:e.recordIds||[],count:e.count||0})}}async saveIndexes(){if(!this.indexResource)return;const[e,t]=await A(async()=>{const e=await this.indexResource.getAll();for(const t of e)await this.indexResource.delete(t.id);for(const[e,t]of this.indexes.entries()){const[r,i,s]=e.split(":");await this.indexResource.insert({id:`index-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:r,fieldName:i,word:s,recordIds:t.recordIds,count:t.count,lastUpdated:(new Date).toISOString()})}})}installIndexingHooks(){this.database.plugins||(this.database.plugins={}),this.database.plugins.fulltext=this;for(const e of Object.values(this.database.resources))"fulltext_indexes"!==e.name&&this.installResourceHooks(e);this.database._fulltextProxyInstalled||(this.database._previousCreateResourceForFullText=this.database.createResource,this.database.createResource=async function(...e){const t=await this._previousCreateResourceForFullText(...e);return this.plugins?.fulltext&&"fulltext_indexes"!==t.name&&this.plugins.fulltext.installResourceHooks(t),t},this.database._fulltextProxyInstalled=!0);for(const e of Object.values(this.database.resources))"fulltext_indexes"!==e.name&&this.installResourceHooks(e)}installResourceHooks(e){e._insert=e.insert,e._update=e.update,e._delete=e.delete,e._deleteMany=e.deleteMany,this.wrapResourceMethod(e,"insert",async(t,r,i)=>{const[s]=r;return this.indexRecord(e.name,t.id,s).catch(console.error),t}),this.wrapResourceMethod(e,"update",async(t,r,i)=>{const[s,n]=r;return this.removeRecordFromIndex(e.name,s).catch(console.error),this.indexRecord(e.name,s,t).catch(console.error),t}),this.wrapResourceMethod(e,"delete",async(t,r,i)=>{const[s]=r;return this.removeRecordFromIndex(e.name,s).catch(console.error),t}),this.wrapResourceMethod(e,"deleteMany",async(t,r,i)=>{const[s]=r;for(const t of s)this.removeRecordFromIndex(e.name,t).catch(console.error);return t})}async indexRecord(e,t,r){const i=this.getIndexedFields(e);if(i&&0!==i.length)for(const s of i){const i=this.getFieldValue(r,s);if(!i)continue;const n=this.tokenize(i);for(const r of n){if(r.length<this.config.minWordLength)continue;const i=`${e}:${s}:${r.toLowerCase()}`,n=this.indexes.get(i)||{recordIds:[],count:0};n.recordIds.includes(t)||(n.recordIds.push(t),n.count=n.recordIds.length),this.indexes.set(i,n)}}}async removeRecordFromIndex(e,t){for(const[r,i]of this.indexes.entries())if(r.startsWith(`${e}:`)){const e=i.recordIds.indexOf(t);e>-1&&(i.recordIds.splice(e,1),i.count=i.recordIds.length,0===i.recordIds.length?this.indexes.delete(r):this.indexes.set(r,i))}}getFieldValue(e,t){if(!t.includes("."))return e&&void 0!==e[t]?e[t]:null;const r=t.split(".");let i=e;for(const e of r){if(!i||"object"!=typeof i||!(e in i))return null;i=i[e]}return i}tokenize(e){if(!e)return[];return String(e).toLowerCase().replace(/[^\w\s\u00C0-\u017F]/g," ").split(/\s+/).filter(e=>e.length>0)}getIndexedFields(e){if(this.config.fields)return this.config.fields;return{users:["name","email"],products:["name","description"],articles:["title","content"]}[e]||[]}async search(e,t,r={}){const{fields:i=null,limit:s=this.config.maxResults,offset:n=0,exactMatch:o=!1}=r;if(!t||0===t.trim().length)return[];const a=this.tokenize(t),c=new Map,u=i||this.getIndexedFields(e);if(0===u.length)return[];for(const t of a)if(!(t.length<this.config.minWordLength))for(const r of u)if(o){const i=`${e}:${r}:${t.toLowerCase()}`,s=this.indexes.get(i);if(s)for(const e of s.recordIds){const t=c.get(e)||0;c.set(e,t+1)}}else for(const[i,s]of this.indexes.entries())if(i.startsWith(`${e}:${r}:${t.toLowerCase()}`))for(const e of s.recordIds){const t=c.get(e)||0;c.set(e,t+1)}return Array.from(c.entries()).map(([e,t])=>({recordId:e,score:t})).sort((e,t)=>t.score-e.score).slice(n,n+s)}async searchRecords(e,t,r={}){const i=await this.search(e,t,r);if(0===i.length)return[];const s=this.database.resources[e];if(!s)throw new Error(`Resource '${e}' not found`);const n=i.map(e=>e.recordId);return(await s.getMany(n)).filter(e=>e&&"object"==typeof e).map(e=>{const t=i.find(t=>t.recordId===e.id);return{...e,_searchScore:t?t.score:0}}).sort((e,t)=>t._searchScore-e._searchScore)}async rebuildIndex(e){const t=this.database.resources[e];if(!t)throw new Error(`Resource '${e}' not found`);for(const[t]of this.indexes.entries())t.startsWith(`${e}:`)&&this.indexes.delete(t);const r=await t.getAll();for(let t=0;t<r.length;t+=100){const i=r.slice(t,t+100);for(const t of i){const[r,i]=await A(()=>this.indexRecord(e,t.id,t))}}await this.saveIndexes()}async getIndexStats(){const e={totalIndexes:this.indexes.size,resources:{},totalWords:0};for(const[t,r]of this.indexes.entries()){const[i,s]=t.split(":");e.resources[i]||(e.resources[i]={fields:{},totalRecords:new Set,totalWords:0}),e.resources[i].fields[s]||(e.resources[i].fields[s]={words:0,totalOccurrences:0}),e.resources[i].fields[s].words++,e.resources[i].fields[s].totalOccurrences+=r.count,e.resources[i].totalWords++;for(const t of r.recordIds)e.resources[i].totalRecords.add(t);e.totalWords++}for(const t in e.resources)e.resources[t].totalRecords=e.resources[t].totalRecords.size;return e}async rebuildAllIndexes({timeout:e}={}){return e?Promise.race([this._rebuildAllIndexesInternal(),new Promise((t,r)=>setTimeout(()=>r(new Error("Timeout")),e))]):this._rebuildAllIndexesInternal()}async _rebuildAllIndexesInternal(){const e=Object.keys(this.database.resources).filter(e=>"fulltext_indexes"!==e);for(const t of e){const[e,r]=await A(()=>this.rebuildIndex(t))}}async clearIndex(e){for(const[t]of this.indexes.entries())t.startsWith(`${e}:`)&&this.indexes.delete(t);await this.saveIndexes()}async clearAllIndexes(){this.indexes.clear(),await this.saveIndexes()}},e.InvalidResourceItem=te,e.MetricsPlugin=class extends je{constructor(e={}){super(),this.config={collectPerformance:!1!==e.collectPerformance,collectErrors:!1!==e.collectErrors,collectUsage:!1!==e.collectUsage,retentionDays:e.retentionDays||30,flushInterval:e.flushInterval||6e4,...e},this.metrics={operations:{insert:{count:0,totalTime:0,errors:0},update:{count:0,totalTime:0,errors:0},delete:{count:0,totalTime:0,errors:0},get:{count:0,totalTime:0,errors:0},list:{count:0,totalTime:0,errors:0},count:{count:0,totalTime:0,errors:0}},resources:{},errors:[],performance:[],startTime:(new Date).toISOString()},this.flushTimer=null}async setup(e){if(this.database=e,"test"===process.env.NODE_ENV)return;const[t,r]=await A(async()=>{const[t,r,i]=await A(()=>e.createResource({name:"metrics",attributes:{id:"string|required",type:"string|required",resourceName:"string",operation:"string",count:"number|required",totalTime:"number|required",errors:"number|required",avgTime:"number|required",timestamp:"string|required",metadata:"json"}}));this.metricsResource=t?i:e.resources.metrics;const[s,n,o]=await A(()=>e.createResource({name:"error_logs",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",error:"string|required",timestamp:"string|required",metadata:"json"}}));this.errorsResource=s?o:e.resources.error_logs;const[a,c,u]=await A(()=>e.createResource({name:"performance_logs",attributes:{id:"string|required",resourceName:"string|required",operation:"string|required",duration:"number|required",timestamp:"string|required",metadata:"json"}}));this.performanceResource=a?u:e.resources.performance_logs});t||(this.metricsResource=e.resources.metrics,this.errorsResource=e.resources.error_logs,this.performanceResource=e.resources.performance_logs),this.installMetricsHooks(),"test"!==process.env.NODE_ENV&&this.startFlushTimer()}async start(){}async stop(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),"test"!==process.env.NODE_ENV&&await this.flushMetrics()}installMetricsHooks(){for(const e of Object.values(this.database.resources))["metrics","error_logs","performance_logs"].includes(e.name)||this.installResourceHooks(e);this.database._createResource=this.database.createResource,this.database.createResource=async function(...e){const t=await this._createResource(...e);return this.plugins?.metrics&&!["metrics","error_logs","performance_logs"].includes(t.name)&&this.plugins.metrics.installResourceHooks(t),t}}installResourceHooks(e){e._insert=e.insert,e._update=e.update,e._delete=e.delete,e._deleteMany=e.deleteMany,e._get=e.get,e._getMany=e.getMany,e._getAll=e.getAll,e._list=e.list,e._listIds=e.listIds,e._count=e.count,e._page=e.page,e.insert=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._insert(...t));if(this.recordOperation(e.name,"insert",Date.now()-r,!i),i||this.recordError(e.name,"insert",s),!i)throw s;return n}.bind(this),e.update=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._update(...t));if(this.recordOperation(e.name,"update",Date.now()-r,!i),i||this.recordError(e.name,"update",s),!i)throw s;return n}.bind(this),e.delete=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._delete(...t));if(this.recordOperation(e.name,"delete",Date.now()-r,!i),i||this.recordError(e.name,"delete",s),!i)throw s;return n}.bind(this),e.deleteMany=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._deleteMany(...t));if(this.recordOperation(e.name,"delete",Date.now()-r,!i),i||this.recordError(e.name,"delete",s),!i)throw s;return n}.bind(this),e.get=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._get(...t));if(this.recordOperation(e.name,"get",Date.now()-r,!i),i||this.recordError(e.name,"get",s),!i)throw s;return n}.bind(this),e.getMany=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._getMany(...t));if(this.recordOperation(e.name,"get",Date.now()-r,!i),i||this.recordError(e.name,"get",s),!i)throw s;return n}.bind(this),e.getAll=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._getAll(...t));if(this.recordOperation(e.name,"list",Date.now()-r,!i),i||this.recordError(e.name,"list",s),!i)throw s;return n}.bind(this),e.list=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._list(...t));if(this.recordOperation(e.name,"list",Date.now()-r,!i),i||this.recordError(e.name,"list",s),!i)throw s;return n}.bind(this),e.listIds=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._listIds(...t));if(this.recordOperation(e.name,"list",Date.now()-r,!i),i||this.recordError(e.name,"list",s),!i)throw s;return n}.bind(this),e.count=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._count(...t));if(this.recordOperation(e.name,"count",Date.now()-r,!i),i||this.recordError(e.name,"count",s),!i)throw s;return n}.bind(this),e.page=async function(...t){const r=Date.now(),[i,s,n]=await A(()=>e._page(...t));if(this.recordOperation(e.name,"list",Date.now()-r,!i),i||this.recordError(e.name,"list",s),!i)throw s;return n}.bind(this)}recordOperation(e,t,r,i){this.metrics.operations[t]&&(this.metrics.operations[t].count++,this.metrics.operations[t].totalTime+=r,i&&this.metrics.operations[t].errors++),this.metrics.resources[e]||(this.metrics.resources[e]={insert:{count:0,totalTime:0,errors:0},update:{count:0,totalTime:0,errors:0},delete:{count:0,totalTime:0,errors:0},get:{count:0,totalTime:0,errors:0},list:{count:0,totalTime:0,errors:0},count:{count:0,totalTime:0,errors:0}}),this.metrics.resources[e][t]&&(this.metrics.resources[e][t].count++,this.metrics.resources[e][t].totalTime+=r,i&&this.metrics.resources[e][t].errors++),this.config.collectPerformance&&this.metrics.performance.push({resourceName:e,operation:t,duration:r,timestamp:(new Date).toISOString()})}recordError(e,t,r){this.config.collectErrors&&this.metrics.errors.push({resourceName:e,operation:t,error:r.message,stack:r.stack,timestamp:(new Date).toISOString()})}startFlushTimer(){this.flushTimer&&clearInterval(this.flushTimer),this.config.flushInterval>0&&(this.flushTimer=setInterval(()=>{this.flushMetrics().catch(console.error)},this.config.flushInterval))}async flushMetrics(){if(!this.metricsResource)return;const[e,t]=await A(async()=>{const e="test"===process.env.NODE_ENV?{}:{global:"true"},t="test"===process.env.NODE_ENV?{}:{perf:"true"},r="test"===process.env.NODE_ENV?{}:{error:"true"},i="test"===process.env.NODE_ENV?{}:{resource:"true"};for(const[t,r]of Object.entries(this.metrics.operations))r.count>0&&await this.metricsResource.insert({id:`metrics-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:"operation",resourceName:"global",operation:t,count:r.count,totalTime:r.totalTime,errors:r.errors,avgTime:r.count>0?r.totalTime/r.count:0,timestamp:(new Date).toISOString(),metadata:e});for(const[e,t]of Object.entries(this.metrics.resources))for(const[r,s]of Object.entries(t))s.count>0&&await this.metricsResource.insert({id:`metrics-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,type:"operation",resourceName:e,operation:r,count:s.count,totalTime:s.totalTime,errors:s.errors,avgTime:s.count>0?s.totalTime/s.count:0,timestamp:(new Date).toISOString(),metadata:i});if(this.config.collectPerformance&&this.metrics.performance.length>0)for(const e of this.metrics.performance)await this.performanceResource.insert({id:`perf-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:e.resourceName,operation:e.operation,duration:e.duration,timestamp:e.timestamp,metadata:t});if(this.config.collectErrors&&this.metrics.errors.length>0)for(const e of this.metrics.errors)await this.errorsResource.insert({id:`error-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:e.resourceName,operation:e.operation,error:e.error,stack:e.stack,timestamp:e.timestamp,metadata:r});this.resetMetrics()});e||console.error("Failed to flush metrics:",t)}resetMetrics(){for(const e of Object.keys(this.metrics.operations))this.metrics.operations[e]={count:0,totalTime:0,errors:0};for(const e of Object.keys(this.metrics.resources))for(const t of Object.keys(this.metrics.resources[e]))this.metrics.resources[e][t]={count:0,totalTime:0,errors:0};this.metrics.performance=[],this.metrics.errors=[]}async getMetrics(e={}){const{type:t="operation",resourceName:r,operation:i,startDate:s,endDate:n,limit:o=100,offset:a=0}=e;if(!this.metricsResource)return[];let c=(await this.metricsResource.getAll()).filter(e=>(!t||e.type===t)&&((!r||e.resourceName===r)&&((!i||e.operation===i)&&(!(s&&new Date(e.timestamp)<new Date(s))&&!(n&&new Date(e.timestamp)>new Date(n))))));return c.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp)),c.slice(a,a+o)}async getErrorLogs(e={}){if(!this.errorsResource)return[];const{resourceName:t,operation:r,startDate:i,endDate:s,limit:n=100,offset:o=0}=e;let a=(await this.errorsResource.getAll()).filter(e=>(!t||e.resourceName===t)&&((!r||e.operation===r)&&(!(i&&new Date(e.timestamp)<new Date(i))&&!(s&&new Date(e.timestamp)>new Date(s)))));return a.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp)),a.slice(o,o+n)}async getPerformanceLogs(e={}){if(!this.performanceResource)return[];const{resourceName:t,operation:r,startDate:i,endDate:s,limit:n=100,offset:o=0}=e;let a=(await this.performanceResource.getAll()).filter(e=>(!t||e.resourceName===t)&&((!r||e.operation===r)&&(!(i&&new Date(e.timestamp)<new Date(i))&&!(s&&new Date(e.timestamp)>new Date(s)))));return a.sort((e,t)=>new Date(t.timestamp)-new Date(e.timestamp)),a.slice(o,o+n)}async getStats(){const e=new Date,t=new Date(e.getTime()-864e5),[r,i,s]=await Promise.all([this.getMetrics({startDate:t.toISOString()}),this.getErrorLogs({startDate:t.toISOString()}),this.getPerformanceLogs({startDate:t.toISOString()})]),n={period:"24h",totalOperations:0,totalErrors:i.length,avgResponseTime:0,operationsByType:{},resources:{},uptime:{startTime:this.metrics.startTime,duration:e.getTime()-new Date(this.metrics.startTime).getTime()}};for(const e of r)if("operation"===e.type){n.totalOperations+=e.count,n.operationsByType[e.operation]||(n.operationsByType[e.operation]={count:0,errors:0,avgTime:0}),n.operationsByType[e.operation].count+=e.count,n.operationsByType[e.operation].errors+=e.errors;const t=n.operationsByType[e.operation],r=t.count,i=(t.avgTime*(r-e.count)+e.totalTime)/r;t.avgTime=i}const o=r.reduce((e,t)=>e+t.totalTime,0),a=r.reduce((e,t)=>e+t.count,0);return n.avgResponseTime=a>0?o/a:0,n}async cleanupOldData(){const e=new Date;if(e.setDate(e.getDate()-this.config.retentionDays),this.metricsResource){const t=await this.getMetrics({endDate:e.toISOString()});for(const e of t)await this.metricsResource.delete(e.id)}if(this.errorsResource){const t=await this.getErrorLogs({endDate:e.toISOString()});for(const e of t)await this.errorsResource.delete(e.id)}if(this.performanceResource){const t=await this.getPerformanceLogs({endDate:e.toISOString()});for(const e of t)await this.performanceResource.delete(e.id)}}},e.MissingMetadata=ee,e.NoSuchBucket=Q,e.NoSuchKey=X,e.NotFound=Z,e.PartitionError=ue,e.PermissionError=J,e.Plugin=je,e.PluginObject=Ee,e.ReplicatorPlugin=class extends je{constructor(e={}){if(super(),e.verbose&&console.log("[PLUGIN][CONSTRUCTOR] ReplicatorPlugin constructor called"),e.verbose&&console.log("[PLUGIN][constructor] New ReplicatorPlugin instance created with config:",e),!e.replicators||!Array.isArray(e.replicators))throw new Error("ReplicatorPlugin: replicators array is required");for(const t of e.replicators)if(!t.driver)throw new Error("ReplicatorPlugin: each replicator must have a driver");this.config={verbose:e.verbose??!1,persistReplicatorLog:e.persistReplicatorLog??!1,replicatorLogResource:e.replicatorLogResource??"replicator_logs",replicators:e.replicators||[]},this.replicators=[],this.queue=[],this.isProcessing=!1,this.stats={totalOperations:0,totalErrors:0,lastError:null},this._installedListeners=[]}async decompressData(e){return e}filterInternalFields(e){if(!e||"object"!=typeof e)return e;const t={};for(const[r,i]of Object.entries(e))r.startsWith("_")||"$overflow"===r||"$before"===r||"$after"===r||(t[r]=i);return t}installEventListeners(e){const t=this;t.config.verbose&&console.log("[PLUGIN] installEventListeners called for:",e&&e.name,{hasDatabase:!!e.database,sameDatabase:e.database===t.database,alreadyInstalled:e._replicatorListenersInstalled,resourceObj:e,resourceObjId:e&&e.id,resourceObjType:typeof e,resourceObjIs:e&&Object.is(e,t.database.resources&&t.database.resources[e.name]),resourceObjEq:e===(t.database.resources&&t.database.resources[e.name])}),e&&e.name!==t.config.replicatorLogResource&&e.database&&e.database===t.database&&(e._replicatorListenersInstalled||(e._replicatorListenersInstalled=!0,this._installedListeners.push(e),t.config.verbose&&console.log(`[PLUGIN] installEventListeners INSTALLED for resource: ${e&&e.name}`),e.on("insert",async r=>{t.config.verbose&&console.log("[PLUGIN] Listener INSERT on",e.name,"plugin.replicators.length:",t.replicators.length,t.replicators.map(e=>({id:e.id,driver:e.driver})));try{const i=await t.getCompleteData(e,r);t.config.verbose&&console.log(`[PLUGIN] Listener INSERT completeData for ${e.name} id=${r&&r.id}:`,i),await t.processReplicatorEvent(e.name,"insert",r.id,i,null)}catch(i){t.config.verbose&&console.error(`[PLUGIN] Listener INSERT error on ${e.name} id=${r&&r.id}:`,i)}}),e.on("update",async r=>{console.log("[PLUGIN][Listener][UPDATE][START] triggered for resource:",e.name,"data:",r);const i=r&&r.$before;t.config.verbose&&console.log("[PLUGIN] Listener UPDATE on",e.name,"plugin.replicators.length:",t.replicators.length,t.replicators.map(e=>({id:e.id,driver:e.driver})),"data:",r,"beforeData:",i);try{let s;const[n,o,a]=await A(()=>e.get(r.id));s=n&&a?a:r,await t.processReplicatorEvent(e.name,"update",r.id,s,i)}catch(i){t.config.verbose&&console.error(`[PLUGIN] Listener UPDATE erro em ${e.name} id=${r&&r.id}:`,i)}}),e.on("delete",async(r,i)=>{t.config.verbose&&console.log("[PLUGIN] Listener DELETE on",e.name,"plugin.replicators.length:",t.replicators.length,t.replicators.map(e=>({id:e.id,driver:e.driver})));try{await t.processReplicatorEvent(e.name,"delete",r.id,null,i)}catch(i){t.config.verbose&&console.error(`[PLUGIN] Listener DELETE erro em ${e.name} id=${r&&r.id}:`,i)}}),t.config.verbose&&console.log(`[PLUGIN] Listeners instalados para resource: ${e&&e.name} (insert: ${e.listenerCount("insert")}, update: ${e.listenerCount("update")}, delete: ${e.listenerCount("delete")})`)))}async getCompleteData(e,t){const[r,i,s]=await A(()=>e.get(t.id));return r?s:t}async setup(e){if(console.log("[PLUGIN][SETUP] setup called"),this.config.verbose&&console.log("[PLUGIN][setup] called with database:",e&&e.name),this.database=e,this.config.persistReplicatorLog){let t=e.resources[$i(this.config.replicatorLogResource)];t||(t=await e.createResource({name:this.config.replicatorLogResource,behavior:"truncate-data",attributes:{id:"string|required",resource:"string|required",action:"string|required",data:"object",timestamp:"number|required",createdAt:"string|required"},partitions:{byDate:{fields:{createdAt:"string|maxlength:10"}}}}),this.config.verbose&&console.log("[PLUGIN] Log resource created:",this.config.replicatorLogResource,!!t)),e.resources[$i(this.config.replicatorLogResource)]=t,this.replicatorLog=t,this.config.verbose&&console.log("[PLUGIN] Log resource created and registered:",this.config.replicatorLogResource,!!e.resources[$i(this.config.replicatorLogResource)]),"function"==typeof e.uploadMetadataFile&&(await e.uploadMetadataFile(),this.config.verbose&&console.log("[PLUGIN] uploadMetadataFile called. database.resources keys:",Object.keys(e.resources)))}this.config.replicators&&this.config.replicators.length>0&&0===this.replicators.length&&(await this.initializeReplicators(),console.log("[PLUGIN][SETUP] after initializeReplicators, replicators.length:",this.replicators.length),this.config.verbose&&console.log("[PLUGIN][setup] After initializeReplicators, replicators.length:",this.replicators.length,this.replicators.map(e=>({id:e.id,driver:e.driver}))));for(const t in e.resources)$i(t)!==$i(this.config.replicatorLogResource)&&this.installEventListeners(e.resources[t]);e.on("connected",()=>{for(const t in e.resources)$i(t)!==$i(this.config.replicatorLogResource)&&this.installEventListeners(e.resources[t])});const t=e.createResource.bind(e);e.createResource=async e=>{this.config.verbose&&console.log("[PLUGIN] createResource proxy called for:",e&&e.name);const r=await t(e);return r&&r.name!==this.config.replicatorLogResource&&this.installEventListeners(r),r},e.on("s3db.resourceCreated",t=>{const r=e.resources[t];r&&r.name!==this.config.replicatorLogResource&&this.installEventListeners(r)}),e.on("s3db.resourceUpdated",t=>{const r=e.resources[t];r&&r.name!==this.config.replicatorLogResource&&this.installEventListeners(r)})}async initializeReplicators(){console.log("[PLUGIN][INIT] initializeReplicators called");for(const e of this.config.replicators)try{console.log("[PLUGIN][INIT] processing replicatorConfig:",e);const t=e.driver,r=e.resources,i=Li(t,e,r,e.client);i?(await i.initialize(this.database),this.replicators.push({id:Math.random().toString(36).slice(2),driver:t,config:e,resources:r,instance:i}),console.log("[PLUGIN][INIT] pushed replicator:",t,r)):console.log("[PLUGIN][INIT] createReplicator returned null/undefined for driver:",t)}catch(e){console.error("[PLUGIN][INIT] Error creating replicator:",e)}}async start(){}async stop(){}async processReplicatorEvent(e,t,r,i,s=null){if(this.config.verbose&&(console.log("[PLUGIN][processReplicatorEvent] replicators.length:",this.replicators.length,this.replicators.map(e=>({id:e.id,driver:e.driver}))),console.log(`[PLUGIN][processReplicatorEvent] operation: ${t}, resource: ${e}, recordId: ${r}, data:`,i,"beforeData:",s)),this.config.verbose&&console.log(`[PLUGIN] processReplicatorEvent: resource=${e} op=${t} id=${r} data=`,i),this.config.verbose&&console.log(`[PLUGIN] processReplicatorEvent: resource=${e} op=${t} replicators=${this.replicators.length}`),0===this.replicators.length)return void(this.config.verbose&&console.log("[PLUGIN] No replicators registered"));const n=this.replicators.filter(r=>{const i=r.instance.shouldReplicateResource(e,t);return this.config.verbose&&console.log(`[PLUGIN] Replicator ${r.driver} shouldReplicateResource(${e}, ${t}):`,i),i});if(this.config.verbose&&console.log(`[PLUGIN] processReplicatorEvent: applicableReplicators for resource=${e}:`,n.map(e=>e.driver)),0===n.length)return void(this.config.verbose&&console.log("[PLUGIN] No applicable replicators for resource",e));const a=this.filterInternalFields(o.isPlainObject(i)?i:{raw:i}),c=s?this.filterInternalFields(o.isPlainObject(s)?s:{raw:s}):null,u={id:`repl-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,resourceName:e,operation:t,recordId:r,data:a,beforeData:c,timestamp:(new Date).toISOString(),attempts:0},l=await this.logreplicator(u),[h,d,f]=await A(async()=>this.processreplicatorItem(u));h?(l&&await this.updatereplicatorLog(l,{status:f.success?"success":"failed",attempts:1,error:f.success?"":JSON.stringify(f.results)}),this.stats.totalOperations++,f.success?this.stats.successfulOperations++:this.stats.failedOperations++):(l&&await this.updatereplicatorLog(l,{status:"failed",attempts:1,error:d.message}),this.stats.failedOperations++)}async processreplicatorItem(e){this.config.verbose&&console.log("[PLUGIN][processreplicatorItem] called with item:",e);const t=this.replicators.filter(t=>{const r=t.instance.shouldReplicateResource(e.resourceName,e.operation);return this.config.verbose&&console.log(`[PLUGIN] processreplicatorItem: Replicator ${t.driver} shouldReplicateResource(${e.resourceName}, ${e.operation}):`,r),r});if(this.config.verbose&&console.log(`[PLUGIN] processreplicatorItem: applicableReplicators for resource=${e.resourceName}:`,t.map(e=>e.driver)),0===t.length)return this.config.verbose&&console.log("[PLUGIN] processreplicatorItem: No applicable replicators for resource",e.resourceName),{success:!0,skipped:!0,reason:"no_applicable_replicators"};const r=[];for(const i of t){let t,s,n;this.config.verbose&&console.log("[PLUGIN] processReplicatorItem",{resource:e.resourceName,operation:e.operation,data:e.data,beforeData:e.beforeData,replicator:i.instance?.constructor?.name}),i.instance&&i.instance.constructor&&"S3dbReplicator"===i.instance.constructor.name?[s,n,t]=await A(()=>i.instance.replicate({resource:e.resourceName,operation:e.operation,data:e.data,id:e.recordId,beforeData:e.beforeData})):[s,n,t]=await A(()=>i.instance.replicate(e.resourceName,e.operation,e.data,e.recordId,e.beforeData)),r.push({replicatorId:i.id,driver:i.driver,success:t&&t.success,error:t&&t.error,skipped:t&&t.skipped})}return{success:r.every(e=>e.success||e.skipped),results:r}}async logreplicator(e){const t=this.replicatorLog||this.database.resources[$i(this.config.replicatorLogResource)];if(!t)return this.config.verbose&&console.error("[PLUGIN] replicator log resource not found!"),this.database&&(this.config.verbose&&console.warn("[PLUGIN] database.resources keys:",Object.keys(this.database.resources)),this.database.options&&this.database.options.connectionString&&this.config.verbose&&console.warn("[PLUGIN] database connectionString:",this.database.options.connectionString)),void this.emit("replicator.log.failed",{error:"replicator log resource not found",item:e});const r={id:e.id||`repl-${Date.now()}-${Math.random().toString(36).slice(2)}`,resource:e.resource||e.resourceName||"",action:e.operation||e.action||"",data:e.data||{},timestamp:"number"==typeof e.timestamp?e.timestamp:Date.now(),createdAt:e.createdAt||(new Date).toISOString().slice(0,10)};try{await t.insert(r)}catch(t){this.config.verbose&&console.error("[PLUGIN] Error writing to replicator log:",t),this.emit("replicator.log.failed",{error:t,item:e})}}async updatereplicatorLog(e,t){if(!this.replicatorLog)return;const[r,i]=await A(async()=>{await this.replicatorLog.update(e,{...t,lastAttempt:(new Date).toISOString()})});r||this.emit("replicator.updateLog.failed",{error:i.message,logId:e,updates:t})}async getreplicatorStats(){return{replicators:await Promise.all(this.replicators.map(async e=>{const t=await e.instance.getStatus();return{id:e.id,driver:e.driver,config:e.config,status:t}})),queue:{length:this.queue.length,isProcessing:this.isProcessing},stats:this.stats,lastSync:this.stats.lastSync}}async getreplicatorLogs(e={}){if(!this.replicatorLog)return[];const{resourceName:t,operation:r,status:i,limit:s=100,offset:n=0}=e;let o={};t&&(o.resourceName=t),r&&(o.operation=r),i&&(o.status=i);return(await this.replicatorLog.list(o)).slice(n,n+s)}async retryFailedreplicators(){if(!this.replicatorLog)return{retried:0};const e=await this.replicatorLog.list({status:"failed"});let t=0;for(const r of e){const[e,i]=await A(async()=>{await this.processReplicatorEvent(r.resourceName,r.operation,r.recordId,r.data)});e?t++:this.config.verbose&&console.error("Failed to retry replicator:",i)}return{retried:t}}async syncAllData(e){const t=this.replicators.find(t=>t.id===e);if(!t)throw new Error(`Replicator not found: ${e}`);this.stats.lastSync=(new Date).toISOString();for(const r in this.database.resources)if($i(r)!==$i("replicator_logs")&&t.instance.shouldReplicateResource(r)){this.emit("replicator.sync.resource",{resourceName:r,replicatorId:e});const i=this.database.resources[r],s=await i.getAll();for(const e of s)await t.instance.replicate(r,"insert",e,e.id)}this.emit("replicator.sync.completed",{replicatorId:e,stats:this.stats})}async cleanup(){if(this.config.verbose&&console.log("[PLUGIN][CLEANUP] Cleaning up ReplicatorPlugin"),this._installedListeners&&Array.isArray(this._installedListeners)){for(const e of this._installedListeners)e&&"function"==typeof e.removeAllListeners&&(e.removeAllListeners("insert"),e.removeAllListeners("update"),e.removeAllListeners("delete")),e._replicatorListenersInstalled=!1;this._installedListeners=[]}if(this.database&&"function"==typeof this.database.removeAllListeners&&this.database.removeAllListeners(),this.replicators&&Array.isArray(this.replicators)){for(const e of this.replicators)e.instance&&"function"==typeof e.instance.cleanup&&await e.instance.cleanup();this.replicators=[]}this.queue=[],this.isProcessing=!1,this.stats={totalOperations:0,totalErrors:0,lastError:null},this.config.verbose&&console.log("[PLUGIN][CLEANUP] ReplicatorPlugin cleanup complete")}},e.Resource=Di,e.ResourceError=ce,e.ResourceIdsPageReader=fi,e.ResourceIdsReader=di,e.ResourceNotFound=Y,e.ResourceReader=pi,e.ResourceWriter=gi,e.S3_DEFAULT_ENDPOINT=ki,e.S3_DEFAULT_REGION=Oi,e.S3db=Pi,e.S3dbError=W,e.Schema=Ii,e.SchemaActions=Ai,e.SchemaError=ae,e.UnknownError=re,e.ValidationError=G,e.Validator=Ei,e.ValidatorManager=Ni,e.behaviors=L,e.calculateAttributeNamesSize=f,e.calculateAttributeSizes=g,e.calculateEffectiveLimit=b,e.calculateSystemOverhead=y,e.calculateTotalSize=m,e.calculateUTF8Bytes=d,e.decode=z,e.decodeDecimal=K,e.decrypt=fe,e.default=Pi,e.encode=B,e.encodeDecimal=V,e.encrypt=de,e.getBehavior=$,e.getSizeBreakdown=function(e){const t=g(e),r=f(e),i=Object.values(t).reduce((e,t)=>e+t,0),s=i+r,n=Object.entries(t).sort(([,e],[,t])=>t-e).map(([e,t])=>({attribute:e,size:t,percentage:(t/s*100).toFixed(2)+"%"}));return{total:s,valueSizes:t,namesSize:r,valueTotal:i,breakdown:n,detailedBreakdown:{values:i,names:r,total:s}}},e.idGenerator=me,e.mapAwsError=se,e.md5=pe,e.passwordGenerator=ye,e.sha256=he,e.streamToString=mi,e.transformValue=p,e.tryFn=A,e.tryFnSync=I,Object.defineProperty(e,"__esModule",{value:!0}),e}({},nanoid,zlib,promisePool,web,0,lodashEs,crypto,jsonStableStringify,clientS3,flat,FastestValidator);