@oaknational/google-classroom-addon 1.4.0 → 1.5.0
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,8 +1,8 @@
|
|
|
1
|
-
"use strict";var e=require("crypto"),
|
|
1
|
+
"use strict";var t=require("@googleapis/classroom"),e=require("crypto"),r=require("google-auth-library");function n(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var i=n(e),o=function(){return o=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var i in e=arguments[r])Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},o.apply(this,arguments)};function s(t,e,r,n){return new(r||(r=Promise))(function(i,o){function s(t){try{c(n.next(t))}catch(t){o(t)}}function a(t){try{c(n.throw(t))}catch(t){o(t)}}function c(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r(function(t){t(e)})).then(s,a)}c((n=n.apply(t,e||[])).next())})}function a(t,e){var r,n,i,o={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(o=0)),o;)try{if(r=1,n&&(i=2&a[0]?n.return:a[0]?n.throw||((i=n.return)&&i.call(n),0):n.next)&&!(i=i.call(n,a[1])).done)return i;switch(n=0,i&&(a=[2&a[0],i.value]),a[0]){case 0:case 1:i=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,n=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(i=o.trys,(i=i.length>0&&i[i.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!i||a[1]>i[0]&&a[1]<i[3])){o.label=a[1];break}if(6===a[0]&&o.label<i[1]){o.label=i[1],i=a;break}if(i&&o.label<i[2]){o.label=i[2],o.ops.push(a);break}i[2]&&o.ops.pop(),o.trys.pop();continue}a=e.call(t,o)}catch(t){a=[6,t],n=0}finally{r=i=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}}"function"==typeof SuppressedError&&SuppressedError;var c,u={};
|
|
2
2
|
/*!
|
|
3
3
|
* cookie
|
|
4
4
|
* Copyright(c) 2012-2014 Roman Shtylman
|
|
5
5
|
* Copyright(c) 2015 Douglas Christopher Wilson
|
|
6
6
|
* MIT Licensed
|
|
7
|
-
*/!function(){if(s)return a;s=1,a.parse=function(e,r){if("string"!=typeof e)throw new TypeError("argument str must be a string");var n={},i=e.length;if(i<2)return n;var o=r&&r.decode||u,s=0,a=0,f=0;do{if(-1===(a=e.indexOf("=",s)))break;if(-1===(f=e.indexOf(";",s)))f=i;else if(a>f){s=e.lastIndexOf(";",a-1)+1;continue}var d=c(e,s,a),p=l(e,a,d),w=e.slice(d,p);if(!t.call(n,w)){var y=c(e,a+1,f),g=l(e,f,y);34===e.charCodeAt(y)&&34===e.charCodeAt(g-1)&&(y++,g--);var m=e.slice(y,g);n[w]=h(m,o)}s=f+1}while(s<i);return n},a.serialize=function(t,s,a){var c=a&&a.encode||encodeURIComponent;if("function"!=typeof c)throw new TypeError("option encode is invalid");if(!r.test(t))throw new TypeError("argument name is invalid");var l=c(s);if(!n.test(l))throw new TypeError("argument val is invalid");var u=t+"="+l;if(!a)return u;if(null!=a.maxAge){var h=Math.floor(a.maxAge);if(!isFinite(h))throw new TypeError("option maxAge is invalid");u+="; Max-Age="+h}if(a.domain){if(!i.test(a.domain))throw new TypeError("option domain is invalid");u+="; Domain="+a.domain}if(a.path){if(!o.test(a.path))throw new TypeError("option path is invalid");u+="; Path="+a.path}if(a.expires){var f=a.expires;if(!function(t){return"[object Date]"===e.call(t)}(f)||isNaN(f.valueOf()))throw new TypeError("option expires is invalid");u+="; Expires="+f.toUTCString()}a.httpOnly&&(u+="; HttpOnly");a.secure&&(u+="; Secure");a.partitioned&&(u+="; Partitioned");if(a.priority){switch("string"==typeof a.priority?a.priority.toLowerCase():a.priority){case"low":u+="; Priority=Low";break;case"medium":u+="; Priority=Medium";break;case"high":u+="; Priority=High";break;default:throw new TypeError("option priority is invalid")}}if(a.sameSite){switch("string"==typeof a.sameSite?a.sameSite.toLowerCase():a.sameSite){case!0:u+="; SameSite=Strict";break;case"lax":u+="; SameSite=Lax";break;case"strict":u+="; SameSite=Strict";break;case"none":u+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}}return u};var e=Object.prototype.toString,t=Object.prototype.hasOwnProperty,r=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,n=/^("?)[\u0021\u0023-\u002B\u002D-\u003A\u003C-\u005B\u005D-\u007E]*\1$/,i=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,o=/^[\u0020-\u003A\u003D-\u007E]*$/;function c(e,t,r){do{var n=e.charCodeAt(t);if(32!==n&&9!==n)return t}while(++t<r);return r}function l(e,t,r){for(;t>r;){var n=e.charCodeAt(--t);if(32!==n&&9!==n)return t+1}return r}function u(e){return-1!==e.indexOf("%")?decodeURIComponent(e):e}function h(e,t){try{return t(e)}catch(t){return e}}}();var c={},l=Array.from({length:64});for(let e=0,t="A".charCodeAt(0),r="Z".charCodeAt(0);e+t<=r;e++){const r=String.fromCharCode(e+t);c[r]=e,l[e]=r}for(let e=0,t="a".charCodeAt(0),r="z".charCodeAt(0);e+t<=r;e++){const r=String.fromCharCode(e+t),n=e+26;c[r]=n,l[n]=r}for(let e=0;e<10;e++){c[e.toString(10)]=e+52;const t=e.toString(10),r=e+52;c[t]=r,l[r]=t}c["-"]=62,l[62]="-",c._=63,l[63]="_";var u=e=>(new TextEncoder).encode(e),h=e=>{const t=e+"=".repeat((4-e.length%4)%4);let r=t.length/4*3;t.endsWith("==")?r-=2:t.endsWith("=")&&r--;const n=new ArrayBuffer(r),i=new DataView(n);for(let e=0;e<t.length;e+=4){let r=0,n=0;for(let i=e,o=e+3;i<=o;i++)if("="===t[i])r>>=6;else{if(!(t[i]in c))throw new TypeError(`Invalid character ${t[i]} in base64 string.`);r|=c[t[i]]<<6*(o-i),n+=6}const o=e/4*3;r>>=n%8;const s=Math.floor(n/8);for(let e=0;e<s;e++){const t=8*(s-e-1);i.setUint8(o+e,(r&255<<t)>>t)}}return new Uint8Array(n)},f=e=>{const t="string"==typeof e?u(e):e;let r="";for(let e=0;e<t.length;e+=3){let n=0,i=0;for(let r=e,o=Math.min(e+3,t.length);r<o;r++)n|=t[r]<<8*(o-r-1),i+=8;const o=Math.ceil(i/6);n<<=6*o-i;for(let e=1;e<=o;e++){const t=6*(o-e);r+=l[(n&63<<t)>>t]}}return r},d={encryption:{saltBits:256,algorithm:"aes-256-cbc",iterations:1,minPasswordlength:32},integrity:{saltBits:256,algorithm:"sha256",iterations:1,minPasswordlength:32},ttl:0,timestampSkewSec:60,localtimeOffsetMsec:0},p=e=>({...e,encryption:{...e.encryption},integrity:{...e.integrity}}),w={"aes-128-ctr":{keyBits:128,ivBits:128,name:"AES-CTR"},"aes-256-cbc":{keyBits:256,ivBits:128,name:"AES-CBC"},sha256:{keyBits:256,name:"SHA-256"}},y="Fe26.2",g=(e,t)=>{if(t<1)throw new Error("Invalid random bits count");return((e,t)=>{const r=new Uint8Array(t);return e.getRandomValues(r),r})(e,Math.ceil(t/8))},m=async(e,t,r)=>{var n;if(!(null==t?void 0:t.length))throw new Error("Empty password");if(null==r||"object"!=typeof r)throw new Error("Bad options");if(!(r.algorithm in w))throw new Error(`Unknown algorithm: ${r.algorithm}`);const i=w[r.algorithm],o={},s=null!=(n=r.hmac)&&n,a=s?{name:"HMAC",hash:i.name}:{name:i.name},c=s?["sign","verify"]:["encrypt","decrypt"];if("string"==typeof t){if(t.length<r.minPasswordlength)throw new Error(`Password string too short (min ${r.minPasswordlength} characters required)`);let{salt:n=""}=r;if(!n){const{saltBits:t=0}=r;if(!t)throw new Error("Missing salt and saltBits options");const i=g(e,t);n=[...new Uint8Array(i)].map(e=>e.toString(16).padStart(2,"0")).join("")}const s=await(async(e,t,r,n,i,o)=>{const s=u(t),a=await e.subtle.importKey("raw",s,{name:"PBKDF2"},!1,["deriveBits"]),c={name:"PBKDF2",hash:o,salt:u(r),iterations:n};return await e.subtle.deriveBits(c,a,8*i)})(e,t,n,r.iterations,i.keyBits/8,"SHA-1"),l=await e.subtle.importKey("raw",s,a,!1,c);o.key=l,o.salt=n}else{if(t.length<i.keyBits/8)throw new Error("Key buffer (password) too small");o.key=await e.subtle.importKey("raw",t,a,!1,c),o.salt=""}return r.iv?o.iv=r.iv:"ivBits"in i&&(o.iv=g(e,i.ivBits)),o},v=(e,t,r)=>["aes-128-ctr"===e?{name:"AES-CTR",counter:t.iv,length:128}:{name:"AES-CBC",iv:t.iv},t.key,"string"==typeof r?u(r):r],E=async(e,t,r,n)=>{const i=await m(e,t,r),o=await e.subtle.decrypt(...v(r.algorithm,i,n));return s=new Uint8Array(o),(new TextDecoder).decode(s);var s},S=async(e,t,r,n)=>{const i=await m(e,t,{...r,hmac:!0}),o=u(n),s=await e.subtle.sign({name:"HMAC"},i.key,o);return{digest:f(new Uint8Array(s)),salt:i.salt}},C=e=>"string"==typeof e||e instanceof Uint8Array?{encryption:e,integrity:e}:"secret"in e?{id:e.id,encryption:e.secret,integrity:e.secret}:{id:e.id,encryption:e.encryption,integrity:e.integrity},b=async(e,t,r,n)=>{if(!r)throw new Error("Empty password");const i=p(n),o=Date.now()+(i.localtimeOffsetMsec||0),s=JSON.stringify(t),a=C(r),{id:c="",encryption:l,integrity:u}=a;if(c&&!/^\w+$/.test(c))throw new Error("Invalid password id");const{encrypted:h,key:d}=await(async(e,t,r,n)=>{const i=await m(e,t,r),o=await e.subtle.encrypt(...v(r.algorithm,i,n));return{encrypted:new Uint8Array(o),key:i}})(e,l,i.encryption,s),w=f(new Uint8Array(h)),g=f(d.iv),E=i.ttl?o+i.ttl:"",b=`${y}*${c}*${d.salt}*${g}*${w}*${E}`,A=await S(e,u,i.integrity,b);return`${b}*${A.salt}*${A.digest}`};const A=globalThis.crypto,k=A.subtle,T=()=>A.randomUUID(),_=e=>A.getRandomValues(e),O={randomUUID:T,getRandomValues:_,subtle:k};var U=Object.freeze({__proto__:null,default:O,getRandomValues:_,randomUUID:T,subtle:k});function I(e){return"string"==typeof e?{1:e}:e}var x,N=function(e){return async function(t,{password:r,ttl:n=1209600}){const i=I(r),o=Math.max(...Object.keys(i).map(Number)),s={id:o.toString(),secret:i[o]};return`${await b(e,t,s,{...d,ttl:1e3*n})}~2`}}(U),R=function(e){return async function(t,{password:r,ttl:n=1209600}){const i=I(r),{sealWithoutVersion:o,tokenVersion:s}=function(e){const[t,r]=e.split("~");return{sealWithoutVersion:t,tokenVersion:null==r?null:parseInt(r,10)}}(t);try{const t=await(async(e,t,r,n)=>{if(!r)throw new Error("Empty password");const i=p(n),o=Date.now()+(i.localtimeOffsetMsec||0),s=t.split("*");if(8!==s.length)throw new Error("Incorrect number of sealed components");const a=s[0];let c=s[1];const l=s[2],u=s[3],f=s[4],d=s[5],w=s[6],g=s[7],m=`${a}*${c}*${l}*${u}*${f}*${d}`;if(y!==a)throw new Error("Wrong mac prefix");if(d){if(!/^\d+$/.test(d))throw new Error("Invalid expiration");if(Number.parseInt(d,10)<=o-1e3*i.timestampSkewSec)throw new Error("Expired seal")}let v="";if(c=c||"default","string"==typeof r||r instanceof Uint8Array)v=r;else{if(!(c in r))throw new Error(`Cannot find password: ${c}`);v=r[c]}v=C(v);const b=i.integrity;if(b.salt=w,!((e,t)=>{let r=e.length===t.length?0:1;r&&(t=e);for(let n=0;n<e.length;n+=1)r|=e.charCodeAt(n)^t.charCodeAt(n);return 0===r})((await S(e,v.integrity,b,m)).digest,g))throw new Error("Bad hmac value");const A=h(f),k=i.encryption;k.salt=l,k.iv=h(u);const T=await E(e,v.encryption,k,A);return T?JSON.parse(T):null})(e,o,i,{...d,ttl:1e3*n})??{};return 2===s?t:{...t.persistent}}catch(e){if(e instanceof Error&&/^(Expired seal|Bad hmac value|Cannot find password|Incorrect number of sealed components)/.test(e.message))return{};throw e}}}(U),B=function(){function e(e){this.encryptionSecret=e,this.ENCRYPTION_SECRET=e}return e.prototype.encryptString=function(t){var r=n.default.randomBytes(e.SALT_BYTES).toString("hex"),i=n.default.randomBytes(e.IV_LENGTH),o=n.default.scryptSync(this.ENCRYPTION_SECRET,r,e.ENCRYPTION_KEY_LENGTH),s=n.default.createCipheriv(e.ALGORITHM,o,i),a=s.update(t,"utf8","hex");return a+=s.final("hex"),"".concat(i.toString("hex"),":").concat(a,":").concat(r)},e.prototype.decryptString=function(t){var r=function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,o=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=o.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(i)throw i.error}}return s}(t.split(":"),3),i=r[0],o=r[1],s=r[2];if(!i||!o||!s)throw new Error("Invalid encrypted string");var a=Buffer.from(i,"hex"),c=n.default.scryptSync(this.ENCRYPTION_SECRET,s,e.ENCRYPTION_KEY_LENGTH),l=n.default.createDecipheriv(e.ALGORITHM,c,a),u=l.update(o,"hex","utf8");return u+=l.final("utf8")},e.ALGORITHM="aes-256-cbc",e.IV_LENGTH=16,e.SALT_BYTES=16,e.ENCRYPTION_KEY_LENGTH=32,e}();!function(e){e.CONNECTED_USERS_CREDENTIALS="connectedUsersCredentials"}(x||(x={}));var P=function(){function e(e){this.firestore=e,this._firestore=e}return e.prototype.getConnectedUserCredentials=function(e){return i(this,void 0,void 0,function(){var t;return o(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,this._firestore.collection(x.CONNECTED_USERS_CREDENTIALS).doc(e).get()];case 1:return[2,r.sent()];case 2:throw t=r.sent(),console.error(t),new Error("Failed to save users credentials");case 3:return[2]}})})},e.prototype.upsertConnectedUserCredentials=function(e){return i(this,void 0,void 0,function(){var t;return o(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),this._firestore.settings({ignoreUndefinedProperties:!0}),[4,this._firestore.collection(x.CONNECTED_USERS_CREDENTIALS).doc(e.loginHint).set(e)];case 1:return r.sent(),[3,3];case 2:throw t=r.sent(),console.error(t),new Error("Failed to upsert users credentials");case 3:return[2]}})})},e}(),$=function(){function e(e,r,n,s,a){var c=this;if(this.googleClientId=e,this.googleClientSecret=r,this.callbackUrl=n,this.accessToken=s,this.refreshToken=a,!e)throw new Error("Google Client ID is missing");if(!r)throw new Error("Google Client Secret is missing");if(!n)throw new Error("Google OAuth Callback URL is missing");var l=new t.OAuth2Client({clientId:e,clientSecret:r,redirectUri:n,forceRefreshOnFailure:!1});"true"===process.env.GOOGLE_CLASSROOM_DEV_MODE&&s&&(l.refreshHandler=function(){return i(c,void 0,void 0,function(){return o(this,function(e){return[2,{access_token:s,expiry_date:(new Date).getTime()+36e5}]})})}),(s||a)&&l.setCredentials({access_token:s,refresh_token:a}),this.client=l,this.clientId=e}return e.prototype.getAuthenticateUrl=function(e,t){void 0===t&&(t=!1);try{return this.client.generateAuthUrl({access_type:"offline",include_granted_scopes:!0,scope:["https://www.googleapis.com/auth/userinfo.profile","https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/classroom.courses.readonly","https://www.googleapis.com/auth/classroom.addons.student","https://www.googleapis.com/auth/classroom.addons.teacher"],loginHint:e,subscribeToNewsletter:t})}catch(e){return console.error(e),null}},e.prototype.exchangeCodeForTokens=function(e){return i(this,void 0,void 0,function(){var t,r,n,i;return o(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,this.client.getToken(e)];case 1:return t=o.sent().tokens,[4,this.client.verifyIdToken({idToken:t.id_token,audience:this.clientId})];case 2:if(r=o.sent(),n=r.getPayload(),!t.access_token)throw new Error("Access token is missing");if(!(null==n?void 0:n.sub))throw new Error("User sub is missing");return[2,{accessToken:t.access_token,loginHint:n.sub,refreshToken:t.refresh_token,profilePictureUrl:null==n?void 0:n.picture,email:n.email}];case 3:return i=o.sent(),console.error(i),[2,null];case 4:return[2]}})})},e.prototype.refreshAccessToken=function(e){return i(this,void 0,void 0,function(){var t,r;return o(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),this.client.setCredentials({refresh_token:e}),[4,this.client.getAccessToken()];case 1:if(!(t=n.sent()).token)throw new Error("Unable to refresh access token");return[2,t.token];case 2:return r=n.sent(),console.error(r),[2,null];case 3:return[2]}})})},e.prototype.isAuthenticated=function(e){return i(this,void 0,void 0,function(){var t,r;return o(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,this.client.getTokenInfo(e)];case 1:return t=n.sent(),t.expiry_date<Date.now()?[2,!0]:[2,!1];case 2:return r=n.sent(),console.error(r),[2,!1];case 3:return[2]}})})},e}(),D=function(){function e(e,t,r,n,i,o){this.encryptionSecret=e,this.firestore=t,this.googleOAuthClientId=r,this.googleOAuthClientSecret=n,this.googleOAuthCallbackApiRoute=i,this.sessionSecret=o,this.encryptionService=new B(e),this.firestoreClient=new P(t),this._googleOAuthClientId=r,this._googleOAuthClientSecret=n,this._googleOAuthCallbackApiRoute=i,this._sessionSecret=o}return e.prototype.getOAuthClient=function(e,t){return new $(this._googleOAuthClientId,this._googleOAuthClientSecret,this._googleOAuthCallbackApiRoute,e,t)},e.prototype.getGoogleSignInUrl=function(e){return i(this,arguments,void 0,function(e,t){var r,n;return void 0===t&&(t=!1),o(this,function(i){if(r=this.getOAuthClient(),!(n=r.getAuthenticateUrl(e,t)))throw new Error("Failed to get Google Authentication URL");return[2,n]})})},e.prototype.handleGoogleSignInCallback=function(e,t){return i(this,void 0,void 0,function(){var r,n,i,s;return o(this,function(o){switch(o.label){case 0:return[4,this.getOAuthClient().exchangeCodeForTokens(e)];case 1:if(!(r=o.sent()))throw new Error("Failed to authenticate Google sign-in");return n=r.refreshToken?this.encryptionService.encryptString(r.refreshToken):void 0,i=r.profilePictureUrl?this.encryptionService.encryptString(r.profilePictureUrl):void 0,[4,this.firestoreClient.upsertConnectedUserCredentials({refreshToken:n,profilePictureUrl:i,loginHint:r.loginHint})];case 2:return o.sent(),[4,N({loginHint:r.loginHint,accessToken:r.accessToken},{password:this._sessionSecret})];case 3:return s=o.sent(),t&&r.email?[4,t(r.email)]:[3,5];case 4:o.sent(),o.label=5;case 5:return[2,{encryptedSession:s,profilePictureUrl:r.profilePictureUrl}]}})})},e.prototype.verifyAuthSession=function(e){return i(this,void 0,void 0,function(){var t,r,n,i;return o(this,function(o){switch(o.label){case 0:return[4,R(e,{password:this._sessionSecret})];case 1:return(null==(t=o.sent())?void 0:t.accessToken)&&(null==t?void 0:t.loginHint)?[4,this.firestoreClient.getConnectedUserCredentials(t.loginHint)]:[2,null];case 2:return(r=o.sent())?[4,(n=this.getOAuthClient(t.accessToken,r.refreshToken)).isAuthenticated(t.accessToken)]:[2,null];case 3:return o.sent()?[2,e]:[4,n.refreshAccessToken(r.refreshToken)];case 4:return(i=o.sent())?[4,N({loginHint:t.loginHint,accessToken:i},{password:this._sessionSecret})]:[3,6];case 5:return[2,o.sent()];case 6:return[2,null]}})})},e}();exports.OakGoogleClassroomAddOn=D;
|
|
7
|
+
*/!function(){if(c)return u;c=1,u.parse=function(t,r){if("string"!=typeof t)throw new TypeError("argument str must be a string");var n={},i=t.length;if(i<2)return n;var o=r&&r.decode||l,c=0,u=0,d=0;do{if(-1===(u=t.indexOf("=",c)))break;if(-1===(d=t.indexOf(";",c)))d=i;else if(u>d){c=t.lastIndexOf(";",u-1)+1;continue}var f=s(t,c,u),p=a(t,u,f),w=t.slice(f,p);if(!e.call(n,w)){var g=s(t,u+1,d),y=a(t,d,g);34===t.charCodeAt(g)&&34===t.charCodeAt(y-1)&&(g++,y--);var m=t.slice(g,y);n[w]=h(m,o)}c=d+1}while(c<i);return n},u.serialize=function(e,s,a){var c=a&&a.encode||encodeURIComponent;if("function"!=typeof c)throw new TypeError("option encode is invalid");if(!r.test(e))throw new TypeError("argument name is invalid");var u=c(s);if(!n.test(u))throw new TypeError("argument val is invalid");var l=e+"="+u;if(!a)return l;if(null!=a.maxAge){var h=Math.floor(a.maxAge);if(!isFinite(h))throw new TypeError("option maxAge is invalid");l+="; Max-Age="+h}if(a.domain){if(!i.test(a.domain))throw new TypeError("option domain is invalid");l+="; Domain="+a.domain}if(a.path){if(!o.test(a.path))throw new TypeError("option path is invalid");l+="; Path="+a.path}if(a.expires){var d=a.expires;if(!function(e){return"[object Date]"===t.call(e)}(d)||isNaN(d.valueOf()))throw new TypeError("option expires is invalid");l+="; Expires="+d.toUTCString()}a.httpOnly&&(l+="; HttpOnly");a.secure&&(l+="; Secure");a.partitioned&&(l+="; Partitioned");if(a.priority){switch("string"==typeof a.priority?a.priority.toLowerCase():a.priority){case"low":l+="; Priority=Low";break;case"medium":l+="; Priority=Medium";break;case"high":l+="; Priority=High";break;default:throw new TypeError("option priority is invalid")}}if(a.sameSite){switch("string"==typeof a.sameSite?a.sameSite.toLowerCase():a.sameSite){case!0:l+="; SameSite=Strict";break;case"lax":l+="; SameSite=Lax";break;case"strict":l+="; SameSite=Strict";break;case"none":l+="; SameSite=None";break;default:throw new TypeError("option sameSite is invalid")}}return l};var t=Object.prototype.toString,e=Object.prototype.hasOwnProperty,r=/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/,n=/^("?)[\u0021\u0023-\u002B\u002D-\u003A\u003C-\u005B\u005D-\u007E]*\1$/,i=/^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i,o=/^[\u0020-\u003A\u003D-\u007E]*$/;function s(t,e,r){do{var n=t.charCodeAt(e);if(32!==n&&9!==n)return e}while(++e<r);return r}function a(t,e,r){for(;e>r;){var n=t.charCodeAt(--e);if(32!==n&&9!==n)return e+1}return r}function l(t){return-1!==t.indexOf("%")?decodeURIComponent(t):t}function h(t,e){try{return e(t)}catch(e){return t}}}();var l={},h=Array.from({length:64});for(let t=0,e="A".charCodeAt(0),r="Z".charCodeAt(0);t+e<=r;t++){const r=String.fromCharCode(t+e);l[r]=t,h[t]=r}for(let t=0,e="a".charCodeAt(0),r="z".charCodeAt(0);t+e<=r;t++){const r=String.fromCharCode(t+e),n=t+26;l[r]=n,h[n]=r}for(let t=0;t<10;t++){l[t.toString(10)]=t+52;const e=t.toString(10),r=t+52;l[e]=r,h[r]=e}l["-"]=62,h[62]="-",l._=63,h[63]="_";var d=t=>(new TextEncoder).encode(t),f=t=>{const e=t+"=".repeat((4-t.length%4)%4);let r=e.length/4*3;e.endsWith("==")?r-=2:e.endsWith("=")&&r--;const n=new ArrayBuffer(r),i=new DataView(n);for(let t=0;t<e.length;t+=4){let r=0,n=0;for(let i=t,o=t+3;i<=o;i++)if("="===e[i])r>>=6;else{if(!(e[i]in l))throw new TypeError(`Invalid character ${e[i]} in base64 string.`);r|=l[e[i]]<<6*(o-i),n+=6}const o=t/4*3;r>>=n%8;const s=Math.floor(n/8);for(let t=0;t<s;t++){const e=8*(s-t-1);i.setUint8(o+t,(r&255<<e)>>e)}}return new Uint8Array(n)},p=t=>{const e="string"==typeof t?d(t):t;let r="";for(let t=0;t<e.length;t+=3){let n=0,i=0;for(let r=t,o=Math.min(t+3,e.length);r<o;r++)n|=e[r]<<8*(o-r-1),i+=8;const o=Math.ceil(i/6);n<<=6*o-i;for(let t=1;t<=o;t++){const e=6*(o-t);r+=h[(n&63<<e)>>e]}}return r},w={encryption:{saltBits:256,algorithm:"aes-256-cbc",iterations:1,minPasswordlength:32},integrity:{saltBits:256,algorithm:"sha256",iterations:1,minPasswordlength:32},ttl:0,timestampSkewSec:60,localtimeOffsetMsec:0},g=t=>({...t,encryption:{...t.encryption},integrity:{...t.integrity}}),y={"aes-128-ctr":{keyBits:128,ivBits:128,name:"AES-CTR"},"aes-256-cbc":{keyBits:256,ivBits:128,name:"AES-CBC"},sha256:{keyBits:256,name:"SHA-256"}},m="Fe26.2",v=(t,e)=>{if(e<1)throw new Error("Invalid random bits count");return((t,e)=>{const r=new Uint8Array(e);return t.getRandomValues(r),r})(t,Math.ceil(e/8))},C=async(t,e,r)=>{var n;if(!(null==e?void 0:e.length))throw new Error("Empty password");if(null==r||"object"!=typeof r)throw new Error("Bad options");if(!(r.algorithm in y))throw new Error(`Unknown algorithm: ${r.algorithm}`);const i=y[r.algorithm],o={},s=null!=(n=r.hmac)&&n,a=s?{name:"HMAC",hash:i.name}:{name:i.name},c=s?["sign","verify"]:["encrypt","decrypt"];if("string"==typeof e){if(e.length<r.minPasswordlength)throw new Error(`Password string too short (min ${r.minPasswordlength} characters required)`);let{salt:n=""}=r;if(!n){const{saltBits:e=0}=r;if(!e)throw new Error("Missing salt and saltBits options");const i=v(t,e);n=[...new Uint8Array(i)].map(t=>t.toString(16).padStart(2,"0")).join("")}const s=await(async(t,e,r,n,i,o)=>{const s=d(e),a=await t.subtle.importKey("raw",s,{name:"PBKDF2"},!1,["deriveBits"]),c={name:"PBKDF2",hash:o,salt:d(r),iterations:n};return await t.subtle.deriveBits(c,a,8*i)})(t,e,n,r.iterations,i.keyBits/8,"SHA-1"),u=await t.subtle.importKey("raw",s,a,!1,c);o.key=u,o.salt=n}else{if(e.length<i.keyBits/8)throw new Error("Key buffer (password) too small");o.key=await t.subtle.importKey("raw",e,a,!1,c),o.salt=""}return r.iv?o.iv=r.iv:"ivBits"in i&&(o.iv=v(t,i.ivBits)),o},A=(t,e,r)=>["aes-128-ctr"===t?{name:"AES-CTR",counter:e.iv,length:128}:{name:"AES-CBC",iv:e.iv},e.key,"string"==typeof r?d(r):r],S=async(t,e,r,n)=>{const i=await C(t,e,r),o=await t.subtle.decrypt(...A(r.algorithm,i,n));return s=new Uint8Array(o),(new TextDecoder).decode(s);var s},E=async(t,e,r,n)=>{const i=await C(t,e,{...r,hmac:!0}),o=d(n),s=await t.subtle.sign({name:"HMAC"},i.key,o);return{digest:p(new Uint8Array(s)),salt:i.salt}},b=t=>"string"==typeof t||t instanceof Uint8Array?{encryption:t,integrity:t}:"secret"in t?{id:t.id,encryption:t.secret,integrity:t.secret}:{id:t.id,encryption:t.encryption,integrity:t.integrity},k=async(t,e,r,n)=>{if(!r)throw new Error("Empty password");const i=g(n),o=Date.now()+(i.localtimeOffsetMsec||0),s=JSON.stringify(e),a=b(r),{id:c="",encryption:u,integrity:l}=a;if(c&&!/^\w+$/.test(c))throw new Error("Invalid password id");const{encrypted:h,key:d}=await(async(t,e,r,n)=>{const i=await C(t,e,r),o=await t.subtle.encrypt(...A(r.algorithm,i,n));return{encrypted:new Uint8Array(o),key:i}})(t,u,i.encryption,s),f=p(new Uint8Array(h)),w=p(d.iv),y=i.ttl?o+i.ttl:"",v=`${m}*${c}*${d.salt}*${w}*${f}*${y}`,S=await E(t,l,i.integrity,v);return`${v}*${S.salt}*${S.digest}`};const T=globalThis.crypto,I=T.subtle,O=()=>T.randomUUID(),_=t=>T.getRandomValues(t),U={randomUUID:O,getRandomValues:_,subtle:I};var x=Object.freeze({__proto__:null,default:U,getRandomValues:_,randomUUID:O,subtle:I});function R(t){return"string"==typeof t?{1:t}:t}var N,P=function(t){return async function(e,{password:r,ttl:n=1209600}){const i=R(r),o=Math.max(...Object.keys(i).map(Number)),s={id:o.toString(),secret:i[o]};return`${await k(t,e,s,{...w,ttl:1e3*n})}~2`}}(x),B=function(t){return async function(e,{password:r,ttl:n=1209600}){const i=R(r),{sealWithoutVersion:o,tokenVersion:s}=function(t){const[e,r]=t.split("~");return{sealWithoutVersion:e,tokenVersion:null==r?null:parseInt(r,10)}}(e);try{const e=await(async(t,e,r,n)=>{if(!r)throw new Error("Empty password");const i=g(n),o=Date.now()+(i.localtimeOffsetMsec||0),s=e.split("*");if(8!==s.length)throw new Error("Incorrect number of sealed components");const a=s[0];let c=s[1];const u=s[2],l=s[3],h=s[4],d=s[5],p=s[6],w=s[7],y=`${a}*${c}*${u}*${l}*${h}*${d}`;if(m!==a)throw new Error("Wrong mac prefix");if(d){if(!/^\d+$/.test(d))throw new Error("Invalid expiration");if(Number.parseInt(d,10)<=o-1e3*i.timestampSkewSec)throw new Error("Expired seal")}let v="";if(c=c||"default","string"==typeof r||r instanceof Uint8Array)v=r;else{if(!(c in r))throw new Error(`Cannot find password: ${c}`);v=r[c]}v=b(v);const C=i.integrity;if(C.salt=p,!((t,e)=>{let r=t.length===e.length?0:1;r&&(e=t);for(let n=0;n<t.length;n+=1)r|=t.charCodeAt(n)^e.charCodeAt(n);return 0===r})((await E(t,v.integrity,C,y)).digest,w))throw new Error("Bad hmac value");const A=f(h),k=i.encryption;k.salt=u,k.iv=f(l);const T=await S(t,v.encryption,k,A);return T?JSON.parse(T):null})(t,o,i,{...w,ttl:1e3*n})??{};return 2===s?e:{...e.persistent}}catch(t){if(t instanceof Error&&/^(Expired seal|Bad hmac value|Cannot find password|Incorrect number of sealed components)/.test(t.message))return{};throw t}}}(x),H=function(){function e(t,e){this.baseUrl=t,this.oAuthClient=e,this.baseUrl=t,this.oAuthClient=e}return e.prototype.getClassroomClient=function(){return s(this,void 0,void 0,function(){var e;return a(this,function(r){switch(r.label){case 0:return[4,this.oAuthClient.getOAuth2Client()];case 1:return e=r.sent(),[2,new t.classroom_v1.Classroom({auth:e})]}})})},e.prototype.createAnnouncementAttachment=function(t){return s(this,void 0,void 0,function(){var e,r,n,i,o,s,c,u,l;return a(this,function(a){switch(a.label){case 0:return e=t.courseId,r=t.itemId,n=t.addOnToken,i=t.title,o=t.lessonSlug,s=t.programeSlug,c=t.unitSlug,u=t.maxPoints,[4,this.getClassroomClient()];case 1:return[4,a.sent().courses.courseWork.addOnAttachments.create({courseId:e,itemId:r,addOnToken:n,requestBody:{title:i,teacherViewUri:{uri:"".concat(this.baseUrl,"/pupils/programmes/").concat(s,"/units/").concat(c,"/lessons/").concat(o)},studentViewUri:{uri:"".concat(this.baseUrl,"/pupils/programmes/").concat(s,"/units/").concat(c,"/lessons/").concat(o)},studentWorkReviewUri:u?{uri:"".concat(this.baseUrl,"/pupils/programmes/").concat(s,"/units/").concat(c,"/lessons/").concat(o)}:void 0,maxPoints:u}})];case 2:return[2,{courseId:(l=a.sent()).data.courseId,postId:l.data.postId,id:l.data.id,title:l.data.title,teacherViewUri:l.data.teacherViewUri,studentViewUri:l.data.studentViewUri,studentWorkReviewUri:l.data.studentWorkReviewUri,itemId:l.data.itemId,maxPoints:l.data.maxPoints}]}})})},e.prototype.submitPupilResponse=function(t){return s(this,void 0,void 0,function(){return a(this,function(e){switch(e.label){case 0:return[4,this.getClassroomClient()];case 1:return[4,e.sent().courses.courseWork.addOnAttachments.studentSubmissions.patch({courseId:t.courseId,itemId:t.itemId,attachmentId:t.attachmentId,submissionId:t.submissionId,updateMask:"pointsEarned",requestBody:{pointsEarned:t.pointsEarned}})];case 2:return[2,e.sent().data]}})})},e.prototype.fetchPupilResponse=function(t){return s(this,void 0,void 0,function(){return a(this,function(e){switch(e.label){case 0:return[4,this.getClassroomClient()];case 1:return[4,e.sent().courses.courseWork.addOnAttachments.studentSubmissions.get({courseId:t.courseId,itemId:t.itemId,attachmentId:t.attachmentId,submissionId:t.submissionId})];case 2:return[2,e.sent().data]}})})},e}(),D=function(){function t(t){this.encryptionSecret=t,this.ENCRYPTION_SECRET=t}return t.prototype.encryptString=function(e){var r=i.default.randomBytes(t.SALT_BYTES).toString("hex"),n=i.default.randomBytes(t.IV_LENGTH),o=i.default.scryptSync(this.ENCRYPTION_SECRET,r,t.ENCRYPTION_KEY_LENGTH),s=i.default.createCipheriv(t.ALGORITHM,o,n),a=s.update(e,"utf8","hex");return a+=s.final("hex"),"".concat(n.toString("hex"),":").concat(a,":").concat(r)},t.prototype.decryptString=function(e){var r=function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,i,o=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=o.next()).done;)s.push(n.value)}catch(t){i={error:t}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(i)throw i.error}}return s}(e.split(":"),3),n=r[0],o=r[1],s=r[2];if(!n||!o||!s)throw new Error("Invalid encrypted string");var a=Buffer.from(n,"hex"),c=i.default.scryptSync(this.ENCRYPTION_SECRET,s,t.ENCRYPTION_KEY_LENGTH),u=i.default.createDecipheriv(t.ALGORITHM,c,a),l=u.update(o,"hex","utf8");return l+=u.final("utf8")},t.ALGORITHM="aes-256-cbc",t.IV_LENGTH=16,t.SALT_BYTES=16,t.ENCRYPTION_KEY_LENGTH=32,t}();!function(t){t.CONNECTED_USERS_CREDENTIALS="connectedUsersCredentials",t.CLASSROOM_ATTACHMENTS="classroomAttachments"}(N||(N={}));var $=function(){function t(t){this.firestore=t,this._firestore=t}return t.prototype.getConnectedUserCredentials=function(t){return s(this,void 0,void 0,function(){var e;return a(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,this._firestore.collection(N.CONNECTED_USERS_CREDENTIALS).doc(t).get()];case 1:return[2,r.sent()];case 2:throw e=r.sent(),console.error(e),new Error("Failed to save users credentials");case 3:return[2]}})})},t.prototype.upsertConnectedUserCredentials=function(t){return s(this,void 0,void 0,function(){var e;return a(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),this._firestore.settings({ignoreUndefinedProperties:!0}),[4,this._firestore.collection(N.CONNECTED_USERS_CREDENTIALS).doc(t.loginHint).set(t)];case 1:return r.sent(),[3,3];case 2:throw e=r.sent(),console.error(e),new Error("Failed to upsert users credentials");case 3:return[2]}})})},t.prototype.upsertClassroomAttachment=function(t){return s(this,void 0,void 0,function(){var e;return a(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,this._firestore.collection(N.CLASSROOM_ATTACHMENTS).doc(t.attachmentId).set(t)];case 1:return r.sent(),[3,3];case 2:throw e=r.sent(),console.error(e),new Error("Failed to upsert classroom attachment");case 3:return[2]}})})},t.prototype.getClassroomAttachmentById=function(t){return s(this,void 0,void 0,function(){var e,r;return a(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,this._firestore.collection(N.CLASSROOM_ATTACHMENTS).doc(t).get()];case 1:return(e=n.sent()).exists?[2,e.data()]:[2,null];case 2:throw r=n.sent(),console.error(r),new Error("Failed to get classroom attachment by ID");case 3:return[2]}})})},t}(),M=function(){function t(t,e,n,i,o){var c=this;if(this.googleClientId=t,this.googleClientSecret=e,this.callbackUrl=n,this.accessToken=i,this.refreshToken=o,!t)throw new Error("Google Client ID is missing");if(!e)throw new Error("Google Client Secret is missing");if(!n)throw new Error("Google OAuth Callback URL is missing");var u=new r.OAuth2Client({clientId:t,clientSecret:e,redirectUri:n,forceRefreshOnFailure:!1});"true"===process.env.GOOGLE_CLASSROOM_DEV_MODE&&i&&(u.refreshHandler=function(){return s(c,void 0,void 0,function(){return a(this,function(t){return[2,{access_token:i,expiry_date:(new Date).getTime()+36e5}]})})}),(i||o)&&u.setCredentials({access_token:i,refresh_token:o}),this.client=u,this.clientId=t}return t.prototype.getAuthenticateUrl=function(t,e){void 0===e&&(e=!1);try{return this.client.generateAuthUrl({access_type:"offline",include_granted_scopes:!0,scope:["https://www.googleapis.com/auth/userinfo.profile","https://www.googleapis.com/auth/userinfo.email","https://www.googleapis.com/auth/classroom.courses.readonly","https://www.googleapis.com/auth/classroom.addons.student","https://www.googleapis.com/auth/classroom.addons.teacher"],loginHint:t,subscribeToNewsletter:e})}catch(t){return console.error(t),null}},t.prototype.exchangeCodeForTokens=function(t){return s(this,void 0,void 0,function(){var e,r,n,i;return a(this,function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,this.client.getToken(t)];case 1:return e=o.sent().tokens,[4,this.client.verifyIdToken({idToken:e.id_token,audience:this.clientId})];case 2:if(r=o.sent(),n=r.getPayload(),!e.access_token)throw new Error("Access token is missing");if(!(null==n?void 0:n.sub))throw new Error("User sub is missing");return[2,{accessToken:e.access_token,loginHint:n.sub,refreshToken:e.refresh_token,profilePictureUrl:null==n?void 0:n.picture,email:n.email}];case 3:return i=o.sent(),console.error(i),[2,null];case 4:return[2]}})})},t.prototype.refreshAccessToken=function(t){return s(this,void 0,void 0,function(){var e,r;return a(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),this.client.setCredentials({refresh_token:t}),[4,this.client.getAccessToken()];case 1:if(!(e=n.sent()).token)throw new Error("Unable to refresh access token");return[2,e.token];case 2:return r=n.sent(),console.error(r),[2,null];case 3:return[2]}})})},t.prototype.isAuthenticated=function(t){return s(this,void 0,void 0,function(){var e,r;return a(this,function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),[4,this.client.getTokenInfo(t)];case 1:return e=n.sent(),e.expiry_date<Date.now()?[2,!0]:[2,!1];case 2:return r=n.sent(),console.error(r),[2,!1];case 3:return[2]}})})},t.prototype.getOAuth2Client=function(){return s(this,void 0,void 0,function(){return a(this,function(t){return[2,this.client]})})},t}(),L=function(){function t(t,e,r,n,i,o,s){this.encryptionSecret=t,this.firestore=e,this.googleOAuthClientId=r,this.googleOAuthClientSecret=n,this.googleOAuthCallbackApiRoute=i,this.sessionSecret=o,this.baseUrl=s,this.encryptionService=new D(t),this.firestoreClient=new $(e),this._googleOAuthClientId=r,this._googleOAuthClientSecret=n,this._googleOAuthCallbackApiRoute=i,this._sessionSecret=o}return t.prototype.getOAuthClient=function(t,e){return new M(this._googleOAuthClientId,this._googleOAuthClientSecret,this._googleOAuthCallbackApiRoute,t,e)},t.prototype.getGoogleSignInUrl=function(t){return s(this,arguments,void 0,function(t,e){var r,n;return void 0===e&&(e=!1),a(this,function(i){if(r=this.getOAuthClient(),!(n=r.getAuthenticateUrl(t,e)))throw new Error("Failed to get Google Authentication URL");return[2,n]})})},t.prototype.handleGoogleSignInCallback=function(t,e){return s(this,void 0,void 0,function(){var r,n,i,o;return a(this,function(s){switch(s.label){case 0:return[4,this.getOAuthClient().exchangeCodeForTokens(t)];case 1:if(!(r=s.sent()))throw new Error("Failed to authenticate Google sign-in");return n=r.refreshToken?this.encryptionService.encryptString(r.refreshToken):void 0,i=r.profilePictureUrl?this.encryptionService.encryptString(r.profilePictureUrl):void 0,[4,this.firestoreClient.upsertConnectedUserCredentials({refreshToken:n,profilePictureUrl:i,loginHint:r.loginHint})];case 2:return s.sent(),[4,P({loginHint:r.loginHint,accessToken:r.accessToken},{password:this._sessionSecret})];case 3:return o=s.sent(),e&&r.email?[4,e(r.email)]:[3,5];case 4:s.sent(),s.label=5;case 5:return[2,{encryptedSession:o,profilePictureUrl:r.profilePictureUrl}]}})})},t.prototype.verifyAuthSession=function(t){return s(this,void 0,void 0,function(){var e,r,n,i;return a(this,function(o){switch(o.label){case 0:return[4,B(t,{password:this._sessionSecret})];case 1:return(null==(e=o.sent())?void 0:e.accessToken)&&(null==e?void 0:e.loginHint)?[4,this.firestoreClient.getConnectedUserCredentials(e.loginHint)]:[2,null];case 2:return(r=o.sent())?[4,(n=this.getOAuthClient(e.accessToken,r.refreshToken)).isAuthenticated(e.accessToken)]:[2,null];case 3:return o.sent()?[2,t]:[4,n.refreshAccessToken(r.refreshToken)];case 4:return(i=o.sent())?[4,P({loginHint:e.loginHint,accessToken:i},{password:this._sessionSecret})]:[3,6];case 5:return[2,o.sent()];case 6:return[2,null]}})})},t.prototype.createAttachment=function(t,e,r){return s(this,void 0,void 0,function(){var n,i,s;return a(this,function(a){switch(a.label){case 0:return n=this.getOAuthClient(e,r),[4,new H(this.baseUrl,n).createAnnouncementAttachment(t)];case 1:return i=a.sent(),s=o(o({},i),{attachmentId:i.id||"",createdAt:(new Date).toISOString()}),[4,this.firestoreClient.upsertClassroomAttachment(s)];case 2:return a.sent(),[4,this.firestoreClient.getClassroomAttachmentById(i.id)];case 3:return[2,a.sent()]}})})},t}();exports.OakGoogleClassroomAddOn=L;
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../node_modules/tslib/tslib.es6.js","../../../node_modules/cookie/index.js","../../../node_modules/iron-webcrypto/dist/index.js","../../../node_modules/uncrypto/dist/crypto.web.mjs","../../../node_modules/iron-session/dist/index.js","../../../src/services/FirestoreClient/FirestoreClient.ts","../../../src/services/Encryption/EncryptionService.ts","../../../src/services/GoogleOAuth/GoogleOAuthClient.ts","../../../src/services/OakGoogleClassroom.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module exports.\n * @public\n */\n\nexports.parse = parse;\nexports.serialize = serialize;\n\n/**\n * Module variables.\n * @private\n */\n\nvar __toString = Object.prototype.toString\nvar __hasOwnProperty = Object.prototype.hasOwnProperty\n\n/**\n * RegExp to match cookie-name in RFC 6265 sec 4.1.1\n * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2\n * which has been replaced by the token definition in RFC 7230 appendix B.\n *\n * cookie-name = token\n * token = 1*tchar\n * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" /\n * \"*\" / \"+\" / \"-\" / \".\" / \"^\" / \"_\" /\n * \"`\" / \"|\" / \"~\" / DIGIT / ALPHA\n */\n\nvar cookieNameRegExp = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n/**\n * RegExp to match cookie-value in RFC 6265 sec 4.1.1\n *\n * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n * ; US-ASCII characters excluding CTLs,\n * ; whitespace DQUOTE, comma, semicolon,\n * ; and backslash\n */\n\nvar cookieValueRegExp = /^(\"?)[\\u0021\\u0023-\\u002B\\u002D-\\u003A\\u003C-\\u005B\\u005D-\\u007E]*\\1$/;\n\n/**\n * RegExp to match domain-value in RFC 6265 sec 4.1.1\n *\n * domain-value = <subdomain>\n * ; defined in [RFC1034], Section 3.5, as\n * ; enhanced by [RFC1123], Section 2.1\n * <subdomain> = <label> | <subdomain> \".\" <label>\n * <label> = <let-dig> [ [ <ldh-str> ] <let-dig> ]\n * Labels must be 63 characters or less.\n * 'let-dig' not 'letter' in the first char, per RFC1123\n * <ldh-str> = <let-dig-hyp> | <let-dig-hyp> <ldh-str>\n * <let-dig-hyp> = <let-dig> | \"-\"\n * <let-dig> = <letter> | <digit>\n * <letter> = any one of the 52 alphabetic characters A through Z in\n * upper case and a through z in lower case\n * <digit> = any one of the ten digits 0 through 9\n *\n * Keep support for leading dot: https://github.com/jshttp/cookie/issues/173\n *\n * > (Note that a leading %x2E (\".\"), if present, is ignored even though that\n * character is not permitted, but a trailing %x2E (\".\"), if present, will\n * cause the user agent to ignore the attribute.)\n */\n\nvar domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;\n\n/**\n * RegExp to match path-value in RFC 6265 sec 4.1.1\n *\n * path-value = <any CHAR except CTLs or \";\">\n * CHAR = %x01-7F\n * ; defined in RFC 5234 appendix B.1\n */\n\nvar pathValueRegExp = /^[\\u0020-\\u003A\\u003D-\\u007E]*$/;\n\n/**\n * Parse a cookie header.\n *\n * Parse the given cookie header string into an object\n * The object has the various cookies as keys(names) => values\n *\n * @param {string} str\n * @param {object} [opt]\n * @return {object}\n * @public\n */\n\nfunction parse(str, opt) {\n if (typeof str !== 'string') {\n throw new TypeError('argument str must be a string');\n }\n\n var obj = {};\n var len = str.length;\n // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='.\n if (len < 2) return obj;\n\n var dec = (opt && opt.decode) || decode;\n var index = 0;\n var eqIdx = 0;\n var endIdx = 0;\n\n do {\n eqIdx = str.indexOf('=', index);\n if (eqIdx === -1) break; // No more cookie pairs.\n\n endIdx = str.indexOf(';', index);\n\n if (endIdx === -1) {\n endIdx = len;\n } else if (eqIdx > endIdx) {\n // backtrack on prior semicolon\n index = str.lastIndexOf(';', eqIdx - 1) + 1;\n continue;\n }\n\n var keyStartIdx = startIndex(str, index, eqIdx);\n var keyEndIdx = endIndex(str, eqIdx, keyStartIdx);\n var key = str.slice(keyStartIdx, keyEndIdx);\n\n // only assign once\n if (!__hasOwnProperty.call(obj, key)) {\n var valStartIdx = startIndex(str, eqIdx + 1, endIdx);\n var valEndIdx = endIndex(str, endIdx, valStartIdx);\n\n if (str.charCodeAt(valStartIdx) === 0x22 /* \" */ && str.charCodeAt(valEndIdx - 1) === 0x22 /* \" */) {\n valStartIdx++;\n valEndIdx--;\n }\n\n var val = str.slice(valStartIdx, valEndIdx);\n obj[key] = tryDecode(val, dec);\n }\n\n index = endIdx + 1\n } while (index < len);\n\n return obj;\n}\n\nfunction startIndex(str, index, max) {\n do {\n var code = str.charCodeAt(index);\n if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index;\n } while (++index < max);\n return max;\n}\n\nfunction endIndex(str, index, min) {\n while (index > min) {\n var code = str.charCodeAt(--index);\n if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index + 1;\n }\n return min;\n}\n\n/**\n * Serialize data into a cookie header.\n *\n * Serialize a name value pair into a cookie string suitable for\n * http headers. An optional options object specifies cookie parameters.\n *\n * serialize('foo', 'bar', { httpOnly: true })\n * => \"foo=bar; httpOnly\"\n *\n * @param {string} name\n * @param {string} val\n * @param {object} [opt]\n * @return {string}\n * @public\n */\n\nfunction serialize(name, val, opt) {\n var enc = (opt && opt.encode) || encodeURIComponent;\n\n if (typeof enc !== 'function') {\n throw new TypeError('option encode is invalid');\n }\n\n if (!cookieNameRegExp.test(name)) {\n throw new TypeError('argument name is invalid');\n }\n\n var value = enc(val);\n\n if (!cookieValueRegExp.test(value)) {\n throw new TypeError('argument val is invalid');\n }\n\n var str = name + '=' + value;\n if (!opt) return str;\n\n if (null != opt.maxAge) {\n var maxAge = Math.floor(opt.maxAge);\n\n if (!isFinite(maxAge)) {\n throw new TypeError('option maxAge is invalid')\n }\n\n str += '; Max-Age=' + maxAge;\n }\n\n if (opt.domain) {\n if (!domainValueRegExp.test(opt.domain)) {\n throw new TypeError('option domain is invalid');\n }\n\n str += '; Domain=' + opt.domain;\n }\n\n if (opt.path) {\n if (!pathValueRegExp.test(opt.path)) {\n throw new TypeError('option path is invalid');\n }\n\n str += '; Path=' + opt.path;\n }\n\n if (opt.expires) {\n var expires = opt.expires\n\n if (!isDate(expires) || isNaN(expires.valueOf())) {\n throw new TypeError('option expires is invalid');\n }\n\n str += '; Expires=' + expires.toUTCString()\n }\n\n if (opt.httpOnly) {\n str += '; HttpOnly';\n }\n\n if (opt.secure) {\n str += '; Secure';\n }\n\n if (opt.partitioned) {\n str += '; Partitioned'\n }\n\n if (opt.priority) {\n var priority = typeof opt.priority === 'string'\n ? opt.priority.toLowerCase() : opt.priority;\n\n switch (priority) {\n case 'low':\n str += '; Priority=Low'\n break\n case 'medium':\n str += '; Priority=Medium'\n break\n case 'high':\n str += '; Priority=High'\n break\n default:\n throw new TypeError('option priority is invalid')\n }\n }\n\n if (opt.sameSite) {\n var sameSite = typeof opt.sameSite === 'string'\n ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n switch (sameSite) {\n case true:\n str += '; SameSite=Strict';\n break;\n case 'lax':\n str += '; SameSite=Lax';\n break;\n case 'strict':\n str += '; SameSite=Strict';\n break;\n case 'none':\n str += '; SameSite=None';\n break;\n default:\n throw new TypeError('option sameSite is invalid');\n }\n }\n\n return str;\n}\n\n/**\n * URL-decode string value. Optimized to skip native call when no %.\n *\n * @param {string} str\n * @returns {string}\n */\n\nfunction decode (str) {\n return str.indexOf('%') !== -1\n ? decodeURIComponent(str)\n : str\n}\n\n/**\n * Determine if value is a Date.\n *\n * @param {*} val\n * @private\n */\n\nfunction isDate (val) {\n return __toString.call(val) === '[object Date]';\n}\n\n/**\n * Try decoding a string using a decoding function.\n *\n * @param {string} str\n * @param {function} decode\n * @private\n */\n\nfunction tryDecode(str, decode) {\n try {\n return decode(str);\n } catch (e) {\n return str;\n }\n}\n","// src/utils.ts\nvar alphabetByEncoding = {};\nvar alphabetByValue = Array.from({ length: 64 });\nfor (let i = 0, start = \"A\".charCodeAt(0), limit = \"Z\".charCodeAt(0); i + start <= limit; i++) {\n const char = String.fromCharCode(i + start);\n alphabetByEncoding[char] = i;\n alphabetByValue[i] = char;\n}\nfor (let i = 0, start = \"a\".charCodeAt(0), limit = \"z\".charCodeAt(0); i + start <= limit; i++) {\n const char = String.fromCharCode(i + start);\n const index = i + 26;\n alphabetByEncoding[char] = index;\n alphabetByValue[index] = char;\n}\nfor (let i = 0; i < 10; i++) {\n alphabetByEncoding[i.toString(10)] = i + 52;\n const char = i.toString(10);\n const index = i + 52;\n alphabetByEncoding[char] = index;\n alphabetByValue[index] = char;\n}\nalphabetByEncoding[\"-\"] = 62;\nalphabetByValue[62] = \"-\";\nalphabetByEncoding[\"_\"] = 63;\nalphabetByValue[63] = \"_\";\nvar bitsPerLetter = 6;\nvar bitsPerByte = 8;\nvar maxLetterValue = 63;\nvar stringToBuffer = (value) => {\n return new TextEncoder().encode(value);\n};\nvar bufferToString = (value) => {\n return new TextDecoder().decode(value);\n};\nvar base64urlDecode = (_input) => {\n const input = _input + \"=\".repeat((4 - _input.length % 4) % 4);\n let totalByteLength = input.length / 4 * 3;\n if (input.endsWith(\"==\")) {\n totalByteLength -= 2;\n } else if (input.endsWith(\"=\")) {\n totalByteLength--;\n }\n const out = new ArrayBuffer(totalByteLength);\n const dataView = new DataView(out);\n for (let i = 0; i < input.length; i += 4) {\n let bits = 0;\n let bitLength = 0;\n for (let j = i, limit = i + 3; j <= limit; j++) {\n if (input[j] === \"=\") {\n bits >>= bitsPerLetter;\n } else {\n if (!(input[j] in alphabetByEncoding)) {\n throw new TypeError(`Invalid character ${input[j]} in base64 string.`);\n }\n bits |= alphabetByEncoding[input[j]] << (limit - j) * bitsPerLetter;\n bitLength += bitsPerLetter;\n }\n }\n const chunkOffset = i / 4 * 3;\n bits >>= bitLength % bitsPerByte;\n const byteLength = Math.floor(bitLength / bitsPerByte);\n for (let k = 0; k < byteLength; k++) {\n const offset = (byteLength - k - 1) * bitsPerByte;\n dataView.setUint8(chunkOffset + k, (bits & 255 << offset) >> offset);\n }\n }\n return new Uint8Array(out);\n};\nvar base64urlEncode = (_input) => {\n const input = typeof _input === \"string\" ? stringToBuffer(_input) : _input;\n let str = \"\";\n for (let i = 0; i < input.length; i += 3) {\n let bits = 0;\n let bitLength = 0;\n for (let j = i, limit = Math.min(i + 3, input.length); j < limit; j++) {\n bits |= input[j] << (limit - j - 1) * bitsPerByte;\n bitLength += bitsPerByte;\n }\n const bitClusterCount = Math.ceil(bitLength / bitsPerLetter);\n bits <<= bitClusterCount * bitsPerLetter - bitLength;\n for (let k = 1; k <= bitClusterCount; k++) {\n const offset = (bitClusterCount - k) * bitsPerLetter;\n str += alphabetByValue[(bits & maxLetterValue << offset) >> offset];\n }\n }\n return str;\n};\n\n// src/index.ts\nvar defaults = {\n encryption: { saltBits: 256, algorithm: \"aes-256-cbc\", iterations: 1, minPasswordlength: 32 },\n integrity: { saltBits: 256, algorithm: \"sha256\", iterations: 1, minPasswordlength: 32 },\n ttl: 0,\n timestampSkewSec: 60,\n localtimeOffsetMsec: 0\n};\nvar clone = (options) => ({\n ...options,\n encryption: { ...options.encryption },\n integrity: { ...options.integrity }\n});\nvar algorithms = {\n \"aes-128-ctr\": { keyBits: 128, ivBits: 128, name: \"AES-CTR\" },\n \"aes-256-cbc\": { keyBits: 256, ivBits: 128, name: \"AES-CBC\" },\n sha256: { keyBits: 256, name: \"SHA-256\" }\n};\nvar macFormatVersion = \"2\";\nvar macPrefix = \"Fe26.2\";\nvar randomBytes = (_crypto, size) => {\n const bytes = new Uint8Array(size);\n _crypto.getRandomValues(bytes);\n return bytes;\n};\nvar randomBits = (_crypto, bits) => {\n if (bits < 1)\n throw new Error(\"Invalid random bits count\");\n const bytes = Math.ceil(bits / 8);\n return randomBytes(_crypto, bytes);\n};\nvar pbkdf2 = async (_crypto, password, salt, iterations, keyLength, hash) => {\n const passwordBuffer = stringToBuffer(password);\n const importedKey = await _crypto.subtle.importKey(\n \"raw\",\n passwordBuffer,\n { name: \"PBKDF2\" },\n false,\n [\"deriveBits\"]\n );\n const saltBuffer = stringToBuffer(salt);\n const params = { name: \"PBKDF2\", hash, salt: saltBuffer, iterations };\n const derivation = await _crypto.subtle.deriveBits(params, importedKey, keyLength * 8);\n return derivation;\n};\nvar generateKey = async (_crypto, password, options) => {\n var _a;\n if (!(password == null ? void 0 : password.length))\n throw new Error(\"Empty password\");\n if (options == null || typeof options !== \"object\")\n throw new Error(\"Bad options\");\n if (!(options.algorithm in algorithms))\n throw new Error(`Unknown algorithm: ${options.algorithm}`);\n const algorithm = algorithms[options.algorithm];\n const result = {};\n const hmac = (_a = options.hmac) != null ? _a : false;\n const id = hmac ? { name: \"HMAC\", hash: algorithm.name } : { name: algorithm.name };\n const usage = hmac ? [\"sign\", \"verify\"] : [\"encrypt\", \"decrypt\"];\n if (typeof password === \"string\") {\n if (password.length < options.minPasswordlength)\n throw new Error(\n `Password string too short (min ${options.minPasswordlength} characters required)`\n );\n let { salt = \"\" } = options;\n if (!salt) {\n const { saltBits = 0 } = options;\n if (!saltBits)\n throw new Error(\"Missing salt and saltBits options\");\n const randomSalt = randomBits(_crypto, saltBits);\n salt = [...new Uint8Array(randomSalt)].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n }\n const derivedKey = await pbkdf2(\n _crypto,\n password,\n salt,\n options.iterations,\n algorithm.keyBits / 8,\n \"SHA-1\"\n );\n const importedEncryptionKey = await _crypto.subtle.importKey(\n \"raw\",\n derivedKey,\n id,\n false,\n usage\n );\n result.key = importedEncryptionKey;\n result.salt = salt;\n } else {\n if (password.length < algorithm.keyBits / 8)\n throw new Error(\"Key buffer (password) too small\");\n result.key = await _crypto.subtle.importKey(\"raw\", password, id, false, usage);\n result.salt = \"\";\n }\n if (options.iv)\n result.iv = options.iv;\n else if (\"ivBits\" in algorithm)\n result.iv = randomBits(_crypto, algorithm.ivBits);\n return result;\n};\nvar getEncryptParams = (algorithm, key, data) => {\n return [\n algorithm === \"aes-128-ctr\" ? { name: \"AES-CTR\", counter: key.iv, length: 128 } : { name: \"AES-CBC\", iv: key.iv },\n key.key,\n typeof data === \"string\" ? stringToBuffer(data) : data\n ];\n};\nvar encrypt = async (_crypto, password, options, data) => {\n const key = await generateKey(_crypto, password, options);\n const encrypted = await _crypto.subtle.encrypt(...getEncryptParams(options.algorithm, key, data));\n return { encrypted: new Uint8Array(encrypted), key };\n};\nvar decrypt = async (_crypto, password, options, data) => {\n const key = await generateKey(_crypto, password, options);\n const decrypted = await _crypto.subtle.decrypt(...getEncryptParams(options.algorithm, key, data));\n return bufferToString(new Uint8Array(decrypted));\n};\nvar hmacWithPassword = async (_crypto, password, options, data) => {\n const key = await generateKey(_crypto, password, { ...options, hmac: true });\n const textBuffer = stringToBuffer(data);\n const signed = await _crypto.subtle.sign({ name: \"HMAC\" }, key.key, textBuffer);\n const digest = base64urlEncode(new Uint8Array(signed));\n return { digest, salt: key.salt };\n};\nvar normalizePassword = (password) => {\n if (typeof password === \"string\" || password instanceof Uint8Array)\n return { encryption: password, integrity: password };\n if (\"secret\" in password)\n return { id: password.id, encryption: password.secret, integrity: password.secret };\n return { id: password.id, encryption: password.encryption, integrity: password.integrity };\n};\nvar seal = async (_crypto, object, password, options) => {\n if (!password)\n throw new Error(\"Empty password\");\n const opts = clone(options);\n const now = Date.now() + (opts.localtimeOffsetMsec || 0);\n const objectString = JSON.stringify(object);\n const pass = normalizePassword(password);\n const { id = \"\", encryption, integrity } = pass;\n if (id && !/^\\w+$/.test(id))\n throw new Error(\"Invalid password id\");\n const { encrypted, key } = await encrypt(_crypto, encryption, opts.encryption, objectString);\n const encryptedB64 = base64urlEncode(new Uint8Array(encrypted));\n const iv = base64urlEncode(key.iv);\n const expiration = opts.ttl ? now + opts.ttl : \"\";\n const macBaseString = `${macPrefix}*${id}*${key.salt}*${iv}*${encryptedB64}*${expiration}`;\n const mac = await hmacWithPassword(_crypto, integrity, opts.integrity, macBaseString);\n const sealed = `${macBaseString}*${mac.salt}*${mac.digest}`;\n return sealed;\n};\nvar fixedTimeComparison = (a, b) => {\n let mismatch = a.length === b.length ? 0 : 1;\n if (mismatch)\n b = a;\n for (let i = 0; i < a.length; i += 1)\n mismatch |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return mismatch === 0;\n};\nvar unseal = async (_crypto, sealed, password, options) => {\n if (!password)\n throw new Error(\"Empty password\");\n const opts = clone(options);\n const now = Date.now() + (opts.localtimeOffsetMsec || 0);\n const parts = sealed.split(\"*\");\n if (parts.length !== 8)\n throw new Error(\"Incorrect number of sealed components\");\n const prefix = parts[0];\n let passwordId = parts[1];\n const encryptionSalt = parts[2];\n const encryptionIv = parts[3];\n const encryptedB64 = parts[4];\n const expiration = parts[5];\n const hmacSalt = parts[6];\n const hmac = parts[7];\n const macBaseString = `${prefix}*${passwordId}*${encryptionSalt}*${encryptionIv}*${encryptedB64}*${expiration}`;\n if (macPrefix !== prefix)\n throw new Error(\"Wrong mac prefix\");\n if (expiration) {\n if (!/^\\d+$/.test(expiration))\n throw new Error(\"Invalid expiration\");\n const exp = Number.parseInt(expiration, 10);\n if (exp <= now - opts.timestampSkewSec * 1e3)\n throw new Error(\"Expired seal\");\n }\n let pass = \"\";\n passwordId = passwordId || \"default\";\n if (typeof password === \"string\" || password instanceof Uint8Array)\n pass = password;\n else if (passwordId in password) {\n pass = password[passwordId];\n } else {\n throw new Error(`Cannot find password: ${passwordId}`);\n }\n pass = normalizePassword(pass);\n const macOptions = opts.integrity;\n macOptions.salt = hmacSalt;\n const mac = await hmacWithPassword(_crypto, pass.integrity, macOptions, macBaseString);\n if (!fixedTimeComparison(mac.digest, hmac))\n throw new Error(\"Bad hmac value\");\n const encrypted = base64urlDecode(encryptedB64);\n const decryptOptions = opts.encryption;\n decryptOptions.salt = encryptionSalt;\n decryptOptions.iv = base64urlDecode(encryptionIv);\n const decrypted = await decrypt(_crypto, pass.encryption, decryptOptions, encrypted);\n if (decrypted)\n return JSON.parse(decrypted);\n return null;\n};\n\nexport { algorithms, base64urlDecode, base64urlEncode, bufferToString, clone, decrypt, defaults, encrypt, generateKey, hmacWithPassword, macFormatVersion, macPrefix, randomBits, seal, stringToBuffer, unseal };\n","const webCrypto = globalThis.crypto;\nconst subtle = webCrypto.subtle;\nconst randomUUID = () => {\n return webCrypto.randomUUID();\n};\nconst getRandomValues = (array) => {\n return webCrypto.getRandomValues(array);\n};\nconst _crypto = {\n randomUUID,\n getRandomValues,\n subtle\n};\n\nexport { _crypto as default, getRandomValues, randomUUID, subtle };\n","import { serialize, parse } from 'cookie';\nimport { seal, defaults, unseal } from 'iron-webcrypto';\nimport * as crypto from 'uncrypto';\n\n// src/core.ts\nvar timestampSkewSec = 60;\nvar fourteenDaysInSeconds = 14 * 24 * 3600;\nvar currentMajorVersion = 2;\nvar versionDelimiter = \"~\";\nvar defaultOptions = {\n ttl: fourteenDaysInSeconds,\n cookieOptions: { httpOnly: true, secure: true, sameSite: \"lax\", path: \"/\" }\n};\nfunction normalizeStringPasswordToMap(password) {\n return typeof password === \"string\" ? { 1: password } : password;\n}\nfunction parseSeal(seal) {\n const [sealWithoutVersion, tokenVersionAsString] = seal.split(versionDelimiter);\n const tokenVersion = tokenVersionAsString == null ? null : parseInt(tokenVersionAsString, 10);\n return { sealWithoutVersion, tokenVersion };\n}\nfunction computeCookieMaxAge(ttl) {\n if (ttl === 0) {\n return 2147483647;\n }\n return ttl - timestampSkewSec;\n}\nfunction getCookie(req, cookieName) {\n return parse(\n (\"headers\" in req && typeof req.headers.get === \"function\" ? req.headers.get(\"cookie\") : req.headers.cookie) ?? \"\"\n )[cookieName] ?? \"\";\n}\nfunction getServerActionCookie(cookieName, cookieHandler) {\n const cookieObject = cookieHandler.get(cookieName);\n const cookie = cookieObject?.value;\n if (typeof cookie === \"string\") {\n return cookie;\n }\n return \"\";\n}\nfunction setCookie(res, cookieValue) {\n if (\"headers\" in res && typeof res.headers.append === \"function\") {\n res.headers.append(\"set-cookie\", cookieValue);\n return;\n }\n let existingSetCookie = res.getHeader(\"set-cookie\") ?? [];\n if (!Array.isArray(existingSetCookie)) {\n existingSetCookie = [existingSetCookie.toString()];\n }\n res.setHeader(\"set-cookie\", [\n ...existingSetCookie,\n cookieValue\n ]);\n}\nfunction createSealData(_crypto) {\n return async function sealData2(data, {\n password,\n ttl = fourteenDaysInSeconds\n }) {\n const passwordsMap = normalizeStringPasswordToMap(password);\n const mostRecentPasswordId = Math.max(\n ...Object.keys(passwordsMap).map(Number)\n );\n const passwordForSeal = {\n id: mostRecentPasswordId.toString(),\n secret: passwordsMap[mostRecentPasswordId]\n };\n const seal$1 = await seal(_crypto, data, passwordForSeal, {\n ...defaults,\n ttl: ttl * 1e3\n });\n return `${seal$1}${versionDelimiter}${currentMajorVersion}`;\n };\n}\nfunction createUnsealData(_crypto) {\n return async function unsealData2(seal, {\n password,\n ttl = fourteenDaysInSeconds\n }) {\n const passwordsMap = normalizeStringPasswordToMap(password);\n const { sealWithoutVersion, tokenVersion } = parseSeal(seal);\n try {\n const data = await unseal(_crypto, sealWithoutVersion, passwordsMap, {\n ...defaults,\n ttl: ttl * 1e3\n }) ?? {};\n if (tokenVersion === 2) {\n return data;\n }\n return { ...data.persistent };\n } catch (error) {\n if (error instanceof Error && /^(Expired seal|Bad hmac value|Cannot find password|Incorrect number of sealed components)/.test(\n error.message\n )) {\n return {};\n }\n throw error;\n }\n };\n}\nfunction getSessionConfig(sessionOptions) {\n const options = {\n ...defaultOptions,\n ...sessionOptions,\n cookieOptions: {\n ...defaultOptions.cookieOptions,\n ...sessionOptions.cookieOptions || {}\n }\n };\n if (sessionOptions.cookieOptions && \"maxAge\" in sessionOptions.cookieOptions) {\n if (sessionOptions.cookieOptions.maxAge === void 0) {\n options.ttl = 0;\n }\n } else {\n options.cookieOptions.maxAge = computeCookieMaxAge(options.ttl);\n }\n return options;\n}\nvar badUsageMessage = \"iron-session: Bad usage: use getIronSession(req, res, options) or getIronSession(cookieStore, options).\";\nfunction createGetIronSession(sealData2, unsealData2) {\n return getIronSession2;\n async function getIronSession2(reqOrCookieStore, resOrsessionOptions, sessionOptions) {\n if (!reqOrCookieStore) {\n throw new Error(badUsageMessage);\n }\n if (!resOrsessionOptions) {\n throw new Error(badUsageMessage);\n }\n if (!sessionOptions) {\n return getIronSessionFromCookieStore(\n reqOrCookieStore,\n resOrsessionOptions,\n sealData2,\n unsealData2\n );\n }\n const req = reqOrCookieStore;\n const res = resOrsessionOptions;\n if (!sessionOptions) {\n throw new Error(badUsageMessage);\n }\n if (!sessionOptions.cookieName) {\n throw new Error(\"iron-session: Bad usage. Missing cookie name.\");\n }\n if (!sessionOptions.password) {\n throw new Error(\"iron-session: Bad usage. Missing password.\");\n }\n const passwordsMap = normalizeStringPasswordToMap(sessionOptions.password);\n if (Object.values(passwordsMap).some((password) => password.length < 32)) {\n throw new Error(\n \"iron-session: Bad usage. Password must be at least 32 characters long.\"\n );\n }\n let sessionConfig = getSessionConfig(sessionOptions);\n const sealFromCookies = getCookie(req, sessionConfig.cookieName);\n const session = sealFromCookies ? await unsealData2(sealFromCookies, {\n password: passwordsMap,\n ttl: sessionConfig.ttl\n }) : {};\n Object.defineProperties(session, {\n updateConfig: {\n value: function updateConfig(newSessionOptions) {\n sessionConfig = getSessionConfig(newSessionOptions);\n }\n },\n save: {\n value: async function save() {\n if (\"headersSent\" in res && res.headersSent) {\n throw new Error(\n \"iron-session: Cannot set session cookie: session.save() was called after headers were sent. Make sure to call it before any res.send() or res.end()\"\n );\n }\n const seal = await sealData2(session, {\n password: passwordsMap,\n ttl: sessionConfig.ttl\n });\n const cookieValue = serialize(\n sessionConfig.cookieName,\n seal,\n sessionConfig.cookieOptions\n );\n if (cookieValue.length > 4096) {\n throw new Error(\n `iron-session: Cookie length is too big (${cookieValue.length} bytes), browsers will refuse it. Try to remove some data.`\n );\n }\n setCookie(res, cookieValue);\n }\n },\n destroy: {\n value: function destroy() {\n Object.keys(session).forEach((key) => {\n delete session[key];\n });\n const cookieValue = serialize(sessionConfig.cookieName, \"\", {\n ...sessionConfig.cookieOptions,\n maxAge: 0\n });\n setCookie(res, cookieValue);\n }\n }\n });\n return session;\n }\n}\nasync function getIronSessionFromCookieStore(cookieStore, sessionOptions, sealData2, unsealData2) {\n if (!sessionOptions.cookieName) {\n throw new Error(\"iron-session: Bad usage. Missing cookie name.\");\n }\n if (!sessionOptions.password) {\n throw new Error(\"iron-session: Bad usage. Missing password.\");\n }\n const passwordsMap = normalizeStringPasswordToMap(sessionOptions.password);\n if (Object.values(passwordsMap).some((password) => password.length < 32)) {\n throw new Error(\n \"iron-session: Bad usage. Password must be at least 32 characters long.\"\n );\n }\n let sessionConfig = getSessionConfig(sessionOptions);\n const sealFromCookies = getServerActionCookie(\n sessionConfig.cookieName,\n cookieStore\n );\n const session = sealFromCookies ? await unsealData2(sealFromCookies, {\n password: passwordsMap,\n ttl: sessionConfig.ttl\n }) : {};\n Object.defineProperties(session, {\n updateConfig: {\n value: function updateConfig(newSessionOptions) {\n sessionConfig = getSessionConfig(newSessionOptions);\n }\n },\n save: {\n value: async function save() {\n const seal = await sealData2(session, {\n password: passwordsMap,\n ttl: sessionConfig.ttl\n });\n const cookieLength = sessionConfig.cookieName.length + seal.length + JSON.stringify(sessionConfig.cookieOptions).length;\n if (cookieLength > 4096) {\n throw new Error(\n `iron-session: Cookie length is too big (${cookieLength} bytes), browsers will refuse it. Try to remove some data.`\n );\n }\n cookieStore.set(\n sessionConfig.cookieName,\n seal,\n sessionConfig.cookieOptions\n );\n }\n },\n destroy: {\n value: function destroy() {\n Object.keys(session).forEach((key) => {\n delete session[key];\n });\n const cookieOptions = { ...sessionConfig.cookieOptions, maxAge: 0 };\n cookieStore.set(sessionConfig.cookieName, \"\", cookieOptions);\n }\n }\n });\n return session;\n}\nvar sealData = createSealData(crypto);\nvar unsealData = createUnsealData(crypto);\nvar getIronSession = createGetIronSession(sealData, unsealData);\n\nexport { getIronSession, sealData, unsealData };\n//# sourceMappingURL=index.js.map\n//# sourceMappingURL=index.js.map","import type { Firestore } from \"@google-cloud/firestore\";\n\nexport type UserCredentialsEntity = {\n loginHint: string;\n refreshToken: string;\n profilePictureUrl?: string;\n};\n\nenum FirestoreCollections {\n CONNECTED_USERS_CREDENTIALS = \"connectedUsersCredentials\",\n}\n\nexport class FirestoreClient {\n private _firestore: Firestore;\n\n constructor(private readonly firestore: Firestore) {\n this._firestore = firestore;\n }\n\n public async getConnectedUserCredentials(\n loginHint: string,\n ): Promise<UserCredentialsEntity | null> {\n try {\n const doc = await this._firestore\n .collection(FirestoreCollections.CONNECTED_USERS_CREDENTIALS)\n .doc(loginHint)\n .get();\n // todo: zod schema validation\n return doc as unknown as UserCredentialsEntity; // can remove cast with zod\n } catch (error) {\n console.error(error);\n throw new Error(\"Failed to save users credentials\");\n }\n }\n\n public async upsertConnectedUserCredentials(\n credentials: Omit<UserCredentialsEntity, \"refreshToken\"> & {\n refreshToken?: string;\n },\n ): Promise<void> {\n try {\n // todo: zod schema validation\n this._firestore.settings({ ignoreUndefinedProperties: true });\n await this._firestore\n .collection(FirestoreCollections.CONNECTED_USERS_CREDENTIALS)\n .doc(credentials.loginHint)\n .set(credentials);\n } catch (error) {\n console.error(error);\n throw new Error(\"Failed to upsert users credentials\");\n }\n }\n}\n","import crypto from \"crypto\";\n\nexport class EncryptionService {\n private static ALGORITHM = \"aes-256-cbc\";\n private static IV_LENGTH = 16; // For AES, this is always 16\n private static SALT_BYTES = 16;\n private static ENCRYPTION_KEY_LENGTH = 32;\n private ENCRYPTION_SECRET: string;\n\n constructor(private readonly encryptionSecret: string) {\n this.ENCRYPTION_SECRET = encryptionSecret;\n }\n\n public encryptString(value: string): string {\n const salt = crypto\n .randomBytes(EncryptionService.SALT_BYTES)\n .toString(\"hex\");\n const iv = crypto.randomBytes(EncryptionService.IV_LENGTH);\n const encryptionKey = crypto.scryptSync(\n this.ENCRYPTION_SECRET,\n salt,\n EncryptionService.ENCRYPTION_KEY_LENGTH,\n );\n const cipher = crypto.createCipheriv(\n EncryptionService.ALGORITHM,\n encryptionKey,\n iv,\n );\n let encrypted = cipher.update(value, \"utf8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n return `${iv.toString(\"hex\")}:${encrypted}:${salt}`;\n }\n\n public decryptString(value: string): string {\n const [ivHex, encryptedText, salt] = value.split(\":\");\n if (!ivHex || !encryptedText || !salt)\n throw new Error(`Invalid encrypted string`);\n\n const iv = Buffer.from(ivHex, \"hex\");\n const encryptionKey = crypto.scryptSync(\n this.ENCRYPTION_SECRET,\n salt,\n EncryptionService.ENCRYPTION_KEY_LENGTH,\n );\n\n const decipher = crypto.createDecipheriv(\n EncryptionService.ALGORITHM,\n encryptionKey,\n iv,\n );\n\n let decrypted = decipher.update(encryptedText, \"hex\", \"utf8\");\n decrypted += decipher.final(\"utf8\");\n\n return decrypted;\n }\n}\n","import { LoginTicket, OAuth2Client, TokenPayload } from \"google-auth-library\";\nimport { AccessTokenResponse } from \"google-auth-library/build/src/auth/oauth2client\";\n\nexport type GoogleOAuthUser = {\n accessToken: string;\n loginHint: string;\n refreshToken?: string;\n profilePictureUrl?: string;\n email?: string;\n};\n\nexport class GoogleOAuthClient {\n private client: OAuth2Client;\n private clientId: string;\n\n constructor(\n private readonly googleClientId: string,\n private readonly googleClientSecret: string,\n private readonly callbackUrl: string,\n private readonly accessToken?: string,\n private readonly refreshToken?: string,\n ) {\n if (!googleClientId) throw new Error(\"Google Client ID is missing\");\n if (!googleClientSecret) throw new Error(\"Google Client Secret is missing\");\n if (!callbackUrl) throw new Error(\"Google OAuth Callback URL is missing\");\n const client = new OAuth2Client({\n clientId: googleClientId,\n clientSecret: googleClientSecret,\n redirectUri: callbackUrl,\n forceRefreshOnFailure: false,\n });\n\n if (process.env.GOOGLE_CLASSROOM_DEV_MODE === \"true\" && accessToken) {\n client.refreshHandler = async (): Promise<AccessTokenResponse> => ({\n access_token: accessToken,\n expiry_date: new Date().getTime() + 1000 * 60 * 60, // now + 1 hour,\n });\n }\n\n if (accessToken || refreshToken)\n client.setCredentials({\n access_token: accessToken,\n refresh_token: refreshToken,\n });\n this.client = client;\n this.clientId = googleClientId;\n }\n\n /**\n * Returns the URL that the user should be redirected to in order to connect their Google account\n */\n public getAuthenticateUrl(\n loginHint?: string,\n subscribeToNewsletter: boolean = false,\n ): string | null {\n try {\n const scope: string[] = [\n \"https://www.googleapis.com/auth/userinfo.profile\",\n \"https://www.googleapis.com/auth/userinfo.email\",\n \"https://www.googleapis.com/auth/classroom.courses.readonly\",\n \"https://www.googleapis.com/auth/classroom.addons.student\",\n \"https://www.googleapis.com/auth/classroom.addons.teacher\",\n ];\n\n return this.client.generateAuthUrl({\n access_type: \"offline\",\n include_granted_scopes: true,\n scope,\n loginHint,\n subscribeToNewsletter,\n });\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n /**\n * Returns user info and auth tokens by exchanging a Google OAuth\n * @param code - Code supplied by Google from OAuth callback redirection\n */\n public async exchangeCodeForTokens(\n code: string,\n ): Promise<GoogleOAuthUser | null> {\n try {\n const { tokens } = await this.client.getToken(code);\n\n // Verify the tokens we received.\n const ticket: LoginTicket = await this.client.verifyIdToken({\n idToken: tokens.id_token!,\n audience: this.clientId,\n });\n\n // After verifying the token, we can access the payload.\n const info: TokenPayload | undefined = ticket.getPayload();\n\n // todo: use zod\n if (!tokens.access_token) throw new Error(\"Access token is missing\");\n if (!info?.sub) throw new Error(\"User sub is missing\");\n\n return {\n accessToken: tokens.access_token,\n loginHint: info.sub,\n refreshToken: tokens.refresh_token!, // only received if first time signing in\n profilePictureUrl: info?.picture,\n email: info.email,\n };\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n /**\n * Attempts to generate a new access token from a supplied refresh token and returns it\n * @param refreshToken - A Google OAuth 2.0 refresh token\n */\n public async refreshAccessToken(\n refreshToken: string,\n ): Promise<string | null> {\n try {\n this.client.setCredentials({ refresh_token: refreshToken });\n const accessToken = await this.client.getAccessToken();\n // todo: use zod\n if (!accessToken.token) throw new Error(\"Unable to refresh access token\");\n return accessToken.token;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n /**\n * Checks if the access token attached to the auth client exists and has not expired.\n * (The access token being tested is optionally supplied when the GoogleOAuthClient is constructed)\n */\n public async isAuthenticated(accessToken: string): Promise<boolean> {\n try {\n const tokenInfo = await this.client.getTokenInfo(accessToken);\n const tokenHasExpired = tokenInfo.expiry_date < Date.now();\n if (!tokenHasExpired) return false;\n\n return true;\n } catch (error) {\n console.error(error);\n return false;\n }\n }\n}\n","import type { Firestore } from \"@google-cloud/firestore\";\nimport { sealData, unsealData } from \"iron-session\";\n\nimport { EncryptionService } from \"@/services/Encryption\";\nimport { FirestoreClient } from \"@/services/FirestoreClient\";\nimport { GoogleOAuthClient } from \"@/services/GoogleOAuth\";\n\nexport type OakGoogleSignInCallback = {\n encryptedSession: string;\n profilePictureUrl?: string;\n};\n\ntype EncryptedSession = {\n loginHint: string;\n accessToken: string;\n};\n\nexport class OakGoogleClassroomAddOn {\n private encryptionService: EncryptionService;\n private firestoreClient: FirestoreClient;\n private _googleOAuthClientId: string;\n private _googleOAuthClientSecret: string;\n private _googleOAuthCallbackApiRoute: string;\n private _sessionSecret: string;\n\n constructor(\n private readonly encryptionSecret: string,\n private readonly firestore: Firestore,\n private readonly googleOAuthClientId: string,\n private readonly googleOAuthClientSecret: string,\n private readonly googleOAuthCallbackApiRoute: string,\n private readonly sessionSecret: string,\n ) {\n this.encryptionService = new EncryptionService(encryptionSecret);\n this.firestoreClient = new FirestoreClient(firestore);\n this._googleOAuthClientId = googleOAuthClientId;\n this._googleOAuthClientSecret = googleOAuthClientSecret;\n this._googleOAuthCallbackApiRoute = googleOAuthCallbackApiRoute;\n this._sessionSecret = sessionSecret;\n }\n\n private getOAuthClient(\n accessToken?: string,\n refreshToken?: string,\n ): GoogleOAuthClient {\n return new GoogleOAuthClient(\n this._googleOAuthClientId,\n this._googleOAuthClientSecret,\n this._googleOAuthCallbackApiRoute,\n accessToken,\n refreshToken,\n );\n }\n\n public async getGoogleSignInUrl(\n loginHint?: string,\n subscribeToNewsletter: boolean = false,\n ): Promise<string> {\n const oauthClient = this.getOAuthClient();\n const url: string | null = oauthClient.getAuthenticateUrl(\n loginHint,\n subscribeToNewsletter,\n );\n if (!url) throw new Error(\"Failed to get Google Authentication URL\");\n return url;\n }\n\n public async handleGoogleSignInCallback(\n code: string,\n subscribeToNewsletterFn?: (email: string) => Promise<void>,\n ): Promise<OakGoogleSignInCallback> {\n const oauthClient = this.getOAuthClient();\n const user = await oauthClient.exchangeCodeForTokens(code);\n if (!user) throw new Error(\"Failed to authenticate Google sign-in\");\n const encryptedRefreshToken = user.refreshToken\n ? this.encryptionService.encryptString(user.refreshToken)\n : undefined;\n const encryptedProfileUrl = user.profilePictureUrl\n ? this.encryptionService.encryptString(user.profilePictureUrl)\n : undefined;\n await this.firestoreClient.upsertConnectedUserCredentials({\n refreshToken: encryptedRefreshToken,\n profilePictureUrl: encryptedProfileUrl,\n loginHint: user.loginHint,\n });\n const encryptedSession = await sealData(\n {\n loginHint: user.loginHint,\n accessToken: user.accessToken,\n } as EncryptedSession,\n { password: this._sessionSecret },\n );\n if (subscribeToNewsletterFn && user.email)\n await subscribeToNewsletterFn(user.email);\n return {\n encryptedSession,\n profilePictureUrl: user.profilePictureUrl,\n };\n }\n\n /**\n * Checks if session exists and is authenticated. It will automatically attempt\n * to refresh the session if it has expired.\n * Returns null for an invalid session.\n * Returns the encrypted session (original or refreshed) if valid.\n */\n public async verifyAuthSession(\n encryptedSession: string,\n ): Promise<string | null> {\n const decryptedSession = await unsealData<EncryptedSession>(\n encryptedSession,\n {\n password: this._sessionSecret,\n },\n );\n if (!decryptedSession?.accessToken || !decryptedSession?.loginHint)\n return null;\n\n // Check active session for the user exists\n const connectedUser =\n await this.firestoreClient.getConnectedUserCredentials(\n decryptedSession.loginHint,\n );\n if (!connectedUser) return null;\n\n // Check if the access token is still valid\n const oauthClient = this.getOAuthClient(\n decryptedSession.accessToken,\n connectedUser.refreshToken,\n );\n const isTokenValid = await oauthClient.isAuthenticated(\n decryptedSession.accessToken,\n );\n if (isTokenValid) return encryptedSession;\n\n // Attempt to refresh expired access token\n const refreshedToken = await oauthClient.refreshAccessToken(\n connectedUser.refreshToken,\n );\n if (refreshedToken) {\n const newEncryptedSession = await sealData(\n {\n loginHint: decryptedSession.loginHint,\n accessToken: refreshedToken,\n } as EncryptedSession,\n { password: this._sessionSecret },\n );\n return newEncryptedSession;\n }\n\n return null;\n }\n}\n"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","_","label","sent","trys","ops","g","Object","create","Iterator","prototype","verb","Symbol","iterator","this","n","v","op","TypeError","call","pop","length","push","SuppressedError","cookie","parse","str","opt","obj","len","dec","decode","index","eqIdx","endIdx","indexOf","lastIndexOf","keyStartIdx","startIndex","keyEndIdx","endIndex","key","slice","__hasOwnProperty","valStartIdx","valEndIdx","charCodeAt","val","tryDecode","serialize","name","enc","encode","encodeURIComponent","cookieNameRegExp","test","cookieValueRegExp","maxAge","Math","floor","isFinite","domain","domainValueRegExp","path","pathValueRegExp","expires","__toString","isDate","isNaN","valueOf","toUTCString","httpOnly","secure","partitioned","priority","toLowerCase","sameSite","toString","hasOwnProperty","max","code","min","decodeURIComponent","alphabetByEncoding","alphabetByValue","Array","from","i","start","limit","char","String","fromCharCode","stringToBuffer","TextEncoder","base64urlDecode","_input","input","repeat","totalByteLength","endsWith","out","ArrayBuffer","dataView","DataView","bits","bitLength","j","chunkOffset","byteLength","k","offset","setUint8","Uint8Array","base64urlEncode","bitClusterCount","ceil","defaults","encryption","saltBits","algorithm","iterations","minPasswordlength","integrity","ttl","timestampSkewSec","localtimeOffsetMsec","clone","options","algorithms","keyBits","ivBits","sha256","macPrefix","randomBits","_crypto","Error","size","bytes","getRandomValues","randomBytes","generateKey","async","password","_a","hmac","id","hash","usage","salt","randomSalt","map","x","padStart","join","derivedKey","keyLength","passwordBuffer","importedKey","subtle","importKey","params","deriveBits","pbkdf2","importedEncryptionKey","iv","getEncryptParams","data","counter","decrypt","decrypted","TextDecoder","hmacWithPassword","textBuffer","signed","sign","digest","normalizePassword","secret","seal","object","opts","now","Date","objectString","JSON","stringify","pass","encrypted","encrypt","encryptedB64","expiration","macBaseString","mac","webCrypto","globalThis","crypto","randomUUID","array","normalizeStringPasswordToMap","FirestoreCollections","sealData","fourteenDaysInSeconds","passwordsMap","mostRecentPasswordId","keys","Number","passwordForSeal","createSealData","unsealData","sealWithoutVersion","tokenVersion","tokenVersionAsString","split","parseInt","parseSeal","sealed","parts","prefix","passwordId","encryptionSalt","encryptionIv","hmacSalt","macOptions","a","b","mismatch","fixedTimeComparison","decryptOptions","unseal","persistent","error","message","createUnsealData","EncryptionService","encryptionSecret","ENCRYPTION_SECRET","encryptString","SALT_BYTES","IV_LENGTH","encryptionKey","scryptSync","ENCRYPTION_KEY_LENGTH","cipher","createCipheriv","ALGORITHM","update","final","concat","decryptString","o","m","r","ar","__read","ivHex","encryptedText","Buffer","decipher","createDecipheriv","FirestoreClient","firestore","_firestore","getConnectedUserCredentials","loginHint","collection","CONNECTED_USERS_CREDENTIALS","doc","get","console","error_1","upsertConnectedUserCredentials","credentials","settings","ignoreUndefinedProperties","set","error_2","GoogleOAuthClient","googleClientId","googleClientSecret","callbackUrl","accessToken","refreshToken","_this","client","OAuth2Client","clientId","clientSecret","redirectUri","forceRefreshOnFailure","process","env","GOOGLE_CLASSROOM_DEV_MODE","refreshHandler","access_token","expiry_date","getTime","setCredentials","refresh_token","getAuthenticateUrl","subscribeToNewsletter","generateAuthUrl","access_type","include_granted_scopes","scope","exchangeCodeForTokens","getToken","tokens","verifyIdToken","idToken","id_token","audience","ticket","info","getPayload","sub","profilePictureUrl","picture","email","refreshAccessToken","getAccessToken","token","isAuthenticated","getTokenInfo","tokenInfo","error_3","OakGoogleClassroomAddOn","googleOAuthClientId","googleOAuthClientSecret","googleOAuthCallbackApiRoute","sessionSecret","encryptionService","firestoreClient","_googleOAuthClientId","_googleOAuthClientSecret","_googleOAuthCallbackApiRoute","_sessionSecret","getOAuthClient","getGoogleSignInUrl","loginHint_1","arguments","oauthClient","url","handleGoogleSignInCallback","subscribeToNewsletterFn","user","encryptedRefreshToken","undefined","encryptedProfileUrl","encryptedSession","verifyAuthSession","decryptedSession","connectedUser","refreshedToken"],"mappings":"yJAkHO,SAASA,EAAUC,EAASC,EAAYC,EAAGC,GAE9C,OAAO,IAAKD,IAAMA,EAAIE,UAAU,SAAUC,EAASC,GAC/C,SAASC,EAAUC,GAAS,IAAMC,EAAKN,EAAUO,KAAKF,GAAS,CAAE,MAAOG,GAAKL,EAAOK,EAAI,CAAE,CAC1F,SAASC,EAASJ,GAAS,IAAMC,EAAKN,EAAiB,MAAEK,GAAS,CAAE,MAAOG,GAAKL,EAAOK,EAAI,CAAE,CAC7F,SAASF,EAAKI,GAJlB,IAAeL,EAIaK,EAAOC,KAAOT,EAAQQ,EAAOL,QAJ1CA,EAIyDK,EAAOL,MAJhDA,aAAiBN,EAAIM,EAAQ,IAAIN,EAAE,SAAUG,GAAWA,EAAQG,EAAQ,IAIjBO,KAAKR,EAAWK,EAAW,CAC7GH,GAAMN,EAAYA,EAAUa,MAAMhB,EAASC,GAAc,KAAKS,OAClE,EACJ,CAEO,SAASO,EAAYjB,EAASkB,GACjC,IAAsGC,EAAGC,EAAGC,EAAxGC,EAAI,CAAEC,MAAO,EAAGC,KAAM,WAAa,GAAW,EAAPH,EAAE,GAAQ,MAAMA,EAAE,GAAI,OAAOA,EAAE,EAAI,EAAGI,KAAM,GAAIC,IAAK,IAAeC,EAAIC,OAAOC,QAA4B,mBAAbC,SAA0BA,SAAWF,QAAQG,WACtL,OAAOJ,EAAEjB,KAAOsB,EAAK,GAAIL,EAAS,MAAIK,EAAK,GAAIL,EAAU,OAAIK,EAAK,GAAsB,mBAAXC,SAA0BN,EAAEM,OAAOC,UAAY,WAAa,OAAOC,IAAM,GAAIR,EAC1J,SAASK,EAAKI,GAAK,OAAO,SAAUC,GAAK,OACzC,SAAcC,GACV,GAAInB,EAAG,MAAM,IAAIoB,UAAU,mCAC3B,KAAOZ,IAAMA,EAAI,EAAGW,EAAG,KAAOhB,EAAI,IAAKA,OACnC,GAAIH,EAAI,EAAGC,IAAMC,EAAY,EAARiB,EAAG,GAASlB,EAAU,OAAIkB,EAAG,GAAKlB,EAAS,SAAOC,EAAID,EAAU,SAAMC,EAAEmB,KAAKpB,GAAI,GAAKA,EAAEV,SAAWW,EAAIA,EAAEmB,KAAKpB,EAAGkB,EAAG,KAAKxB,KAAM,OAAOO,EAE3J,OADID,EAAI,EAAGC,IAAGiB,EAAK,CAAS,EAARA,EAAG,GAAQjB,EAAEb,QACzB8B,EAAG,IACP,KAAK,EAAG,KAAK,EAAGjB,EAAIiB,EAAI,MACxB,KAAK,EAAc,OAAXhB,EAAEC,QAAgB,CAAEf,MAAO8B,EAAG,GAAIxB,MAAM,GAChD,KAAK,EAAGQ,EAAEC,QAASH,EAAIkB,EAAG,GAAIA,EAAK,CAAC,GAAI,SACxC,KAAK,EAAGA,EAAKhB,EAAEI,IAAIe,MAAOnB,EAAEG,KAAKgB,MAAO,SACxC,QACI,KAAMpB,EAAIC,EAAEG,MAAMJ,EAAIA,EAAEqB,OAAS,GAAKrB,EAAEA,EAAEqB,OAAS,KAAkB,IAAVJ,EAAG,IAAsB,IAAVA,EAAG,IAAW,CAAEhB,EAAI,EAAG,QAAU,CAC3G,GAAc,IAAVgB,EAAG,MAAcjB,GAAMiB,EAAG,GAAKjB,EAAE,IAAMiB,EAAG,GAAKjB,EAAE,IAAM,CAAEC,EAAEC,MAAQe,EAAG,GAAI,KAAO,CACrF,GAAc,IAAVA,EAAG,IAAYhB,EAAEC,MAAQF,EAAE,GAAI,CAAEC,EAAEC,MAAQF,EAAE,GAAIA,EAAIiB,EAAI,KAAO,CACpE,GAAIjB,GAAKC,EAAEC,MAAQF,EAAE,GAAI,CAAEC,EAAEC,MAAQF,EAAE,GAAIC,EAAEI,IAAIiB,KAAKL,GAAK,KAAO,CAC9DjB,EAAE,IAAIC,EAAEI,IAAIe,MAChBnB,EAAEG,KAAKgB,MAAO,SAEtBH,EAAKpB,EAAKsB,KAAKxC,EAASsB,EAC5B,CAAE,MAAOX,GAAK2B,EAAK,CAAC,EAAG3B,GAAIS,EAAI,CAAG,CAAC,QAAWD,EAAIE,EAAI,CAAG,CACzD,GAAY,EAARiB,EAAG,GAAQ,MAAMA,EAAG,GAAI,MAAO,CAAE9B,MAAO8B,EAAG,GAAKA,EAAG,QAAK,EAAQxB,MAAM,EAC9E,CAtBgDL,CAAK,CAAC2B,EAAGC,GAAK,CAAG,CAuBrE,CAkLkD,mBAApBO,iBAAiCA;;;;;;iCC1T/DC,EAAAC,MAqFA,SAAeC,EAAKC,GAClB,GAAmB,iBAARD,EACT,MAAM,IAAIR,UAAU,iCAGtB,IAAIU,EAAM,CAAA,EACNC,EAAMH,EAAIL,OAEd,GAAIQ,EAAM,EAAG,OAAOD,EAEpB,IAAIE,EAAOH,GAAOA,EAAII,QAAWA,EAC7BC,EAAQ,EACRC,EAAQ,EACRC,EAAS,EAEb,EAAG,CAED,IAAc,KADdD,EAAQP,EAAIS,QAAQ,IAAKH,IACP,MAIlB,IAAe,KAFfE,EAASR,EAAIS,QAAQ,IAAKH,IAGxBE,EAASL,OACJ,GAAII,EAAQC,EAAQ,CAEzBF,EAAQN,EAAIU,YAAY,IAAKH,EAAQ,GAAK,EAC1C,QACN,CAEI,IAAII,EAAcC,EAAWZ,EAAKM,EAAOC,GACrCM,EAAYC,EAASd,EAAKO,EAAOI,GACjCI,EAAMf,EAAIgB,MAAML,EAAaE,GAGjC,IAAKI,EAAiBxB,KAAKS,EAAKa,GAAM,CACpC,IAAIG,EAAcN,EAAWZ,EAAKO,EAAQ,EAAGC,GACzCW,EAAYL,EAASd,EAAKQ,EAAQU,GAEF,KAAhClB,EAAIoB,WAAWF,IAAmE,KAAlClB,EAAIoB,WAAWD,EAAY,KAC7ED,IACAC,KAGF,IAAIE,EAAMrB,EAAIgB,MAAME,EAAaC,GACjCjB,EAAIa,GAAOO,EAAUD,EAAKjB,EAChC,CAEIE,EAAQE,EAAS,CACrB,OAAWF,EAAQH,GAEjB,OAAOD,CACT,EAvIAJ,EAAAyB,UAyKA,SAAmBC,EAAMH,EAAKpB,GAC5B,IAAIwB,EAAOxB,GAAOA,EAAIyB,QAAWC,mBAEjC,GAAmB,mBAARF,EACT,MAAM,IAAIjC,UAAU,4BAGtB,IAAKoC,EAAiBC,KAAKL,GACzB,MAAM,IAAIhC,UAAU,4BAGtB,IAAI/B,EAAQgE,EAAIJ,GAEhB,IAAKS,EAAkBD,KAAKpE,GAC1B,MAAM,IAAI+B,UAAU,2BAGtB,IAAIQ,EAAMwB,EAAO,IAAM/D,EACvB,IAAKwC,EAAK,OAAOD,EAEjB,GAAI,MAAQC,EAAI8B,OAAQ,CACtB,IAAIA,EAASC,KAAKC,MAAMhC,EAAI8B,QAE5B,IAAKG,SAASH,GACZ,MAAM,IAAIvC,UAAU,4BAGtBQ,GAAO,aAAe+B,CAC1B,CAEE,GAAI9B,EAAIkC,OAAQ,CACd,IAAKC,EAAkBP,KAAK5B,EAAIkC,QAC9B,MAAM,IAAI3C,UAAU,4BAGtBQ,GAAO,YAAcC,EAAIkC,MAC7B,CAEE,GAAIlC,EAAIoC,KAAM,CACZ,IAAKC,EAAgBT,KAAK5B,EAAIoC,MAC5B,MAAM,IAAI7C,UAAU,0BAGtBQ,GAAO,UAAYC,EAAIoC,IAC3B,CAEE,GAAIpC,EAAIsC,QAAS,CACf,IAAIA,EAAUtC,EAAIsC,QAElB,IAmFJ,SAAiBlB,GACf,MAAgC,kBAAzBmB,EAAW/C,KAAK4B,EACzB,CArFSoB,CAAOF,IAAYG,MAAMH,EAAQI,WACpC,MAAM,IAAInD,UAAU,6BAGtBQ,GAAO,aAAeuC,EAAQK,aAClC,CAEM3C,EAAI4C,WACN7C,GAAO,cAGLC,EAAI6C,SACN9C,GAAO,YAGLC,EAAI8C,cACN/C,GAAO,iBAGT,GAAIC,EAAI+C,SAAU,CAIhB,OAHuC,iBAAjB/C,EAAI+C,SACtB/C,EAAI+C,SAASC,cAAgBhD,EAAI+C,UAGnC,IAAK,MACHhD,GAAO,iBACP,MACF,IAAK,SACHA,GAAO,oBACP,MACF,IAAK,OACHA,GAAO,kBACP,MACF,QACE,MAAM,IAAIR,UAAU,8BAE5B,CAEE,GAAIS,EAAIiD,SAAU,CAIhB,OAHuC,iBAAjBjD,EAAIiD,SACtBjD,EAAIiD,SAASD,cAAgBhD,EAAIiD,UAGnC,KAAK,EACHlD,GAAO,oBACP,MACF,IAAK,MACHA,GAAO,iBACP,MACF,IAAK,SACHA,GAAO,oBACP,MACF,IAAK,OACHA,GAAO,kBACP,MACF,QACE,MAAM,IAAIR,UAAU,8BAE5B,CAEE,OAAOQ,CACT,EAhRA,IAAIwC,EAAa3D,OAAOG,UAAUmE,SAC9BlC,EAAmBpC,OAAOG,UAAUoE,eAcpCxB,EAAmB,iCAYnBE,EAAoB,wEA0BpBM,EAAoB,sFAUpBE,EAAkB,kCAmEtB,SAAS1B,EAAWZ,EAAKM,EAAO+C,GAC9B,EAAG,CACD,IAAIC,EAAOtD,EAAIoB,WAAWd,GAC1B,GAAa,KAATgD,GAAkC,IAATA,EAAwB,OAAOhD,CAChE,SAAaA,EAAQ+C,GACnB,OAAOA,CACT,CAEA,SAASvC,EAASd,EAAKM,EAAOiD,GAC5B,KAAOjD,EAAQiD,GAAK,CAClB,IAAID,EAAOtD,EAAIoB,aAAad,GAC5B,GAAa,KAATgD,GAAkC,IAATA,EAAwB,OAAOhD,EAAQ,CACxE,CACE,OAAOiD,CACT,CAyIA,SAASlD,EAAQL,GACf,OAA4B,IAArBA,EAAIS,QAAQ,KACf+C,mBAAmBxD,GACnBA,CACN,CAqBA,SAASsB,EAAUtB,EAAKK,GACtB,IACE,OAAOA,EAAOL,EAClB,CAAI,MAAOpC,GACP,OAAOoC,CACX,CACA,KC7UA,IAAIyD,EAAqB,CAAA,EACrBC,EAAkBC,MAAMC,KAAK,CAAEjE,OAAQ,KAC3C,IAAK,IAAIkE,EAAI,EAAGC,EAAQ,IAAI1C,WAAW,GAAI2C,EAAQ,IAAI3C,WAAW,GAAIyC,EAAIC,GAASC,EAAOF,IAAK,CAC7F,MAAMG,EAAOC,OAAOC,aAAaL,EAAIC,GACrCL,EAAmBO,GAAQH,EAC3BH,EAAgBG,GAAKG,CACvB,CACA,IAAK,IAAIH,EAAI,EAAGC,EAAQ,IAAI1C,WAAW,GAAI2C,EAAQ,IAAI3C,WAAW,GAAIyC,EAAIC,GAASC,EAAOF,IAAK,CAC7F,MAAMG,EAAOC,OAAOC,aAAaL,EAAIC,GAC/BxD,EAAQuD,EAAI,GAClBJ,EAAmBO,GAAQ1D,EAC3BoD,EAAgBpD,GAAS0D,CAC3B,CACA,IAAK,IAAIH,EAAI,EAAGA,EAAI,GAAIA,IAAK,CAC3BJ,EAAmBI,EAAEV,SAAS,KAAOU,EAAI,GACzC,MAAMG,EAAOH,EAAEV,SAAS,IAClB7C,EAAQuD,EAAI,GAClBJ,EAAmBO,GAAQ1D,EAC3BoD,EAAgBpD,GAAS0D,CAC3B,CACAP,EAAmB,KAAO,GAC1BC,EAAgB,IAAM,IACtBD,EAAsB,EAAI,GAC1BC,EAAgB,IAAM,IACtB,IAGIS,EAAkB1G,IACb,IAAI2G,aAAc1C,OAAOjE,GAK9B4G,EAAmBC,IACrB,MAAMC,EAAQD,EAAS,IAAIE,QAAQ,EAAIF,EAAO3E,OAAS,GAAK,GAC5D,IAAI8E,EAAkBF,EAAM5E,OAAS,EAAI,EACrC4E,EAAMG,SAAS,MACjBD,GAAmB,EACVF,EAAMG,SAAS,MACxBD,IAEF,MAAME,EAAM,IAAIC,YAAYH,GACtBI,EAAW,IAAIC,SAASH,GAC9B,IAAK,IAAId,EAAI,EAAGA,EAAIU,EAAM5E,OAAQkE,GAAK,EAAG,CACxC,IAAIkB,EAAO,EACPC,EAAY,EAChB,IAAK,IAAIC,EAAIpB,EAAGE,EAAQF,EAAI,EAAGoB,GAAKlB,EAAOkB,IACzC,GAAiB,MAAbV,EAAMU,GACRF,IAxBY,MAyBP,CACL,KAAMR,EAAMU,KAAMxB,GAChB,MAAM,IAAIjE,UAAU,qBAAqB+E,EAAMU,wBAEjDF,GAAQtB,EAAmBc,EAAMU,KA7BrB,GA6B6BlB,EAAQkB,GACjDD,GA9BY,CA+Bd,CAEF,MAAME,EAAcrB,EAAI,EAAI,EAC5BkB,IAASC,EAjCK,EAkCd,MAAMG,EAAanD,KAAKC,MAAM+C,EAlChB,GAmCd,IAAK,IAAII,EAAI,EAAGA,EAAID,EAAYC,IAAK,CACnC,MAAMC,EApCM,GAoCIF,EAAaC,EAAI,GACjCP,EAASS,SAASJ,EAAcE,GAAIL,EAAO,KAAOM,IAAWA,EAC/D,CACF,CACA,OAAO,IAAIE,WAAWZ,IAEpBa,EAAmBlB,IACrB,MAAMC,EAA0B,iBAAXD,EAAsBH,EAAeG,GAAUA,EACpE,IAAItE,EAAM,GACV,IAAK,IAAI6D,EAAI,EAAGA,EAAIU,EAAM5E,OAAQkE,GAAK,EAAG,CACxC,IAAIkB,EAAO,EACPC,EAAY,EAChB,IAAK,IAAIC,EAAIpB,EAAGE,EAAQ/B,KAAKuB,IAAIM,EAAI,EAAGU,EAAM5E,QAASsF,EAAIlB,EAAOkB,IAChEF,GAAQR,EAAMU,IAjDF,GAiDSlB,EAAQkB,EAAI,GACjCD,GAlDY,EAoDd,MAAMS,EAAkBzD,KAAK0D,KAAKV,EArDlB,GAsDhBD,IAtDgB,EAsDPU,EAAkCT,EAC3C,IAAK,IAAII,EAAI,EAAGA,GAAKK,EAAiBL,IAAK,CACzC,MAAMC,EAxDQ,GAwDEI,EAAkBL,GAClCpF,GAAO0D,GAAiBqB,EAvDT,IAuDkCM,IAAWA,EAC9D,CACF,CACA,OAAOrF,GAIL2F,EAAW,CACbC,WAAY,CAAEC,SAAU,IAAKC,UAAW,cAAeC,WAAY,EAAGC,kBAAmB,IACzFC,UAAW,CAAEJ,SAAU,IAAKC,UAAW,SAAUC,WAAY,EAAGC,kBAAmB,IACnFE,IAAK,EACLC,iBAAkB,GAClBC,oBAAqB,GAEnBC,EAASC,IAAO,IACfA,EACHV,WAAY,IAAKU,EAAQV,YACzBK,UAAW,IAAKK,EAAQL,aAEtBM,EAAa,CACf,cAAe,CAAEC,QAAS,IAAKC,OAAQ,IAAKjF,KAAM,WAClD,cAAe,CAAEgF,QAAS,IAAKC,OAAQ,IAAKjF,KAAM,WAClDkF,OAAQ,CAAEF,QAAS,IAAKhF,KAAM,YAG5BmF,EAAY,SAMZC,EAAa,CAACC,EAAS9B,KACzB,GAAIA,EAAO,EACT,MAAM,IAAI+B,MAAM,6BAElB,MATgB,EAACD,EAASE,KAC1B,MAAMC,EAAQ,IAAIzB,WAAWwB,GAE7B,OADAF,EAAQI,gBAAgBD,GACjBA,GAMAE,CAAYL,EADL7E,KAAK0D,KAAKX,EAAO,KAiB7BoC,EAAcC,MAAOP,EAASQ,EAAUf,KAC1C,IAAIgB,EACJ,KAAkB,MAAZD,OAAmB,EAASA,EAAS1H,QACzC,MAAM,IAAImH,MAAM,kBAClB,GAAe,MAAXR,GAAsC,iBAAZA,EAC5B,MAAM,IAAIQ,MAAM,eAClB,KAAMR,EAAQR,aAAaS,GACzB,MAAM,IAAIO,MAAM,sBAAsBR,EAAQR,aAChD,MAAMA,EAAYS,EAAWD,EAAQR,WAC/BhI,EAAS,CAAA,EACTyJ,EAA8B,OAAtBD,EAAKhB,EAAQiB,OAAgBD,EACrCE,EAAKD,EAAO,CAAE/F,KAAM,OAAQiG,KAAM3B,EAAUtE,MAAS,CAAEA,KAAMsE,EAAUtE,MACvEkG,EAAQH,EAAO,CAAC,OAAQ,UAAY,CAAC,UAAW,WACtD,GAAwB,iBAAbF,EAAuB,CAChC,GAAIA,EAAS1H,OAAS2G,EAAQN,kBAC5B,MAAM,IAAIc,MACR,kCAAkCR,EAAQN,0CAE9C,IAAI2B,KAAEA,EAAO,IAAOrB,EACpB,IAAKqB,EAAM,CACT,MAAM9B,SAAEA,EAAW,GAAMS,EACzB,IAAKT,EACH,MAAM,IAAIiB,MAAM,qCAClB,MAAMc,EAAahB,EAAWC,EAAShB,GACvC8B,EAAO,IAAI,IAAIpC,WAAWqC,IAAaC,IAAKC,GAAMA,EAAE3E,SAAS,IAAI4E,SAAS,EAAG,MAAMC,KAAK,GAC1F,CACA,MAAMC,OAxCGb,OAAOP,EAASQ,EAAUM,EAAM5B,EAAYmC,EAAWT,KAClE,MAAMU,EAAiBhE,EAAekD,GAChCe,QAAoBvB,EAAQwB,OAAOC,UACvC,MACAH,EACA,CAAE3G,KAAM,WACR,EACA,CAAC,eAGG+G,EAAS,CAAE/G,KAAM,SAAUiG,OAAME,KADpBxD,EAAewD,GACuB5B,cAEzD,aADyBc,EAAQwB,OAAOG,WAAWD,EAAQH,EAAyB,EAAZF,IA6B7CO,CACvB5B,EACAQ,EACAM,EACArB,EAAQP,WACRD,EAAUU,QAAU,EACpB,SAEIkC,QAA8B7B,EAAQwB,OAAOC,UACjD,MACAL,EACAT,GACA,EACAE,GAEF5J,EAAOiD,IAAM2H,EACb5K,EAAO6J,KAAOA,CAChB,KAAO,CACL,GAAIN,EAAS1H,OAASmG,EAAUU,QAAU,EACxC,MAAM,IAAIM,MAAM,mCAClBhJ,EAAOiD,UAAY8F,EAAQwB,OAAOC,UAAU,MAAOjB,EAAUG,GAAI,EAAOE,GACxE5J,EAAO6J,KAAO,EAChB,CAKA,OAJIrB,EAAQqC,GACV7K,EAAO6K,GAAKrC,EAAQqC,GACb,WAAY7C,IACnBhI,EAAO6K,GAAK/B,EAAWC,EAASf,EAAUW,SACrC3I,GAEL8K,EAAmB,CAAC9C,EAAW/E,EAAK8H,IAC/B,CACS,gBAAd/C,EAA8B,CAAEtE,KAAM,UAAWsH,QAAS/H,EAAI4H,GAAIhJ,OAAQ,KAAQ,CAAE6B,KAAM,UAAWmH,GAAI5H,EAAI4H,IAC7G5H,EAAIA,IACY,iBAAT8H,EAAoB1E,EAAe0E,GAAQA,GAQlDE,EAAU3B,MAAOP,EAASQ,EAAUf,EAASuC,KAC/C,MAAM9H,QAAYoG,EAAYN,EAASQ,EAAUf,GAC3C0C,QAAkBnC,EAAQwB,OAAOU,WAAWH,EAAiBtC,EAAQR,UAAW/E,EAAK8H,IAC3F,OA5KoBpL,EA4KE,IAAI8H,WAAWyD,IA3K9B,IAAIC,aAAc5I,OAAO5C,GADb,IAACA,GA8KlByL,EAAmB9B,MAAOP,EAASQ,EAAUf,EAASuC,KACxD,MAAM9H,QAAYoG,EAAYN,EAASQ,EAAU,IAAKf,EAASiB,MAAM,IAC/D4B,EAAahF,EAAe0E,GAC5BO,QAAevC,EAAQwB,OAAOgB,KAAK,CAAE7H,KAAM,QAAUT,EAAIA,IAAKoI,GAEpE,MAAO,CAAEG,OADM9D,EAAgB,IAAID,WAAW6D,IAC7BzB,KAAM5G,EAAI4G,OAEzB4B,EAAqBlC,GACC,iBAAbA,GAAyBA,aAAoB9B,WAC/C,CAAEK,WAAYyB,EAAUpB,UAAWoB,GACxC,WAAYA,EACP,CAAEG,GAAIH,EAASG,GAAI5B,WAAYyB,EAASmC,OAAQvD,UAAWoB,EAASmC,QACtE,CAAEhC,GAAIH,EAASG,GAAI5B,WAAYyB,EAASzB,WAAYK,UAAWoB,EAASpB,WAE7EwD,EAAOrC,MAAOP,EAAS6C,EAAQrC,EAAUf,KAC3C,IAAKe,EACH,MAAM,IAAIP,MAAM,kBAClB,MAAM6C,EAAOtD,EAAMC,GACbsD,EAAMC,KAAKD,OAASD,EAAKvD,qBAAuB,GAChD0D,EAAeC,KAAKC,UAAUN,GAC9BO,EAAOV,EAAkBlC,IACzBG,GAAEA,EAAK,GAAE5B,WAAEA,EAAUK,UAAEA,GAAcgE,EAC3C,GAAIzC,IAAO,QAAQ3F,KAAK2F,GACtB,MAAM,IAAIV,MAAM,uBAClB,MAAMoD,UAAEA,EAASnJ,IAAEA,QAlCPqG,OAAOP,EAASQ,EAAUf,EAASuC,KAC/C,MAAM9H,QAAYoG,EAAYN,EAASQ,EAAUf,GAC3C4D,QAAkBrD,EAAQwB,OAAO8B,WAAWvB,EAAiBtC,EAAQR,UAAW/E,EAAK8H,IAC3F,MAAO,CAAEqB,UAAW,IAAI3E,WAAW2E,GAAYnJ,QA+BdoJ,CAAQtD,EAASjB,EAAY+D,EAAK/D,WAAYkE,GACzEM,EAAe5E,EAAgB,IAAID,WAAW2E,IAC9CvB,EAAKnD,EAAgBzE,EAAI4H,IACzB0B,EAAaV,EAAKzD,IAAM0D,EAAMD,EAAKzD,IAAM,GACzCoE,EAAgB,GAAG3D,KAAaa,KAAMzG,EAAI4G,QAAQgB,KAAMyB,KAAgBC,IACxEE,QAAYrB,EAAiBrC,EAASZ,EAAW0D,EAAK1D,UAAWqE,GAEvE,MADe,GAAGA,KAAiBC,EAAI5C,QAAQ4C,EAAIjB,UC3OrD,MAAMkB,EAAYC,WAAWC,OACvBrC,EAASmC,EAAUnC,OACnBsC,EAAa,IACVH,EAAUG,aAEb1D,EAAmB2D,GAChBJ,EAAUvD,gBAAgB2D,GAE7B/D,EAAU,CACd8D,aACA1D,kBACAoB,kGCEF,SAASwC,EAA6BxD,GACpC,MAA2B,iBAAbA,EAAwB,CAAE,EAAGA,GAAaA,CAC1D,CAyPA,IChQKyD,EDgQDC,EAlNJ,SAAwBlE,GACtB,OAAOO,eAAyByB,GAAMxB,SACpCA,EAAQnB,IACRA,EAAM8E,UAEN,MAAMC,EAAeJ,EAA6BxD,GAC5C6D,EAAuBlJ,KAAKqB,OAC7BxE,OAAOsM,KAAKF,GAAcpD,IAAIuD,SAE7BC,EAAkB,CACtB7D,GAAI0D,EAAqB/H,WACzBqG,OAAQyB,EAAaC,IAMvB,MAAO,SAJczB,EAAK5C,EAASgC,EAAMwC,EAAiB,IACrD1F,EACHO,IAAW,IAANA,OAGT,CACF,CA+LeoF,CAAeZ,GAC1Ba,EA/LJ,SAA0B1E,GACxB,OAAOO,eAA2BqC,GAAMpC,SACtCA,EAAQnB,IACRA,EAAM8E,UAEN,MAAMC,EAAeJ,EAA6BxD,IAC5CmE,mBAAEA,EAAkBC,aAAEA,GAhEhC,SAAmBhC,GACjB,MAAO+B,EAAoBE,GAAwBjC,EAAKkC,MATnC,KAWrB,MAAO,CAAEH,qBAAoBC,aADgB,MAAxBC,EAA+B,KAAOE,SAASF,EAAsB,IAE5F,CA4DiDG,CAAUpC,GACvD,IACE,MAAMZ,OFoKCzB,OAAOP,EAASiF,EAAQzE,EAAUf,KAC7C,IAAKe,EACH,MAAM,IAAIP,MAAM,kBAClB,MAAM6C,EAAOtD,EAAMC,GACbsD,EAAMC,KAAKD,OAASD,EAAKvD,qBAAuB,GAChD2F,EAAQD,EAAOH,MAAM,KAC3B,GAAqB,IAAjBI,EAAMpM,OACR,MAAM,IAAImH,MAAM,yCAClB,MAAMkF,EAASD,EAAM,GACrB,IAAIE,EAAaF,EAAM,GACvB,MAAMG,EAAiBH,EAAM,GACvBI,EAAeJ,EAAM,GACrB3B,EAAe2B,EAAM,GACrB1B,EAAa0B,EAAM,GACnBK,EAAWL,EAAM,GACjBxE,EAAOwE,EAAM,GACbzB,EAAgB,GAAG0B,KAAUC,KAAcC,KAAkBC,KAAgB/B,KAAgBC,IACnG,GAAI1D,IAAcqF,EAChB,MAAM,IAAIlF,MAAM,oBAClB,GAAIuD,EAAY,CACd,IAAK,QAAQxI,KAAKwI,GAChB,MAAM,IAAIvD,MAAM,sBAElB,GADYsE,OAAOQ,SAASvB,EAAY,KAC7BT,EAA8B,IAAxBD,EAAKxD,iBACpB,MAAM,IAAIW,MAAM,eACpB,CACA,IAAImD,EAAO,GAEX,GADAgC,EAAaA,GAAc,UACH,iBAAb5E,GAAyBA,aAAoB9B,WACtD0E,EAAO5C,MACJ,MAAI4E,KAAc5E,GAGrB,MAAM,IAAIP,MAAM,yBAAyBmF,KAFzChC,EAAO5C,EAAS4E,EAGlB,CACAhC,EAAOV,EAAkBU,GACzB,MAAMoC,EAAa1C,EAAK1D,UAGxB,GAFAoG,EAAW1E,KAAOyE,GA7CM,EAACE,EAAGC,KAC5B,IAAIC,EAAWF,EAAE3M,SAAW4M,EAAE5M,OAAS,EAAI,EACvC6M,IACFD,EAAID,GACN,IAAK,IAAIzI,EAAI,EAAGA,EAAIyI,EAAE3M,OAAQkE,GAAK,EACjC2I,GAAYF,EAAElL,WAAWyC,GAAK0I,EAAEnL,WAAWyC,GAC7C,OAAoB,IAAb2I,GAyCFC,QADavD,EAAiBrC,EAASoD,EAAKhE,UAAWoG,EAAY/B,IAC3ChB,OAAQ/B,GACnC,MAAM,IAAIT,MAAM,kBAClB,MAAMoD,EAAY7F,EAAgB+F,GAC5BsC,EAAiB/C,EAAK/D,WAC5B8G,EAAe/E,KAAOuE,EACtBQ,EAAe/D,GAAKtE,EAAgB8H,GACpC,MAAMnD,QAAkBD,EAAQlC,EAASoD,EAAKrE,WAAY8G,EAAgBxC,GAC1E,OAAIlB,EACKe,KAAKhK,MAAMiJ,GACb,MEpNgB2D,CAAO9F,EAAS2E,EAAoBP,EAAc,IAChEtF,EACHO,IAAW,IAANA,KACD,CAAA,EACN,OAAqB,IAAjBuF,EACK5C,EAEF,IAAKA,EAAK+D,WACnB,CAAE,MAAOC,GACP,GAAIA,aAAiB/F,OAAS,4FAA4FjF,KACxHgL,EAAMC,SAEN,MAAO,CAAA,EAET,MAAMD,CACR,CACF,CACF,CAsKiBE,CAAiBrC,GEvQlCsC,EAAA,WAOE,SAAAA,EAA6BC,GAAA7N,KAAA6N,iBAAAA,EAC3B7N,KAAK8N,kBAAoBD,CAC3B,CA6CF,OA3CSD,EAAAhO,UAAAmO,cAAP,SAAqB1P,GACnB,IAAMkK,EAAO+C,EAAAA,QACVxD,YAAY8F,EAAkBI,YAC9BjK,SAAS,OACNwF,EAAK+B,EAAAA,QAAOxD,YAAY8F,EAAkBK,WAC1CC,EAAgB5C,EAAAA,QAAO6C,WAC3BnO,KAAK8N,kBACLvF,EACAqF,EAAkBQ,uBAEdC,EAAS/C,EAAAA,QAAOgD,eACpBV,EAAkBW,UAClBL,EACA3E,GAEEuB,EAAYuD,EAAOG,OAAOnQ,EAAO,OAAQ,OAE7C,OADAyM,GAAauD,EAAOI,MAAM,OACnB,GAAAC,OAAGnF,EAAGxF,SAAS,OAAM,KAAA2K,OAAI5D,EAAS,KAAA4D,OAAInG,EAC/C,EAEOqF,EAAAhO,UAAA+O,cAAP,SAAqBtQ,GACb,IAAA6J,ENkJH,SAAgB0G,EAAG3O,GACtB,IAAI4O,EAAsB,mBAAX/O,QAAyB8O,EAAE9O,OAAOC,UACjD,IAAK8O,EAAG,OAAOD,EACf,IAAmBE,EAAYtQ,EAA3BiG,EAAIoK,EAAExO,KAAKuO,GAAOG,EAAK,GAC3B,IACI,WAAc,IAAN9O,GAAgBA,KAAM,MAAQ6O,EAAIrK,EAAElG,QAAQI,MAAMoQ,EAAGvO,KAAKsO,EAAEzQ,MACxE,CACA,MAAOoP,GAASjP,EAAI,CAAEiP,MAAOA,EAAS,CAC1C,QACQ,IACQqB,IAAMA,EAAEnQ,OAASkQ,EAAIpK,EAAU,SAAIoK,EAAExO,KAAKoE,EAClD,CACR,QAAkB,GAAIjG,EAAG,MAAMA,EAAEiP,KAAO,CACpC,CACA,OAAOsB,CACX,CMjKUC,CAA+B3Q,EAAMkO,MAAM,KAAI,GAA9C0C,OAAOC,OAAe3G,OAC7B,IAAK0G,IAAUC,IAAkB3G,EAC/B,MAAM,IAAIb,MAAM,4BAElB,IAAM6B,EAAK4F,OAAO3K,KAAKyK,EAAO,OACxBf,EAAgB5C,EAAAA,QAAO6C,WAC3BnO,KAAK8N,kBACLvF,EACAqF,EAAkBQ,uBAGdgB,EAAW9D,EAAAA,QAAO+D,iBACtBzB,EAAkBW,UAClBL,EACA3E,GAGEK,EAAYwF,EAASZ,OAAOU,EAAe,MAAO,QAGtD,OAFAtF,GAAawF,EAASX,MAAM,OAG9B,EApDeb,EAAAW,UAAY,cACZX,EAAAK,UAAY,GACZL,EAAAI,WAAa,GACbJ,EAAAQ,sBAAwB,GAkDzCR,CAAC,KDhDD,SAAKlC,GACHA,EAAA,4BAAA,2BACD,CAFD,CAAKA,IAAAA,EAAoB,CAAA,IAIzB,IAAA4D,EAAA,WAGE,SAAAA,EAA6BC,GAAAvP,KAAAuP,UAAAA,EAC3BvP,KAAKwP,WAAaD,CACpB,CAmCF,OAjCeD,EAAA1P,UAAA6P,4BAAb,SACEC,iGAGc,6BAAA,CAAA,EAAM1P,KAAKwP,WACpBG,WAAWjE,EAAqBkE,6BAChCC,IAAIH,GACJI,cAEH,MAAA,CAAA,EALY5H,EAAA7I,eAQZ,iBADA0Q,QAAQtC,MAAMuC,GACR,IAAItI,MAAM,yDAEnB,EAEY4H,EAAA1P,UAAAqQ,+BAAb,SACEC,iGAOE,6BADAlQ,KAAKwP,WAAWW,SAAS,CAAEC,2BAA2B,IACtD,CAAA,EAAMpQ,KAAKwP,WACRG,WAAWjE,EAAqBkE,6BAChCC,IAAIK,EAAYR,WAChBW,IAAIH,kBAHPhI,EAAA7I,oBAMA,iBADA0Q,QAAQtC,MAAM6C,GACR,IAAI5I,MAAM,2DAEnB,EACH4H,CAAA,IEzCAiB,EAAA,WAIE,SAAAA,EACmBC,EACAC,EACAC,EACAC,EACAC,GALnB,IAAAC,EAAA7Q,KAOE,GANiBA,KAAAwQ,eAAAA,EACAxQ,KAAAyQ,mBAAAA,EACAzQ,KAAA0Q,YAAAA,EACA1Q,KAAA2Q,YAAAA,EACA3Q,KAAA4Q,aAAAA,GAEZJ,EAAgB,MAAM,IAAI9I,MAAM,+BACrC,IAAK+I,EAAoB,MAAM,IAAI/I,MAAM,mCACzC,IAAKgJ,EAAa,MAAM,IAAIhJ,MAAM,wCAClC,IAAMoJ,EAAS,IAAIC,eAAa,CAC9BC,SAAUR,EACVS,aAAcR,EACdS,YAAaR,EACbS,uBAAuB,IAGqB,SAA1CC,QAAQC,IAAIC,2BAAwCX,IACtDG,EAAOS,eAAiB,WAAA,OAAA3T,EAAAiT,OAAA,OAAA,EAAA,qCAA0C,MAAA,CAAA,EAAA,CAChEW,aAAcb,EACdc,aAAa,IAAIhH,MAAOiH,UAAY,cAIpCf,GAAeC,IACjBE,EAAOa,eAAe,CACpBH,aAAcb,EACdiB,cAAehB,IAEnB5Q,KAAK8Q,OAASA,EACd9Q,KAAKgR,SAAWR,CAClB,CAsGF,OAjGSD,EAAA3Q,UAAAiS,mBAAP,SACEnC,EACAoC,QAAA,IAAAA,IAAAA,GAAA,GAEA,IASE,OAAO9R,KAAK8Q,OAAOiB,gBAAgB,CACjCC,YAAa,UACbC,wBAAwB,EACxBC,MAXsB,CACtB,mDACA,iDACA,6DACA,2DACA,4DAOAxC,UAASA,EACToC,sBAAqBA,GAEzB,CAAE,MAAOrE,GAEP,OADAsC,QAAQtC,MAAMA,GACP,IACT,CACF,EAMa8C,EAAA3Q,UAAAuS,sBAAb,SACEjO,uGAGqB,6BAAA,CAAA,EAAMlE,KAAK8Q,OAAOsB,SAASlO,WAGlB,OAHpBmO,EAAWnK,EAAA7I,OAAgCgT,OAGvB,CAAA,EAAMrS,KAAK8Q,OAAOwB,cAAc,CAC1DC,QAASF,EAAOG,SAChBC,SAAUzS,KAAKgR,mBAOjB,GATM0B,EAAsBxK,EAAA7I,OAMtBsT,EAAiCD,EAAOE,cAGzCP,EAAOb,aAAc,MAAM,IAAI9J,MAAM,2BAC1C,KAAKiL,aAAI,EAAJA,EAAME,KAAK,MAAM,IAAInL,MAAM,uBAEhC,MAAA,CAAA,EAAO,CACLiJ,YAAa0B,EAAOb,aACpB9B,UAAWiD,EAAKE,IAChBjC,aAAcyB,EAAOT,cACrBkB,kBAAmBH,aAAI,EAAJA,EAAMI,QACzBC,MAAOL,EAAKK,eAId,kBADAjD,QAAQtC,MAAMuC,GACd,CAAA,EAAO,2BAEV,EAMYO,EAAA3Q,UAAAqT,mBAAb,SACErC,mGAIsB,6BADpB5Q,KAAK8Q,OAAOa,eAAe,CAAEC,cAAehB,IACxB,CAAA,EAAM5Q,KAAK8Q,OAAOoC,yBAEtC,KAFMvC,EAAczI,EAAA7I,QAEH8T,MAAO,MAAM,IAAIzL,MAAM,kCACxC,MAAA,CAAA,EAAOiJ,EAAYwC,cAGnB,kBADApD,QAAQtC,MAAM6C,GACd,CAAA,EAAO,2BAEV,EAMYC,EAAA3Q,UAAAwT,gBAAb,SAA6BzC,mGAEP,6BAAA,CAAA,EAAM3Q,KAAK8Q,OAAOuC,aAAa1C,WAEjD,OAFM2C,EAAYpL,EAAA7I,OACMiU,EAAU7B,YAAchH,KAAKD,MAGrD,CAAA,GAAO,GAFe,CAAA,GAAO,UAK7B,kBADAuF,QAAQtC,MAAM8F,GACd,CAAA,GAAO,wBAEV,EACHhD,CAAA,ICnIAiD,EAAA,WAQE,SAAAA,EACmB3F,EACA0B,EACAkE,EACAC,EACAC,EACAC,GALA5T,KAAA6N,iBAAAA,EACA7N,KAAAuP,UAAAA,EACAvP,KAAAyT,oBAAAA,EACAzT,KAAA0T,wBAAAA,EACA1T,KAAA2T,4BAAAA,EACA3T,KAAA4T,cAAAA,EAEjB5T,KAAK6T,kBAAoB,IAAIjG,EAAkBC,GAC/C7N,KAAK8T,gBAAkB,IAAIxE,EAAgBC,GAC3CvP,KAAK+T,qBAAuBN,EAC5BzT,KAAKgU,yBAA2BN,EAChC1T,KAAKiU,6BAA+BN,EACpC3T,KAAKkU,eAAiBN,CACxB,CAiHF,OA/GUJ,EAAA5T,UAAAuU,eAAR,SACExD,EACAC,GAEA,OAAO,IAAIL,EACTvQ,KAAK+T,qBACL/T,KAAKgU,yBACLhU,KAAKiU,6BACLtD,EACAC,EAEJ,EAEa4C,EAAA5T,UAAAwU,mBAAb,SAAAC,GACE,OAAAzW,EAAAoC,KAAAsU,eAAA,EAAA,SAAA5E,EACAoC,uBAAA,IAAAA,IAAAA,GAAA,sBAOA,GALMyC,EAAcvU,KAAKmU,mBACnBK,EAAqBD,EAAY1C,mBACrCnC,EACAoC,IAEQ,MAAM,IAAIpK,MAAM,2CAC1B,MAAA,CAAA,EAAO8M,MACR,EAEYhB,EAAA5T,UAAA6U,2BAAb,SACEvQ,EACAwQ,uGAGa,MAAA,CAAA,EADO1U,KAAKmU,iBACMhC,sBAAsBjO,WACrD,KADMyQ,EAAOzM,EAAA7I,QACF,MAAM,IAAIqI,MAAM,yCAO3B,OANMkN,EAAwBD,EAAK/D,aAC/B5Q,KAAK6T,kBAAkB9F,cAAc4G,EAAK/D,mBAC1CiE,EACEC,EAAsBH,EAAK7B,kBAC7B9S,KAAK6T,kBAAkB9F,cAAc4G,EAAK7B,wBAC1C+B,EACJ,CAAA,EAAM7U,KAAK8T,gBAAgB7D,+BAA+B,CACxDW,aAAcgE,EACd9B,kBAAmBgC,EACnBpF,UAAWiF,EAAKjF,oBAEO,OALzBxH,EAAA7I,OAKyB,CAAA,EAAMsM,EAC7B,CACE+D,UAAWiF,EAAKjF,UAChBiB,YAAagE,EAAKhE,aAEpB,CAAE1I,SAAUjI,KAAKkU,yBAEf,OAPEa,EAAmB7M,EAAA7I,OAOrBqV,GAA2BC,EAAK3B,MAClC,CAAA,EAAM0B,EAAwBC,EAAK3B,QADjC,CAAA,EAAA,UACF9K,EAAA7I,wBACF,MAAA,CAAA,EAAO,CACL0V,iBAAgBA,EAChBjC,kBAAmB6B,EAAK7B,wBAE3B,EAQYU,EAAA5T,UAAAoV,kBAAb,SACED,uGAEyB,MAAA,CAAA,EAAM5I,EAC7B4I,EACA,CACE9M,SAAUjI,KAAKkU,yBAGnB,OAAKe,OANCA,EAAmB/M,EAAA7I,aAMJ,EAAhB4V,EAAkBtE,eAAgBsE,eAAAA,EAAkBvF,WAKvD,CAAA,EAAM1P,KAAK8T,gBAAgBrE,4BACzBwF,EAAiBvF,YALnB,CAAA,EAAO,aAOT,OAJMwF,EACJhN,EAAA7I,QAUmB,CAAA,GAJfkV,EAAcvU,KAAKmU,eACvBc,EAAiBtE,YACjBuE,EAActE,eAEuBwC,gBACrC6B,EAAiBtE,cARC,CAAA,EAAO,aAU3B,OAHqBzI,EAAA7I,OAGH,CAAA,EAAO0V,GAGF,CAAA,EAAMR,EAAYtB,mBACvCiC,EAActE,sBAEZ,OAHEuE,EAAiBjN,EAAA7I,QAIO,CAAA,EAAMsM,EAChC,CACE+D,UAAWuF,EAAiBvF,UAC5BiB,YAAawE,GAEf,CAAElN,SAAUjI,KAAKkU,kBANjB,CAAA,EAAA,UAQF,MAAA,CAAA,EAP4BhM,EAAA7I,QAU9B,KAAA,EAAA,MAAA,CAAA,EAAO,UACR,EACHmU,CAAA","x_google_ignoreList":[0,1,2,3,4]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../node_modules/tslib/tslib.es6.js","../../../node_modules/cookie/index.js","../../../node_modules/iron-webcrypto/dist/index.js","../../../node_modules/uncrypto/dist/crypto.web.mjs","../../../node_modules/iron-session/dist/index.js","../../../src/services/FirestoreClient/FirestoreClient.ts","../../../src/services/GoogleClassroom/GoogleClassroomClient.ts","../../../src/services/Encryption/EncryptionService.ts","../../../src/services/GoogleOAuth/GoogleOAuthClient.ts","../../../src/services/OakGoogleClassroom.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/*!\n * cookie\n * Copyright(c) 2012-2014 Roman Shtylman\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module exports.\n * @public\n */\n\nexports.parse = parse;\nexports.serialize = serialize;\n\n/**\n * Module variables.\n * @private\n */\n\nvar __toString = Object.prototype.toString\nvar __hasOwnProperty = Object.prototype.hasOwnProperty\n\n/**\n * RegExp to match cookie-name in RFC 6265 sec 4.1.1\n * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2\n * which has been replaced by the token definition in RFC 7230 appendix B.\n *\n * cookie-name = token\n * token = 1*tchar\n * tchar = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" /\n * \"*\" / \"+\" / \"-\" / \".\" / \"^\" / \"_\" /\n * \"`\" / \"|\" / \"~\" / DIGIT / ALPHA\n */\n\nvar cookieNameRegExp = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n/**\n * RegExp to match cookie-value in RFC 6265 sec 4.1.1\n *\n * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )\n * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E\n * ; US-ASCII characters excluding CTLs,\n * ; whitespace DQUOTE, comma, semicolon,\n * ; and backslash\n */\n\nvar cookieValueRegExp = /^(\"?)[\\u0021\\u0023-\\u002B\\u002D-\\u003A\\u003C-\\u005B\\u005D-\\u007E]*\\1$/;\n\n/**\n * RegExp to match domain-value in RFC 6265 sec 4.1.1\n *\n * domain-value = <subdomain>\n * ; defined in [RFC1034], Section 3.5, as\n * ; enhanced by [RFC1123], Section 2.1\n * <subdomain> = <label> | <subdomain> \".\" <label>\n * <label> = <let-dig> [ [ <ldh-str> ] <let-dig> ]\n * Labels must be 63 characters or less.\n * 'let-dig' not 'letter' in the first char, per RFC1123\n * <ldh-str> = <let-dig-hyp> | <let-dig-hyp> <ldh-str>\n * <let-dig-hyp> = <let-dig> | \"-\"\n * <let-dig> = <letter> | <digit>\n * <letter> = any one of the 52 alphabetic characters A through Z in\n * upper case and a through z in lower case\n * <digit> = any one of the ten digits 0 through 9\n *\n * Keep support for leading dot: https://github.com/jshttp/cookie/issues/173\n *\n * > (Note that a leading %x2E (\".\"), if present, is ignored even though that\n * character is not permitted, but a trailing %x2E (\".\"), if present, will\n * cause the user agent to ignore the attribute.)\n */\n\nvar domainValueRegExp = /^([.]?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)([.][a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;\n\n/**\n * RegExp to match path-value in RFC 6265 sec 4.1.1\n *\n * path-value = <any CHAR except CTLs or \";\">\n * CHAR = %x01-7F\n * ; defined in RFC 5234 appendix B.1\n */\n\nvar pathValueRegExp = /^[\\u0020-\\u003A\\u003D-\\u007E]*$/;\n\n/**\n * Parse a cookie header.\n *\n * Parse the given cookie header string into an object\n * The object has the various cookies as keys(names) => values\n *\n * @param {string} str\n * @param {object} [opt]\n * @return {object}\n * @public\n */\n\nfunction parse(str, opt) {\n if (typeof str !== 'string') {\n throw new TypeError('argument str must be a string');\n }\n\n var obj = {};\n var len = str.length;\n // RFC 6265 sec 4.1.1, RFC 2616 2.2 defines a cookie name consists of one char minimum, plus '='.\n if (len < 2) return obj;\n\n var dec = (opt && opt.decode) || decode;\n var index = 0;\n var eqIdx = 0;\n var endIdx = 0;\n\n do {\n eqIdx = str.indexOf('=', index);\n if (eqIdx === -1) break; // No more cookie pairs.\n\n endIdx = str.indexOf(';', index);\n\n if (endIdx === -1) {\n endIdx = len;\n } else if (eqIdx > endIdx) {\n // backtrack on prior semicolon\n index = str.lastIndexOf(';', eqIdx - 1) + 1;\n continue;\n }\n\n var keyStartIdx = startIndex(str, index, eqIdx);\n var keyEndIdx = endIndex(str, eqIdx, keyStartIdx);\n var key = str.slice(keyStartIdx, keyEndIdx);\n\n // only assign once\n if (!__hasOwnProperty.call(obj, key)) {\n var valStartIdx = startIndex(str, eqIdx + 1, endIdx);\n var valEndIdx = endIndex(str, endIdx, valStartIdx);\n\n if (str.charCodeAt(valStartIdx) === 0x22 /* \" */ && str.charCodeAt(valEndIdx - 1) === 0x22 /* \" */) {\n valStartIdx++;\n valEndIdx--;\n }\n\n var val = str.slice(valStartIdx, valEndIdx);\n obj[key] = tryDecode(val, dec);\n }\n\n index = endIdx + 1\n } while (index < len);\n\n return obj;\n}\n\nfunction startIndex(str, index, max) {\n do {\n var code = str.charCodeAt(index);\n if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index;\n } while (++index < max);\n return max;\n}\n\nfunction endIndex(str, index, min) {\n while (index > min) {\n var code = str.charCodeAt(--index);\n if (code !== 0x20 /* */ && code !== 0x09 /* \\t */) return index + 1;\n }\n return min;\n}\n\n/**\n * Serialize data into a cookie header.\n *\n * Serialize a name value pair into a cookie string suitable for\n * http headers. An optional options object specifies cookie parameters.\n *\n * serialize('foo', 'bar', { httpOnly: true })\n * => \"foo=bar; httpOnly\"\n *\n * @param {string} name\n * @param {string} val\n * @param {object} [opt]\n * @return {string}\n * @public\n */\n\nfunction serialize(name, val, opt) {\n var enc = (opt && opt.encode) || encodeURIComponent;\n\n if (typeof enc !== 'function') {\n throw new TypeError('option encode is invalid');\n }\n\n if (!cookieNameRegExp.test(name)) {\n throw new TypeError('argument name is invalid');\n }\n\n var value = enc(val);\n\n if (!cookieValueRegExp.test(value)) {\n throw new TypeError('argument val is invalid');\n }\n\n var str = name + '=' + value;\n if (!opt) return str;\n\n if (null != opt.maxAge) {\n var maxAge = Math.floor(opt.maxAge);\n\n if (!isFinite(maxAge)) {\n throw new TypeError('option maxAge is invalid')\n }\n\n str += '; Max-Age=' + maxAge;\n }\n\n if (opt.domain) {\n if (!domainValueRegExp.test(opt.domain)) {\n throw new TypeError('option domain is invalid');\n }\n\n str += '; Domain=' + opt.domain;\n }\n\n if (opt.path) {\n if (!pathValueRegExp.test(opt.path)) {\n throw new TypeError('option path is invalid');\n }\n\n str += '; Path=' + opt.path;\n }\n\n if (opt.expires) {\n var expires = opt.expires\n\n if (!isDate(expires) || isNaN(expires.valueOf())) {\n throw new TypeError('option expires is invalid');\n }\n\n str += '; Expires=' + expires.toUTCString()\n }\n\n if (opt.httpOnly) {\n str += '; HttpOnly';\n }\n\n if (opt.secure) {\n str += '; Secure';\n }\n\n if (opt.partitioned) {\n str += '; Partitioned'\n }\n\n if (opt.priority) {\n var priority = typeof opt.priority === 'string'\n ? opt.priority.toLowerCase() : opt.priority;\n\n switch (priority) {\n case 'low':\n str += '; Priority=Low'\n break\n case 'medium':\n str += '; Priority=Medium'\n break\n case 'high':\n str += '; Priority=High'\n break\n default:\n throw new TypeError('option priority is invalid')\n }\n }\n\n if (opt.sameSite) {\n var sameSite = typeof opt.sameSite === 'string'\n ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n switch (sameSite) {\n case true:\n str += '; SameSite=Strict';\n break;\n case 'lax':\n str += '; SameSite=Lax';\n break;\n case 'strict':\n str += '; SameSite=Strict';\n break;\n case 'none':\n str += '; SameSite=None';\n break;\n default:\n throw new TypeError('option sameSite is invalid');\n }\n }\n\n return str;\n}\n\n/**\n * URL-decode string value. Optimized to skip native call when no %.\n *\n * @param {string} str\n * @returns {string}\n */\n\nfunction decode (str) {\n return str.indexOf('%') !== -1\n ? decodeURIComponent(str)\n : str\n}\n\n/**\n * Determine if value is a Date.\n *\n * @param {*} val\n * @private\n */\n\nfunction isDate (val) {\n return __toString.call(val) === '[object Date]';\n}\n\n/**\n * Try decoding a string using a decoding function.\n *\n * @param {string} str\n * @param {function} decode\n * @private\n */\n\nfunction tryDecode(str, decode) {\n try {\n return decode(str);\n } catch (e) {\n return str;\n }\n}\n","// src/utils.ts\nvar alphabetByEncoding = {};\nvar alphabetByValue = Array.from({ length: 64 });\nfor (let i = 0, start = \"A\".charCodeAt(0), limit = \"Z\".charCodeAt(0); i + start <= limit; i++) {\n const char = String.fromCharCode(i + start);\n alphabetByEncoding[char] = i;\n alphabetByValue[i] = char;\n}\nfor (let i = 0, start = \"a\".charCodeAt(0), limit = \"z\".charCodeAt(0); i + start <= limit; i++) {\n const char = String.fromCharCode(i + start);\n const index = i + 26;\n alphabetByEncoding[char] = index;\n alphabetByValue[index] = char;\n}\nfor (let i = 0; i < 10; i++) {\n alphabetByEncoding[i.toString(10)] = i + 52;\n const char = i.toString(10);\n const index = i + 52;\n alphabetByEncoding[char] = index;\n alphabetByValue[index] = char;\n}\nalphabetByEncoding[\"-\"] = 62;\nalphabetByValue[62] = \"-\";\nalphabetByEncoding[\"_\"] = 63;\nalphabetByValue[63] = \"_\";\nvar bitsPerLetter = 6;\nvar bitsPerByte = 8;\nvar maxLetterValue = 63;\nvar stringToBuffer = (value) => {\n return new TextEncoder().encode(value);\n};\nvar bufferToString = (value) => {\n return new TextDecoder().decode(value);\n};\nvar base64urlDecode = (_input) => {\n const input = _input + \"=\".repeat((4 - _input.length % 4) % 4);\n let totalByteLength = input.length / 4 * 3;\n if (input.endsWith(\"==\")) {\n totalByteLength -= 2;\n } else if (input.endsWith(\"=\")) {\n totalByteLength--;\n }\n const out = new ArrayBuffer(totalByteLength);\n const dataView = new DataView(out);\n for (let i = 0; i < input.length; i += 4) {\n let bits = 0;\n let bitLength = 0;\n for (let j = i, limit = i + 3; j <= limit; j++) {\n if (input[j] === \"=\") {\n bits >>= bitsPerLetter;\n } else {\n if (!(input[j] in alphabetByEncoding)) {\n throw new TypeError(`Invalid character ${input[j]} in base64 string.`);\n }\n bits |= alphabetByEncoding[input[j]] << (limit - j) * bitsPerLetter;\n bitLength += bitsPerLetter;\n }\n }\n const chunkOffset = i / 4 * 3;\n bits >>= bitLength % bitsPerByte;\n const byteLength = Math.floor(bitLength / bitsPerByte);\n for (let k = 0; k < byteLength; k++) {\n const offset = (byteLength - k - 1) * bitsPerByte;\n dataView.setUint8(chunkOffset + k, (bits & 255 << offset) >> offset);\n }\n }\n return new Uint8Array(out);\n};\nvar base64urlEncode = (_input) => {\n const input = typeof _input === \"string\" ? stringToBuffer(_input) : _input;\n let str = \"\";\n for (let i = 0; i < input.length; i += 3) {\n let bits = 0;\n let bitLength = 0;\n for (let j = i, limit = Math.min(i + 3, input.length); j < limit; j++) {\n bits |= input[j] << (limit - j - 1) * bitsPerByte;\n bitLength += bitsPerByte;\n }\n const bitClusterCount = Math.ceil(bitLength / bitsPerLetter);\n bits <<= bitClusterCount * bitsPerLetter - bitLength;\n for (let k = 1; k <= bitClusterCount; k++) {\n const offset = (bitClusterCount - k) * bitsPerLetter;\n str += alphabetByValue[(bits & maxLetterValue << offset) >> offset];\n }\n }\n return str;\n};\n\n// src/index.ts\nvar defaults = {\n encryption: { saltBits: 256, algorithm: \"aes-256-cbc\", iterations: 1, minPasswordlength: 32 },\n integrity: { saltBits: 256, algorithm: \"sha256\", iterations: 1, minPasswordlength: 32 },\n ttl: 0,\n timestampSkewSec: 60,\n localtimeOffsetMsec: 0\n};\nvar clone = (options) => ({\n ...options,\n encryption: { ...options.encryption },\n integrity: { ...options.integrity }\n});\nvar algorithms = {\n \"aes-128-ctr\": { keyBits: 128, ivBits: 128, name: \"AES-CTR\" },\n \"aes-256-cbc\": { keyBits: 256, ivBits: 128, name: \"AES-CBC\" },\n sha256: { keyBits: 256, name: \"SHA-256\" }\n};\nvar macFormatVersion = \"2\";\nvar macPrefix = \"Fe26.2\";\nvar randomBytes = (_crypto, size) => {\n const bytes = new Uint8Array(size);\n _crypto.getRandomValues(bytes);\n return bytes;\n};\nvar randomBits = (_crypto, bits) => {\n if (bits < 1)\n throw new Error(\"Invalid random bits count\");\n const bytes = Math.ceil(bits / 8);\n return randomBytes(_crypto, bytes);\n};\nvar pbkdf2 = async (_crypto, password, salt, iterations, keyLength, hash) => {\n const passwordBuffer = stringToBuffer(password);\n const importedKey = await _crypto.subtle.importKey(\n \"raw\",\n passwordBuffer,\n { name: \"PBKDF2\" },\n false,\n [\"deriveBits\"]\n );\n const saltBuffer = stringToBuffer(salt);\n const params = { name: \"PBKDF2\", hash, salt: saltBuffer, iterations };\n const derivation = await _crypto.subtle.deriveBits(params, importedKey, keyLength * 8);\n return derivation;\n};\nvar generateKey = async (_crypto, password, options) => {\n var _a;\n if (!(password == null ? void 0 : password.length))\n throw new Error(\"Empty password\");\n if (options == null || typeof options !== \"object\")\n throw new Error(\"Bad options\");\n if (!(options.algorithm in algorithms))\n throw new Error(`Unknown algorithm: ${options.algorithm}`);\n const algorithm = algorithms[options.algorithm];\n const result = {};\n const hmac = (_a = options.hmac) != null ? _a : false;\n const id = hmac ? { name: \"HMAC\", hash: algorithm.name } : { name: algorithm.name };\n const usage = hmac ? [\"sign\", \"verify\"] : [\"encrypt\", \"decrypt\"];\n if (typeof password === \"string\") {\n if (password.length < options.minPasswordlength)\n throw new Error(\n `Password string too short (min ${options.minPasswordlength} characters required)`\n );\n let { salt = \"\" } = options;\n if (!salt) {\n const { saltBits = 0 } = options;\n if (!saltBits)\n throw new Error(\"Missing salt and saltBits options\");\n const randomSalt = randomBits(_crypto, saltBits);\n salt = [...new Uint8Array(randomSalt)].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n }\n const derivedKey = await pbkdf2(\n _crypto,\n password,\n salt,\n options.iterations,\n algorithm.keyBits / 8,\n \"SHA-1\"\n );\n const importedEncryptionKey = await _crypto.subtle.importKey(\n \"raw\",\n derivedKey,\n id,\n false,\n usage\n );\n result.key = importedEncryptionKey;\n result.salt = salt;\n } else {\n if (password.length < algorithm.keyBits / 8)\n throw new Error(\"Key buffer (password) too small\");\n result.key = await _crypto.subtle.importKey(\"raw\", password, id, false, usage);\n result.salt = \"\";\n }\n if (options.iv)\n result.iv = options.iv;\n else if (\"ivBits\" in algorithm)\n result.iv = randomBits(_crypto, algorithm.ivBits);\n return result;\n};\nvar getEncryptParams = (algorithm, key, data) => {\n return [\n algorithm === \"aes-128-ctr\" ? { name: \"AES-CTR\", counter: key.iv, length: 128 } : { name: \"AES-CBC\", iv: key.iv },\n key.key,\n typeof data === \"string\" ? stringToBuffer(data) : data\n ];\n};\nvar encrypt = async (_crypto, password, options, data) => {\n const key = await generateKey(_crypto, password, options);\n const encrypted = await _crypto.subtle.encrypt(...getEncryptParams(options.algorithm, key, data));\n return { encrypted: new Uint8Array(encrypted), key };\n};\nvar decrypt = async (_crypto, password, options, data) => {\n const key = await generateKey(_crypto, password, options);\n const decrypted = await _crypto.subtle.decrypt(...getEncryptParams(options.algorithm, key, data));\n return bufferToString(new Uint8Array(decrypted));\n};\nvar hmacWithPassword = async (_crypto, password, options, data) => {\n const key = await generateKey(_crypto, password, { ...options, hmac: true });\n const textBuffer = stringToBuffer(data);\n const signed = await _crypto.subtle.sign({ name: \"HMAC\" }, key.key, textBuffer);\n const digest = base64urlEncode(new Uint8Array(signed));\n return { digest, salt: key.salt };\n};\nvar normalizePassword = (password) => {\n if (typeof password === \"string\" || password instanceof Uint8Array)\n return { encryption: password, integrity: password };\n if (\"secret\" in password)\n return { id: password.id, encryption: password.secret, integrity: password.secret };\n return { id: password.id, encryption: password.encryption, integrity: password.integrity };\n};\nvar seal = async (_crypto, object, password, options) => {\n if (!password)\n throw new Error(\"Empty password\");\n const opts = clone(options);\n const now = Date.now() + (opts.localtimeOffsetMsec || 0);\n const objectString = JSON.stringify(object);\n const pass = normalizePassword(password);\n const { id = \"\", encryption, integrity } = pass;\n if (id && !/^\\w+$/.test(id))\n throw new Error(\"Invalid password id\");\n const { encrypted, key } = await encrypt(_crypto, encryption, opts.encryption, objectString);\n const encryptedB64 = base64urlEncode(new Uint8Array(encrypted));\n const iv = base64urlEncode(key.iv);\n const expiration = opts.ttl ? now + opts.ttl : \"\";\n const macBaseString = `${macPrefix}*${id}*${key.salt}*${iv}*${encryptedB64}*${expiration}`;\n const mac = await hmacWithPassword(_crypto, integrity, opts.integrity, macBaseString);\n const sealed = `${macBaseString}*${mac.salt}*${mac.digest}`;\n return sealed;\n};\nvar fixedTimeComparison = (a, b) => {\n let mismatch = a.length === b.length ? 0 : 1;\n if (mismatch)\n b = a;\n for (let i = 0; i < a.length; i += 1)\n mismatch |= a.charCodeAt(i) ^ b.charCodeAt(i);\n return mismatch === 0;\n};\nvar unseal = async (_crypto, sealed, password, options) => {\n if (!password)\n throw new Error(\"Empty password\");\n const opts = clone(options);\n const now = Date.now() + (opts.localtimeOffsetMsec || 0);\n const parts = sealed.split(\"*\");\n if (parts.length !== 8)\n throw new Error(\"Incorrect number of sealed components\");\n const prefix = parts[0];\n let passwordId = parts[1];\n const encryptionSalt = parts[2];\n const encryptionIv = parts[3];\n const encryptedB64 = parts[4];\n const expiration = parts[5];\n const hmacSalt = parts[6];\n const hmac = parts[7];\n const macBaseString = `${prefix}*${passwordId}*${encryptionSalt}*${encryptionIv}*${encryptedB64}*${expiration}`;\n if (macPrefix !== prefix)\n throw new Error(\"Wrong mac prefix\");\n if (expiration) {\n if (!/^\\d+$/.test(expiration))\n throw new Error(\"Invalid expiration\");\n const exp = Number.parseInt(expiration, 10);\n if (exp <= now - opts.timestampSkewSec * 1e3)\n throw new Error(\"Expired seal\");\n }\n let pass = \"\";\n passwordId = passwordId || \"default\";\n if (typeof password === \"string\" || password instanceof Uint8Array)\n pass = password;\n else if (passwordId in password) {\n pass = password[passwordId];\n } else {\n throw new Error(`Cannot find password: ${passwordId}`);\n }\n pass = normalizePassword(pass);\n const macOptions = opts.integrity;\n macOptions.salt = hmacSalt;\n const mac = await hmacWithPassword(_crypto, pass.integrity, macOptions, macBaseString);\n if (!fixedTimeComparison(mac.digest, hmac))\n throw new Error(\"Bad hmac value\");\n const encrypted = base64urlDecode(encryptedB64);\n const decryptOptions = opts.encryption;\n decryptOptions.salt = encryptionSalt;\n decryptOptions.iv = base64urlDecode(encryptionIv);\n const decrypted = await decrypt(_crypto, pass.encryption, decryptOptions, encrypted);\n if (decrypted)\n return JSON.parse(decrypted);\n return null;\n};\n\nexport { algorithms, base64urlDecode, base64urlEncode, bufferToString, clone, decrypt, defaults, encrypt, generateKey, hmacWithPassword, macFormatVersion, macPrefix, randomBits, seal, stringToBuffer, unseal };\n","const webCrypto = globalThis.crypto;\nconst subtle = webCrypto.subtle;\nconst randomUUID = () => {\n return webCrypto.randomUUID();\n};\nconst getRandomValues = (array) => {\n return webCrypto.getRandomValues(array);\n};\nconst _crypto = {\n randomUUID,\n getRandomValues,\n subtle\n};\n\nexport { _crypto as default, getRandomValues, randomUUID, subtle };\n","import { serialize, parse } from 'cookie';\nimport { seal, defaults, unseal } from 'iron-webcrypto';\nimport * as crypto from 'uncrypto';\n\n// src/core.ts\nvar timestampSkewSec = 60;\nvar fourteenDaysInSeconds = 14 * 24 * 3600;\nvar currentMajorVersion = 2;\nvar versionDelimiter = \"~\";\nvar defaultOptions = {\n ttl: fourteenDaysInSeconds,\n cookieOptions: { httpOnly: true, secure: true, sameSite: \"lax\", path: \"/\" }\n};\nfunction normalizeStringPasswordToMap(password) {\n return typeof password === \"string\" ? { 1: password } : password;\n}\nfunction parseSeal(seal) {\n const [sealWithoutVersion, tokenVersionAsString] = seal.split(versionDelimiter);\n const tokenVersion = tokenVersionAsString == null ? null : parseInt(tokenVersionAsString, 10);\n return { sealWithoutVersion, tokenVersion };\n}\nfunction computeCookieMaxAge(ttl) {\n if (ttl === 0) {\n return 2147483647;\n }\n return ttl - timestampSkewSec;\n}\nfunction getCookie(req, cookieName) {\n return parse(\n (\"headers\" in req && typeof req.headers.get === \"function\" ? req.headers.get(\"cookie\") : req.headers.cookie) ?? \"\"\n )[cookieName] ?? \"\";\n}\nfunction getServerActionCookie(cookieName, cookieHandler) {\n const cookieObject = cookieHandler.get(cookieName);\n const cookie = cookieObject?.value;\n if (typeof cookie === \"string\") {\n return cookie;\n }\n return \"\";\n}\nfunction setCookie(res, cookieValue) {\n if (\"headers\" in res && typeof res.headers.append === \"function\") {\n res.headers.append(\"set-cookie\", cookieValue);\n return;\n }\n let existingSetCookie = res.getHeader(\"set-cookie\") ?? [];\n if (!Array.isArray(existingSetCookie)) {\n existingSetCookie = [existingSetCookie.toString()];\n }\n res.setHeader(\"set-cookie\", [\n ...existingSetCookie,\n cookieValue\n ]);\n}\nfunction createSealData(_crypto) {\n return async function sealData2(data, {\n password,\n ttl = fourteenDaysInSeconds\n }) {\n const passwordsMap = normalizeStringPasswordToMap(password);\n const mostRecentPasswordId = Math.max(\n ...Object.keys(passwordsMap).map(Number)\n );\n const passwordForSeal = {\n id: mostRecentPasswordId.toString(),\n secret: passwordsMap[mostRecentPasswordId]\n };\n const seal$1 = await seal(_crypto, data, passwordForSeal, {\n ...defaults,\n ttl: ttl * 1e3\n });\n return `${seal$1}${versionDelimiter}${currentMajorVersion}`;\n };\n}\nfunction createUnsealData(_crypto) {\n return async function unsealData2(seal, {\n password,\n ttl = fourteenDaysInSeconds\n }) {\n const passwordsMap = normalizeStringPasswordToMap(password);\n const { sealWithoutVersion, tokenVersion } = parseSeal(seal);\n try {\n const data = await unseal(_crypto, sealWithoutVersion, passwordsMap, {\n ...defaults,\n ttl: ttl * 1e3\n }) ?? {};\n if (tokenVersion === 2) {\n return data;\n }\n return { ...data.persistent };\n } catch (error) {\n if (error instanceof Error && /^(Expired seal|Bad hmac value|Cannot find password|Incorrect number of sealed components)/.test(\n error.message\n )) {\n return {};\n }\n throw error;\n }\n };\n}\nfunction getSessionConfig(sessionOptions) {\n const options = {\n ...defaultOptions,\n ...sessionOptions,\n cookieOptions: {\n ...defaultOptions.cookieOptions,\n ...sessionOptions.cookieOptions || {}\n }\n };\n if (sessionOptions.cookieOptions && \"maxAge\" in sessionOptions.cookieOptions) {\n if (sessionOptions.cookieOptions.maxAge === void 0) {\n options.ttl = 0;\n }\n } else {\n options.cookieOptions.maxAge = computeCookieMaxAge(options.ttl);\n }\n return options;\n}\nvar badUsageMessage = \"iron-session: Bad usage: use getIronSession(req, res, options) or getIronSession(cookieStore, options).\";\nfunction createGetIronSession(sealData2, unsealData2) {\n return getIronSession2;\n async function getIronSession2(reqOrCookieStore, resOrsessionOptions, sessionOptions) {\n if (!reqOrCookieStore) {\n throw new Error(badUsageMessage);\n }\n if (!resOrsessionOptions) {\n throw new Error(badUsageMessage);\n }\n if (!sessionOptions) {\n return getIronSessionFromCookieStore(\n reqOrCookieStore,\n resOrsessionOptions,\n sealData2,\n unsealData2\n );\n }\n const req = reqOrCookieStore;\n const res = resOrsessionOptions;\n if (!sessionOptions) {\n throw new Error(badUsageMessage);\n }\n if (!sessionOptions.cookieName) {\n throw new Error(\"iron-session: Bad usage. Missing cookie name.\");\n }\n if (!sessionOptions.password) {\n throw new Error(\"iron-session: Bad usage. Missing password.\");\n }\n const passwordsMap = normalizeStringPasswordToMap(sessionOptions.password);\n if (Object.values(passwordsMap).some((password) => password.length < 32)) {\n throw new Error(\n \"iron-session: Bad usage. Password must be at least 32 characters long.\"\n );\n }\n let sessionConfig = getSessionConfig(sessionOptions);\n const sealFromCookies = getCookie(req, sessionConfig.cookieName);\n const session = sealFromCookies ? await unsealData2(sealFromCookies, {\n password: passwordsMap,\n ttl: sessionConfig.ttl\n }) : {};\n Object.defineProperties(session, {\n updateConfig: {\n value: function updateConfig(newSessionOptions) {\n sessionConfig = getSessionConfig(newSessionOptions);\n }\n },\n save: {\n value: async function save() {\n if (\"headersSent\" in res && res.headersSent) {\n throw new Error(\n \"iron-session: Cannot set session cookie: session.save() was called after headers were sent. Make sure to call it before any res.send() or res.end()\"\n );\n }\n const seal = await sealData2(session, {\n password: passwordsMap,\n ttl: sessionConfig.ttl\n });\n const cookieValue = serialize(\n sessionConfig.cookieName,\n seal,\n sessionConfig.cookieOptions\n );\n if (cookieValue.length > 4096) {\n throw new Error(\n `iron-session: Cookie length is too big (${cookieValue.length} bytes), browsers will refuse it. Try to remove some data.`\n );\n }\n setCookie(res, cookieValue);\n }\n },\n destroy: {\n value: function destroy() {\n Object.keys(session).forEach((key) => {\n delete session[key];\n });\n const cookieValue = serialize(sessionConfig.cookieName, \"\", {\n ...sessionConfig.cookieOptions,\n maxAge: 0\n });\n setCookie(res, cookieValue);\n }\n }\n });\n return session;\n }\n}\nasync function getIronSessionFromCookieStore(cookieStore, sessionOptions, sealData2, unsealData2) {\n if (!sessionOptions.cookieName) {\n throw new Error(\"iron-session: Bad usage. Missing cookie name.\");\n }\n if (!sessionOptions.password) {\n throw new Error(\"iron-session: Bad usage. Missing password.\");\n }\n const passwordsMap = normalizeStringPasswordToMap(sessionOptions.password);\n if (Object.values(passwordsMap).some((password) => password.length < 32)) {\n throw new Error(\n \"iron-session: Bad usage. Password must be at least 32 characters long.\"\n );\n }\n let sessionConfig = getSessionConfig(sessionOptions);\n const sealFromCookies = getServerActionCookie(\n sessionConfig.cookieName,\n cookieStore\n );\n const session = sealFromCookies ? await unsealData2(sealFromCookies, {\n password: passwordsMap,\n ttl: sessionConfig.ttl\n }) : {};\n Object.defineProperties(session, {\n updateConfig: {\n value: function updateConfig(newSessionOptions) {\n sessionConfig = getSessionConfig(newSessionOptions);\n }\n },\n save: {\n value: async function save() {\n const seal = await sealData2(session, {\n password: passwordsMap,\n ttl: sessionConfig.ttl\n });\n const cookieLength = sessionConfig.cookieName.length + seal.length + JSON.stringify(sessionConfig.cookieOptions).length;\n if (cookieLength > 4096) {\n throw new Error(\n `iron-session: Cookie length is too big (${cookieLength} bytes), browsers will refuse it. Try to remove some data.`\n );\n }\n cookieStore.set(\n sessionConfig.cookieName,\n seal,\n sessionConfig.cookieOptions\n );\n }\n },\n destroy: {\n value: function destroy() {\n Object.keys(session).forEach((key) => {\n delete session[key];\n });\n const cookieOptions = { ...sessionConfig.cookieOptions, maxAge: 0 };\n cookieStore.set(sessionConfig.cookieName, \"\", cookieOptions);\n }\n }\n });\n return session;\n}\nvar sealData = createSealData(crypto);\nvar unsealData = createUnsealData(crypto);\nvar getIronSession = createGetIronSession(sealData, unsealData);\n\nexport { getIronSession, sealData, unsealData };\n//# sourceMappingURL=index.js.map\n//# sourceMappingURL=index.js.map","import { Firestore } from \"@google-cloud/firestore\";\n\nimport { ClassroomAttachment } from \"@/services/GoogleClassroom/GoogleClassroomClient\";\n\nexport type UserCredentialsEntity = {\n loginHint: string;\n refreshToken: string;\n profilePictureUrl?: string;\n};\n\nexport type ClassroomAttachmentEntity = ClassroomAttachment & {\n attachmentId: string;\n createdAt: string;\n};\n\nenum FirestoreCollections {\n CONNECTED_USERS_CREDENTIALS = \"connectedUsersCredentials\",\n CLASSROOM_ATTACHMENTS = \"classroomAttachments\",\n}\n\nexport class FirestoreClient {\n private _firestore: Firestore;\n\n constructor(private readonly firestore: Firestore) {\n this._firestore = firestore;\n }\n\n public async getConnectedUserCredentials(\n loginHint: string,\n ): Promise<UserCredentialsEntity | null> {\n try {\n const doc = await this._firestore\n .collection(FirestoreCollections.CONNECTED_USERS_CREDENTIALS)\n .doc(loginHint)\n .get();\n // todo: zod schema validation\n return doc as unknown as UserCredentialsEntity; // can remove cast with zod\n } catch (error) {\n console.error(error);\n throw new Error(\"Failed to save users credentials\");\n }\n }\n\n public async upsertConnectedUserCredentials(\n credentials: Omit<UserCredentialsEntity, \"refreshToken\"> & {\n refreshToken?: string;\n },\n ): Promise<void> {\n try {\n // todo: zod schema validation\n this._firestore.settings({ ignoreUndefinedProperties: true });\n await this._firestore\n .collection(FirestoreCollections.CONNECTED_USERS_CREDENTIALS)\n .doc(credentials.loginHint)\n .set(credentials);\n } catch (error) {\n console.error(error);\n throw new Error(\"Failed to upsert users credentials\");\n }\n }\n\n public async upsertClassroomAttachment(\n data: ClassroomAttachmentEntity,\n ): Promise<void> {\n try {\n await this._firestore\n .collection(FirestoreCollections.CLASSROOM_ATTACHMENTS)\n .doc(data.attachmentId)\n .set(data);\n } catch (error) {\n console.error(error);\n throw new Error(\"Failed to upsert classroom attachment\");\n }\n }\n\n public async getClassroomAttachmentById(attachmentId: string) {\n try {\n const querySnapshot = await this._firestore\n .collection(FirestoreCollections.CLASSROOM_ATTACHMENTS)\n .doc(attachmentId)\n .get();\n\n if (!querySnapshot.exists) {\n return null;\n }\n\n // Assuming attachmentId is unique, we take the first matching document\n const doc = querySnapshot;\n return doc.data();\n } catch (error) {\n console.error(error);\n throw new Error(\"Failed to get classroom attachment by ID\");\n }\n }\n}\n","import { classroom_v1 } from \"@googleapis/classroom\";\n\nimport { GoogleOAuthClient } from \"@/services/GoogleOAuth\";\n\nexport type CreateAnnouncementAttachmentArgs = {\n courseId: string;\n itemId: string;\n addOnToken: string;\n title: string;\n lessonSlug: string;\n programeSlug: string;\n unitSlug: string;\n maxPoints?: number;\n};\n\nexport type SubmitPupilResponseArgs = {\n courseId: string;\n itemId: string;\n attachmentId: string;\n submissionId: string;\n pointsEarned: number;\n};\n\nexport type FetchPupilResponseArgs = {\n courseId: string;\n itemId: string;\n attachmentId: string;\n submissionId: string;\n};\n\nexport type ClassroomAttachment = {\n courseId: classroom_v1.Schema$AddOnAttachment[\"courseId\"];\n postId: classroom_v1.Schema$AddOnAttachment[\"postId\"];\n id: classroom_v1.Schema$AddOnAttachment[\"id\"];\n title: classroom_v1.Schema$AddOnAttachment[\"title\"];\n teacherViewUri?: classroom_v1.Schema$EmbedUri;\n studentViewUri?: classroom_v1.Schema$EmbedUri;\n studentWorkReviewUri?: classroom_v1.Schema$EmbedUri;\n itemId: classroom_v1.Schema$AddOnAttachment[\"itemId\"];\n maxPoints?: classroom_v1.Schema$AddOnAttachment[\"maxPoints\"];\n};\n\nexport type ClassroomApi = classroom_v1.Classroom;\n\nexport class GoogleClassroomClient {\n constructor(\n private readonly baseUrl: string,\n private readonly oAuthClient: GoogleOAuthClient,\n ) {\n this.baseUrl = baseUrl;\n this.oAuthClient = oAuthClient;\n }\n\n private async getClassroomClient(): Promise<ClassroomApi> {\n const auth2Client = await this.oAuthClient.getOAuth2Client();\n const classroom = new classroom_v1.Classroom({\n auth: auth2Client,\n });\n return classroom;\n }\n\n public async createAnnouncementAttachment(\n args: CreateAnnouncementAttachmentArgs,\n ): Promise<ClassroomAttachment> {\n const {\n courseId,\n itemId,\n addOnToken,\n title,\n lessonSlug,\n programeSlug,\n unitSlug,\n maxPoints,\n } = args;\n const classroom = await this.getClassroomClient();\n const attachment =\n await classroom.courses.courseWork.addOnAttachments.create({\n courseId,\n itemId,\n addOnToken,\n requestBody: {\n title,\n teacherViewUri: {\n uri: `${this.baseUrl}/pupils/programmes/${programeSlug}/units/${unitSlug}/lessons/${lessonSlug}`,\n },\n studentViewUri: {\n uri: `${this.baseUrl}/pupils/programmes/${programeSlug}/units/${unitSlug}/lessons/${lessonSlug}`,\n },\n studentWorkReviewUri: maxPoints\n ? {\n uri: `${this.baseUrl}/pupils/programmes/${programeSlug}/units/${unitSlug}/lessons/${lessonSlug}`,\n }\n : undefined,\n maxPoints,\n },\n });\n\n return {\n courseId: attachment.data.courseId,\n postId: attachment.data.postId,\n id: attachment.data.id,\n title: attachment.data.title,\n teacherViewUri: attachment.data.teacherViewUri,\n studentViewUri: attachment.data.studentViewUri,\n studentWorkReviewUri: attachment.data.studentWorkReviewUri,\n itemId: attachment.data.itemId,\n maxPoints: attachment.data.maxPoints,\n };\n }\n\n public async submitPupilResponse(\n args: SubmitPupilResponseArgs,\n ): Promise<classroom_v1.Schema$AddOnAttachmentStudentSubmission> {\n const classroom = await this.getClassroomClient();\n const res =\n await classroom.courses.courseWork.addOnAttachments.studentSubmissions.patch(\n {\n courseId: args.courseId,\n itemId: args.itemId,\n attachmentId: args.attachmentId,\n submissionId: args.submissionId,\n updateMask: \"pointsEarned\",\n requestBody: { pointsEarned: args.pointsEarned },\n },\n );\n return res.data;\n }\n\n public async fetchPupilResponse(\n args: FetchPupilResponseArgs,\n ): Promise<classroom_v1.Schema$AddOnAttachmentStudentSubmission> {\n const classroom = await this.getClassroomClient();\n const res =\n await classroom.courses.courseWork.addOnAttachments.studentSubmissions.get(\n {\n courseId: args.courseId,\n itemId: args.itemId,\n attachmentId: args.attachmentId,\n submissionId: args.submissionId,\n },\n );\n return res.data;\n }\n}\n","import crypto from \"crypto\";\n\nexport class EncryptionService {\n private static ALGORITHM = \"aes-256-cbc\";\n private static IV_LENGTH = 16; // For AES, this is always 16\n private static SALT_BYTES = 16;\n private static ENCRYPTION_KEY_LENGTH = 32;\n private ENCRYPTION_SECRET: string;\n\n constructor(private readonly encryptionSecret: string) {\n this.ENCRYPTION_SECRET = encryptionSecret;\n }\n\n public encryptString(value: string): string {\n const salt = crypto\n .randomBytes(EncryptionService.SALT_BYTES)\n .toString(\"hex\");\n const iv = crypto.randomBytes(EncryptionService.IV_LENGTH);\n const encryptionKey = crypto.scryptSync(\n this.ENCRYPTION_SECRET,\n salt,\n EncryptionService.ENCRYPTION_KEY_LENGTH,\n );\n const cipher = crypto.createCipheriv(\n EncryptionService.ALGORITHM,\n encryptionKey,\n iv,\n );\n let encrypted = cipher.update(value, \"utf8\", \"hex\");\n encrypted += cipher.final(\"hex\");\n return `${iv.toString(\"hex\")}:${encrypted}:${salt}`;\n }\n\n public decryptString(value: string): string {\n const [ivHex, encryptedText, salt] = value.split(\":\");\n if (!ivHex || !encryptedText || !salt)\n throw new Error(`Invalid encrypted string`);\n\n const iv = Buffer.from(ivHex, \"hex\");\n const encryptionKey = crypto.scryptSync(\n this.ENCRYPTION_SECRET,\n salt,\n EncryptionService.ENCRYPTION_KEY_LENGTH,\n );\n\n const decipher = crypto.createDecipheriv(\n EncryptionService.ALGORITHM,\n encryptionKey,\n iv,\n );\n\n let decrypted = decipher.update(encryptedText, \"hex\", \"utf8\");\n decrypted += decipher.final(\"utf8\");\n\n return decrypted;\n }\n}\n","import { LoginTicket, OAuth2Client, TokenPayload } from \"google-auth-library\";\nimport { AccessTokenResponse } from \"google-auth-library/build/src/auth/oauth2client\";\n\nexport type GoogleOAuthUser = {\n accessToken: string;\n loginHint: string;\n refreshToken?: string;\n profilePictureUrl?: string;\n email?: string;\n};\n\nexport class GoogleOAuthClient {\n private client: OAuth2Client;\n private clientId: string;\n\n constructor(\n private readonly googleClientId: string,\n private readonly googleClientSecret: string,\n private readonly callbackUrl: string,\n private readonly accessToken?: string,\n private readonly refreshToken?: string,\n ) {\n if (!googleClientId) throw new Error(\"Google Client ID is missing\");\n if (!googleClientSecret) throw new Error(\"Google Client Secret is missing\");\n if (!callbackUrl) throw new Error(\"Google OAuth Callback URL is missing\");\n const client = new OAuth2Client({\n clientId: googleClientId,\n clientSecret: googleClientSecret,\n redirectUri: callbackUrl,\n forceRefreshOnFailure: false,\n });\n\n if (process.env.GOOGLE_CLASSROOM_DEV_MODE === \"true\" && accessToken) {\n client.refreshHandler = async (): Promise<AccessTokenResponse> => ({\n access_token: accessToken,\n expiry_date: new Date().getTime() + 1000 * 60 * 60, // now + 1 hour,\n });\n }\n\n if (accessToken || refreshToken)\n client.setCredentials({\n access_token: accessToken,\n refresh_token: refreshToken,\n });\n this.client = client;\n this.clientId = googleClientId;\n }\n\n /**\n * Returns the URL that the user should be redirected to in order to connect their Google account\n */\n public getAuthenticateUrl(\n loginHint?: string,\n subscribeToNewsletter: boolean = false,\n ): string | null {\n try {\n const scope: string[] = [\n \"https://www.googleapis.com/auth/userinfo.profile\",\n \"https://www.googleapis.com/auth/userinfo.email\",\n \"https://www.googleapis.com/auth/classroom.courses.readonly\",\n \"https://www.googleapis.com/auth/classroom.addons.student\",\n \"https://www.googleapis.com/auth/classroom.addons.teacher\",\n ];\n\n return this.client.generateAuthUrl({\n access_type: \"offline\",\n include_granted_scopes: true,\n scope,\n loginHint,\n subscribeToNewsletter,\n });\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n /**\n * Returns user info and auth tokens by exchanging a Google OAuth\n * @param code - Code supplied by Google from OAuth callback redirection\n */\n public async exchangeCodeForTokens(\n code: string,\n ): Promise<GoogleOAuthUser | null> {\n try {\n const { tokens } = await this.client.getToken(code);\n\n // Verify the tokens we received.\n const ticket: LoginTicket = await this.client.verifyIdToken({\n idToken: tokens.id_token!,\n audience: this.clientId,\n });\n\n // After verifying the token, we can access the payload.\n const info: TokenPayload | undefined = ticket.getPayload();\n\n // todo: use zod\n if (!tokens.access_token) throw new Error(\"Access token is missing\");\n if (!info?.sub) throw new Error(\"User sub is missing\");\n\n return {\n accessToken: tokens.access_token,\n loginHint: info.sub,\n refreshToken: tokens.refresh_token!, // only received if first time signing in\n profilePictureUrl: info?.picture,\n email: info.email,\n };\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n /**\n * Attempts to generate a new access token from a supplied refresh token and returns it\n * @param refreshToken - A Google OAuth 2.0 refresh token\n */\n public async refreshAccessToken(\n refreshToken: string,\n ): Promise<string | null> {\n try {\n this.client.setCredentials({ refresh_token: refreshToken });\n const accessToken = await this.client.getAccessToken();\n // todo: use zod\n if (!accessToken.token) throw new Error(\"Unable to refresh access token\");\n return accessToken.token;\n } catch (error) {\n console.error(error);\n return null;\n }\n }\n\n /**\n * Checks if the access token attached to the auth client exists and has not expired.\n * (The access token being tested is optionally supplied when the GoogleOAuthClient is constructed)\n */\n public async isAuthenticated(accessToken: string): Promise<boolean> {\n try {\n const tokenInfo = await this.client.getTokenInfo(accessToken);\n const tokenHasExpired = tokenInfo.expiry_date < Date.now();\n if (!tokenHasExpired) return false;\n\n return true;\n } catch (error) {\n console.error(error);\n return false;\n }\n }\n\n public async getOAuth2Client(): Promise<OAuth2Client> {\n return this.client;\n }\n}\n","import type { Firestore } from \"@google-cloud/firestore\";\nimport { sealData, unsealData } from \"iron-session\";\n\nimport {\n CreateAnnouncementAttachmentArgs,\n GoogleClassroomClient,\n} from \"./GoogleClassroom\";\n\nimport { EncryptionService } from \"@/services/Encryption\";\nimport { FirestoreClient } from \"@/services/FirestoreClient\";\nimport { GoogleOAuthClient } from \"@/services/GoogleOAuth\";\n\nexport type OakGoogleSignInCallback = {\n encryptedSession: string;\n profilePictureUrl?: string;\n};\n\ntype EncryptedSession = {\n loginHint: string;\n accessToken: string;\n};\n\nexport class OakGoogleClassroomAddOn {\n private encryptionService: EncryptionService;\n private firestoreClient: FirestoreClient;\n private _googleOAuthClientId: string;\n private _googleOAuthClientSecret: string;\n private _googleOAuthCallbackApiRoute: string;\n private _sessionSecret: string;\n\n constructor(\n private readonly encryptionSecret: string,\n private readonly firestore: Firestore,\n private readonly googleOAuthClientId: string,\n private readonly googleOAuthClientSecret: string,\n private readonly googleOAuthCallbackApiRoute: string,\n private readonly sessionSecret: string,\n private readonly baseUrl: string,\n ) {\n this.encryptionService = new EncryptionService(encryptionSecret);\n this.firestoreClient = new FirestoreClient(firestore);\n this._googleOAuthClientId = googleOAuthClientId;\n this._googleOAuthClientSecret = googleOAuthClientSecret;\n this._googleOAuthCallbackApiRoute = googleOAuthCallbackApiRoute;\n this._sessionSecret = sessionSecret;\n }\n\n private getOAuthClient(\n accessToken?: string,\n refreshToken?: string,\n ): GoogleOAuthClient {\n return new GoogleOAuthClient(\n this._googleOAuthClientId,\n this._googleOAuthClientSecret,\n this._googleOAuthCallbackApiRoute,\n accessToken,\n refreshToken,\n );\n }\n\n public async getGoogleSignInUrl(\n loginHint?: string,\n subscribeToNewsletter: boolean = false,\n ): Promise<string> {\n const oauthClient = this.getOAuthClient();\n const url: string | null = oauthClient.getAuthenticateUrl(\n loginHint,\n subscribeToNewsletter,\n );\n if (!url) throw new Error(\"Failed to get Google Authentication URL\");\n return url;\n }\n\n public async handleGoogleSignInCallback(\n code: string,\n subscribeToNewsletterFn?: (email: string) => Promise<void>,\n ): Promise<OakGoogleSignInCallback> {\n const oauthClient = this.getOAuthClient();\n const user = await oauthClient.exchangeCodeForTokens(code);\n if (!user) throw new Error(\"Failed to authenticate Google sign-in\");\n const encryptedRefreshToken = user.refreshToken\n ? this.encryptionService.encryptString(user.refreshToken)\n : undefined;\n const encryptedProfileUrl = user.profilePictureUrl\n ? this.encryptionService.encryptString(user.profilePictureUrl)\n : undefined;\n await this.firestoreClient.upsertConnectedUserCredentials({\n refreshToken: encryptedRefreshToken,\n profilePictureUrl: encryptedProfileUrl,\n loginHint: user.loginHint,\n });\n const encryptedSession = await sealData(\n {\n loginHint: user.loginHint,\n accessToken: user.accessToken,\n } as EncryptedSession,\n { password: this._sessionSecret },\n );\n if (subscribeToNewsletterFn && user.email)\n await subscribeToNewsletterFn(user.email);\n return {\n encryptedSession,\n profilePictureUrl: user.profilePictureUrl,\n };\n }\n\n /**\n * Checks if session exists and is authenticated. It will automatically attempt\n * to refresh the session if it has expired.\n * Returns null for an invalid session.\n * Returns the encrypted session (original or refreshed) if valid.\n */\n public async verifyAuthSession(\n encryptedSession: string,\n ): Promise<string | null> {\n const decryptedSession = await unsealData<EncryptedSession>(\n encryptedSession,\n {\n password: this._sessionSecret,\n },\n );\n if (!decryptedSession?.accessToken || !decryptedSession?.loginHint)\n return null;\n\n // Check active session for the user exists\n const connectedUser =\n await this.firestoreClient.getConnectedUserCredentials(\n decryptedSession.loginHint,\n );\n if (!connectedUser) return null;\n\n // Check if the access token is still valid\n const oauthClient = this.getOAuthClient(\n decryptedSession.accessToken,\n connectedUser.refreshToken,\n );\n const isTokenValid = await oauthClient.isAuthenticated(\n decryptedSession.accessToken,\n );\n if (isTokenValid) return encryptedSession;\n\n // Attempt to refresh expired access token\n const refreshedToken = await oauthClient.refreshAccessToken(\n connectedUser.refreshToken,\n );\n if (refreshedToken) {\n const newEncryptedSession = await sealData(\n {\n loginHint: decryptedSession.loginHint,\n accessToken: refreshedToken,\n } as EncryptedSession,\n { password: this._sessionSecret },\n );\n return newEncryptedSession;\n }\n\n return null;\n }\n\n public async createAttachment(\n args: CreateAnnouncementAttachmentArgs,\n accessToken?: string,\n refreshToken?: string,\n ) {\n const oAuthClient = this.getOAuthClient(accessToken, refreshToken);\n const classroomClient = new GoogleClassroomClient(\n this.baseUrl,\n oAuthClient,\n );\n const classroomAttachment =\n await classroomClient.createAnnouncementAttachment(args);\n const data = {\n ...classroomAttachment,\n attachmentId: classroomAttachment.id || \"\",\n createdAt: new Date().toISOString(),\n };\n await this.firestoreClient.upsertClassroomAttachment(data);\n const savedAttachment =\n await this.firestoreClient.getClassroomAttachmentById(\n classroomAttachment.id!,\n );\n return savedAttachment;\n }\n}\n"],"names":["__assign","Object","assign","t","s","i","n","arguments","length","p","prototype","hasOwnProperty","call","apply","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","__generator","body","f","y","_","label","sent","trys","ops","g","create","Iterator","verb","Symbol","iterator","v","op","TypeError","pop","push","SuppressedError","cookie","parse","str","opt","obj","len","dec","decode","index","eqIdx","endIdx","indexOf","lastIndexOf","keyStartIdx","startIndex","keyEndIdx","endIndex","key","slice","__hasOwnProperty","valStartIdx","valEndIdx","charCodeAt","val","tryDecode","serialize","name","enc","encode","encodeURIComponent","cookieNameRegExp","test","cookieValueRegExp","maxAge","Math","floor","isFinite","domain","domainValueRegExp","path","pathValueRegExp","expires","__toString","isDate","isNaN","valueOf","toUTCString","httpOnly","secure","partitioned","priority","toLowerCase","sameSite","toString","max","code","min","decodeURIComponent","alphabetByEncoding","alphabetByValue","Array","from","start","limit","char","String","fromCharCode","stringToBuffer","TextEncoder","base64urlDecode","_input","input","repeat","totalByteLength","endsWith","out","ArrayBuffer","dataView","DataView","bits","bitLength","j","chunkOffset","byteLength","k","offset","setUint8","Uint8Array","base64urlEncode","bitClusterCount","ceil","defaults","encryption","saltBits","algorithm","iterations","minPasswordlength","integrity","ttl","timestampSkewSec","localtimeOffsetMsec","clone","options","algorithms","keyBits","ivBits","sha256","macPrefix","randomBits","_crypto","Error","size","bytes","getRandomValues","randomBytes","generateKey","async","password","_a","hmac","id","hash","usage","salt","randomSalt","map","x","padStart","join","derivedKey","keyLength","passwordBuffer","importedKey","subtle","importKey","params","deriveBits","pbkdf2","importedEncryptionKey","iv","getEncryptParams","data","counter","decrypt","decrypted","TextDecoder","hmacWithPassword","textBuffer","signed","sign","digest","normalizePassword","secret","seal","object","opts","now","Date","objectString","JSON","stringify","pass","encrypted","encrypt","encryptedB64","expiration","macBaseString","mac","webCrypto","globalThis","crypto","randomUUID","array","normalizeStringPasswordToMap","FirestoreCollections","sealData","fourteenDaysInSeconds","passwordsMap","mostRecentPasswordId","keys","Number","passwordForSeal","createSealData","unsealData","sealWithoutVersion","tokenVersion","tokenVersionAsString","split","parseInt","parseSeal","sealed","parts","prefix","passwordId","encryptionSalt","encryptionIv","hmacSalt","macOptions","a","b","mismatch","fixedTimeComparison","decryptOptions","unseal","persistent","error","message","createUnsealData","GoogleClassroomClient","baseUrl","oAuthClient","getClassroomClient","getOAuth2Client","auth2Client","classroom_v1","Classroom","auth","createAnnouncementAttachment","args","courseId","itemId","addOnToken","title","lessonSlug","programeSlug","unitSlug","maxPoints","courses","courseWork","addOnAttachments","requestBody","teacherViewUri","uri","concat","studentViewUri","studentWorkReviewUri","undefined","attachment","postId","submitPupilResponse","studentSubmissions","patch","attachmentId","submissionId","updateMask","pointsEarned","fetchPupilResponse","get","EncryptionService","encryptionSecret","ENCRYPTION_SECRET","encryptString","SALT_BYTES","IV_LENGTH","encryptionKey","scryptSync","ENCRYPTION_KEY_LENGTH","cipher","createCipheriv","ALGORITHM","update","final","decryptString","o","m","r","ar","__read","ivHex","encryptedText","Buffer","decipher","createDecipheriv","FirestoreClient","firestore","_firestore","getConnectedUserCredentials","loginHint","collection","CONNECTED_USERS_CREDENTIALS","doc","console","error_1","upsertConnectedUserCredentials","credentials","settings","ignoreUndefinedProperties","set","error_2","upsertClassroomAttachment","CLASSROOM_ATTACHMENTS","error_3","getClassroomAttachmentById","querySnapshot","exists","error_4","GoogleOAuthClient","googleClientId","googleClientSecret","callbackUrl","accessToken","refreshToken","_this","client","OAuth2Client","clientId","clientSecret","redirectUri","forceRefreshOnFailure","process","env","GOOGLE_CLASSROOM_DEV_MODE","refreshHandler","access_token","expiry_date","getTime","setCredentials","refresh_token","getAuthenticateUrl","subscribeToNewsletter","generateAuthUrl","access_type","include_granted_scopes","scope","exchangeCodeForTokens","getToken","tokens","verifyIdToken","idToken","id_token","audience","ticket","info","getPayload","sub","profilePictureUrl","picture","email","refreshAccessToken","getAccessToken","token","isAuthenticated","getTokenInfo","tokenInfo","OakGoogleClassroomAddOn","googleOAuthClientId","googleOAuthClientSecret","googleOAuthCallbackApiRoute","sessionSecret","encryptionService","firestoreClient","_googleOAuthClientId","_googleOAuthClientSecret","_googleOAuthCallbackApiRoute","_sessionSecret","getOAuthClient","getGoogleSignInUrl","loginHint_1","oauthClient","url","handleGoogleSignInCallback","subscribeToNewsletterFn","user","encryptedRefreshToken","encryptedProfileUrl","encryptedSession","verifyAuthSession","decryptedSession","connectedUser","refreshedToken","createAttachment","classroomAttachment","createdAt","toISOString"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4]}
|