diff --git a/.github/workflows/code-qa.yaml b/.github/workflows/code-qa-js.yaml
similarity index 56%
rename from .github/workflows/code-qa.yaml
rename to .github/workflows/code-qa-js.yaml
index 3de7e76..8417951 100644
--- a/.github/workflows/code-qa.yaml
+++ b/.github/workflows/code-qa-js.yaml
@@ -1,17 +1,40 @@
-# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
-# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
-
-name: Code Quality Assurance
+name: Code Quality Assurance - JavaScript/TypeScript
on:
push:
branches: [master]
- paths-ignore:
- - "core/scripts/APIandLibraries/**"
+ paths:
+ - "**/*.js"
+ - "**/*.ts"
+ - "**/*.mjs"
+ - "**/*.html"
+ - "**/*.css"
+ - "**/*.json"
+ - "**/*.xml"
+ - "**/*.svg"
+ - "**/*.png"
+ - "**/*.webp"
+ - "**/*.ico"
+ - ".prettierrc"
+ - ".github/workflows/code-qa-js.yaml"
+ - "package*.json"
pull_request:
branches: [master]
- paths-ignore:
- - "core/scripts/APIandLibraries/**"
+ paths:
+ - "**/*.js"
+ - "**/*.ts"
+ - "**/*.mjs"
+ - "**/*.html"
+ - "**/*.css"
+ - "**/*.json"
+ - "**/*.xml"
+ - "**/*.svg"
+ - "**/*.png"
+ - "**/*.webp"
+ - "**/*.ico"
+ - ".prettierrc"
+ - ".github/workflows/code-qa-js.yaml"
+ - "package*.json"
permissions:
contents: read
@@ -26,13 +49,13 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
- name: Cache Node.js modules
- uses: actions/cache@v4
+ uses: actions/cache@v5
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
@@ -47,4 +70,4 @@ jobs:
- name: Run tests
run: npm run test:jest
- name: Run Playwright tests
- run: npx playwright install --with-deps && npm run test:playwright:headless
+ run: npx playwright install --with-deps && npm run test:e2e:headless
diff --git a/.github/workflows/code-qa-markdown.yaml b/.github/workflows/code-qa-markdown.yaml
new file mode 100644
index 0000000..d432e46
--- /dev/null
+++ b/.github/workflows/code-qa-markdown.yaml
@@ -0,0 +1,44 @@
+name: Code Quality Assurance - Markdown
+
+on:
+ push:
+ branches: [master]
+ paths:
+ - "**/*.md"
+ - ".markdownlint.json"
+ - ".markdownlintignore"
+ - ".github/workflows/code-qa-markdown.yaml"
+ - "package*.json"
+ pull_request:
+ branches: [master]
+ paths:
+ - "**/*.md"
+ - ".markdownlint.json"
+ - ".markdownlintignore"
+ - ".github/workflows/code-qa-markdown.yaml"
+ - "package*.json"
+
+permissions:
+ contents: read
+jobs:
+ lint-markdown:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v6
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v6
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache Node.js modules
+ uses: actions/cache@v5
+ with:
+ path: ~/.npm
+ key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
+ restore-keys: |
+ ${{ runner.os }}-node-
+ - name: Run installs
+ run: npm ci
+ - name: Run markdownlint on Markdown files
+ run: npm run lint:markdown
diff --git a/.github/workflows/codeql-analysis.yaml b/.github/workflows/codeql-analysis.yaml
index feee28e..12fe0d0 100644
--- a/.github/workflows/codeql-analysis.yaml
+++ b/.github/workflows/codeql-analysis.yaml
@@ -50,7 +50,7 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
diff --git a/.markdownlint.json b/.markdownlint.json
new file mode 100644
index 0000000..3a4eaee
--- /dev/null
+++ b/.markdownlint.json
@@ -0,0 +1,6 @@
+{
+ "MD007": false,
+ "MD010": false,
+ "MD013": false,
+ "MD060": false
+}
diff --git a/.markdownlintignore b/.markdownlintignore
new file mode 100644
index 0000000..b73df77
--- /dev/null
+++ b/.markdownlintignore
@@ -0,0 +1,56 @@
+# Markdown to ignore
+LICENSE.md
+
+# dependencies
+**/node_modules
+/.pnp
+.pnp.js
+
+# VS code
+.vscode/settings.json
+.vscode/launch.json
+
+# System Files
+.DS_Store
+
+# Coverage and testing
+.coverage
+/coverage
+coverage.html
+coverage.out
+coverage.xml
+cypress/screenshots
+cypress/videos
+
+# Playwright
+node_modules/
+test-results/
+playwright-report/
+blob-report/
+playwright/.cache/
+playwright/.auth/
+playwright-report/
+blob-report/
+test-results/
+
+# Packages
+core/scripts/APIandLibraries/**/*
+
+# workbox
+workbox-config.cjs
+core/scripts/serviceWorker
+
+# Visual Studio Code
+.vscode/settings.json
+.vscode/launch.json
+
+# Data files
+.fasta
+.xlsx
+.csv
+
+# PDFs
+.pdf
+
+# Ignore minified files
+*.min.*
diff --git a/.prettierignore b/.prettierignore
index a156cc6..b9bfd68 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -3,31 +3,35 @@
/.pnp
.pnp.js
-# Build files
-*.min.js
-*.min.css
-sw.js
-*.js.map
-
-# Packages
-core/scripts/APIandLibraries/**/*
+# VS code
+.vscode/settings.json
+.vscode/launch.json
-# R data files
-.Rproj.user
-.Rhistory
-.RData
-.Ruserdata
+# System Files
+.DS_Store
-# Server files
-.htaccess
+# Coverage and testing
+.coverage
+/coverage
+coverage.html
+coverage.out
+coverage.xml
+cypress/screenshots
+cypress/videos
+
+# Playwright
+node_modules/
+test-results/
+playwright-report/
+blob-report/
+playwright/.cache/
+playwright/.auth/
+playwright-report/
+blob-report/
+test-results/
-# misc
-.DS_Store
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
-.vscode
+# Packages
+core/scripts/APIandLibraries/**/*
# workbox
workbox-config.cjs
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5366ff5..07f27ae 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -182,7 +182,7 @@ Bug fix:
## [1.0.0] - 2018-09-20
-The official release of SciGrade is here! You can visit it and see all of it in action at https://scigrade.com/ or learn how it works by looking through our EDIT.MD code.
+The official release of SciGrade is here! You can visit it and see all of it in action at
You would only receive feedback on your practice attempts and not your final assignments.
";e+="The assignment itself is marked out of 10 marks with 2 marks for each input excluding gRNA strand direction, cut position and target region range (these three values are used to calculate if you have the right answer or not which means they are still crucial that they are still correct).
",e+="The following is the breakdown of what marks you would have received and why you would have gotten them:
",e+=`Mark: ${all_marks[0]}/10 (${all_marks[1]})
`;let n=0,t="Your gRNA sequence was wrong and not found in the Benchling gRNA outputs. Either you made a typo or this answer was not correct and did not contain the target cut site within an acceptable range.";MARgRNAseq&&(MARgRNAseq_degree===1?(n=2,t="This means your answer was correct and you received full marks."):MARgRNAseq_degree===2?(n=1,t="This means your sequence was partially correct as it contains the target sequence within a 20bp range but was not optimal. One mark."):MARgRNAseq_degree===3&&(n=.5,t="This means your sequence was not wrong (therefore was still correct) but there were better options out there. I recommend you try this practice assignment again. Still worth some marks though (half a mark)."));let o=0,a="Your PAM sequence was wrong and not found relative to your gRNA sequence. Either you made a typo or this answer was not correct. Either it contained the cut site within the PAM site or it was not an NGG or NAG PAM site (SciGrade only accepts either of those two PAM sites).";MARPAMseq&&(o=2,a="This means your answer was correct and you received full marks.");let r=0,c="Your off-target score was wrong. Either it was not above/within the optimal range (or above 35) or the last-resort option.";MAROffTarget&&(MAROffTarget_degree===1?(r=2,c="This means your answer was correct while above/within the optimal and you received full marks."):MAROffTarget_degree===2?(r=1,c="This means your answer was technically correct as its on-target value was above 35."):MAROffTarget_degree===3&&(r=.5,c="This means your answer was partially correct as it was found to be your only option is solely based on the target region range you selected."));let d=0,u="";for(let l=0;lFor gRNA Strand Sequence, you put down "${all_answers[0]}" which gave you the mark ${n}.
`,e+=t,e+="For gRNA PAM Sequence, you put down "${all_answers[1]}" which gave you the mark ${o}.
`,e+=a,e+="For Off-Target Score, you put down "${all_answers[4]}" which gave you the mark ${r}.
`,e+=c,e+="For F1 Primer, you put down "${all_answers[5]}" which gave you the mark ${d}.
`,e+=s,e+="For R1 Primer, you put down "${all_answers[6]}" which gave you the mark ${p}.
`,e+=m,e+="If at any point you wish to dispute marks, please contact your TA or professor once you completed your assignment. If you have found a bug in our SciGrade marking system, please contact your professor or our admin.
",e+="',$("#mainContainer").append(e)}function showNewInput(e,n,t){document.getElementById(String(e)).value===String(n)?document.getElementById(String(t)).removeAttribute("hidden"):document.getElementById(String(t)).setAttribute("hidden",!0)}let completed_assignments=[],all_answers=[],all_outputs=[],all_marks=[];function submitAnswers(){all_answers=[],all_outputs=[],all_marks=[],checkAnswers(),setTimeout(()=>{markAnswers(),all_answers.push(document?.getElementById("sequence_input")?.value?.trim()||"",document.getElementById("pam_input").value.trim(),document.getElementById("position_input").value,document.getElementById("strand_input").value,document.getElementById("offtarget_input").value,document.getElementById("f1_input").value.trim(),document.getElementById("r1_input").value.trim()),all_outputs.push(MARstrand,MARgRNAseq,MARgRNAseq_degree,MARCutPos,MARPAMseq,MAROffTarget,MAROffTarget_degree,MAROffTarget_aboveOpt,MAROffTarget_above35,MAROffTarget_onlyOption,MARF1primers,MARR1primers),all_marks.push(studentMark,studentMarkPercentage),document.getElementById("options_label").innerHTML="Would you like to see feedback on your answers or start a new assignment?",document.getElementById("seeFeedback").removeAttribute("hidden"),showFeedback(),$("#feedbackButton").click()},750)}function IfPressEnter(e,n){(e.which===13||e.keyCode===13)&&$(`#${n}`).click()}function backToAssignments(){redirectCRISPR(),$("#practice").click()}$(()=>{$("form").submit(()=>!1)}),typeof module<"u"&&module.exports&&(module.exports={getOffTargetOptimalValue,isNumberOrDashKey,createComplementarySeq,checkOffTarget,checkF1Primers,checkR1Primers,fillGeneList,get MAROffTarget(){return MAROffTarget},get MAROffTarget_degree(){return MAROffTarget_degree},get MARF1primers(){return MARF1primers},get MARR1primers(){return MARR1primers},__setTestState(e={}){e.correctNucleotideIncluded!==void 0&&(correctNucleotideIncluded=e.correctNucleotideIncluded),e.MARgRNAseq!==void 0&&(MARgRNAseq=e.MARgRNAseq),e.benchling_gRNA_outputs!==void 0&&(benchling_gRNA_outputs=e.benchling_gRNA_outputs),e.current_gene!==void 0&&(current_gene=e.current_gene),e.gene_backgroundInfo!==void 0&&(gene_backgroundInfo=e.gene_backgroundInfo)},__resetState(){MAROffTarget=!1,MAROffTarget_degree=0,MARF1primers=!1,MARR1primers=!1,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1,correctNucleotideIncluded=!1,MARgRNAseq=!1}}); + `,e+='
You would only receive feedback on your practice attempts and not your final assignments.
";e+="The assignment itself is marked out of 10 marks with 2 marks for each input excluding gRNA strand direction, cut position and target region range (these three values are used to calculate if you have the right answer or not which means they are still crucial that they are still correct).
",e+="The following is the breakdown of what marks you would have received and why you would have gotten them:
",e+=`Mark: ${all_marks[0]}/10 (${all_marks[1]})
`;let n=0,t="Your gRNA sequence was wrong and not found in the Benchling gRNA outputs. Either you made a typo or this answer was not correct and did not contain the target cut site within an acceptable range.";MARgRNAseq&&(MARgRNAseq_degree===1?(n=2,t="This means your answer was correct and you received full marks."):MARgRNAseq_degree===2?(n=1,t="This means your sequence was partially correct as it contains the target sequence within a 20bp range but was not optimal. One mark."):MARgRNAseq_degree===3&&(n=.5,t="This means your sequence was not wrong (therefore was still correct) but there were better options out there. I recommend you try this practice assignment again. Still worth some marks though (half a mark)."));let i=0,r="Your PAM sequence was wrong and not found relative to your gRNA sequence. Either you made a typo or this answer was not correct. Either it contained the cut site within the PAM site or it was not an NGG or NAG PAM site (SciGrade only accepts either of those two PAM sites).";MARPAMseq&&(i=2,r="This means your answer was correct and you received full marks.");let o=0,l="Your off-target score was wrong. Either it was not above/within the optimal range (or above 35) or the last-resort option.";MAROffTarget&&(MAROffTarget_degree===1?(o=2,l="This means your answer was correct while above/within the optimal and you received full marks."):MAROffTarget_degree===2?(o=1,l="This means your answer was technically correct as its on-target value was above 35."):MAROffTarget_degree===3&&(o=.5,l="This means your answer was partially correct as it was found to be your only option is solely based on the target region range you selected."));let u=0,c="";for(let s=0;sFor gRNA Strand Sequence, you put down "${all_answers[0]}" which gave you the mark ${n}.
`,e+=t,e+="For gRNA PAM Sequence, you put down "${all_answers[1]}" which gave you the mark ${i}.
`,e+=r,e+="For Off-Target Score, you put down "${all_answers[4]}" which gave you the mark ${o}.
`,e+=l,e+="For F1 Primer, you put down "${all_answers[5]}" which gave you the mark ${u}.
`,e+=a,e+="For R1 Primer, you put down "${all_answers[6]}" which gave you the mark ${f}.
`,e+=p,e+="If at any point you wish to dispute marks, please contact your TA or professor once you completed your assignment. If you have found a bug in our SciGrade marking system, please contact your professor or our admin.
",e+="',$("#mainContainer").append(e)}function showNewInput(e,n,t){document.getElementById(String(e)).value===String(n)?document.getElementById(String(t)).removeAttribute("hidden"):document.getElementById(String(t)).setAttribute("hidden",!0)}let completed_assignments=[],all_answers=[],all_outputs=[],all_marks=[];function submitAnswers(){all_answers=[],all_outputs=[],all_marks=[],checkAnswers(),setTimeout(()=>{markAnswers(),all_answers.push(document?.getElementById("sequence_input")?.value?.trim()||"",document.getElementById("pam_input").value.trim(),document.getElementById("position_input").value,document.getElementById("strand_input").value,document.getElementById("offtarget_input").value,document.getElementById("f1_input").value.trim(),document.getElementById("r1_input").value.trim()),all_outputs.push(MARstrand,MARgRNAseq,MARgRNAseq_degree,MARCutPos,MARPAMseq,MAROffTarget,MAROffTarget_degree,MAROffTarget_aboveOpt,MAROffTarget_above35,MAROffTarget_onlyOption,MARF1primers,MARR1primers),all_marks.push(studentMark,studentMarkPercentage),document.getElementById("options_label").innerHTML="Would you like to see feedback on your answers or start a new assignment?",document.getElementById("seeFeedback").removeAttribute("hidden"),showFeedback(),$("#feedbackButton").click()},750)}function IfPressEnter(e,n){(e.which===13||e.keyCode===13)&&$(`#${n}`).click()}function backToAssignments(){redirectCRISPR(),$("#practice").click()}$(()=>{$("form").submit(()=>!1)}),typeof module<"u"&&module.exports&&(module.exports={getOffTargetOptimalValue,isNumberOrDashKey,createComplementarySeq,checkOffTarget,checkF1Primers,checkR1Primers,fillGeneList,get MAROffTarget(){return MAROffTarget},get MAROffTarget_degree(){return MAROffTarget_degree},get MARF1primers(){return MARF1primers},get MARR1primers(){return MARR1primers},__setTestState(e={}){e.correctNucleotideIncluded!==void 0&&(correctNucleotideIncluded=e.correctNucleotideIncluded),e.MARgRNAseq!==void 0&&(MARgRNAseq=e.MARgRNAseq),e.benchling_gRNA_outputs!==void 0&&(benchling_gRNA_outputs=e.benchling_gRNA_outputs),e.current_gene!==void 0&&(current_gene=e.current_gene),e.gene_backgroundInfo!==void 0&&(gene_backgroundInfo=e.gene_backgroundInfo)},__resetState(){MAROffTarget=!1,MAROffTarget_degree=0,MARF1primers=!1,MARR1primers=!1,MAROffTarget_aboveOpt=!1,MAROffTarget_above35=!1,MAROffTarget_onlyOption=!1,correctNucleotideIncluded=!1,MARgRNAseq=!1}}); diff --git a/core/scripts/crispr_scripts.test.js b/core/scripts/crispr_scripts.test.js index ff4325c..f880144 100644 --- a/core/scripts/crispr_scripts.test.js +++ b/core/scripts/crispr_scripts.test.js @@ -103,6 +103,11 @@ describe("crispr_scripts.js - Utility Functions", () => { const cases = [ { name: "short sequence ATCG", input: "ATCG", want: "CGAT" }, { name: "longer sequence", input: "GCTCGTGACCACCCTGACCT", want: "AGGTCAGGGTGGTCACGAGC" }, + { + name: "gRNA sequence from eBFP marking tests", + input: "AAGCACTGCACGCCGTGGGT", + want: "ACCCACGGCGTGCAGTGCTT", + }, { name: "empty sequence", input: "", want: "" }, { name: "single nucleotide A", input: "A", want: "T" }, { name: "single nucleotide T", input: "T", want: "A" }, diff --git a/core/scripts/runtime.test.js b/core/scripts/runtime.test.js index f55172b..2756bfe 100644 --- a/core/scripts/runtime.test.js +++ b/core/scripts/runtime.test.js @@ -113,25 +113,6 @@ describe("runtime.js - Runtime Flow Helpers", () => { }); describe("redirectCRISPR()", () => { - const cases = [ - { - name: "clears and repopulates main container", - }, - { - name: "calls loadCRISPRJSON_Files before fillGeneList", - }, - ]; - - it.each(cases)("$name", async ({ name }) => { - // Execute the ACTUAL imported function - await redirectCRISPR(); - - // Verify - expect(mockJQuery.empty).toHaveBeenCalled(); - expect(global.loadCRISPRJSON_Files).toHaveBeenCalledTimes(1); - expect(global.fillGeneList).toHaveBeenCalledTimes(1); - }); - it("ensures DOM elements are properly cleared before population", async () => { // Execute the ACTUAL imported function await redirectCRISPR(); @@ -177,23 +158,4 @@ describe("runtime.js - Runtime Flow Helpers", () => { expect(executionSequence).toEqual(["empty", "append", "loadCRISPRJSON_Files", "fillGeneList"]); }); }); - - describe("Integration: Runtime flow initialization", () => { - it("properly initializes runtime flow when both functions are called", async () => { - mockElement.value = "APOE"; - global.checkAnswers_executed = true; - global.document.getElementById.mockReturnValue(mockElement); - - // Execute ACTUAL imported functions - await redirectCRISPR(); - loadGeneContent(); - - // Verify complete state - expect(global.possible_gene).toBe("APOE"); - expect(global.checkAnswers_executed).toBe(false); - expect(mockJQuery.empty).toHaveBeenCalled(); - expect(global.loadCRISPRJSON_Files).toHaveBeenCalled(); - expect(global.fillGeneList).toHaveBeenCalled(); - }); - }); }); diff --git a/core/scripts/serviceWorker/sw.js b/core/scripts/serviceWorker/sw.js index 4006668..4a0009b 100644 --- a/core/scripts/serviceWorker/sw.js +++ b/core/scripts/serviceWorker/sw.js @@ -1,2 +1,2 @@ -if(!self.define){let e,r={};const c=(c,o)=>(c=new URL(c+".js",o).href,r[c]||new Promise(r=>{if("document"in self){const e=document.createElement("script");e.src=c,e.onload=r,document.head.appendChild(e);}else e=c,importScripts(c),r();}).then(()=>{let e=r[c];if(!e)throw new Error(`Module ${c} didn’t register its module`);return e;}));self.define=(o,i)=>{const a=e||("document"in self?document.currentScript.src:"")||location.href;if(r[a])return;let s={};const n=e=>c(e,a),d={module:{uri:a},exports:s,require:n};r[a]=Promise.all(o.map(e=>d[e]||n(e))).then(e=>(i(...e),s));};}define(["./workbox-813eeb66"],function(e){"use strict";self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting();}),e.precacheAndRoute([{url:"../../../core/systemrun.html",revision:"61ec3960f05098c97d298ab90f475771"},{url:"../../../core/styling/style.min.css",revision:"65a608b7d010ea2b87bb7ea7584ab875"},{url:"../../../core/styling/style.css",revision:"b67cbfd3995e07bba50358eaa64009fe"},{url:"../../../core/scripts/runtime.min.js",revision:"6e4641db4ea78c758c56312b1cf2379f"},{url:"../../../core/scripts/runtime.js",revision:"1767d36bb43cfd630a1c01fa2c27f3a9"},{url:"../../../core/scripts/crispr_scripts.min.js",revision:"96fa88586a8017e47d57b94fd287ff3c"},{url:"../../../core/scripts/crispr_scripts.js",revision:"99224226d8d67fb8f654a917e9a2a29d"},{url:"../../../core/scripts/APIandLibraries/tabletoCSV/package.json",revision:"ef0258ebdf3f9d244d7d38c4c35ec723"},{url:"../../../core/scripts/APIandLibraries/tabletoCSV/jquery.tabletoCSV.js",revision:"1757e6cdbbbe5f5a1c330e2f182e24f2"},{url:"../../../core/scripts/APIandLibraries/tabletoCSV/gulpfile.js",revision:"c93880a7ac368dcd9b51d547948cbf8a"},{url:"../../../core/scripts/APIandLibraries/tabletoCSV/example.html",revision:"9b17ab0cdbf7acd33dfcfff87c410d2b"},{url:"../../../core/scripts/APIandLibraries/tabletoCSV/bower.json",revision:"79787e672bb7dc33e2a2e0bdc8467a38"},{url:"../../../core/scripts/APIandLibraries/tabletoCSV/README.md",revision:"d581efd7f3de48bdf77206307df41034"},{url:"../../../core/scripts/APIandLibraries/tabletoCSV/dist/jquery.tabletoCSV.js",revision:"38e3e2fcaff8b3a33f2e3bf01190e845"},{url:"../../../core/scripts/APIandLibraries/jQuery/jquery.min.js",revision:"a8e7cabd4d49dfaf0146678ee147dfc5"},{url:"../../../core/scripts/APIandLibraries/Fonts/MaterialIcon.css",revision:"c1cbea39f07b551807abd9967b809ffd"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/js/bootstrap.min.js",revision:"a92b3364fb0a7349f2a1c31a7ad5ed5e"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/js/bootstrap.js",revision:"52de67605c3d156f4958c83fa9cfc8d9"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.min.js",revision:"6ccf144f123da79e62d5e46a06f133b9"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.js",revision:"32e42b38a15f27b01f79bb13aad53714"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.min.js",revision:"5cc1b73e70520fa84b1846afe0ec8fb6"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.js",revision:"7d2c412531f05f39e97195f9b48a53dc"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.min.css",revision:"53aa521e55523d4f35610e568c5991fd"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.css",revision:"f50b588ab5764c08bb2e57da6bbe47c7"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap.min.css",revision:"1b1cb0e2be9a21f091a87691f20c6300"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap.css",revision:"32f9388da564ecf3f4f129021d3736a8"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.min.css",revision:"1282e3b4ef0226816da34cd92a7ae69b"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.css",revision:"95616dd04a2044a59dbefbc48c050891"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.min.css",revision:"20d013574c70b2032e408e8f81a8fec9"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.css",revision:"2609642eaa62f29a2275e0ced5a098fe"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.min.css",revision:"c01f229a610e6f96bdb57fd287f48fc9"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.css",revision:"0b4f19eb4846adc5a866b80c81bda434"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.min.css",revision:"7c821536802bd2fa35701c22f2e96d36"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.css",revision:"cb9d8d28a86d39db9b43030a8248b766"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.min.css",revision:"fc7e1eb57c409c379d21a8001a0f9b33"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.css",revision:"93f428651ed8b87b9986050f06e03cb2"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.min.css",revision:"895b9494c7178ac12ad9c56d81305665"},{url:"../../../core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.css",revision:"4dd0ce2aa69225d64aacbded692fe756"},{url:"../../../core/images/logo_transparent.svg",revision:"d6abce258f77c56dfa6bb87765e3dfcf"},{url:"../../../core/images/logo_transparent.png",revision:"86746c9170e4cc9fccb363d0c54b3497"},{url:"../../../core/images/logo_transparent-Dark.svg",revision:"faef5b38e346a12888c11184c890292e"},{url:"../../../core/images/logo_transparent-Dark.png",revision:"cec8eede6a0b9a7e6da788d86edf6b37"},{url:"../../../core/images/dna.svg",revision:"7cf969d66011a6cddf39163fa202fa51"},{url:"../../../core/images/dna.png",revision:"d2778bf9fba581a4f4b8c2fca9abc9e8"},{url:"../../../core/images/EDITmd/005_Algorithm.png",revision:"934afcec1bad4f6cd1b39e799e6de5c2"},{url:"../../../core/images/EDITmd/004_FeedbackPage.png",revision:"e4ffddaa8a91c2c5547a89a4c6f47794"},{url:"../../../core/images/EDITmd/002_SciGradePracticeGene.png",revision:"a47cd17752a978f6e468985af11d5f3e"},{url:"../../../core/images/BackgroundImage/homeBackground.webp",revision:"fcb1240061569d6c355261f8d75a0f1b"},{url:"../../../core/images/BackgroundImage/grey.webp",revision:"44f3357b5a1f4d29ea3368de0f0f5279"},{url:"../../../core/icon/screenshot3.webp",revision:"19ef6219d8f3ba14ebf25b72e07240d8"},{url:"../../../core/icon/screenshot2.webp",revision:"87d56bb07395695fda9e04a30caf1672"},{url:"../../../core/icon/screenshot1.webp",revision:"426fd7165422ee95968d181411229d95"},{url:"../../../core/icon/safari-pinned-tab.svg",revision:"3a6f655958b21d384ae3dad886960d93"},{url:"../../../core/icon/resoc.png",revision:"4b94395e0972a350b0727a20e3d06baa"},{url:"../../../core/icon/mstile-70x70.png",revision:"b2902f78c5c0344f8a0558a8f36b97bf"},{url:"../../../core/icon/mstile-310x310.png",revision:"39af54c06ac44ebe9312f682ddd3602c"},{url:"../../../core/icon/mstile-310x150.png",revision:"7555e1760cd643b25105bfe4114eedfd"},{url:"../../../core/icon/mstile-150x150.png",revision:"4a6b569778e6b9d81aaee10df7c65284"},{url:"../../../core/icon/mstile-144x144.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"../../../core/icon/maskable_icon_x96.png",revision:"5269c50f0761a8aa50ae7201c28760c6"},{url:"../../../core/icon/maskable_icon_x72.png",revision:"0603508e30979836bd82b2d95dc0b1f4"},{url:"../../../core/icon/maskable_icon_x512.png",revision:"499293f67750aa3b60815cb50d8e3b72"},{url:"../../../core/icon/maskable_icon_x48.png",revision:"c521515543d0ccc88a843690484dfefe"},{url:"../../../core/icon/maskable_icon_x384.png",revision:"83527cdabf00617fb5b56df08a08b2a3"},{url:"../../../core/icon/maskable_icon_x192.png",revision:"bd977cf9153d6ebb3e8d8f79b4f100b6"},{url:"../../../core/icon/maskable_icon_x128.png",revision:"cf5ea1b4cd68730505d36d59d3c8b04d"},{url:"../../../core/icon/maskable_icon.png",revision:"94a300afab67912c4aa267989a725155"},{url:"../../../core/icon/manifest.json",revision:"ec78f1b4aaf3e8be6d7db11ef45fbf72"},{url:"../../../core/icon/favicon.ico",revision:"ea57adfd4a62355e9f4c2b46ef21600f"},{url:"../../../core/icon/favicon-32x32.png",revision:"a6296dcec5e5a6449807f753d885507d"},{url:"../../../core/icon/favicon-16x16.png",revision:"f9e844d671e8e4b80174f643fe4dcf56"},{url:"../../../core/icon/apple-touch-icon.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"../../../core/icon/apple-touch-icon-precomposed.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"../../../core/icon/apple-touch-icon-76x76.png",revision:"448377ba1760c41142b83ffd0fa47163"},{url:"../../../core/icon/apple-touch-icon-76x76-precomposed.png",revision:"448377ba1760c41142b83ffd0fa47163"},{url:"../../../core/icon/apple-touch-icon-72x72.png",revision:"819a43b6e5dc4991e399ff9b5d9b34b3"},{url:"../../../core/icon/apple-touch-icon-72x72-precomposed.png",revision:"819a43b6e5dc4991e399ff9b5d9b34b3"},{url:"../../../core/icon/apple-touch-icon-60x60.png",revision:"37be5e105d7a21fc8f3c437508dca233"},{url:"../../../core/icon/apple-touch-icon-60x60-precomposed.png",revision:"37be5e105d7a21fc8f3c437508dca233"},{url:"../../../core/icon/apple-touch-icon-57x57.png",revision:"b3e1d7fc553b33f086791c138d69bba1"},{url:"../../../core/icon/apple-touch-icon-57x57-precomposed.png",revision:"b3e1d7fc553b33f086791c138d69bba1"},{url:"../../../core/icon/apple-touch-icon-180x180.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"../../../core/icon/apple-touch-icon-180x180-precomposed.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"../../../core/icon/apple-touch-icon-152x152.png",revision:"8d46a8911ef72a562c97570d452f83ac"},{url:"../../../core/icon/apple-touch-icon-152x152-precomposed.png",revision:"8d46a8911ef72a562c97570d452f83ac"},{url:"../../../core/icon/apple-touch-icon-144x144.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"../../../core/icon/apple-touch-icon-144x144-precomposed.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"../../../core/icon/apple-touch-icon-120x120.png",revision:"c61a5acca54b104d7fe15fbc473796b5"},{url:"../../../core/icon/apple-touch-icon-120x120-precomposed.png",revision:"c61a5acca54b104d7fe15fbc473796b5"},{url:"../../../core/icon/apple-touch-icon-114x114.png",revision:"7b0f0af98c190974af01f605b117fc18"},{url:"../../../core/icon/apple-touch-icon-114x114-precomposed.png",revision:"7b0f0af98c190974af01f605b117fc18"},{url:"../../../core/icon/android-chrome-96x96.png",revision:"497e53074c189be631a8368192870f02"},{url:"../../../core/icon/android-chrome-72x72.png",revision:"a2b1197f79059981d8a19ba65ce73e6d"},{url:"../../../core/icon/android-chrome-512x512.png",revision:"d5a6869fb6a0d95e1c1398de5aac2278"},{url:"../../../core/icon/android-chrome-48x48.png",revision:"7ac44965ab502f17205e2d048d3e1580"},{url:"../../../core/icon/android-chrome-384x384.png",revision:"45ea1a83b4d26a9224844344602ad69e"},{url:"../../../core/icon/android-chrome-36x36.png",revision:"c3603b9735bb8397b0ac5351da9e94ed"},{url:"../../../core/icon/android-chrome-256x256.png",revision:"d80b94ad67334b9560e3cefaf8b04677"},{url:"../../../core/icon/android-chrome-192x192.png",revision:"f94fc51b10052dcc8f91e04945a618b8"},{url:"../../../core/icon/android-chrome-144x144.png",revision:"859cb36c4d6354a1d76e8d9692fdd88d"},{url:"../../../core/data/Benchling_gRNA_Outputs.json",revision:"515b0830b197e126a294fb15cd6d8e89"},{url:"../../../core/data/eBFP/eBFP.fasta",revision:"a30dc131549dc5fbbaa59128830ca49c"},{url:"../../../core/data/eBFP/Benchling_gRNA_outputs.xlsx",revision:"cb29f7f64c8c0f44cfe58c3504af0d2b"},{url:"../../../core/data/HBB/HBB.fasta",revision:"0314a959f59b730536fddec088d4a6c5"},{url:"../../../core/data/HBB/Benchling_gRNA_Outputs.xlsx",revision:"571ef05c0a5fc985423f08ab13e3fc71"},{url:"../../../core/data/CCR5/CCR5.fasta",revision:"60232b31119c5c0dfd9c59216f46928a"},{url:"../../../core/data/CCR5/Benchling_gRNA_Outputs.xlsx",revision:"d204b7de85c0def6a40789a3104dd975"},{url:"../../../core/data/Background_info/gene_background_info.json",revision:"ebeaca222ceb2e2354f6b2bacb6d0b26"},{url:"../../../core/data/APOE/Benchling_gRNA_Outputs.xlsx",revision:"d728b00ab3559732abc114c43893ba7e"},{url:"../../../core/data/APOE/APOE.fasta",revision:"9955beb43e9fd5a6e506cb9853ef13f2"},{url:"../../../core/data/ACTN3/Benchling_gRNA_Outputs.xlsx",revision:"9d9a05ae5858671f89b87ae185b4917b"},{url:"../../../core/data/ACTN3/ACTN3.fasta",revision:"a5ad42f7acbecbc28bed864b8377c5d4"}],{}),e.registerRoute(/\.(?:png|jpg|jpeg|webp|ico|svg)$/,new e.CacheFirst({cacheName:"images",plugins:[new e.ExpirationPlugin({maxEntries:10})]}),"GET"),e.registerRoute(/\.html$/,new e.NetworkFirst({cacheName:"html",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:50}),new e.CacheableResponsePlugin({statuses:[0,200]})]}),"GET"),e.registerRoute(/\.(?:css|js)$/,new e.NetworkFirst({cacheName:"assets",plugins:[new e.ExpirationPlugin({maxEntries:50}),new e.CacheableResponsePlugin({statuses:[0,200]})]}),"GET");}); +if(!self.define){let e,r={};const c=(c,o)=>(c=new URL(c+".js",o).href,r[c]||new Promise(r=>{if("document"in self){const e=document.createElement("script");e.src=c,e.onload=r,document.head.appendChild(e);}else e=c,importScripts(c),r();}).then(()=>{let e=r[c];if(!e)throw new Error(`Module ${c} didn’t register its module`);return e;}));self.define=(o,i)=>{const a=e||("document"in self?document.currentScript.src:"")||location.href;if(r[a])return;let s={};const n=e=>c(e,a),d={module:{uri:a},exports:s,require:n};r[a]=Promise.all(o.map(e=>d[e]||n(e))).then(e=>(i(...e),s));};}define(["./workbox-813eeb66"],function(e){"use strict";self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting();}),e.precacheAndRoute([{url:"core/systemrun.html",revision:"8dff6048b9d69269ee93641fe2a6fdd3"},{url:"core/styling/style.min.css",revision:"65a608b7d010ea2b87bb7ea7584ab875"},{url:"core/styling/style.css",revision:"b67cbfd3995e07bba50358eaa64009fe"},{url:"core/scripts/runtime.min.js",revision:"8a3d731b68f7a844695d9f62975f9e87"},{url:"core/scripts/runtime.js",revision:"3d9fff75f5461d4c927f08837da3737f"},{url:"core/scripts/crispr_scripts.min.js",revision:"a33cfc3004c2dade90c7df5ec2eb33e2"},{url:"core/scripts/crispr_scripts.js",revision:"9b350e01172d688a17f6151a69b9334b"},{url:"core/scripts/APIandLibraries/tabletoCSV/package.json",revision:"ef0258ebdf3f9d244d7d38c4c35ec723"},{url:"core/scripts/APIandLibraries/tabletoCSV/jquery.tabletoCSV.js",revision:"1757e6cdbbbe5f5a1c330e2f182e24f2"},{url:"core/scripts/APIandLibraries/tabletoCSV/gulpfile.js",revision:"c93880a7ac368dcd9b51d547948cbf8a"},{url:"core/scripts/APIandLibraries/tabletoCSV/example.html",revision:"9b17ab0cdbf7acd33dfcfff87c410d2b"},{url:"core/scripts/APIandLibraries/tabletoCSV/bower.json",revision:"79787e672bb7dc33e2a2e0bdc8467a38"},{url:"core/scripts/APIandLibraries/tabletoCSV/README.md",revision:"d581efd7f3de48bdf77206307df41034"},{url:"core/scripts/APIandLibraries/tabletoCSV/dist/jquery.tabletoCSV.js",revision:"38e3e2fcaff8b3a33f2e3bf01190e845"},{url:"core/scripts/APIandLibraries/jQuery/jquery.min.js",revision:"a8e7cabd4d49dfaf0146678ee147dfc5"},{url:"core/scripts/APIandLibraries/Fonts/MaterialIcon.css",revision:"c1cbea39f07b551807abd9967b809ffd"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.min.js",revision:"a92b3364fb0a7349f2a1c31a7ad5ed5e"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.js",revision:"52de67605c3d156f4958c83fa9cfc8d9"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.min.js",revision:"6ccf144f123da79e62d5e46a06f133b9"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.js",revision:"32e42b38a15f27b01f79bb13aad53714"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.min.js",revision:"5cc1b73e70520fa84b1846afe0ec8fb6"},{url:"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.js",revision:"7d2c412531f05f39e97195f9b48a53dc"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.min.css",revision:"53aa521e55523d4f35610e568c5991fd"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.css",revision:"f50b588ab5764c08bb2e57da6bbe47c7"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.min.css",revision:"1b1cb0e2be9a21f091a87691f20c6300"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.css",revision:"32f9388da564ecf3f4f129021d3736a8"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.min.css",revision:"1282e3b4ef0226816da34cd92a7ae69b"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.css",revision:"95616dd04a2044a59dbefbc48c050891"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.min.css",revision:"20d013574c70b2032e408e8f81a8fec9"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.css",revision:"2609642eaa62f29a2275e0ced5a098fe"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.min.css",revision:"c01f229a610e6f96bdb57fd287f48fc9"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.css",revision:"0b4f19eb4846adc5a866b80c81bda434"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.min.css",revision:"7c821536802bd2fa35701c22f2e96d36"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.css",revision:"cb9d8d28a86d39db9b43030a8248b766"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.min.css",revision:"fc7e1eb57c409c379d21a8001a0f9b33"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.css",revision:"93f428651ed8b87b9986050f06e03cb2"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.min.css",revision:"895b9494c7178ac12ad9c56d81305665"},{url:"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.css",revision:"4dd0ce2aa69225d64aacbded692fe756"},{url:"core/images/logo_transparent.svg",revision:"d6abce258f77c56dfa6bb87765e3dfcf"},{url:"core/images/logo_transparent.png",revision:"86746c9170e4cc9fccb363d0c54b3497"},{url:"core/images/logo_transparent-Dark.svg",revision:"faef5b38e346a12888c11184c890292e"},{url:"core/images/logo_transparent-Dark.png",revision:"cec8eede6a0b9a7e6da788d86edf6b37"},{url:"core/images/dna.svg",revision:"7cf969d66011a6cddf39163fa202fa51"},{url:"core/images/dna.png",revision:"d2778bf9fba581a4f4b8c2fca9abc9e8"},{url:"core/images/EDITmd/005_Algorithm.png",revision:"934afcec1bad4f6cd1b39e799e6de5c2"},{url:"core/images/EDITmd/004_FeedbackPage.png",revision:"e4ffddaa8a91c2c5547a89a4c6f47794"},{url:"core/images/EDITmd/002_SciGradePracticeGene.png",revision:"a47cd17752a978f6e468985af11d5f3e"},{url:"core/images/BackgroundImage/homeBackground.webp",revision:"fcb1240061569d6c355261f8d75a0f1b"},{url:"core/images/BackgroundImage/grey.webp",revision:"44f3357b5a1f4d29ea3368de0f0f5279"},{url:"core/icon/screenshot3.webp",revision:"19ef6219d8f3ba14ebf25b72e07240d8"},{url:"core/icon/screenshot2.webp",revision:"87d56bb07395695fda9e04a30caf1672"},{url:"core/icon/screenshot1.webp",revision:"426fd7165422ee95968d181411229d95"},{url:"core/icon/safari-pinned-tab.svg",revision:"3a6f655958b21d384ae3dad886960d93"},{url:"core/icon/resoc.png",revision:"4b94395e0972a350b0727a20e3d06baa"},{url:"core/icon/mstile-70x70.png",revision:"b2902f78c5c0344f8a0558a8f36b97bf"},{url:"core/icon/mstile-310x310.png",revision:"39af54c06ac44ebe9312f682ddd3602c"},{url:"core/icon/mstile-310x150.png",revision:"7555e1760cd643b25105bfe4114eedfd"},{url:"core/icon/mstile-150x150.png",revision:"4a6b569778e6b9d81aaee10df7c65284"},{url:"core/icon/mstile-144x144.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"core/icon/maskable_icon_x96.png",revision:"5269c50f0761a8aa50ae7201c28760c6"},{url:"core/icon/maskable_icon_x72.png",revision:"0603508e30979836bd82b2d95dc0b1f4"},{url:"core/icon/maskable_icon_x512.png",revision:"499293f67750aa3b60815cb50d8e3b72"},{url:"core/icon/maskable_icon_x48.png",revision:"c521515543d0ccc88a843690484dfefe"},{url:"core/icon/maskable_icon_x384.png",revision:"83527cdabf00617fb5b56df08a08b2a3"},{url:"core/icon/maskable_icon_x192.png",revision:"bd977cf9153d6ebb3e8d8f79b4f100b6"},{url:"core/icon/maskable_icon_x128.png",revision:"cf5ea1b4cd68730505d36d59d3c8b04d"},{url:"core/icon/maskable_icon.png",revision:"94a300afab67912c4aa267989a725155"},{url:"core/icon/manifest.json",revision:"ec78f1b4aaf3e8be6d7db11ef45fbf72"},{url:"core/icon/favicon.ico",revision:"ea57adfd4a62355e9f4c2b46ef21600f"},{url:"core/icon/favicon-32x32.png",revision:"a6296dcec5e5a6449807f753d885507d"},{url:"core/icon/favicon-16x16.png",revision:"f9e844d671e8e4b80174f643fe4dcf56"},{url:"core/icon/apple-touch-icon.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-precomposed.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-76x76.png",revision:"448377ba1760c41142b83ffd0fa47163"},{url:"core/icon/apple-touch-icon-76x76-precomposed.png",revision:"448377ba1760c41142b83ffd0fa47163"},{url:"core/icon/apple-touch-icon-72x72.png",revision:"819a43b6e5dc4991e399ff9b5d9b34b3"},{url:"core/icon/apple-touch-icon-72x72-precomposed.png",revision:"819a43b6e5dc4991e399ff9b5d9b34b3"},{url:"core/icon/apple-touch-icon-60x60.png",revision:"37be5e105d7a21fc8f3c437508dca233"},{url:"core/icon/apple-touch-icon-60x60-precomposed.png",revision:"37be5e105d7a21fc8f3c437508dca233"},{url:"core/icon/apple-touch-icon-57x57.png",revision:"b3e1d7fc553b33f086791c138d69bba1"},{url:"core/icon/apple-touch-icon-57x57-precomposed.png",revision:"b3e1d7fc553b33f086791c138d69bba1"},{url:"core/icon/apple-touch-icon-180x180.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-180x180-precomposed.png",revision:"ced32ca13a0c404c96fc081dca7473eb"},{url:"core/icon/apple-touch-icon-152x152.png",revision:"8d46a8911ef72a562c97570d452f83ac"},{url:"core/icon/apple-touch-icon-152x152-precomposed.png",revision:"8d46a8911ef72a562c97570d452f83ac"},{url:"core/icon/apple-touch-icon-144x144.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"core/icon/apple-touch-icon-144x144-precomposed.png",revision:"52d597709f2268268fd4063d34bd0ce7"},{url:"core/icon/apple-touch-icon-120x120.png",revision:"c61a5acca54b104d7fe15fbc473796b5"},{url:"core/icon/apple-touch-icon-120x120-precomposed.png",revision:"c61a5acca54b104d7fe15fbc473796b5"},{url:"core/icon/apple-touch-icon-114x114.png",revision:"7b0f0af98c190974af01f605b117fc18"},{url:"core/icon/apple-touch-icon-114x114-precomposed.png",revision:"7b0f0af98c190974af01f605b117fc18"},{url:"core/icon/android-chrome-96x96.png",revision:"497e53074c189be631a8368192870f02"},{url:"core/icon/android-chrome-72x72.png",revision:"a2b1197f79059981d8a19ba65ce73e6d"},{url:"core/icon/android-chrome-512x512.png",revision:"d5a6869fb6a0d95e1c1398de5aac2278"},{url:"core/icon/android-chrome-48x48.png",revision:"7ac44965ab502f17205e2d048d3e1580"},{url:"core/icon/android-chrome-384x384.png",revision:"45ea1a83b4d26a9224844344602ad69e"},{url:"core/icon/android-chrome-36x36.png",revision:"c3603b9735bb8397b0ac5351da9e94ed"},{url:"core/icon/android-chrome-256x256.png",revision:"d80b94ad67334b9560e3cefaf8b04677"},{url:"core/icon/android-chrome-192x192.png",revision:"f94fc51b10052dcc8f91e04945a618b8"},{url:"core/icon/android-chrome-144x144.png",revision:"859cb36c4d6354a1d76e8d9692fdd88d"},{url:"core/data/Benchling_gRNA_Outputs.json",revision:"515b0830b197e126a294fb15cd6d8e89"},{url:"core/data/eBFP/eBFP.fasta",revision:"a30dc131549dc5fbbaa59128830ca49c"},{url:"core/data/eBFP/Benchling_gRNA_outputs.xlsx",revision:"cb29f7f64c8c0f44cfe58c3504af0d2b"},{url:"core/data/HBB/HBB.fasta",revision:"0314a959f59b730536fddec088d4a6c5"},{url:"core/data/HBB/Benchling_gRNA_Outputs.xlsx",revision:"571ef05c0a5fc985423f08ab13e3fc71"},{url:"core/data/CCR5/CCR5.fasta",revision:"60232b31119c5c0dfd9c59216f46928a"},{url:"core/data/CCR5/Benchling_gRNA_Outputs.xlsx",revision:"d204b7de85c0def6a40789a3104dd975"},{url:"core/data/Background_info/gene_background_info.json",revision:"ebeaca222ceb2e2354f6b2bacb6d0b26"},{url:"core/data/APOE/Benchling_gRNA_Outputs.xlsx",revision:"d728b00ab3559732abc114c43893ba7e"},{url:"core/data/APOE/APOE.fasta",revision:"9955beb43e9fd5a6e506cb9853ef13f2"},{url:"core/data/ACTN3/Benchling_gRNA_Outputs.xlsx",revision:"9d9a05ae5858671f89b87ae185b4917b"},{url:"core/data/ACTN3/ACTN3.fasta",revision:"a5ad42f7acbecbc28bed864b8377c5d4"}],{}),e.registerRoute(/\.(?:png|jpg|jpeg|webp|ico|svg)$/,new e.CacheFirst({cacheName:"images",plugins:[new e.ExpirationPlugin({maxEntries:10})]}),"GET"),e.registerRoute(/\.html$/,new e.NetworkFirst({cacheName:"html",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:50}),new e.CacheableResponsePlugin({statuses:[0,200]})]}),"GET"),e.registerRoute(/\.(?:css|js)$/,new e.NetworkFirst({cacheName:"assets",plugins:[new e.ExpirationPlugin({maxEntries:50}),new e.CacheableResponsePlugin({statuses:[0,200]})]}),"GET");}); //# sourceMappingURL=sw.js.map diff --git a/core/scripts/serviceWorker/sw.js.map b/core/scripts/serviceWorker/sw.js.map index 1b7c92d..8fa3213 100644 --- a/core/scripts/serviceWorker/sw.js.map +++ b/core/scripts/serviceWorker/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","sources":["../../../../../private/var/folders/x_/xp67pwcd45d2bwd0h9y9cpbw0000gp/T/1764d5872f2a6373fcc69d4be0b40f76/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-routing/registerRoute.mjs';\nimport {ExpirationPlugin as workbox_expiration_ExpirationPlugin} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-expiration/ExpirationPlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {CacheableResponsePlugin as workbox_cacheable_response_CacheableResponsePlugin} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-cacheable-response/CacheableResponsePlugin.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"core/systemrun.html\",\n \"revision\": \"61ec3960f05098c97d298ab90f475771\"\n },\n {\n \"url\": \"core/styling/style.min.css\",\n \"revision\": \"65a608b7d010ea2b87bb7ea7584ab875\"\n },\n {\n \"url\": \"core/styling/style.css\",\n \"revision\": \"b67cbfd3995e07bba50358eaa64009fe\"\n },\n {\n \"url\": \"core/scripts/runtime.min.js\",\n \"revision\": \"6e4641db4ea78c758c56312b1cf2379f\"\n },\n {\n \"url\": \"core/scripts/runtime.js\",\n \"revision\": \"1767d36bb43cfd630a1c01fa2c27f3a9\"\n },\n {\n \"url\": \"core/scripts/crispr_scripts.min.js\",\n \"revision\": \"96fa88586a8017e47d57b94fd287ff3c\"\n },\n {\n \"url\": \"core/scripts/crispr_scripts.js\",\n \"revision\": \"99224226d8d67fb8f654a917e9a2a29d\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/package.json\",\n \"revision\": \"ef0258ebdf3f9d244d7d38c4c35ec723\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/jquery.tabletoCSV.js\",\n \"revision\": \"1757e6cdbbbe5f5a1c330e2f182e24f2\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/gulpfile.js\",\n \"revision\": \"c93880a7ac368dcd9b51d547948cbf8a\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/example.html\",\n \"revision\": \"9b17ab0cdbf7acd33dfcfff87c410d2b\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/bower.json\",\n \"revision\": \"79787e672bb7dc33e2a2e0bdc8467a38\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/README.md\",\n \"revision\": \"d581efd7f3de48bdf77206307df41034\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/dist/jquery.tabletoCSV.js\",\n \"revision\": \"38e3e2fcaff8b3a33f2e3bf01190e845\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/jQuery/jquery.min.js\",\n \"revision\": \"a8e7cabd4d49dfaf0146678ee147dfc5\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Fonts/MaterialIcon.css\",\n \"revision\": \"c1cbea39f07b551807abd9967b809ffd\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.min.js\",\n \"revision\": \"a92b3364fb0a7349f2a1c31a7ad5ed5e\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.js\",\n \"revision\": \"52de67605c3d156f4958c83fa9cfc8d9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.min.js\",\n \"revision\": \"6ccf144f123da79e62d5e46a06f133b9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.js\",\n \"revision\": \"32e42b38a15f27b01f79bb13aad53714\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.min.js\",\n \"revision\": \"5cc1b73e70520fa84b1846afe0ec8fb6\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.js\",\n \"revision\": \"7d2c412531f05f39e97195f9b48a53dc\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.min.css\",\n \"revision\": \"53aa521e55523d4f35610e568c5991fd\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.css\",\n \"revision\": \"f50b588ab5764c08bb2e57da6bbe47c7\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.min.css\",\n \"revision\": \"1b1cb0e2be9a21f091a87691f20c6300\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.css\",\n \"revision\": \"32f9388da564ecf3f4f129021d3736a8\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.min.css\",\n \"revision\": \"1282e3b4ef0226816da34cd92a7ae69b\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.css\",\n \"revision\": \"95616dd04a2044a59dbefbc48c050891\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.min.css\",\n \"revision\": \"20d013574c70b2032e408e8f81a8fec9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.css\",\n \"revision\": \"2609642eaa62f29a2275e0ced5a098fe\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.min.css\",\n \"revision\": \"c01f229a610e6f96bdb57fd287f48fc9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.css\",\n \"revision\": \"0b4f19eb4846adc5a866b80c81bda434\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.min.css\",\n \"revision\": \"7c821536802bd2fa35701c22f2e96d36\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.css\",\n \"revision\": \"cb9d8d28a86d39db9b43030a8248b766\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.min.css\",\n \"revision\": \"fc7e1eb57c409c379d21a8001a0f9b33\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.css\",\n \"revision\": \"93f428651ed8b87b9986050f06e03cb2\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.min.css\",\n \"revision\": \"895b9494c7178ac12ad9c56d81305665\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.css\",\n \"revision\": \"4dd0ce2aa69225d64aacbded692fe756\"\n },\n {\n \"url\": \"core/images/logo_transparent.svg\",\n \"revision\": \"d6abce258f77c56dfa6bb87765e3dfcf\"\n },\n {\n \"url\": \"core/images/logo_transparent.png\",\n \"revision\": \"86746c9170e4cc9fccb363d0c54b3497\"\n },\n {\n \"url\": \"core/images/logo_transparent-Dark.svg\",\n \"revision\": \"faef5b38e346a12888c11184c890292e\"\n },\n {\n \"url\": \"core/images/logo_transparent-Dark.png\",\n \"revision\": \"cec8eede6a0b9a7e6da788d86edf6b37\"\n },\n {\n \"url\": \"core/images/dna.svg\",\n \"revision\": \"7cf969d66011a6cddf39163fa202fa51\"\n },\n {\n \"url\": \"core/images/dna.png\",\n \"revision\": \"d2778bf9fba581a4f4b8c2fca9abc9e8\"\n },\n {\n \"url\": \"core/images/EDITmd/005_Algorithm.png\",\n \"revision\": \"934afcec1bad4f6cd1b39e799e6de5c2\"\n },\n {\n \"url\": \"core/images/EDITmd/004_FeedbackPage.png\",\n \"revision\": \"e4ffddaa8a91c2c5547a89a4c6f47794\"\n },\n {\n \"url\": \"core/images/EDITmd/002_SciGradePracticeGene.png\",\n \"revision\": \"a47cd17752a978f6e468985af11d5f3e\"\n },\n {\n \"url\": \"core/images/BackgroundImage/homeBackground.webp\",\n \"revision\": \"fcb1240061569d6c355261f8d75a0f1b\"\n },\n {\n \"url\": \"core/images/BackgroundImage/grey.webp\",\n \"revision\": \"44f3357b5a1f4d29ea3368de0f0f5279\"\n },\n {\n \"url\": \"core/icon/screenshot3.webp\",\n \"revision\": \"19ef6219d8f3ba14ebf25b72e07240d8\"\n },\n {\n \"url\": \"core/icon/screenshot2.webp\",\n \"revision\": \"87d56bb07395695fda9e04a30caf1672\"\n },\n {\n \"url\": \"core/icon/screenshot1.webp\",\n \"revision\": \"426fd7165422ee95968d181411229d95\"\n },\n {\n \"url\": \"core/icon/safari-pinned-tab.svg\",\n \"revision\": \"3a6f655958b21d384ae3dad886960d93\"\n },\n {\n \"url\": \"core/icon/resoc.png\",\n \"revision\": \"4b94395e0972a350b0727a20e3d06baa\"\n },\n {\n \"url\": \"core/icon/mstile-70x70.png\",\n \"revision\": \"b2902f78c5c0344f8a0558a8f36b97bf\"\n },\n {\n \"url\": \"core/icon/mstile-310x310.png\",\n \"revision\": \"39af54c06ac44ebe9312f682ddd3602c\"\n },\n {\n \"url\": \"core/icon/mstile-310x150.png\",\n \"revision\": \"7555e1760cd643b25105bfe4114eedfd\"\n },\n {\n \"url\": \"core/icon/mstile-150x150.png\",\n \"revision\": \"4a6b569778e6b9d81aaee10df7c65284\"\n },\n {\n \"url\": \"core/icon/mstile-144x144.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x96.png\",\n \"revision\": \"5269c50f0761a8aa50ae7201c28760c6\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x72.png\",\n \"revision\": \"0603508e30979836bd82b2d95dc0b1f4\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x512.png\",\n \"revision\": \"499293f67750aa3b60815cb50d8e3b72\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x48.png\",\n \"revision\": \"c521515543d0ccc88a843690484dfefe\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x384.png\",\n \"revision\": \"83527cdabf00617fb5b56df08a08b2a3\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x192.png\",\n \"revision\": \"bd977cf9153d6ebb3e8d8f79b4f100b6\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x128.png\",\n \"revision\": \"cf5ea1b4cd68730505d36d59d3c8b04d\"\n },\n {\n \"url\": \"core/icon/maskable_icon.png\",\n \"revision\": \"94a300afab67912c4aa267989a725155\"\n },\n {\n \"url\": \"core/icon/manifest.json\",\n \"revision\": \"ec78f1b4aaf3e8be6d7db11ef45fbf72\"\n },\n {\n \"url\": \"core/icon/favicon.ico\",\n \"revision\": \"ea57adfd4a62355e9f4c2b46ef21600f\"\n },\n {\n \"url\": \"core/icon/favicon-32x32.png\",\n \"revision\": \"a6296dcec5e5a6449807f753d885507d\"\n },\n {\n \"url\": \"core/icon/favicon-16x16.png\",\n \"revision\": \"f9e844d671e8e4b80174f643fe4dcf56\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-precomposed.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-76x76.png\",\n \"revision\": \"448377ba1760c41142b83ffd0fa47163\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-76x76-precomposed.png\",\n \"revision\": \"448377ba1760c41142b83ffd0fa47163\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-72x72.png\",\n \"revision\": \"819a43b6e5dc4991e399ff9b5d9b34b3\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-72x72-precomposed.png\",\n \"revision\": \"819a43b6e5dc4991e399ff9b5d9b34b3\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-60x60.png\",\n \"revision\": \"37be5e105d7a21fc8f3c437508dca233\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-60x60-precomposed.png\",\n \"revision\": \"37be5e105d7a21fc8f3c437508dca233\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-57x57.png\",\n \"revision\": \"b3e1d7fc553b33f086791c138d69bba1\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-57x57-precomposed.png\",\n \"revision\": \"b3e1d7fc553b33f086791c138d69bba1\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-180x180.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-180x180-precomposed.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-152x152.png\",\n \"revision\": \"8d46a8911ef72a562c97570d452f83ac\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-152x152-precomposed.png\",\n \"revision\": \"8d46a8911ef72a562c97570d452f83ac\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-144x144.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-144x144-precomposed.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-120x120.png\",\n \"revision\": \"c61a5acca54b104d7fe15fbc473796b5\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-120x120-precomposed.png\",\n \"revision\": \"c61a5acca54b104d7fe15fbc473796b5\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-114x114.png\",\n \"revision\": \"7b0f0af98c190974af01f605b117fc18\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-114x114-precomposed.png\",\n \"revision\": \"7b0f0af98c190974af01f605b117fc18\"\n },\n {\n \"url\": \"core/icon/android-chrome-96x96.png\",\n \"revision\": \"497e53074c189be631a8368192870f02\"\n },\n {\n \"url\": \"core/icon/android-chrome-72x72.png\",\n \"revision\": \"a2b1197f79059981d8a19ba65ce73e6d\"\n },\n {\n \"url\": \"core/icon/android-chrome-512x512.png\",\n \"revision\": \"d5a6869fb6a0d95e1c1398de5aac2278\"\n },\n {\n \"url\": \"core/icon/android-chrome-48x48.png\",\n \"revision\": \"7ac44965ab502f17205e2d048d3e1580\"\n },\n {\n \"url\": \"core/icon/android-chrome-384x384.png\",\n \"revision\": \"45ea1a83b4d26a9224844344602ad69e\"\n },\n {\n \"url\": \"core/icon/android-chrome-36x36.png\",\n \"revision\": \"c3603b9735bb8397b0ac5351da9e94ed\"\n },\n {\n \"url\": \"core/icon/android-chrome-256x256.png\",\n \"revision\": \"d80b94ad67334b9560e3cefaf8b04677\"\n },\n {\n \"url\": \"core/icon/android-chrome-192x192.png\",\n \"revision\": \"f94fc51b10052dcc8f91e04945a618b8\"\n },\n {\n \"url\": \"core/icon/android-chrome-144x144.png\",\n \"revision\": \"859cb36c4d6354a1d76e8d9692fdd88d\"\n },\n {\n \"url\": \"core/data/Benchling_gRNA_Outputs.json\",\n \"revision\": \"515b0830b197e126a294fb15cd6d8e89\"\n },\n {\n \"url\": \"core/data/eBFP/eBFP.fasta\",\n \"revision\": \"a30dc131549dc5fbbaa59128830ca49c\"\n },\n {\n \"url\": \"core/data/eBFP/Benchling_gRNA_outputs.xlsx\",\n \"revision\": \"cb29f7f64c8c0f44cfe58c3504af0d2b\"\n },\n {\n \"url\": \"core/data/HBB/HBB.fasta\",\n \"revision\": \"0314a959f59b730536fddec088d4a6c5\"\n },\n {\n \"url\": \"core/data/HBB/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"571ef05c0a5fc985423f08ab13e3fc71\"\n },\n {\n \"url\": \"core/data/CCR5/CCR5.fasta\",\n \"revision\": \"60232b31119c5c0dfd9c59216f46928a\"\n },\n {\n \"url\": \"core/data/CCR5/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"d204b7de85c0def6a40789a3104dd975\"\n },\n {\n \"url\": \"core/data/Background_info/gene_background_info.json\",\n \"revision\": \"ebeaca222ceb2e2354f6b2bacb6d0b26\"\n },\n {\n \"url\": \"core/data/APOE/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"d728b00ab3559732abc114c43893ba7e\"\n },\n {\n \"url\": \"core/data/APOE/APOE.fasta\",\n \"revision\": \"9955beb43e9fd5a6e506cb9853ef13f2\"\n },\n {\n \"url\": \"core/data/ACTN3/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"9d9a05ae5858671f89b87ae185b4917b\"\n },\n {\n \"url\": \"core/data/ACTN3/ACTN3.fasta\",\n \"revision\": \"a5ad42f7acbecbc28bed864b8377c5d4\"\n }\n], {});\n\n\n\n\nworkbox_routing_registerRoute(/\\.(?:png|jpg|jpeg|webp|ico|svg)$/, new workbox_strategies_CacheFirst({ \"cacheName\":\"images\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 10 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.html$/, new workbox_strategies_NetworkFirst({ \"cacheName\":\"html\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 50 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:css|js)$/, new workbox_strategies_NetworkFirst({ \"cacheName\":\"assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 50 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision","workbox_routing_registerRoute","workbox_strategies_CacheFirst","cacheName","plugins","workbox_expiration_ExpirationPlugin","maxEntries","workbox_strategies_NetworkFirst","networkTimeoutSeconds","workbox_cacheable_response_CacheableResponsePlugin","statuses"],"mappings":"inBAwBAA,KAAKC,iBAAiB,UAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,gBAYTC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,mEACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,6EACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oCAEd,CACED,IAAO,qEACPC,SAAY,oCAEd,CACED,IAAO,0EACPC,SAAY,oCAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,wEACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,qCAEb,CAAE,GAKLC,EAAAA,cAA8B,mCAAoC,IAAIC,aAA8B,CAAEC,UAAY,SAAUC,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,QAAW,OACvML,EAAAA,cAA8B,UAAW,IAAIM,eAAgC,CAAEJ,UAAY,OAAOK,sBAAwB,GAAIJ,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,KAAO,IAAIG,EAAAA,wBAAmD,CAAEC,SAAU,CAAE,EAAG,UAAc,OAC3RT,EAAAA,cAA8B,gBAAiB,IAAIM,eAAgC,CAAEJ,UAAY,SAAUC,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,KAAO,IAAIG,EAAAA,wBAAmD,CAAEC,SAAU,CAAE,EAAG,UAAc"} \ No newline at end of file +{"version":3,"file":"sw.js","sources":["../../../../../private/var/folders/x_/xp67pwcd45d2bwd0h9y9cpbw0000gp/T/e056a9aa17af84bd1b613818bd12b446/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-routing/registerRoute.mjs';\nimport {ExpirationPlugin as workbox_expiration_ExpirationPlugin} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-expiration/ExpirationPlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {CacheableResponsePlugin as workbox_cacheable_response_CacheableResponsePlugin} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-cacheable-response/CacheableResponsePlugin.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/Users/joohyun/Documents/code/SciGrade/node_modules/workbox-precaching/precacheAndRoute.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.addEventListener('message', (event) => {\n if (event.data && event.data.type === 'SKIP_WAITING') {\n self.skipWaiting();\n }\n});\n\n\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"core/systemrun.html\",\n \"revision\": \"8dff6048b9d69269ee93641fe2a6fdd3\"\n },\n {\n \"url\": \"core/styling/style.min.css\",\n \"revision\": \"65a608b7d010ea2b87bb7ea7584ab875\"\n },\n {\n \"url\": \"core/styling/style.css\",\n \"revision\": \"b67cbfd3995e07bba50358eaa64009fe\"\n },\n {\n \"url\": \"core/scripts/runtime.min.js\",\n \"revision\": \"8a3d731b68f7a844695d9f62975f9e87\"\n },\n {\n \"url\": \"core/scripts/runtime.js\",\n \"revision\": \"3d9fff75f5461d4c927f08837da3737f\"\n },\n {\n \"url\": \"core/scripts/crispr_scripts.min.js\",\n \"revision\": \"a33cfc3004c2dade90c7df5ec2eb33e2\"\n },\n {\n \"url\": \"core/scripts/crispr_scripts.js\",\n \"revision\": \"9b350e01172d688a17f6151a69b9334b\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/package.json\",\n \"revision\": \"ef0258ebdf3f9d244d7d38c4c35ec723\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/jquery.tabletoCSV.js\",\n \"revision\": \"1757e6cdbbbe5f5a1c330e2f182e24f2\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/gulpfile.js\",\n \"revision\": \"c93880a7ac368dcd9b51d547948cbf8a\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/example.html\",\n \"revision\": \"9b17ab0cdbf7acd33dfcfff87c410d2b\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/bower.json\",\n \"revision\": \"79787e672bb7dc33e2a2e0bdc8467a38\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/README.md\",\n \"revision\": \"d581efd7f3de48bdf77206307df41034\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/tabletoCSV/dist/jquery.tabletoCSV.js\",\n \"revision\": \"38e3e2fcaff8b3a33f2e3bf01190e845\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/jQuery/jquery.min.js\",\n \"revision\": \"a8e7cabd4d49dfaf0146678ee147dfc5\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Fonts/MaterialIcon.css\",\n \"revision\": \"c1cbea39f07b551807abd9967b809ffd\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.min.js\",\n \"revision\": \"a92b3364fb0a7349f2a1c31a7ad5ed5e\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.js\",\n \"revision\": \"52de67605c3d156f4958c83fa9cfc8d9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.min.js\",\n \"revision\": \"6ccf144f123da79e62d5e46a06f133b9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.esm.js\",\n \"revision\": \"32e42b38a15f27b01f79bb13aad53714\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.min.js\",\n \"revision\": \"5cc1b73e70520fa84b1846afe0ec8fb6\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/js/bootstrap.bundle.js\",\n \"revision\": \"7d2c412531f05f39e97195f9b48a53dc\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.min.css\",\n \"revision\": \"53aa521e55523d4f35610e568c5991fd\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.rtl.css\",\n \"revision\": \"f50b588ab5764c08bb2e57da6bbe47c7\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.min.css\",\n \"revision\": \"1b1cb0e2be9a21f091a87691f20c6300\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap.css\",\n \"revision\": \"32f9388da564ecf3f4f129021d3736a8\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.min.css\",\n \"revision\": \"1282e3b4ef0226816da34cd92a7ae69b\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.rtl.css\",\n \"revision\": \"95616dd04a2044a59dbefbc48c050891\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.min.css\",\n \"revision\": \"20d013574c70b2032e408e8f81a8fec9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-utilities.css\",\n \"revision\": \"2609642eaa62f29a2275e0ced5a098fe\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.min.css\",\n \"revision\": \"c01f229a610e6f96bdb57fd287f48fc9\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.rtl.css\",\n \"revision\": \"0b4f19eb4846adc5a866b80c81bda434\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.min.css\",\n \"revision\": \"7c821536802bd2fa35701c22f2e96d36\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-reboot.css\",\n \"revision\": \"cb9d8d28a86d39db9b43030a8248b766\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.min.css\",\n \"revision\": \"fc7e1eb57c409c379d21a8001a0f9b33\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.rtl.css\",\n \"revision\": \"93f428651ed8b87b9986050f06e03cb2\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.min.css\",\n \"revision\": \"895b9494c7178ac12ad9c56d81305665\"\n },\n {\n \"url\": \"core/scripts/APIandLibraries/Bootstrap/css/bootstrap-grid.css\",\n \"revision\": \"4dd0ce2aa69225d64aacbded692fe756\"\n },\n {\n \"url\": \"core/images/logo_transparent.svg\",\n \"revision\": \"d6abce258f77c56dfa6bb87765e3dfcf\"\n },\n {\n \"url\": \"core/images/logo_transparent.png\",\n \"revision\": \"86746c9170e4cc9fccb363d0c54b3497\"\n },\n {\n \"url\": \"core/images/logo_transparent-Dark.svg\",\n \"revision\": \"faef5b38e346a12888c11184c890292e\"\n },\n {\n \"url\": \"core/images/logo_transparent-Dark.png\",\n \"revision\": \"cec8eede6a0b9a7e6da788d86edf6b37\"\n },\n {\n \"url\": \"core/images/dna.svg\",\n \"revision\": \"7cf969d66011a6cddf39163fa202fa51\"\n },\n {\n \"url\": \"core/images/dna.png\",\n \"revision\": \"d2778bf9fba581a4f4b8c2fca9abc9e8\"\n },\n {\n \"url\": \"core/images/EDITmd/005_Algorithm.png\",\n \"revision\": \"934afcec1bad4f6cd1b39e799e6de5c2\"\n },\n {\n \"url\": \"core/images/EDITmd/004_FeedbackPage.png\",\n \"revision\": \"e4ffddaa8a91c2c5547a89a4c6f47794\"\n },\n {\n \"url\": \"core/images/EDITmd/002_SciGradePracticeGene.png\",\n \"revision\": \"a47cd17752a978f6e468985af11d5f3e\"\n },\n {\n \"url\": \"core/images/BackgroundImage/homeBackground.webp\",\n \"revision\": \"fcb1240061569d6c355261f8d75a0f1b\"\n },\n {\n \"url\": \"core/images/BackgroundImage/grey.webp\",\n \"revision\": \"44f3357b5a1f4d29ea3368de0f0f5279\"\n },\n {\n \"url\": \"core/icon/screenshot3.webp\",\n \"revision\": \"19ef6219d8f3ba14ebf25b72e07240d8\"\n },\n {\n \"url\": \"core/icon/screenshot2.webp\",\n \"revision\": \"87d56bb07395695fda9e04a30caf1672\"\n },\n {\n \"url\": \"core/icon/screenshot1.webp\",\n \"revision\": \"426fd7165422ee95968d181411229d95\"\n },\n {\n \"url\": \"core/icon/safari-pinned-tab.svg\",\n \"revision\": \"3a6f655958b21d384ae3dad886960d93\"\n },\n {\n \"url\": \"core/icon/resoc.png\",\n \"revision\": \"4b94395e0972a350b0727a20e3d06baa\"\n },\n {\n \"url\": \"core/icon/mstile-70x70.png\",\n \"revision\": \"b2902f78c5c0344f8a0558a8f36b97bf\"\n },\n {\n \"url\": \"core/icon/mstile-310x310.png\",\n \"revision\": \"39af54c06ac44ebe9312f682ddd3602c\"\n },\n {\n \"url\": \"core/icon/mstile-310x150.png\",\n \"revision\": \"7555e1760cd643b25105bfe4114eedfd\"\n },\n {\n \"url\": \"core/icon/mstile-150x150.png\",\n \"revision\": \"4a6b569778e6b9d81aaee10df7c65284\"\n },\n {\n \"url\": \"core/icon/mstile-144x144.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x96.png\",\n \"revision\": \"5269c50f0761a8aa50ae7201c28760c6\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x72.png\",\n \"revision\": \"0603508e30979836bd82b2d95dc0b1f4\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x512.png\",\n \"revision\": \"499293f67750aa3b60815cb50d8e3b72\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x48.png\",\n \"revision\": \"c521515543d0ccc88a843690484dfefe\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x384.png\",\n \"revision\": \"83527cdabf00617fb5b56df08a08b2a3\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x192.png\",\n \"revision\": \"bd977cf9153d6ebb3e8d8f79b4f100b6\"\n },\n {\n \"url\": \"core/icon/maskable_icon_x128.png\",\n \"revision\": \"cf5ea1b4cd68730505d36d59d3c8b04d\"\n },\n {\n \"url\": \"core/icon/maskable_icon.png\",\n \"revision\": \"94a300afab67912c4aa267989a725155\"\n },\n {\n \"url\": \"core/icon/manifest.json\",\n \"revision\": \"ec78f1b4aaf3e8be6d7db11ef45fbf72\"\n },\n {\n \"url\": \"core/icon/favicon.ico\",\n \"revision\": \"ea57adfd4a62355e9f4c2b46ef21600f\"\n },\n {\n \"url\": \"core/icon/favicon-32x32.png\",\n \"revision\": \"a6296dcec5e5a6449807f753d885507d\"\n },\n {\n \"url\": \"core/icon/favicon-16x16.png\",\n \"revision\": \"f9e844d671e8e4b80174f643fe4dcf56\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-precomposed.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-76x76.png\",\n \"revision\": \"448377ba1760c41142b83ffd0fa47163\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-76x76-precomposed.png\",\n \"revision\": \"448377ba1760c41142b83ffd0fa47163\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-72x72.png\",\n \"revision\": \"819a43b6e5dc4991e399ff9b5d9b34b3\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-72x72-precomposed.png\",\n \"revision\": \"819a43b6e5dc4991e399ff9b5d9b34b3\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-60x60.png\",\n \"revision\": \"37be5e105d7a21fc8f3c437508dca233\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-60x60-precomposed.png\",\n \"revision\": \"37be5e105d7a21fc8f3c437508dca233\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-57x57.png\",\n \"revision\": \"b3e1d7fc553b33f086791c138d69bba1\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-57x57-precomposed.png\",\n \"revision\": \"b3e1d7fc553b33f086791c138d69bba1\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-180x180.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-180x180-precomposed.png\",\n \"revision\": \"ced32ca13a0c404c96fc081dca7473eb\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-152x152.png\",\n \"revision\": \"8d46a8911ef72a562c97570d452f83ac\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-152x152-precomposed.png\",\n \"revision\": \"8d46a8911ef72a562c97570d452f83ac\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-144x144.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-144x144-precomposed.png\",\n \"revision\": \"52d597709f2268268fd4063d34bd0ce7\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-120x120.png\",\n \"revision\": \"c61a5acca54b104d7fe15fbc473796b5\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-120x120-precomposed.png\",\n \"revision\": \"c61a5acca54b104d7fe15fbc473796b5\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-114x114.png\",\n \"revision\": \"7b0f0af98c190974af01f605b117fc18\"\n },\n {\n \"url\": \"core/icon/apple-touch-icon-114x114-precomposed.png\",\n \"revision\": \"7b0f0af98c190974af01f605b117fc18\"\n },\n {\n \"url\": \"core/icon/android-chrome-96x96.png\",\n \"revision\": \"497e53074c189be631a8368192870f02\"\n },\n {\n \"url\": \"core/icon/android-chrome-72x72.png\",\n \"revision\": \"a2b1197f79059981d8a19ba65ce73e6d\"\n },\n {\n \"url\": \"core/icon/android-chrome-512x512.png\",\n \"revision\": \"d5a6869fb6a0d95e1c1398de5aac2278\"\n },\n {\n \"url\": \"core/icon/android-chrome-48x48.png\",\n \"revision\": \"7ac44965ab502f17205e2d048d3e1580\"\n },\n {\n \"url\": \"core/icon/android-chrome-384x384.png\",\n \"revision\": \"45ea1a83b4d26a9224844344602ad69e\"\n },\n {\n \"url\": \"core/icon/android-chrome-36x36.png\",\n \"revision\": \"c3603b9735bb8397b0ac5351da9e94ed\"\n },\n {\n \"url\": \"core/icon/android-chrome-256x256.png\",\n \"revision\": \"d80b94ad67334b9560e3cefaf8b04677\"\n },\n {\n \"url\": \"core/icon/android-chrome-192x192.png\",\n \"revision\": \"f94fc51b10052dcc8f91e04945a618b8\"\n },\n {\n \"url\": \"core/icon/android-chrome-144x144.png\",\n \"revision\": \"859cb36c4d6354a1d76e8d9692fdd88d\"\n },\n {\n \"url\": \"core/data/Benchling_gRNA_Outputs.json\",\n \"revision\": \"515b0830b197e126a294fb15cd6d8e89\"\n },\n {\n \"url\": \"core/data/eBFP/eBFP.fasta\",\n \"revision\": \"a30dc131549dc5fbbaa59128830ca49c\"\n },\n {\n \"url\": \"core/data/eBFP/Benchling_gRNA_outputs.xlsx\",\n \"revision\": \"cb29f7f64c8c0f44cfe58c3504af0d2b\"\n },\n {\n \"url\": \"core/data/HBB/HBB.fasta\",\n \"revision\": \"0314a959f59b730536fddec088d4a6c5\"\n },\n {\n \"url\": \"core/data/HBB/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"571ef05c0a5fc985423f08ab13e3fc71\"\n },\n {\n \"url\": \"core/data/CCR5/CCR5.fasta\",\n \"revision\": \"60232b31119c5c0dfd9c59216f46928a\"\n },\n {\n \"url\": \"core/data/CCR5/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"d204b7de85c0def6a40789a3104dd975\"\n },\n {\n \"url\": \"core/data/Background_info/gene_background_info.json\",\n \"revision\": \"ebeaca222ceb2e2354f6b2bacb6d0b26\"\n },\n {\n \"url\": \"core/data/APOE/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"d728b00ab3559732abc114c43893ba7e\"\n },\n {\n \"url\": \"core/data/APOE/APOE.fasta\",\n \"revision\": \"9955beb43e9fd5a6e506cb9853ef13f2\"\n },\n {\n \"url\": \"core/data/ACTN3/Benchling_gRNA_Outputs.xlsx\",\n \"revision\": \"9d9a05ae5858671f89b87ae185b4917b\"\n },\n {\n \"url\": \"core/data/ACTN3/ACTN3.fasta\",\n \"revision\": \"a5ad42f7acbecbc28bed864b8377c5d4\"\n }\n], {});\n\n\n\n\nworkbox_routing_registerRoute(/\\.(?:png|jpg|jpeg|webp|ico|svg)$/, new workbox_strategies_CacheFirst({ \"cacheName\":\"images\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 10 })] }), 'GET');\nworkbox_routing_registerRoute(/\\.html$/, new workbox_strategies_NetworkFirst({ \"cacheName\":\"html\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 50 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\nworkbox_routing_registerRoute(/\\.(?:css|js)$/, new workbox_strategies_NetworkFirst({ \"cacheName\":\"assets\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 50 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\n\n\n\n\n"],"names":["self","addEventListener","event","data","type","skipWaiting","workbox_precaching_precacheAndRoute","url","revision","workbox_routing_registerRoute","workbox_strategies_CacheFirst","cacheName","plugins","workbox_expiration_ExpirationPlugin","maxEntries","workbox_strategies_NetworkFirst","networkTimeoutSeconds","workbox_cacheable_response_CacheableResponsePlugin","statuses"],"mappings":"inBAwBAA,KAAKC,iBAAiB,UAAYC,IAC5BA,EAAMC,MAA4B,iBAApBD,EAAMC,KAAKC,MAC3BJ,KAAKK,gBAYTC,EAAAA,iBAAoC,CAClC,CACEC,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,yBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,uDACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,oDACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,yDACPC,SAAY,oCAEd,CACED,IAAO,iEACPC,SAAY,oCAEd,CACED,IAAO,6DACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,mEACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,+DACPC,SAAY,oCAEd,CACED,IAAO,2DACPC,SAAY,oCAEd,CACED,IAAO,6EACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oCAEd,CACED,IAAO,yEACPC,SAAY,oCAEd,CACED,IAAO,qEACPC,SAAY,oCAEd,CACED,IAAO,0EACPC,SAAY,oCAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,sEACPC,SAAY,oCAEd,CACED,IAAO,kEACPC,SAAY,oCAEd,CACED,IAAO,wEACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,oEACPC,SAAY,oCAEd,CACED,IAAO,gEACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,0CACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,kDACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,sBACPC,SAAY,oCAEd,CACED,IAAO,6BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,+BACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,kCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,mCACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,wBACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,oCAEd,CACED,IAAO,iCACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,mDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,yCACPC,SAAY,oCAEd,CACED,IAAO,qDACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,qCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,uCACPC,SAAY,oCAEd,CACED,IAAO,wCACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,0BACPC,SAAY,oCAEd,CACED,IAAO,4CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,sDACPC,SAAY,oCAEd,CACED,IAAO,6CACPC,SAAY,oCAEd,CACED,IAAO,4BACPC,SAAY,oCAEd,CACED,IAAO,8CACPC,SAAY,oCAEd,CACED,IAAO,8BACPC,SAAY,qCAEb,CAAE,GAKLC,EAAAA,cAA8B,mCAAoC,IAAIC,aAA8B,CAAEC,UAAY,SAAUC,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,QAAW,OACvML,EAAAA,cAA8B,UAAW,IAAIM,eAAgC,CAAEJ,UAAY,OAAOK,sBAAwB,GAAIJ,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,KAAO,IAAIG,EAAAA,wBAAmD,CAAEC,SAAU,CAAE,EAAG,UAAc,OAC3RT,EAAAA,cAA8B,gBAAiB,IAAIM,eAAgC,CAAEJ,UAAY,SAAUC,QAAS,CAAC,IAAIC,mBAAoC,CAAEC,WAAY,KAAO,IAAIG,EAAAA,wBAAmD,CAAEC,SAAU,CAAE,EAAG,UAAc"} \ No newline at end of file diff --git a/core/systemrun.html b/core/systemrun.html index a71bc9f..867f2ff 100644 --- a/core/systemrun.html +++ b/core/systemrun.html @@ -85,14 +85,10 @@ release: "scigrade@1.2.0", integrations: [ - new Sentry.BrowserTracing(), - new Sentry.Integrations.CaptureConsole({ + Sentry.captureConsoleIntegration({ levels: ["error"], }), ], - - // We recommend adjusting this value in production, or using tracesSampler for finer control - tracesSampleRate: 1.0, }); Sentry.configureScope((scope) => { diff --git a/docs/guides/data-structures.md b/docs/guides/data-structures.md index 5e07e5f..f38ad63 100644 --- a/docs/guides/data-structures.md +++ b/docs/guides/data-structures.md @@ -12,8 +12,6 @@ SciGrade uses JSON as its primary data format for gene information and guide RNA **Purpose:** Store educational metadata and background information for each gene. -### Root Structure - ```json { "_id": "5a67577c01ac2022a0eb6f56", @@ -87,8 +85,6 @@ From actual data (HBB gene): **Purpose:** Reference data for validating student-submitted gRNA sequences and calculating off-target scores. -### Root Structure - ```json { "_id": "5a8deb6a547dd8319415ac3d", @@ -185,7 +181,7 @@ From actual data (HBB gene): **Format:** Standard FASTA format -``` +```fasta >ACTN3 ACGTACGTACGTACGTACGTACGTACGTACGT ``` diff --git a/docs/guides/setup.md b/docs/guides/setup.md index 5df4a35..bb8f48c 100644 --- a/docs/guides/setup.md +++ b/docs/guides/setup.md @@ -46,8 +46,8 @@ npm run prettier # Format code automatically # Testing npm run test # Run jest unit tests npm run test:jest # Run jest unit tests only -npm run test:playwright:headless # Run playwright tests headless -npm run test:playwright:ui # Run playwright tests in UI mode +npm run test:e2e:headless # Run E2E tests headless +npm run test:e2e:ui # Run E2E tests in UI mode # Validation npm run validate # Run prettier, eslint, jest, and playwright tests @@ -153,13 +153,14 @@ npm run test:jest Test files in [tests/playwright/](../../tests/playwright/): - [homepage.spec.js](../../tests/playwright/homepage.spec.js) - Main UI tests +- [submission.spec.js](../../tests/playwright/submission.spec.js) - Submission flow tests - [accessibility.js](../../tests/playwright/utils/accessibility.js) - Accessibility utilities Run tests: ```bash -npm run test:playwright:headless # CI mode -npm run test:playwright:ui # Interactive mode +npm run test:e2e:headless # CI mode +npm run test:e2e:ui # Interactive mode ``` ## Building for Production diff --git a/eslint.config.js b/eslint.config.js index 0bd6b06..23bdd6e 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -3,7 +3,13 @@ import globals from "globals"; export default [ { - ignores: ["node_modules/**/*", "core/scripts/APIandLibraries/**/*", "**/*.min.js"], + ignores: [ + "node_modules/**/*", + "core/scripts/APIandLibraries/**/*", + "**/*.min.js", + "**/playwright-report/**/*", + "**/test-results/**/*", + ], }, { languageOptions: { diff --git a/index.html b/index.html index 452aed9..5f2a1ef 100644 --- a/index.html +++ b/index.html @@ -116,15 +116,11 @@ release: "scigrade@1.2.0", integrations: [ - new Sentry.BrowserTracing(), - new Sentry.Integrations.CaptureConsole({ + Sentry.captureConsoleIntegration({ levels: ["error"], }), ], - // We recommend adjusting this value in production, or using tracesSampler for finer control - tracesSampleRate: 1.0, - // Enable logs to be sent to Sentry enableLogs: true, }); diff --git a/package-lock.json b/package-lock.json index 28c4eb8..2e2ebc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "devDependencies": { "@playwright/test": "^1.58.2", "@types/jest": "^30.0.0", - "@types/node": "^25.2.3", + "@types/node": "^25.3.0", "axe-playwright": "^2.2.2", "esbuild": "^0.27.3", "eslint": "^10.0.0", @@ -21,6 +21,7 @@ "http-server": "^14.1.1", "jest": "^30.2.0", "jest-environment-jsdom": "^30.2.0", + "markdownlint-cli": "^0.47.0", "prettier": "^3.8.1", "workbox-cli": "^7.4.0" } @@ -3430,6 +3431,16 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/esrecurse": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", @@ -3508,6 +3519,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/katex": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", @@ -3515,14 +3533,21 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { - "version": "25.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz", - "integrity": "sha512-m0jEgYlYz+mDJZ2+F4v8D1AyQb+QzsNqRuI7xg1VQX/KlKS0qT9r1Mo16yo5F/MtifXFgaofIFsdFMox2SxIbQ==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/normalize-package-data": { @@ -3560,6 +3585,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", @@ -4749,6 +4781,39 @@ "node": ">=10" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -5253,6 +5318,20 @@ "dev": true, "license": "MIT" }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dedent": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", @@ -5344,6 +5423,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -5354,6 +5443,20 @@ "node": ">=8" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dot-prop": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", @@ -7008,6 +7111,32 @@ "node": ">= 0.4" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -7163,6 +7292,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7242,6 +7382,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-in-ci": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-1.0.0.tgz", @@ -8491,6 +8642,13 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, "node_modules/jsonfile": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", @@ -8545,6 +8703,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/katex": { + "version": "0.16.28", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.28.tgz", + "integrity": "sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -8625,6 +8810,16 @@ "dev": true, "license": "MIT" }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8751,6 +8946,168 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdownlint": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.40.0.tgz", + "integrity": "sha512-UKybllYNheWac61Ia7T6fzuQNDZimFIpCg2w6hHjgV1Qu0w1TV0LlSgryUGzM0bkKQCBhy2FDhEELB73Kb0kAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "4.0.2", + "micromark-core-commonmark": "2.0.3", + "micromark-extension-directive": "4.0.0", + "micromark-extension-gfm-autolink-literal": "2.1.0", + "micromark-extension-gfm-footnote": "2.1.0", + "micromark-extension-gfm-table": "2.1.1", + "micromark-extension-math": "3.1.0", + "micromark-util-types": "2.0.2", + "string-width": "8.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, + "node_modules/markdownlint-cli": { + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.47.0.tgz", + "integrity": "sha512-HOcxeKFAdDoldvoYDofd85vI8LgNWy8vmYpCwnlLV46PJcodmGzD7COSSBlhHwsfT4o9KrAStGodImVBus31Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "~14.0.2", + "deep-extend": "~0.6.0", + "ignore": "~7.0.5", + "js-yaml": "~4.1.1", + "jsonc-parser": "~3.3.1", + "jsonpointer": "~5.0.1", + "markdown-it": "~14.1.0", + "markdownlint": "~0.40.0", + "minimatch": "~10.1.1", + "run-con": "~1.3.2", + "smol-toml": "~1.5.2", + "tinyglobby": "~0.2.15" + }, + "bin": { + "markdownlint": "markdownlint.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/markdownlint-cli/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/markdownlint-cli/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/markdownlint-cli/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/markdownlint-cli/node_modules/minimatch": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.3.tgz", + "integrity": "sha512-IF6URNyBX7Z6XfvjpaNy5meRxPZiIf2OqtOoSLs+hLJ9pJAScnM1RjrFcbCaD85y42KcI+oZmKjFIJKYDFjQfg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/markdownlint/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -8761,6 +9118,13 @@ "node": ">= 0.4" } }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, "node_modules/meow": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", @@ -8807,41 +9171,577 @@ "dev": true, "license": "MIT" }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" }, - "engines": { - "node": ">=8.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/mimic-fn": { + "node_modules/micromark-extension-gfm-footnote": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/min-indent": { @@ -8896,11 +9796,11 @@ } }, "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": ">=16 || 14 >=14.17" } @@ -9273,6 +10173,26 @@ "node": ">=10" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -9633,6 +10553,16 @@ "node": ">=6" } }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/pupa": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", @@ -10150,6 +11080,22 @@ "node": ">=0.12.0" } }, + "node_modules/run-con": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", + "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~4.1.0", + "minimist": "^1.2.8", + "strip-json-comments": "~3.1.1" + }, + "bin": { + "run-con": "cli.js" + } + }, "node_modules/rxjs": { "version": "6.6.7", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", @@ -10460,6 +11406,19 @@ "node": ">=20.0.0" } }, + "node_modules/smol-toml": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", + "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -11112,6 +12071,54 @@ "dev": true, "license": "MIT" }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tldts": { "version": "6.1.86", "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", @@ -11323,6 +12330,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -11343,9 +12357,9 @@ } }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 7e8b4cc..7ac965c 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "audit:fix": "npm i && npm audit fix", "eslint:check": "eslint ./", "eslint": "eslint --fix ./", + "lint:markdown": "markdownlint \"**/*.md\"", "minify": "esbuild core/scripts/runtime.js --minify --outfile=core/scripts/runtime.min.js && esbuild core/scripts/crispr_scripts.js --minify --outfile=core/scripts/crispr_scripts.min.js", "prettier:check": "prettier --check ./", "prettier": "prettier --write ./", @@ -30,9 +31,9 @@ "start": "http-server . -p 3000", "test": "jest", "test:jest": "jest --passWithNoTests", - "test:playwright:headless": "npx playwright test --reporter=list", - "test:playwright:ui": "npx playwright test --ui", - "validate": "npm run prettier && npm run eslint && npm run minify && npm run test:jest && npm run test:playwright:headless", + "test:e2e:headless": "npx playwright test --reporter=list", + "test:e2e:ui": "npx playwright test --ui", + "validate": "npm run prettier && npm run eslint && npm run minify && npm run test:jest && npm run test:e2e:headless && npm run lint:markdown", "workbox": "workbox generateSW workbox-config.cjs" }, "bugs": { @@ -57,7 +58,7 @@ "devDependencies": { "@playwright/test": "^1.58.2", "@types/jest": "^30.0.0", - "@types/node": "^25.2.3", + "@types/node": "^25.3.0", "axe-playwright": "^2.2.2", "esbuild": "^0.27.3", "eslint": "^10.0.0", @@ -67,6 +68,7 @@ "http-server": "^14.1.1", "jest": "^30.2.0", "jest-environment-jsdom": "^30.2.0", + "markdownlint-cli": "^0.47.0", "prettier": "^3.8.1", "workbox-cli": "^7.4.0" } diff --git a/playwright.config.js b/playwright.config.js index 4622598..8bd1fce 100644 --- a/playwright.config.js +++ b/playwright.config.js @@ -10,18 +10,7 @@ import { defineConfig, devices } from "@playwright/test"; // dotenv.config({ path: path.resolve(__dirname, '.env') }); /** Android Devices to test on */ -const androidDeviceList = [ - "Galaxy A55", - "Galaxy A55 landscape", - "Nexus 6", - "Nexus 6 landscape", - "Nexus 6P", - "Nexus 6P landscape", - "Pixel 3", - "Pixel 3 landscape", - "Pixel 7", - "Pixel 7 landscape", -]; +const androidDeviceList = ["Galaxy A55", "Nexus 6P", "Pixel 3", "Pixel 7", "Pixel 7 landscape"]; /** * @see https://playwright.dev/docs/test-configuration @@ -33,9 +22,8 @@ export default defineConfig({ /* Fail the build on CI if you accidentally left test.only in the source code. */ forbidOnly: !!process.env.CI, /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, + retries: 2, + workers: 20, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: [["list"], ["html"], ["json", { outputFile: "test-results/results.json" }]], /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ diff --git a/tests/playwright/submission.spec.js b/tests/playwright/submission.spec.js new file mode 100644 index 0000000..62cfe80 --- /dev/null +++ b/tests/playwright/submission.spec.js @@ -0,0 +1,83 @@ +import { test, expect } from "@playwright/test"; + +// Test case table for score-based E2E tests +const scoreTestCases = [ + { + name: "seq input a bit off - partial credit", + inputs: { + sequence_input: "AAGCACTGCACGCCGTGGGT", + strand_input: "Antisense (-)", + pam_input: "CAG", + position_input: "381", + offtarget_input: "87", + f1_input: "TAATACGACTCACTATAGAAGCACTGCACGCCGT", + r1_input: "TTCTAGCTCTAAAACACCCACGGCGTGCAGTGCT", + }, + expectedScore: 9, + }, + { + name: "failing gRNA and primers - zero score", + inputs: { + sequence_input: "AAAAAAAAAAAAAAAAAAAA", + strand_input: "Sense (+)", + pam_input: "AAA", + position_input: "999", + offtarget_input: "1", + f1_input: "AAAAAAAAAAAAAAAAAAAA", + r1_input: "TTTTTTTTTTTTTTTTTTTT", + }, + expectedScore: 0, + }, +]; + +test.describe("SciGrade Submission Flow", () => { + test.beforeEach(async ({ page }) => { + // Navigate to the application page + await page.goto("http://localhost:3000/core/systemrun.html"); + + // Wait for the page to fully load (redirectCRISPR builds the UI) + await page.waitForSelector("#gene_dropdown_selection"); + + // Wait for gene list to be populated (fillGeneList runs after JSON load) + await page.waitForFunction(() => { + const sel = document.getElementById("gene_dropdown_selection"); + return sel && sel.options.length > 0; + }); + + // Select eBFP gene (default test gene) + await page.selectOption("#gene_dropdown_selection", "eBFP"); + + // Click Load Gene button + await page.getByRole("button", { name: "Load Gene" }).click(); + + // Wait for the form to be generated (loadWork appends form inputs into #work) + await page.waitForSelector("#sequence_input", { state: "visible" }); + }); + + // Data-driven tests using test case table + for (const testCase of scoreTestCases) { + test(`should submit ${testCase.name}`, async ({ page }) => { + // Fill in all form inputs from test case + await page.fill("#sequence_input", testCase.inputs.sequence_input); + await page.selectOption("#strand_input", testCase.inputs.strand_input); + await page.fill("#pam_input", testCase.inputs.pam_input); + await page.fill("#position_input", testCase.inputs.position_input); + await page.fill("#offtarget_input", testCase.inputs.offtarget_input); + await page.fill("#f1_input", testCase.inputs.f1_input); + await page.fill("#r1_input", testCase.inputs.r1_input); + + // Click Submit button + await page.click("#assignmentSubmitButton"); + + // Wait for feedback to render + await expect(page.locator("body")).toContainText(/Mark:/, { timeout: 15000 }); + + // Verify expected score + await expect(page.locator("body")).toContainText(`Mark: ${testCase.expectedScore}/10`); + + // Verify feedback sections are present + await expect(page.locator("body")).toContainText(/gRNA Strand Sequence/); + await expect(page.locator("body")).toContainText(/gRNA PAM Sequence/); + }); + } +});