@vue-skuilder/platform-ui 0.2.22 → 0.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/dist/assets/{About-BinSo4od.js → About-BnNPxGyc.js} +2 -2
  2. package/dist/assets/{About-BinSo4od.js.map → About-BnNPxGyc.js.map} +1 -1
  3. package/dist/assets/{AdminDashboard-CEb-vIi7.js → AdminDashboard-xKvhhtCF.js} +2 -2
  4. package/dist/assets/{AdminDashboard-CEb-vIi7.js.map → AdminDashboard-xKvhhtCF.js.map} +1 -1
  5. package/dist/assets/{ClassroomCtrlPanel-DXw-5Njn.js → ClassroomCtrlPanel-BEZrVMhZ.js} +2 -2
  6. package/dist/assets/{ClassroomCtrlPanel-DXw-5Njn.js.map → ClassroomCtrlPanel-BEZrVMhZ.js.map} +1 -1
  7. package/dist/assets/{Classrooms-DCMbsfUL.js → Classrooms-CbKinUWC.js} +2 -2
  8. package/dist/assets/{Classrooms-DCMbsfUL.js.map → Classrooms-CbKinUWC.js.map} +1 -1
  9. package/dist/assets/{CourseRouter-ESl00XJP.js → CourseRouter-Bp58q74L.js} +2 -2
  10. package/dist/assets/{CourseRouter-ESl00XJP.js.map → CourseRouter-Bp58q74L.js.map} +1 -1
  11. package/dist/assets/{CourseWare-BTFRjgBR-BmnClSwv.js → CourseWare-BTFRjgBR-CNeQ51rc.js} +3 -3
  12. package/dist/assets/{CourseWare-BTFRjgBR-BmnClSwv.js.map → CourseWare-BTFRjgBR-CNeQ51rc.js.map} +1 -1
  13. package/dist/assets/{Courses-B7YKtsRZ.js → Courses-Dgp7pLHi.js} +2 -2
  14. package/dist/assets/{Courses-B7YKtsRZ.js.map → Courses-Dgp7pLHi.js.map} +1 -1
  15. package/dist/assets/{EloModeration-DCFtgWVo.js → EloModeration-LfDm7i75.js} +2 -2
  16. package/dist/assets/{EloModeration-DCFtgWVo.js.map → EloModeration-LfDm7i75.js.map} +1 -1
  17. package/dist/assets/{JoinCode-_hcfvpGP.js → JoinCode-Dg2l59fE.js} +2 -2
  18. package/dist/assets/{JoinCode-_hcfvpGP.js.map → JoinCode-Dg2l59fE.js.map} +1 -1
  19. package/dist/assets/{NewCourseDialog-Br4_PUce.js → NewCourseDialog-BP8ECu_s.js} +2 -2
  20. package/dist/assets/{NewCourseDialog-Br4_PUce.js.map → NewCourseDialog-BP8ECu_s.js.map} +1 -1
  21. package/dist/assets/{ReleaseNotes-zQgb0Cds.js → ReleaseNotes-t_ZOV9Nk.js} +2 -2
  22. package/dist/assets/{ReleaseNotes-zQgb0Cds.js.map → ReleaseNotes-t_ZOV9Nk.js.map} +1 -1
  23. package/dist/assets/{RequestPasswordReset-4lAadmzI.js → RequestPasswordReset-CQj82PAz.js} +2 -2
  24. package/dist/assets/{RequestPasswordReset-4lAadmzI.js.map → RequestPasswordReset-CQj82PAz.js.map} +1 -1
  25. package/dist/assets/{ResetPassword-sVeO4SUM.js → ResetPassword-DofJUB3M.js} +2 -2
  26. package/dist/assets/{ResetPassword-sVeO4SUM.js.map → ResetPassword-DofJUB3M.js.map} +1 -1
  27. package/dist/assets/{Study-l5ZdLcD-.js → Study-B_eVIDIr.js} +2 -2
  28. package/dist/assets/{Study-l5ZdLcD-.js.map → Study-B_eVIDIr.js.map} +1 -1
  29. package/dist/assets/{TagInformation-CZMcMmP1.js → TagInformation-u098yyyw.js} +2 -2
  30. package/dist/assets/{TagInformation-CZMcMmP1.js.map → TagInformation-u098yyyw.js.map} +1 -1
  31. package/dist/assets/{User-DmDgN7WO.js → User-DIpbm9vI.js} +2 -2
  32. package/dist/assets/{User-DmDgN7WO.js.map → User-DIpbm9vI.js.map} +1 -1
  33. package/dist/assets/{UserStats-BmxoNxCx.js → UserStats-XMBBeOn-.js} +2 -2
  34. package/dist/assets/{UserStats-BmxoNxCx.js.map → UserStats-XMBBeOn-.js.map} +1 -1
  35. package/dist/assets/{VerifyEmail-C-fwuCII.js → VerifyEmail-fgjtnUx7.js} +2 -2
  36. package/dist/assets/{VerifyEmail-C-fwuCII.js.map → VerifyEmail-fgjtnUx7.js.map} +1 -1
  37. package/dist/assets/{chess-E2uOAyQS-DjXjV5rB.js → chess-E2uOAyQS-ChlISEXk.js} +2 -2
  38. package/dist/assets/{chess-E2uOAyQS-DjXjV5rB.js.map → chess-E2uOAyQS-ChlISEXk.js.map} +1 -1
  39. package/dist/assets/chess-Lfm7Fsvs-B2E6sqHQ.js +1 -0
  40. package/dist/assets/{common-ui.es-BWBbEz1h.js → common-ui.es-BnYwQ6WD.js} +4 -4
  41. package/dist/assets/{common-ui.es-BWBbEz1h.js.map → common-ui.es-BnYwQ6WD.js.map} +1 -1
  42. package/dist/assets/common-ui.es-CivsxjeK.js +1 -0
  43. package/dist/assets/dist-B7bw2KqT.js +1 -0
  44. package/dist/assets/dist-BI1Dc2NU.js +1 -0
  45. package/dist/assets/{dist-DcjcehoT.js → dist-CWTz_ocg.js} +3 -3
  46. package/dist/assets/{dist-DcjcehoT.js.map → dist-CWTz_ocg.js.map} +1 -1
  47. package/dist/assets/{dist-ByU4XK4n.js → dist-DpHREB7I.js} +2 -2
  48. package/dist/assets/{dist-ByU4XK4n.js.map → dist-DpHREB7I.js.map} +1 -1
  49. package/dist/assets/{edit-ui.es-Bw717-xJ.js → edit-ui.es-BCq7osSP.js} +2 -2
  50. package/dist/assets/{edit-ui.es-Bw717-xJ.js.map → edit-ui.es-BCq7osSP.js.map} +1 -1
  51. package/dist/assets/edit-ui.es-RJLxm37q.js +1 -0
  52. package/dist/assets/{french-Dk7YG8Td-I8ls7jxJ.js → french-Dk7YG8Td-Diep9iou.js} +2 -2
  53. package/dist/assets/{french-Dk7YG8Td-I8ls7jxJ.js.map → french-Dk7YG8Td-Diep9iou.js.map} +1 -1
  54. package/dist/assets/french-evUMlbbq-B-ZDqfUy.js +1 -0
  55. package/dist/assets/{index-i0-XaMZg.js → index-DiRyMYep.js} +4 -4
  56. package/dist/assets/{index-i0-XaMZg.js.map → index-DiRyMYep.js.map} +1 -1
  57. package/dist/assets/{math-B4HbgYf6-CPsDCMOB.js → math-B4HbgYf6-DxhWCfVC.js} +2 -2
  58. package/dist/assets/{math-B4HbgYf6-CPsDCMOB.js.map → math-B4HbgYf6-DxhWCfVC.js.map} +1 -1
  59. package/dist/assets/math-DYni7rRl-D7JUXkpR.js +1 -0
  60. package/dist/assets/piano-BN5Btq91-9M7xzFZI.js +1 -0
  61. package/dist/assets/{piano-DF1g6yaX-CZcQ5tI1.js → piano-DF1g6yaX-C2z0pIrX.js} +2 -2
  62. package/dist/assets/{piano-DF1g6yaX-CZcQ5tI1.js.map → piano-DF1g6yaX-C2z0pIrX.js.map} +1 -1
  63. package/dist/assets/{pitch-CgGJFkZ1-DAOLVkSo.js → pitch-CgGJFkZ1-BWXl37SW.js} +2 -2
  64. package/dist/assets/{pitch-CgGJFkZ1-DAOLVkSo.js.map → pitch-CgGJFkZ1-BWXl37SW.js.map} +1 -1
  65. package/dist/assets/pitch-Dn0iNqiS-COn7DvCC.js +1 -0
  66. package/dist/assets/{server-Bx1Fjv_u.js → server-B7Wbi0X3.js} +2 -2
  67. package/dist/assets/{server-Bx1Fjv_u.js.map → server-B7Wbi0X3.js.map} +1 -1
  68. package/dist/assets/{sightsing-BFQ7HRig-Bnza0c2V.js → sightsing-BFQ7HRig-agEeGc0d.js} +2 -2
  69. package/dist/assets/{sightsing-BFQ7HRig-Bnza0c2V.js.map → sightsing-BFQ7HRig-agEeGc0d.js.map} +1 -1
  70. package/dist/assets/sightsing-CJX3k0Fd-Bxe6N8AQ.js +1 -0
  71. package/dist/assets/{typing-BevtfWlp-hJvw_7v8.js → typing-BevtfWlp-CVNShTVM.js} +2 -2
  72. package/dist/assets/{typing-BevtfWlp-hJvw_7v8.js.map → typing-BevtfWlp-CVNShTVM.js.map} +1 -1
  73. package/dist/assets/typing-k-ojjO7G-BmjwY34I.js +1 -0
  74. package/dist/assets/{word-work-BOnRlZgd-ni_sRS1f.js → word-work-BOnRlZgd-C3bCWnpp.js} +2 -2
  75. package/dist/assets/{word-work-BOnRlZgd-ni_sRS1f.js.map → word-work-BOnRlZgd-C3bCWnpp.js.map} +1 -1
  76. package/dist/assets/word-work-Dd6tIKrt-CykC-OqP.js +1 -0
  77. package/dist/index.html +3 -3
  78. package/dist/sw.js +1 -1
  79. package/dist/sw.js.map +1 -1
  80. package/package.json +7 -7
  81. package/dist/assets/chess-Lfm7Fsvs-DWq5aKTF.js +0 -1
  82. package/dist/assets/common-ui.es-BfQE1HxT.js +0 -1
  83. package/dist/assets/dist-CFrhyyIr.js +0 -1
  84. package/dist/assets/dist-DGZeSkEv.js +0 -1
  85. package/dist/assets/edit-ui.es-DRnztFjo.js +0 -1
  86. package/dist/assets/french-evUMlbbq-CH812tTA.js +0 -1
  87. package/dist/assets/math-DYni7rRl-A9MtWwfu.js +0 -1
  88. package/dist/assets/piano-BN5Btq91-CU1e1CoX.js +0 -1
  89. package/dist/assets/pitch-Dn0iNqiS-V_L5g-6M.js +0 -1
  90. package/dist/assets/sightsing-CJX3k0Fd-CvR9PU-f.js +0 -1
  91. package/dist/assets/typing-k-ojjO7G-DL0IEDBs.js +0 -1
  92. package/dist/assets/word-work-Dd6tIKrt-BqfM1y62.js +0 -1
@@ -0,0 +1 @@
1
+ import"./vue.runtime.esm-bundler-C3q8JS9f.js";import"./common-ui.es-BnYwQ6WD.js";import"./dist-leWgtXBf.js";import{T as e,m as t}from"./MarkdownRenderer-kStoDRNE-CwICngq1.js";import"./dist-DpHREB7I.js";export{e as MarkdownRenderer,t as piniaPlugin};
@@ -0,0 +1 @@
1
+ import"./dist-leWgtXBf.js";import{n as e}from"./dist-DpHREB7I.js";export{e as CourseLookup};
@@ -0,0 +1 @@
1
+ import"./vue.runtime.esm-bundler-C3q8JS9f.js";import"./common-ui.es-BnYwQ6WD.js";import"./dist-leWgtXBf.js";import"./MarkdownRenderer-kStoDRNE-CwICngq1.js";import"./dist-DpHREB7I.js";import"./CourseWare-BTFRjgBR-CNeQ51rc.js";import"./chess-E2uOAyQS-ChlISEXk.js";import"./french-Dk7YG8Td-Diep9iou.js";import"./math-B4HbgYf6-DxhWCfVC.js";import"./piano-DF1g6yaX-C2z0pIrX.js";import"./pitch-CgGJFkZ1-BWXl37SW.js";import"./sightsing-BFQ7HRig-agEeGc0d.js";import"./typing-BevtfWlp-CVNShTVM.js";import"./word-work-BOnRlZgd-C3bCWnpp.js";import{a as e,r as t,t as n}from"./dist-CWTz_ocg.js";export{n as allCourseWare,t as defaultCourse,e as loadAllSubcourses};
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chess-Lfm7Fsvs-DWq5aKTF.js","assets/dist-leWgtXBf.js","assets/chunk-D6hFPZc3.js","assets/common-ui.es-BWBbEz1h.js","assets/dist-ByU4XK4n.js","assets/vue.runtime.esm-bundler-C3q8JS9f.js","assets/MarkdownRenderer-kStoDRNE-CwICngq1.js","assets/common-ui-BY2Ut5jf.css","assets/CourseWare-BTFRjgBR-BmnClSwv.js","assets/CourseWare-BTFRjgBR-D750E7i0.css","assets/chess-E2uOAyQS-DjXjV5rB.js","assets/chess-E2uOAyQS-DB7z_kWx.css","assets/french-evUMlbbq-CH812tTA.js","assets/french-Dk7YG8Td-I8ls7jxJ.js","assets/math-DYni7rRl-A9MtWwfu.js","assets/math-B4HbgYf6-CPsDCMOB.js","assets/math-B4HbgYf6-CZyvKZtp.css","assets/piano-BN5Btq91-CU1e1CoX.js","assets/piano-DF1g6yaX-CZcQ5tI1.js","assets/piano-DF1g6yaX-BLvDAgl1.css","assets/pitch-Dn0iNqiS-V_L5g-6M.js","assets/pitch-CgGJFkZ1-DAOLVkSo.js","assets/sightsing-CJX3k0Fd-CvR9PU-f.js","assets/sightsing-BFQ7HRig-Bnza0c2V.js","assets/sightsing-BFQ7HRig-DkUGf5Yf.css","assets/typing-k-ojjO7G-DL0IEDBs.js","assets/typing-BevtfWlp-hJvw_7v8.js","assets/typing-BevtfWlp-B7ZMUAQJ.css","assets/word-work-Dd6tIKrt-BqfM1y62.js","assets/word-work-BOnRlZgd-ni_sRS1f.js"])))=>i.map(i=>d[i]);
2
- import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,S as i,T as a,Vt as o,W as s,Z as c,_ as l,at as u,b as d,f,g as p,lt as m,v as h,y as g,z as _}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{U as v,v as y}from"./common-ui.es-BWBbEz1h.js";import{C as b,T as x,y as S}from"./dist-leWgtXBf.js";import{V as C}from"./dist-ByU4XK4n.js";import{n as w,r as T,t as E,u as D}from"./CourseWare-BTFRjgBR-BmnClSwv.js";import{r as O}from"./piano-DF1g6yaX-CZcQ5tI1.js";var k=new w(`default`,[T]),A=a({name:`PianoRangeVisualizer`,props:{lowestNote:{type:Number,required:!0},highestNote:{type:Number,required:!0},maxWidth:{type:Number,default:1e3}},setup(e){let t=m(null),n=m(800),r=p(()=>{let e=0;for(let t=21;t<=108;t++)isWhiteKey(t)&&e++;return e}),i=p(()=>Math.min(22,n.value/Math.max(25,r.value))),a=p(()=>i.value*.6),o=p(()=>Math.min(e.maxWidth,i.value*r.value+10)),isWhiteKey=e=>{let t=e%12;return[0,2,4,5,7,9,11].includes(t)},getKeyPosition=e=>{let t=0;for(let n=21;n<e;n++)isWhiteKey(n)&&t++;return isWhiteKey(e)?t*i.value:t*i.value-a.value/2},getNoteLabel=e=>{let t=[`C`,`C#`,`D`,`D#`,`E`,`F`,`F#`,`G`,`G#`,`A`,`A#`,`B`],n=e%12,r=Math.floor(e/12)-1;return`${t[n]}${r}`};return _(()=>{t.value&&(n.value=t.value.clientWidth,new ResizeObserver(e=>{for(let t of e)n.value=t.contentRect.width}).observe(t.value))}),{pianoWrapper:t,keyHeight:100,blackKeyHeight:60,whiteKeyWidth:i,blackKeyWidth:a,svgWidth:o,isWhiteKey,getKeyPosition,getNoteLabel}}}),j={class:`piano-range-container`},M={class:`piano-wrapper`,ref:`pianoWrapper`},N=[`width`,`height`],P={class:`background-keys`,opacity:`0.15`},F=[`x`,`width`,`height`],I=[`x`,`width`,`height`],L={class:`selected-range`},R=[`x`,`width`,`height`],z=[`x`,`width`,`height`],B={class:`range-markers`},V=[`x`,`height`],H=[`x`,`height`],U=[`x`,`y`],W=[`x`,`y`];function _sfc_render$1(e,t,r,i,a,c){return n(),d(`div`,j,[l(`div`,M,[(n(),d(`svg`,{width:e.svgWidth,height:e.keyHeight+20,class:`piano-svg`},[l(`g`,P,[(n(),d(f,null,s(88,t=>(n(),d(f,{key:`bg-${t}`},[e.isWhiteKey(t+20)?(n(),d(`rect`,{key:0,x:e.getKeyPosition(t+20),y:`0`,width:e.whiteKeyWidth,height:e.keyHeight,class:`white-key`,stroke:`#999`,"stroke-width":`1`},null,8,F)):g(``,!0)],64))),64)),(n(),d(f,null,s(88,t=>(n(),d(f,{key:`bg-black-${t}`},[e.isWhiteKey(t+20)?g(``,!0):(n(),d(`rect`,{key:0,x:e.getKeyPosition(t+20),y:`0`,width:e.blackKeyWidth,height:e.blackKeyHeight,class:`black-key`},null,8,I))],64))),64))]),l(`g`,L,[(n(),d(f,null,s(128,t=>(n(),d(f,{key:`white-${t}`},[e.isWhiteKey(t)&&t>=e.lowestNote&&t<=e.highestNote?(n(),d(`rect`,{key:0,x:e.getKeyPosition(t),y:`0`,width:e.whiteKeyWidth,height:e.keyHeight,class:`white-key active`,stroke:`#666`,"stroke-width":`1`},null,8,R)):g(``,!0)],64))),64)),(n(),d(f,null,s(128,t=>(n(),d(f,{key:`black-${t}`},[!e.isWhiteKey(t)&&t>=e.lowestNote&&t<=e.highestNote?(n(),d(`rect`,{key:0,x:e.getKeyPosition(t),y:`0`,width:e.blackKeyWidth,height:e.blackKeyHeight,class:`black-key active`},null,8,z)):g(``,!0)],64))),64))]),l(`g`,B,[l(`rect`,{x:e.getKeyPosition(e.lowestNote)-2,y:`0`,width:4,height:e.keyHeight+5,class:`range-marker start`},null,8,V),l(`rect`,{x:e.getKeyPosition(e.highestNote)+e.whiteKeyWidth-2,y:`0`,width:4,height:e.keyHeight+5,class:`range-marker end`},null,8,H)]),l(`text`,{x:e.getKeyPosition(e.lowestNote)+3,y:e.keyHeight+12,class:`note-label`},o(e.getNoteLabel(e.lowestNote)),9,U),l(`text`,{x:e.getKeyPosition(e.highestNote)+e.whiteKeyWidth-3,y:e.keyHeight+12,"text-anchor":`end`,class:`note-label`},o(e.getNoteLabel(e.highestNote)),9,W)],8,N))],512)])}D(_sfc_render$1,`_sfc_render`);var G=a({name:`MidiConfig`,components:{PianoRangeVisualizer:E(A,[[`render`,_sfc_render$1],[`__scopeId`,`data-v-4b232a8b`]])},props:{_id:{type:String,required:!0},user:{type:Object,required:!0}},setup(e){let t=m(),n=m(!0),r=m([]),i=m([]),a=m(``),o=m(``),s=m(!1),l=m(``),u=m(``),d=m(!1),f=m(`full-88`),p=m(21),h=m(108),g=m(``),v=m(0),b=m(0),S=m([]),initNoteOptions=()=>{let e=[`C`,`C#`,`D`,`D#`,`E`,`F`,`F#`,`G`,`G#`,`A`,`A#`,`B`],t=[];for(let n=0;n<=127;n++){let r=Math.floor(n/12)-1,i=e[n%12];t.push({title:`${i}${r} (${n})`,value:n})}S.value=t},w=m([{title:`Full 88-key Piano (A0-C8)`,value:`full-88`},{title:`76-key Keyboard (E1-G7)`,value:`76-key`},{title:`61-key Keyboard (C2-C7)`,value:`61-key`},{title:`49-key Keyboard (C3-C7)`,value:`49-key`},{title:`37-key Keyboard (C3-C6)`,value:`37-key`},{title:`25-key Keyboard (C4-C6)`,value:`25-key`},{title:`Custom Range`,value:`custom`}]),checkConfigChanged=()=>{d.value=a.value!==l.value||o.value!==u.value||f.value!==g.value||f.value===`custom`&&(p.value!==v.value||h.value!==b.value)},updateCustomRangeFromPreset=()=>{switch(f.value){case`full-88`:p.value=21,h.value=108;break;case`76-key`:p.value=28,h.value=103;break;case`61-key`:p.value=36,h.value=96;break;case`49-key`:p.value=48,h.value=96;break;case`37-key`:p.value=48,h.value=84;break;case`25-key`:p.value=60,h.value=84;break}checkConfigChanged()},updateRangeAndCheckChanges=()=>{p.value>=h.value&&(h.value=p.value+12),checkConfigChanged()},playSound=()=>{t.value?.play([{note:{number:64,name:`E`,octave:4},type:`noteon`,velocity:.4251968503937008,timestamp:0},{note:{number:64,name:`E`,octave:4},velocity:.3779527559055118,type:`noteoff`,timestamp:511.90500000002794},{note:{number:60,name:`C`,octave:4},type:`noteon`,velocity:.5275590551181102,timestamp:535.8800000001211},{note:{number:60,name:`C`,octave:4},velocity:.33858267716535434,type:`noteoff`,timestamp:674.9899999999907},{note:{number:60,name:`C`,octave:4},type:`noteon`,velocity:.5590551181102362,timestamp:1070.8800000000047},{note:{number:60,name:`C`,octave:4},velocity:.3464566929133858,type:`noteoff`,timestamp:1214.8999999999069},{note:{number:64,name:`E`,octave:4},type:`noteon`,velocity:.5118110236220472,timestamp:1424.9400000000605},{note:{number:64,name:`E`,octave:4},velocity:.2755905511811024,type:`noteoff`,timestamp:1576.9150000000373},{note:{number:62,name:`D`,octave:4},type:`noteon`,velocity:.3937007874015748,timestamp:1756.9149999999208},{note:{number:62,name:`D`,octave:4},velocity:.36220472440944884,type:`noteoff`,timestamp:1926.9899999998743},{note:{number:60,name:`C`,octave:4},type:`noteon`,velocity:.5196850393700787,timestamp:1970.9600000000792},{note:{number:60,name:`C`,octave:4},velocity:.36220472440944884,type:`noteoff`,timestamp:2126.009999999893},{note:{number:60,name:`C`,octave:4},type:`noteon`,velocity:.5984251968503937,timestamp:2502.0050000000047},{note:{number:60,name:`C`,octave:4},velocity:.3858267716535433,type:`noteoff`,timestamp:2853.920000000042},{note:{number:67,name:`G`,octave:4},type:`noteon`,velocity:.6850393700787402,timestamp:2875.8649999999907},{note:{number:67,name:`G`,octave:4},velocity:.6377952755905512,type:`noteoff`,timestamp:4497.004999999888}])},indicateHeardNotes=e=>{y({text:`I hear a ${e.note.name}!`,status:x.ok})};c(a,()=>{t.value?.selectInput(a.value),checkConfigChanged()}),c(o,()=>{t.value?.selectOutput(o.value),checkConfigChanged()});let retrieveSettings=async()=>{let t=await(await e.user.getCourseInterface(e._id)).getCourseSettings();if(t?.midiinput){let e=t.midiinput.toString();r.value.some(t=>t.value===e)&&(a.value=e,l.value=e)}if(t?.midioutput){let e=t.midioutput.toString();i.value.some(t=>t.value===e)&&(o.value=e,u.value=e)}t?.keyboardRange&&(g.value=t.keyboardRange.toString(),f.value=g.value),t?.lowestNote&&(v.value=parseInt(t.lowestNote.toString()),p.value=v.value),t?.highestNote&&(b.value=parseInt(t.highestNote.toString()),h.value=b.value),t?.lowestNote&&t?.highestNote&&!t?.keyboardRange&&(f.value=`custom`),d.value=!1},saveSettings=async()=>{s.value=!0,(await C().getUserDB().getCourseInterface(e._id)).updateCourseSettings([{key:`midiinput`,value:a.value},{key:`midioutput`,value:o.value},{key:`keyboardRange`,value:f.value},{key:`lowestNote`,value:p.value},{key:`highestNote`,value:h.value}]),l.value=a.value,u.value=o.value,g.value=f.value,v.value=p.value,b.value=h.value,d.value=!1,s.value=!1,y({text:`Settings updated.`,status:x.ok})};return _(async()=>{initNoteOptions();try{t.value=await O.instance(),n.value=t.value.state===`ready`||t.value.state===`nodevice`}catch(e){console.log(`Error on midi Init: ${e}`),n.value=!1}n.value&&(t.value?.addNoteonListenter(indicateHeardNotes),t.value?(r.value=t.value.inputs.filter(e=>e.state===`connected`).map(e=>({title:`${e.manufacturer}: ${e.name}`,value:e.id})),i.value=t.value?.outputs.filter(e=>e.state===`connected`).map(e=>({title:`${e.manufacturer}: ${e.name}`,value:e.id}))):(r.value=[{title:`No inputs available`,value:``}],i.value=[{title:`No outputs available`,value:``}]),await retrieveSettings(),!a.value&&r.value.length>0&&(a.value=r.value[0].value),!o.value&&i.value.length>0&&(o.value=i.value[0].value))}),{midiSupported:n,inputs:r,outputs:i,selectedInput:a,selectedOutput:o,updatePending:s,playSound,saveSettings,configChanged:d,lowestNote:p,highestNote:h,keyboardRangeOptions:w,selectedKeyboardRange:f,noteOptions:S,updateCustomRangeFromPreset,updateRangeAndCheckChanges}}}),K={key:0,class:`custom-range-inputs d-flex gap-4`},q={class:`d-flex justify-space-between mt-3`},J={key:1};function _sfc_render(a,o,s,c,u,f){let p=r(`v-toolbar-title`),m=r(`v-toolbar`),_=r(`v-select`),v=r(`v-divider`),y=r(`piano-range-visualizer`),b=r(`v-btn`),x=r(`v-form`),S=r(`v-card-text`),C=r(`v-card`);return n(),h(C,null,{default:e(()=>[t(m,{dense:``},{default:e(()=>[t(p,null,{default:e(()=>o[5]||(o[5]=[i(`Configure Midi Device`)])),_:1})]),_:1}),t(S,null,{default:e(()=>[a.midiSupported?(n(),h(x,{key:0,onsubmit:`return false;`},{default:e(()=>[t(_,{modelValue:a.selectedInput,"onUpdate:modelValue":o[0]||(o[0]=e=>a.selectedInput=e),items:a.inputs,label:`Select Input`,hint:`Play some notes on your input device to test the connection`},null,8,[`modelValue`,`items`]),t(_,{modelValue:a.selectedOutput,"onUpdate:modelValue":o[1]||(o[1]=e=>a.selectedOutput=e),items:a.outputs,label:`Select Output`},null,8,[`modelValue`,`items`]),t(v,{class:`my-4`}),o[8]||(o[8]=l(`h3`,{class:`text-subtitle-1 mb-2`},`Keyboard Range`,-1)),t(_,{modelValue:a.selectedKeyboardRange,"onUpdate:modelValue":[o[2]||(o[2]=e=>a.selectedKeyboardRange=e),a.updateCustomRangeFromPreset],items:a.keyboardRangeOptions,label:`Select Keyboard Range`},null,8,[`modelValue`,`items`,`onUpdate:modelValue`]),a.selectedKeyboardRange===`custom`?(n(),d(`div`,K,[t(_,{modelValue:a.lowestNote,"onUpdate:modelValue":[o[3]||(o[3]=e=>a.lowestNote=e),a.updateRangeAndCheckChanges],items:a.noteOptions,label:`Lowest Note`},null,8,[`modelValue`,`items`,`onUpdate:modelValue`]),t(_,{modelValue:a.highestNote,"onUpdate:modelValue":[o[4]||(o[4]=e=>a.highestNote=e),a.updateRangeAndCheckChanges],items:a.noteOptions,label:`Highest Note`},null,8,[`modelValue`,`items`,`onUpdate:modelValue`])])):g(``,!0),t(y,{"lowest-note":a.lowestNote,"highest-note":a.highestNote},null,8,[`lowest-note`,`highest-note`]),l(`div`,q,[t(b,{color:`primary`,onClick:a.playSound},{default:e(()=>o[6]||(o[6]=[i(`Test midi output`)])),_:1},8,[`onClick`]),t(b,{loading:a.updatePending,disabled:!a.configChanged&&!a.updatePending,color:`info`,class:`save-button`,onClick:a.saveSettings},{default:e(()=>o[7]||(o[7]=[i(` Save these settings `)])),_:1},8,[`loading`,`disabled`,`onClick`])])]),_:1})):(n(),d(`div`,J,o[9]||(o[9]=[l(`p`,null,`This quilt requires a midi input device, which is not supported by this browser.`,-1),l(`div`,null,[l(`p`,null,`Try one of the following browsers:`),l(`ul`,null,[l(`li`,null,[l(`a`,{href:`https://www.google.com/chrome/`},`Google Chrome`)]),l(`li`,null,[l(`a`,{href:`https://www.microsoft.com/edge`},`Microsoft Edge`)]),l(`li`,null,[l(`a`,{href:`https://brave.com/`},`Brave`)])])],-1)])))]),_:1})]),_:1})}var Y=E(G,[[`render`,_sfc_render],[`__scopeId`,`data-v-6ee9020f`]]);async function loadSubcourse(e){let t;switch(e){case`chess`:t=await v(()=>import(`./chess-Lfm7Fsvs-DWq5aKTF.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]));break;case`french`:t=await v(()=>import(`./french-evUMlbbq-CH812tTA.js`),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,13]));break;case`math`:t=await v(()=>import(`./math-DYni7rRl-A9MtWwfu.js`),__vite__mapDeps([14,1,2,3,4,5,6,7,8,9,15,16]));break;case`piano`:t=await v(()=>import(`./piano-BN5Btq91-CU1e1CoX.js`),__vite__mapDeps([17,1,2,3,4,5,6,7,8,9,18,19]));break;case`pitch`:t=await v(()=>import(`./pitch-Dn0iNqiS-V_L5g-6M.js`),__vite__mapDeps([20,1,2,3,4,5,6,7,8,9,21]));break;case`sightSing`:t=await v(()=>import(`./sightsing-CJX3k0Fd-CvR9PU-f.js`),__vite__mapDeps([22,1,2,3,4,5,6,7,8,9,23,24]));break;case`typing`:t=await v(()=>import(`./typing-k-ojjO7G-DL0IEDBs.js`),__vite__mapDeps([25,1,2,3,4,5,6,7,8,9,26,27]));break;case`wordWork`:t=await v(()=>import(`./word-work-Dd6tIKrt-BqfM1y62.js`),__vite__mapDeps([28,1,2,3,4,5,6,7,8,9,29]));break}let n=t.default;return X.courses.find(e=>e.name===n.name)||X.courses.push(n),n}async function loadAllSubcourses(){await Promise.all([`chess`,`french`,`math`,`piano`,`pitch`,`sightSing`,`typing`,`wordWork`].map(e=>loadSubcourse(e)))}var AllCourseWare=class{get courses(){return this.courseWareList}constructor(e){S(this,`courseWareList`,void 0),S(this,`cachedRawViews`,null),this.courseWareList=e}getCourseWare(e){return this.courseWareList.find(t=>t.name===e)}allViewsRaw(){if(!this.cachedRawViews){let e=this.allViews();this.cachedRawViews=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,u(t)]))}return this.cachedRawViews}allViews(){let e={};return this.courseWareList.forEach(t=>{Object.assign(e,t.allViewsMap)}),e}getView(e){let t;t=typeof e==`string`?b.getViewDescriptor(e):e;let n=this.getCourseWare(t.course);if(n){let e=n.getQuestion(t.questionType);if(e){let r=e.views.find(e=>e.name===t.view);if(r)return r;throw console.error(`QuestionView ${t.view} not found in course ${t.course}
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chess-Lfm7Fsvs-B2E6sqHQ.js","assets/dist-leWgtXBf.js","assets/chunk-D6hFPZc3.js","assets/common-ui.es-BnYwQ6WD.js","assets/dist-DpHREB7I.js","assets/vue.runtime.esm-bundler-C3q8JS9f.js","assets/MarkdownRenderer-kStoDRNE-CwICngq1.js","assets/common-ui-BY2Ut5jf.css","assets/CourseWare-BTFRjgBR-CNeQ51rc.js","assets/CourseWare-BTFRjgBR-D750E7i0.css","assets/chess-E2uOAyQS-ChlISEXk.js","assets/chess-E2uOAyQS-DB7z_kWx.css","assets/french-evUMlbbq-B-ZDqfUy.js","assets/french-Dk7YG8Td-Diep9iou.js","assets/math-DYni7rRl-D7JUXkpR.js","assets/math-B4HbgYf6-DxhWCfVC.js","assets/math-B4HbgYf6-CZyvKZtp.css","assets/piano-BN5Btq91-9M7xzFZI.js","assets/piano-DF1g6yaX-C2z0pIrX.js","assets/piano-DF1g6yaX-BLvDAgl1.css","assets/pitch-Dn0iNqiS-COn7DvCC.js","assets/pitch-CgGJFkZ1-BWXl37SW.js","assets/sightsing-CJX3k0Fd-Bxe6N8AQ.js","assets/sightsing-BFQ7HRig-agEeGc0d.js","assets/sightsing-BFQ7HRig-DkUGf5Yf.css","assets/typing-k-ojjO7G-BmjwY34I.js","assets/typing-BevtfWlp-CVNShTVM.js","assets/typing-BevtfWlp-B7ZMUAQJ.css","assets/word-work-Dd6tIKrt-CykC-OqP.js","assets/word-work-BOnRlZgd-C3bCWnpp.js"])))=>i.map(i=>d[i]);
2
+ import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,S as i,T as a,Vt as o,W as s,Z as c,_ as l,at as u,b as d,f,g as p,lt as m,v as h,y as g,z as _}from"./vue.runtime.esm-bundler-C3q8JS9f.js";import{U as v,v as y}from"./common-ui.es-BnYwQ6WD.js";import{C as b,T as x,y as S}from"./dist-leWgtXBf.js";import{V as C}from"./dist-DpHREB7I.js";import{n as w,r as T,t as E,u as D}from"./CourseWare-BTFRjgBR-CNeQ51rc.js";import{r as O}from"./piano-DF1g6yaX-C2z0pIrX.js";var k=new w(`default`,[T]),A=a({name:`PianoRangeVisualizer`,props:{lowestNote:{type:Number,required:!0},highestNote:{type:Number,required:!0},maxWidth:{type:Number,default:1e3}},setup(e){let t=m(null),n=m(800),r=p(()=>{let e=0;for(let t=21;t<=108;t++)isWhiteKey(t)&&e++;return e}),i=p(()=>Math.min(22,n.value/Math.max(25,r.value))),a=p(()=>i.value*.6),o=p(()=>Math.min(e.maxWidth,i.value*r.value+10)),isWhiteKey=e=>{let t=e%12;return[0,2,4,5,7,9,11].includes(t)},getKeyPosition=e=>{let t=0;for(let n=21;n<e;n++)isWhiteKey(n)&&t++;return isWhiteKey(e)?t*i.value:t*i.value-a.value/2},getNoteLabel=e=>{let t=[`C`,`C#`,`D`,`D#`,`E`,`F`,`F#`,`G`,`G#`,`A`,`A#`,`B`],n=e%12,r=Math.floor(e/12)-1;return`${t[n]}${r}`};return _(()=>{t.value&&(n.value=t.value.clientWidth,new ResizeObserver(e=>{for(let t of e)n.value=t.contentRect.width}).observe(t.value))}),{pianoWrapper:t,keyHeight:100,blackKeyHeight:60,whiteKeyWidth:i,blackKeyWidth:a,svgWidth:o,isWhiteKey,getKeyPosition,getNoteLabel}}}),j={class:`piano-range-container`},M={class:`piano-wrapper`,ref:`pianoWrapper`},N=[`width`,`height`],P={class:`background-keys`,opacity:`0.15`},F=[`x`,`width`,`height`],I=[`x`,`width`,`height`],L={class:`selected-range`},R=[`x`,`width`,`height`],z=[`x`,`width`,`height`],B={class:`range-markers`},V=[`x`,`height`],H=[`x`,`height`],U=[`x`,`y`],W=[`x`,`y`];function _sfc_render$1(e,t,r,i,a,c){return n(),d(`div`,j,[l(`div`,M,[(n(),d(`svg`,{width:e.svgWidth,height:e.keyHeight+20,class:`piano-svg`},[l(`g`,P,[(n(),d(f,null,s(88,t=>(n(),d(f,{key:`bg-${t}`},[e.isWhiteKey(t+20)?(n(),d(`rect`,{key:0,x:e.getKeyPosition(t+20),y:`0`,width:e.whiteKeyWidth,height:e.keyHeight,class:`white-key`,stroke:`#999`,"stroke-width":`1`},null,8,F)):g(``,!0)],64))),64)),(n(),d(f,null,s(88,t=>(n(),d(f,{key:`bg-black-${t}`},[e.isWhiteKey(t+20)?g(``,!0):(n(),d(`rect`,{key:0,x:e.getKeyPosition(t+20),y:`0`,width:e.blackKeyWidth,height:e.blackKeyHeight,class:`black-key`},null,8,I))],64))),64))]),l(`g`,L,[(n(),d(f,null,s(128,t=>(n(),d(f,{key:`white-${t}`},[e.isWhiteKey(t)&&t>=e.lowestNote&&t<=e.highestNote?(n(),d(`rect`,{key:0,x:e.getKeyPosition(t),y:`0`,width:e.whiteKeyWidth,height:e.keyHeight,class:`white-key active`,stroke:`#666`,"stroke-width":`1`},null,8,R)):g(``,!0)],64))),64)),(n(),d(f,null,s(128,t=>(n(),d(f,{key:`black-${t}`},[!e.isWhiteKey(t)&&t>=e.lowestNote&&t<=e.highestNote?(n(),d(`rect`,{key:0,x:e.getKeyPosition(t),y:`0`,width:e.blackKeyWidth,height:e.blackKeyHeight,class:`black-key active`},null,8,z)):g(``,!0)],64))),64))]),l(`g`,B,[l(`rect`,{x:e.getKeyPosition(e.lowestNote)-2,y:`0`,width:4,height:e.keyHeight+5,class:`range-marker start`},null,8,V),l(`rect`,{x:e.getKeyPosition(e.highestNote)+e.whiteKeyWidth-2,y:`0`,width:4,height:e.keyHeight+5,class:`range-marker end`},null,8,H)]),l(`text`,{x:e.getKeyPosition(e.lowestNote)+3,y:e.keyHeight+12,class:`note-label`},o(e.getNoteLabel(e.lowestNote)),9,U),l(`text`,{x:e.getKeyPosition(e.highestNote)+e.whiteKeyWidth-3,y:e.keyHeight+12,"text-anchor":`end`,class:`note-label`},o(e.getNoteLabel(e.highestNote)),9,W)],8,N))],512)])}D(_sfc_render$1,`_sfc_render`);var G=a({name:`MidiConfig`,components:{PianoRangeVisualizer:E(A,[[`render`,_sfc_render$1],[`__scopeId`,`data-v-4b232a8b`]])},props:{_id:{type:String,required:!0},user:{type:Object,required:!0}},setup(e){let t=m(),n=m(!0),r=m([]),i=m([]),a=m(``),o=m(``),s=m(!1),l=m(``),u=m(``),d=m(!1),f=m(`full-88`),p=m(21),h=m(108),g=m(``),v=m(0),b=m(0),S=m([]),initNoteOptions=()=>{let e=[`C`,`C#`,`D`,`D#`,`E`,`F`,`F#`,`G`,`G#`,`A`,`A#`,`B`],t=[];for(let n=0;n<=127;n++){let r=Math.floor(n/12)-1,i=e[n%12];t.push({title:`${i}${r} (${n})`,value:n})}S.value=t},w=m([{title:`Full 88-key Piano (A0-C8)`,value:`full-88`},{title:`76-key Keyboard (E1-G7)`,value:`76-key`},{title:`61-key Keyboard (C2-C7)`,value:`61-key`},{title:`49-key Keyboard (C3-C7)`,value:`49-key`},{title:`37-key Keyboard (C3-C6)`,value:`37-key`},{title:`25-key Keyboard (C4-C6)`,value:`25-key`},{title:`Custom Range`,value:`custom`}]),checkConfigChanged=()=>{d.value=a.value!==l.value||o.value!==u.value||f.value!==g.value||f.value===`custom`&&(p.value!==v.value||h.value!==b.value)},updateCustomRangeFromPreset=()=>{switch(f.value){case`full-88`:p.value=21,h.value=108;break;case`76-key`:p.value=28,h.value=103;break;case`61-key`:p.value=36,h.value=96;break;case`49-key`:p.value=48,h.value=96;break;case`37-key`:p.value=48,h.value=84;break;case`25-key`:p.value=60,h.value=84;break}checkConfigChanged()},updateRangeAndCheckChanges=()=>{p.value>=h.value&&(h.value=p.value+12),checkConfigChanged()},playSound=()=>{t.value?.play([{note:{number:64,name:`E`,octave:4},type:`noteon`,velocity:.4251968503937008,timestamp:0},{note:{number:64,name:`E`,octave:4},velocity:.3779527559055118,type:`noteoff`,timestamp:511.90500000002794},{note:{number:60,name:`C`,octave:4},type:`noteon`,velocity:.5275590551181102,timestamp:535.8800000001211},{note:{number:60,name:`C`,octave:4},velocity:.33858267716535434,type:`noteoff`,timestamp:674.9899999999907},{note:{number:60,name:`C`,octave:4},type:`noteon`,velocity:.5590551181102362,timestamp:1070.8800000000047},{note:{number:60,name:`C`,octave:4},velocity:.3464566929133858,type:`noteoff`,timestamp:1214.8999999999069},{note:{number:64,name:`E`,octave:4},type:`noteon`,velocity:.5118110236220472,timestamp:1424.9400000000605},{note:{number:64,name:`E`,octave:4},velocity:.2755905511811024,type:`noteoff`,timestamp:1576.9150000000373},{note:{number:62,name:`D`,octave:4},type:`noteon`,velocity:.3937007874015748,timestamp:1756.9149999999208},{note:{number:62,name:`D`,octave:4},velocity:.36220472440944884,type:`noteoff`,timestamp:1926.9899999998743},{note:{number:60,name:`C`,octave:4},type:`noteon`,velocity:.5196850393700787,timestamp:1970.9600000000792},{note:{number:60,name:`C`,octave:4},velocity:.36220472440944884,type:`noteoff`,timestamp:2126.009999999893},{note:{number:60,name:`C`,octave:4},type:`noteon`,velocity:.5984251968503937,timestamp:2502.0050000000047},{note:{number:60,name:`C`,octave:4},velocity:.3858267716535433,type:`noteoff`,timestamp:2853.920000000042},{note:{number:67,name:`G`,octave:4},type:`noteon`,velocity:.6850393700787402,timestamp:2875.8649999999907},{note:{number:67,name:`G`,octave:4},velocity:.6377952755905512,type:`noteoff`,timestamp:4497.004999999888}])},indicateHeardNotes=e=>{y({text:`I hear a ${e.note.name}!`,status:x.ok})};c(a,()=>{t.value?.selectInput(a.value),checkConfigChanged()}),c(o,()=>{t.value?.selectOutput(o.value),checkConfigChanged()});let retrieveSettings=async()=>{let t=await(await e.user.getCourseInterface(e._id)).getCourseSettings();if(t?.midiinput){let e=t.midiinput.toString();r.value.some(t=>t.value===e)&&(a.value=e,l.value=e)}if(t?.midioutput){let e=t.midioutput.toString();i.value.some(t=>t.value===e)&&(o.value=e,u.value=e)}t?.keyboardRange&&(g.value=t.keyboardRange.toString(),f.value=g.value),t?.lowestNote&&(v.value=parseInt(t.lowestNote.toString()),p.value=v.value),t?.highestNote&&(b.value=parseInt(t.highestNote.toString()),h.value=b.value),t?.lowestNote&&t?.highestNote&&!t?.keyboardRange&&(f.value=`custom`),d.value=!1},saveSettings=async()=>{s.value=!0,(await C().getUserDB().getCourseInterface(e._id)).updateCourseSettings([{key:`midiinput`,value:a.value},{key:`midioutput`,value:o.value},{key:`keyboardRange`,value:f.value},{key:`lowestNote`,value:p.value},{key:`highestNote`,value:h.value}]),l.value=a.value,u.value=o.value,g.value=f.value,v.value=p.value,b.value=h.value,d.value=!1,s.value=!1,y({text:`Settings updated.`,status:x.ok})};return _(async()=>{initNoteOptions();try{t.value=await O.instance(),n.value=t.value.state===`ready`||t.value.state===`nodevice`}catch(e){console.log(`Error on midi Init: ${e}`),n.value=!1}n.value&&(t.value?.addNoteonListenter(indicateHeardNotes),t.value?(r.value=t.value.inputs.filter(e=>e.state===`connected`).map(e=>({title:`${e.manufacturer}: ${e.name}`,value:e.id})),i.value=t.value?.outputs.filter(e=>e.state===`connected`).map(e=>({title:`${e.manufacturer}: ${e.name}`,value:e.id}))):(r.value=[{title:`No inputs available`,value:``}],i.value=[{title:`No outputs available`,value:``}]),await retrieveSettings(),!a.value&&r.value.length>0&&(a.value=r.value[0].value),!o.value&&i.value.length>0&&(o.value=i.value[0].value))}),{midiSupported:n,inputs:r,outputs:i,selectedInput:a,selectedOutput:o,updatePending:s,playSound,saveSettings,configChanged:d,lowestNote:p,highestNote:h,keyboardRangeOptions:w,selectedKeyboardRange:f,noteOptions:S,updateCustomRangeFromPreset,updateRangeAndCheckChanges}}}),K={key:0,class:`custom-range-inputs d-flex gap-4`},q={class:`d-flex justify-space-between mt-3`},J={key:1};function _sfc_render(a,o,s,c,u,f){let p=r(`v-toolbar-title`),m=r(`v-toolbar`),_=r(`v-select`),v=r(`v-divider`),y=r(`piano-range-visualizer`),b=r(`v-btn`),x=r(`v-form`),S=r(`v-card-text`),C=r(`v-card`);return n(),h(C,null,{default:e(()=>[t(m,{dense:``},{default:e(()=>[t(p,null,{default:e(()=>o[5]||(o[5]=[i(`Configure Midi Device`)])),_:1})]),_:1}),t(S,null,{default:e(()=>[a.midiSupported?(n(),h(x,{key:0,onsubmit:`return false;`},{default:e(()=>[t(_,{modelValue:a.selectedInput,"onUpdate:modelValue":o[0]||(o[0]=e=>a.selectedInput=e),items:a.inputs,label:`Select Input`,hint:`Play some notes on your input device to test the connection`},null,8,[`modelValue`,`items`]),t(_,{modelValue:a.selectedOutput,"onUpdate:modelValue":o[1]||(o[1]=e=>a.selectedOutput=e),items:a.outputs,label:`Select Output`},null,8,[`modelValue`,`items`]),t(v,{class:`my-4`}),o[8]||(o[8]=l(`h3`,{class:`text-subtitle-1 mb-2`},`Keyboard Range`,-1)),t(_,{modelValue:a.selectedKeyboardRange,"onUpdate:modelValue":[o[2]||(o[2]=e=>a.selectedKeyboardRange=e),a.updateCustomRangeFromPreset],items:a.keyboardRangeOptions,label:`Select Keyboard Range`},null,8,[`modelValue`,`items`,`onUpdate:modelValue`]),a.selectedKeyboardRange===`custom`?(n(),d(`div`,K,[t(_,{modelValue:a.lowestNote,"onUpdate:modelValue":[o[3]||(o[3]=e=>a.lowestNote=e),a.updateRangeAndCheckChanges],items:a.noteOptions,label:`Lowest Note`},null,8,[`modelValue`,`items`,`onUpdate:modelValue`]),t(_,{modelValue:a.highestNote,"onUpdate:modelValue":[o[4]||(o[4]=e=>a.highestNote=e),a.updateRangeAndCheckChanges],items:a.noteOptions,label:`Highest Note`},null,8,[`modelValue`,`items`,`onUpdate:modelValue`])])):g(``,!0),t(y,{"lowest-note":a.lowestNote,"highest-note":a.highestNote},null,8,[`lowest-note`,`highest-note`]),l(`div`,q,[t(b,{color:`primary`,onClick:a.playSound},{default:e(()=>o[6]||(o[6]=[i(`Test midi output`)])),_:1},8,[`onClick`]),t(b,{loading:a.updatePending,disabled:!a.configChanged&&!a.updatePending,color:`info`,class:`save-button`,onClick:a.saveSettings},{default:e(()=>o[7]||(o[7]=[i(` Save these settings `)])),_:1},8,[`loading`,`disabled`,`onClick`])])]),_:1})):(n(),d(`div`,J,o[9]||(o[9]=[l(`p`,null,`This quilt requires a midi input device, which is not supported by this browser.`,-1),l(`div`,null,[l(`p`,null,`Try one of the following browsers:`),l(`ul`,null,[l(`li`,null,[l(`a`,{href:`https://www.google.com/chrome/`},`Google Chrome`)]),l(`li`,null,[l(`a`,{href:`https://www.microsoft.com/edge`},`Microsoft Edge`)]),l(`li`,null,[l(`a`,{href:`https://brave.com/`},`Brave`)])])],-1)])))]),_:1})]),_:1})}var Y=E(G,[[`render`,_sfc_render],[`__scopeId`,`data-v-6ee9020f`]]);async function loadSubcourse(e){let t;switch(e){case`chess`:t=await v(()=>import(`./chess-Lfm7Fsvs-B2E6sqHQ.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]));break;case`french`:t=await v(()=>import(`./french-evUMlbbq-B-ZDqfUy.js`),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,13]));break;case`math`:t=await v(()=>import(`./math-DYni7rRl-D7JUXkpR.js`),__vite__mapDeps([14,1,2,3,4,5,6,7,8,9,15,16]));break;case`piano`:t=await v(()=>import(`./piano-BN5Btq91-9M7xzFZI.js`),__vite__mapDeps([17,1,2,3,4,5,6,7,8,9,18,19]));break;case`pitch`:t=await v(()=>import(`./pitch-Dn0iNqiS-COn7DvCC.js`),__vite__mapDeps([20,1,2,3,4,5,6,7,8,9,21]));break;case`sightSing`:t=await v(()=>import(`./sightsing-CJX3k0Fd-Bxe6N8AQ.js`),__vite__mapDeps([22,1,2,3,4,5,6,7,8,9,23,24]));break;case`typing`:t=await v(()=>import(`./typing-k-ojjO7G-BmjwY34I.js`),__vite__mapDeps([25,1,2,3,4,5,6,7,8,9,26,27]));break;case`wordWork`:t=await v(()=>import(`./word-work-Dd6tIKrt-CykC-OqP.js`),__vite__mapDeps([28,1,2,3,4,5,6,7,8,9,29]));break}let n=t.default;return X.courses.find(e=>e.name===n.name)||X.courses.push(n),n}async function loadAllSubcourses(){await Promise.all([`chess`,`french`,`math`,`piano`,`pitch`,`sightSing`,`typing`,`wordWork`].map(e=>loadSubcourse(e)))}var AllCourseWare=class{get courses(){return this.courseWareList}constructor(e){S(this,`courseWareList`,void 0),S(this,`cachedRawViews`,null),this.courseWareList=e}getCourseWare(e){return this.courseWareList.find(t=>t.name===e)}allViewsRaw(){if(!this.cachedRawViews){let e=this.allViews();this.cachedRawViews=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,u(t)]))}return this.cachedRawViews}allViews(){let e={};return this.courseWareList.forEach(t=>{Object.assign(e,t.allViewsMap)}),e}getView(e){let t;t=typeof e==`string`?b.getViewDescriptor(e):e;let n=this.getCourseWare(t.course);if(n){let e=n.getQuestion(t.questionType);if(e){let r=e.views.find(e=>e.name===t.view);if(r)return r;throw console.error(`QuestionView ${t.view} not found in course ${t.course}
3
3
 
4
4
  descriptor: ${JSON.stringify(t)}
5
5
 
@@ -15,4 +15,4 @@ import"./chunk-D6hFPZc3.js";import{$ as e,C as t,H as n,K as r,S as i,T as a,Vt
15
15
  `),Error(`question ${t.questionType} does not exist.`)}else throw console.error(`Course ${t.course} not found.
16
16
 
17
17
  descriptor: ${JSON.stringify(t)}`),Error(`course ${t.course} does not exist.`)}toString(){let e=``;return this.courses.forEach(t=>{e+=`Course: ${t.name}\n`,t.questions.forEach(t=>{e+=` Question: ${t.name}\n`,t.views.forEach(t=>{e+=` View: ${t.name}\n`})})}),e}allDataShapesRaw(){let e=[];return this.courseWareList.forEach(t=>{t.questions.forEach(t=>{t.dataShapes.forEach(t=>{e.includes(t)||e.push(t)})})}),e}allDataShapes(){let e=[];return this.courseWareList.forEach(t=>{t.questions.forEach(n=>{n.dataShapes.forEach(r=>{e.findIndex(e=>e.course===t.name&&e.dataShape===r.name)===-1&&e.push({course:t.name,dataShape:r.name,displayable:n})})})}),e}getDataShape(e){let t;if(this.getCourseWare(e.course).questions.forEach(n=>{n.dataShapes.forEach(n=>{n.name===e.dataShape&&(t=n)})}),t)return t;throw Error(`DataShape ${b.getDataShapeString(e)} not found`)}},X=new AllCourseWare([]);export{loadAllSubcourses as a,Y as i,AllCourseWare as n,loadSubcourse as o,k as r,X as t};
18
- //# sourceMappingURL=dist-DcjcehoT.js.map
18
+ //# sourceMappingURL=dist-CWTz_ocg.js.map
@@ -1 +1 @@
1
- {"version":3,"mappings":"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","names":["a","r","D","j","b","k","A","C","w","y","M","S","P","e","i","V","F","H","z","p","N","x","I","E","T","O","B"],"ignoreList":[],"sources":["../../../courseware/dist/index.mjs"],"sourcesContent":["import { r as e, t } from \"./shapes-BQUVJdp5.js\";\nimport { i as n, n as r, r as i, t as a } from \"./CourseWare-BTFRjgBR.js\";\nimport { t as o } from \"./chess-E2uOAyQS.js\";\nimport { t as s } from \"./french-Dk7YG8Td.js\";\nimport { t as c } from \"./math-B4HbgYf6.js\";\nimport { a as l, i as u, n as d, o as f, r as p, t as m } from \"./piano-DF1g6yaX.js\";\nimport { t as h } from \"./pitch-CgGJFkZ1.js\";\nimport { t as g } from \"./sightsing-BFQ7HRig.js\";\nimport { t as _ } from \"./typing-BevtfWlp.js\";\nimport { t as v } from \"./word-work-BOnRlZgd.js\";\nimport { Fragment as y, computed as b, createBlock as x, createCommentVNode as S, createElementBlock as C, createElementVNode as w, createTextVNode as T, createVNode as E, defineComponent as D, markRaw as O, onMounted as k, openBlock as A, ref as j, renderList as M, resolveComponent as N, toDisplayString as P, watch as F, withCtx as I } from \"vue\";\nimport { Displayable as L, Question as R, alertUser as z, useQuestionView as ee, useViewable as te } from \"@vue-skuilder/common-ui\";\nimport { NameSpacer as B, Status as V } from \"@vue-skuilder/common\";\nimport { getDataLayer as H } from \"@vue-skuilder/db\";\nimport './assets/index.css';//#region src/default/index.ts\nvar U = new a(\"default\", [r]), W = D({\n\tname: \"PianoRangeVisualizer\",\n\tprops: {\n\t\tlowestNote: {\n\t\t\ttype: Number,\n\t\t\trequired: !0\n\t\t},\n\t\thighestNote: {\n\t\t\ttype: Number,\n\t\t\trequired: !0\n\t\t},\n\t\tmaxWidth: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1e3\n\t\t}\n\t},\n\tsetup(e) {\n\t\tlet t = j(null), n = j(800), r = b(() => {\n\t\t\tlet e = 0;\n\t\t\tfor (let t = 21; t <= 108; t++) isWhiteKey(t) && e++;\n\t\t\treturn e;\n\t\t}), i = b(() => Math.min(22, n.value / Math.max(25, r.value))), a = b(() => i.value * .6), o = b(() => Math.min(e.maxWidth, i.value * r.value + 10)), isWhiteKey = (e) => {\n\t\t\tlet t = e % 12;\n\t\t\treturn [\n\t\t\t\t0,\n\t\t\t\t2,\n\t\t\t\t4,\n\t\t\t\t5,\n\t\t\t\t7,\n\t\t\t\t9,\n\t\t\t\t11\n\t\t\t].includes(t);\n\t\t}, getKeyPosition = (e) => {\n\t\t\tlet t = 0;\n\t\t\tfor (let n = 21; n < e; n++) isWhiteKey(n) && t++;\n\t\t\treturn isWhiteKey(e) ? t * i.value : t * i.value - a.value / 2;\n\t\t}, getNoteLabel = (e) => {\n\t\t\tlet t = [\n\t\t\t\t\"C\",\n\t\t\t\t\"C#\",\n\t\t\t\t\"D\",\n\t\t\t\t\"D#\",\n\t\t\t\t\"E\",\n\t\t\t\t\"F\",\n\t\t\t\t\"F#\",\n\t\t\t\t\"G\",\n\t\t\t\t\"G#\",\n\t\t\t\t\"A\",\n\t\t\t\t\"A#\",\n\t\t\t\t\"B\"\n\t\t\t], n = e % 12, r = Math.floor(e / 12) - 1;\n\t\t\treturn `${t[n]}${r}`;\n\t\t};\n\t\treturn k(() => {\n\t\t\tt.value && (n.value = t.value.clientWidth, new ResizeObserver((e) => {\n\t\t\t\tfor (let t of e) n.value = t.contentRect.width;\n\t\t\t}).observe(t.value));\n\t\t}), {\n\t\t\tpianoWrapper: t,\n\t\t\tkeyHeight: 100,\n\t\t\tblackKeyHeight: 60,\n\t\t\twhiteKeyWidth: i,\n\t\t\tblackKeyWidth: a,\n\t\t\tsvgWidth: o,\n\t\t\tisWhiteKey,\n\t\t\tgetKeyPosition,\n\t\t\tgetNoteLabel\n\t\t};\n\t}\n}), G = { class: \"piano-range-container\" }, K = {\n\tclass: \"piano-wrapper\",\n\tref: \"pianoWrapper\"\n}, q = [\"width\", \"height\"], J = {\n\tclass: \"background-keys\",\n\topacity: \"0.15\"\n}, Y = [\n\t\"x\",\n\t\"width\",\n\t\"height\"\n], X = [\n\t\"x\",\n\t\"width\",\n\t\"height\"\n], Z = { class: \"selected-range\" }, ne = [\n\t\"x\",\n\t\"width\",\n\t\"height\"\n], re = [\n\t\"x\",\n\t\"width\",\n\t\"height\"\n], ie = { class: \"range-markers\" }, ae = [\"x\", \"height\"], oe = [\"x\", \"height\"], se = [\"x\", \"y\"], ce = [\"x\", \"y\"];\nfunction _sfc_render$1(e, t, n, r, i, a) {\n\treturn A(), C(\"div\", G, [w(\"div\", K, [(A(), C(\"svg\", {\n\t\twidth: e.svgWidth,\n\t\theight: e.keyHeight + 20,\n\t\tclass: \"piano-svg\"\n\t}, [\n\t\tw(\"g\", J, [(A(), C(y, null, M(88, (t) => (A(), C(y, { key: `bg-${t}` }, [e.isWhiteKey(t + 20) ? (A(), C(\"rect\", {\n\t\t\tkey: 0,\n\t\t\tx: e.getKeyPosition(t + 20),\n\t\t\ty: \"0\",\n\t\t\twidth: e.whiteKeyWidth,\n\t\t\theight: e.keyHeight,\n\t\t\tclass: \"white-key\",\n\t\t\tstroke: \"#999\",\n\t\t\t\"stroke-width\": \"1\"\n\t\t}, null, 8, Y)) : S(\"\", !0)], 64))), 64)), (A(), C(y, null, M(88, (t) => (A(), C(y, { key: `bg-black-${t}` }, [e.isWhiteKey(t + 20) ? S(\"\", !0) : (A(), C(\"rect\", {\n\t\t\tkey: 0,\n\t\t\tx: e.getKeyPosition(t + 20),\n\t\t\ty: \"0\",\n\t\t\twidth: e.blackKeyWidth,\n\t\t\theight: e.blackKeyHeight,\n\t\t\tclass: \"black-key\"\n\t\t}, null, 8, X))], 64))), 64))]),\n\t\tw(\"g\", Z, [(A(), C(y, null, M(128, (t) => (A(), C(y, { key: `white-${t}` }, [e.isWhiteKey(t) && t >= e.lowestNote && t <= e.highestNote ? (A(), C(\"rect\", {\n\t\t\tkey: 0,\n\t\t\tx: e.getKeyPosition(t),\n\t\t\ty: \"0\",\n\t\t\twidth: e.whiteKeyWidth,\n\t\t\theight: e.keyHeight,\n\t\t\tclass: \"white-key active\",\n\t\t\tstroke: \"#666\",\n\t\t\t\"stroke-width\": \"1\"\n\t\t}, null, 8, ne)) : S(\"\", !0)], 64))), 64)), (A(), C(y, null, M(128, (t) => (A(), C(y, { key: `black-${t}` }, [!e.isWhiteKey(t) && t >= e.lowestNote && t <= e.highestNote ? (A(), C(\"rect\", {\n\t\t\tkey: 0,\n\t\t\tx: e.getKeyPosition(t),\n\t\t\ty: \"0\",\n\t\t\twidth: e.blackKeyWidth,\n\t\t\theight: e.blackKeyHeight,\n\t\t\tclass: \"black-key active\"\n\t\t}, null, 8, re)) : S(\"\", !0)], 64))), 64))]),\n\t\tw(\"g\", ie, [w(\"rect\", {\n\t\t\tx: e.getKeyPosition(e.lowestNote) - 2,\n\t\t\ty: \"0\",\n\t\t\twidth: 4,\n\t\t\theight: e.keyHeight + 5,\n\t\t\tclass: \"range-marker start\"\n\t\t}, null, 8, ae), w(\"rect\", {\n\t\t\tx: e.getKeyPosition(e.highestNote) + e.whiteKeyWidth - 2,\n\t\t\ty: \"0\",\n\t\t\twidth: 4,\n\t\t\theight: e.keyHeight + 5,\n\t\t\tclass: \"range-marker end\"\n\t\t}, null, 8, oe)]),\n\t\tw(\"text\", {\n\t\t\tx: e.getKeyPosition(e.lowestNote) + 3,\n\t\t\ty: e.keyHeight + 12,\n\t\t\tclass: \"note-label\"\n\t\t}, P(e.getNoteLabel(e.lowestNote)), 9, se),\n\t\tw(\"text\", {\n\t\t\tx: e.getKeyPosition(e.highestNote) + e.whiteKeyWidth - 3,\n\t\t\ty: e.keyHeight + 12,\n\t\t\t\"text-anchor\": \"end\",\n\t\t\tclass: \"note-label\"\n\t\t}, P(e.getNoteLabel(e.highestNote)), 9, ce)\n\t], 8, q))], 512)]);\n}\ne(_sfc_render$1, \"_sfc_render\");\n//#endregion\n//#region src/piano/utility/MidiConfig.vue?vue&type=script&lang.ts\nvar le = D({\n\tname: \"MidiConfig\",\n\tcomponents: { PianoRangeVisualizer: /* @__PURE__ */ i(W, [[\"render\", _sfc_render$1], [\"__scopeId\", \"data-v-4b232a8b\"]]) },\n\tprops: {\n\t\t_id: {\n\t\t\ttype: String,\n\t\t\trequired: !0\n\t\t},\n\t\tuser: {\n\t\t\ttype: Object,\n\t\t\trequired: !0\n\t\t}\n\t},\n\tsetup(e) {\n\t\tlet t = j(), n = j(!0), r = j([]), i = j([]), a = j(\"\"), o = j(\"\"), s = j(!1), c = j(\"\"), l = j(\"\"), u = j(!1), d = j(\"full-88\"), f = j(21), m = j(108), h = j(\"\"), g = j(0), _ = j(0), v = j([]), initNoteOptions = () => {\n\t\t\tlet e = [\n\t\t\t\t\"C\",\n\t\t\t\t\"C#\",\n\t\t\t\t\"D\",\n\t\t\t\t\"D#\",\n\t\t\t\t\"E\",\n\t\t\t\t\"F\",\n\t\t\t\t\"F#\",\n\t\t\t\t\"G\",\n\t\t\t\t\"G#\",\n\t\t\t\t\"A\",\n\t\t\t\t\"A#\",\n\t\t\t\t\"B\"\n\t\t\t], t = [];\n\t\t\tfor (let n = 0; n <= 127; n++) {\n\t\t\t\tlet r = Math.floor(n / 12) - 1, i = e[n % 12];\n\t\t\t\tt.push({\n\t\t\t\t\ttitle: `${i}${r} (${n})`,\n\t\t\t\t\tvalue: n\n\t\t\t\t});\n\t\t\t}\n\t\t\tv.value = t;\n\t\t}, y = j([\n\t\t\t{\n\t\t\t\ttitle: \"Full 88-key Piano (A0-C8)\",\n\t\t\t\tvalue: \"full-88\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"76-key Keyboard (E1-G7)\",\n\t\t\t\tvalue: \"76-key\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"61-key Keyboard (C2-C7)\",\n\t\t\t\tvalue: \"61-key\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"49-key Keyboard (C3-C7)\",\n\t\t\t\tvalue: \"49-key\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"37-key Keyboard (C3-C6)\",\n\t\t\t\tvalue: \"37-key\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"25-key Keyboard (C4-C6)\",\n\t\t\t\tvalue: \"25-key\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"Custom Range\",\n\t\t\t\tvalue: \"custom\"\n\t\t\t}\n\t\t]), checkConfigChanged = () => {\n\t\t\tu.value = a.value !== c.value || o.value !== l.value || d.value !== h.value || d.value === \"custom\" && (f.value !== g.value || m.value !== _.value);\n\t\t}, updateCustomRangeFromPreset = () => {\n\t\t\tswitch (d.value) {\n\t\t\t\tcase \"full-88\":\n\t\t\t\t\tf.value = 21, m.value = 108;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"76-key\":\n\t\t\t\t\tf.value = 28, m.value = 103;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"61-key\":\n\t\t\t\t\tf.value = 36, m.value = 96;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"49-key\":\n\t\t\t\t\tf.value = 48, m.value = 96;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"37-key\":\n\t\t\t\t\tf.value = 48, m.value = 84;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"25-key\":\n\t\t\t\t\tf.value = 60, m.value = 84;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcheckConfigChanged();\n\t\t}, updateRangeAndCheckChanges = () => {\n\t\t\tf.value >= m.value && (m.value = f.value + 12), checkConfigChanged();\n\t\t}, playSound = () => {\n\t\t\tt.value?.play([\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 64,\n\t\t\t\t\t\tname: \"E\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .4251968503937008,\n\t\t\t\t\ttimestamp: 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 64,\n\t\t\t\t\t\tname: \"E\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .3779527559055118,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 511.90500000002794\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .5275590551181102,\n\t\t\t\t\ttimestamp: 535.8800000001211\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .33858267716535434,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 674.9899999999907\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .5590551181102362,\n\t\t\t\t\ttimestamp: 1070.8800000000047\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .3464566929133858,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 1214.8999999999069\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 64,\n\t\t\t\t\t\tname: \"E\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .5118110236220472,\n\t\t\t\t\ttimestamp: 1424.9400000000605\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 64,\n\t\t\t\t\t\tname: \"E\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .2755905511811024,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 1576.9150000000373\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 62,\n\t\t\t\t\t\tname: \"D\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .3937007874015748,\n\t\t\t\t\ttimestamp: 1756.9149999999208\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 62,\n\t\t\t\t\t\tname: \"D\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .36220472440944884,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 1926.9899999998743\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .5196850393700787,\n\t\t\t\t\ttimestamp: 1970.9600000000792\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .36220472440944884,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 2126.009999999893\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .5984251968503937,\n\t\t\t\t\ttimestamp: 2502.0050000000047\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .3858267716535433,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 2853.920000000042\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 67,\n\t\t\t\t\t\tname: \"G\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .6850393700787402,\n\t\t\t\t\ttimestamp: 2875.8649999999907\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 67,\n\t\t\t\t\t\tname: \"G\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .6377952755905512,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 4497.004999999888\n\t\t\t\t}\n\t\t\t]);\n\t\t}, indicateHeardNotes = (e) => {\n\t\t\tz({\n\t\t\t\ttext: `I hear a ${e.note.name}!`,\n\t\t\t\tstatus: V.ok\n\t\t\t});\n\t\t};\n\t\tF(a, () => {\n\t\t\tt.value?.selectInput(a.value), checkConfigChanged();\n\t\t}), F(o, () => {\n\t\t\tt.value?.selectOutput(o.value), checkConfigChanged();\n\t\t});\n\t\tlet retrieveSettings = async () => {\n\t\t\tlet t = await (await e.user.getCourseInterface(e._id)).getCourseSettings();\n\t\t\tif (t?.midiinput) {\n\t\t\t\tlet e = t.midiinput.toString();\n\t\t\t\tr.value.some((t) => t.value === e) && (a.value = e, c.value = e);\n\t\t\t}\n\t\t\tif (t?.midioutput) {\n\t\t\t\tlet e = t.midioutput.toString();\n\t\t\t\ti.value.some((t) => t.value === e) && (o.value = e, l.value = e);\n\t\t\t}\n\t\t\tt?.keyboardRange && (h.value = t.keyboardRange.toString(), d.value = h.value), t?.lowestNote && (g.value = parseInt(t.lowestNote.toString()), f.value = g.value), t?.highestNote && (_.value = parseInt(t.highestNote.toString()), m.value = _.value), t?.lowestNote && t?.highestNote && !t?.keyboardRange && (d.value = \"custom\"), u.value = !1;\n\t\t}, saveSettings = async () => {\n\t\t\ts.value = !0, (await H().getUserDB().getCourseInterface(e._id)).updateCourseSettings([\n\t\t\t\t{\n\t\t\t\t\tkey: \"midiinput\",\n\t\t\t\t\tvalue: a.value\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkey: \"midioutput\",\n\t\t\t\t\tvalue: o.value\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkey: \"keyboardRange\",\n\t\t\t\t\tvalue: d.value\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkey: \"lowestNote\",\n\t\t\t\t\tvalue: f.value\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkey: \"highestNote\",\n\t\t\t\t\tvalue: m.value\n\t\t\t\t}\n\t\t\t]), c.value = a.value, l.value = o.value, h.value = d.value, g.value = f.value, _.value = m.value, u.value = !1, s.value = !1, z({\n\t\t\t\ttext: \"Settings updated.\",\n\t\t\t\tstatus: V.ok\n\t\t\t});\n\t\t};\n\t\treturn k(async () => {\n\t\t\tinitNoteOptions();\n\t\t\ttry {\n\t\t\t\tt.value = await p.instance(), n.value = t.value.state === \"ready\" || t.value.state === \"nodevice\";\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(`Error on midi Init: ${e}`), n.value = !1;\n\t\t\t}\n\t\t\tn.value && (t.value?.addNoteonListenter(indicateHeardNotes), t.value ? (r.value = t.value.inputs.filter((e) => e.state === \"connected\").map((e) => ({\n\t\t\t\ttitle: `${e.manufacturer}: ${e.name}`,\n\t\t\t\tvalue: e.id\n\t\t\t})), i.value = t.value?.outputs.filter((e) => e.state === \"connected\").map((e) => ({\n\t\t\t\ttitle: `${e.manufacturer}: ${e.name}`,\n\t\t\t\tvalue: e.id\n\t\t\t}))) : (r.value = [{\n\t\t\t\ttitle: \"No inputs available\",\n\t\t\t\tvalue: \"\"\n\t\t\t}], i.value = [{\n\t\t\t\ttitle: \"No outputs available\",\n\t\t\t\tvalue: \"\"\n\t\t\t}]), await retrieveSettings(), !a.value && r.value.length > 0 && (a.value = r.value[0].value), !o.value && i.value.length > 0 && (o.value = i.value[0].value));\n\t\t}), {\n\t\t\tmidiSupported: n,\n\t\t\tinputs: r,\n\t\t\toutputs: i,\n\t\t\tselectedInput: a,\n\t\t\tselectedOutput: o,\n\t\t\tupdatePending: s,\n\t\t\tplaySound,\n\t\t\tsaveSettings,\n\t\t\tconfigChanged: u,\n\t\t\tlowestNote: f,\n\t\t\thighestNote: m,\n\t\t\tkeyboardRangeOptions: y,\n\t\t\tselectedKeyboardRange: d,\n\t\t\tnoteOptions: v,\n\t\t\tupdateCustomRangeFromPreset,\n\t\t\tupdateRangeAndCheckChanges\n\t\t};\n\t}\n}), Q = {\n\tkey: 0,\n\tclass: \"custom-range-inputs d-flex gap-4\"\n}, ue = { class: \"d-flex justify-space-between mt-3\" }, de = { key: 1 };\nfunction _sfc_render(e, t, n, r, i, a) {\n\tlet o = N(\"v-toolbar-title\"), s = N(\"v-toolbar\"), c = N(\"v-select\"), l = N(\"v-divider\"), u = N(\"piano-range-visualizer\"), d = N(\"v-btn\"), f = N(\"v-form\"), p = N(\"v-card-text\"), m = N(\"v-card\");\n\treturn A(), x(m, null, {\n\t\tdefault: I(() => [E(s, { dense: \"\" }, {\n\t\t\tdefault: I(() => [E(o, null, {\n\t\t\t\tdefault: I(() => t[5] ||= [T(\"Configure Midi Device\")]),\n\t\t\t\t_: 1\n\t\t\t})]),\n\t\t\t_: 1\n\t\t}), E(p, null, {\n\t\t\tdefault: I(() => [e.midiSupported ? (A(), x(f, {\n\t\t\t\tkey: 0,\n\t\t\t\tonsubmit: \"return false;\"\n\t\t\t}, {\n\t\t\t\tdefault: I(() => [\n\t\t\t\t\tE(c, {\n\t\t\t\t\t\tmodelValue: e.selectedInput,\n\t\t\t\t\t\t\"onUpdate:modelValue\": t[0] ||= (t) => e.selectedInput = t,\n\t\t\t\t\t\titems: e.inputs,\n\t\t\t\t\t\tlabel: \"Select Input\",\n\t\t\t\t\t\thint: \"Play some notes on your input device to test the connection\"\n\t\t\t\t\t}, null, 8, [\"modelValue\", \"items\"]),\n\t\t\t\t\tE(c, {\n\t\t\t\t\t\tmodelValue: e.selectedOutput,\n\t\t\t\t\t\t\"onUpdate:modelValue\": t[1] ||= (t) => e.selectedOutput = t,\n\t\t\t\t\t\titems: e.outputs,\n\t\t\t\t\t\tlabel: \"Select Output\"\n\t\t\t\t\t}, null, 8, [\"modelValue\", \"items\"]),\n\t\t\t\t\tE(l, { class: \"my-4\" }),\n\t\t\t\t\tt[8] ||= w(\"h3\", { class: \"text-subtitle-1 mb-2\" }, \"Keyboard Range\", -1),\n\t\t\t\t\tE(c, {\n\t\t\t\t\t\tmodelValue: e.selectedKeyboardRange,\n\t\t\t\t\t\t\"onUpdate:modelValue\": [t[2] ||= (t) => e.selectedKeyboardRange = t, e.updateCustomRangeFromPreset],\n\t\t\t\t\t\titems: e.keyboardRangeOptions,\n\t\t\t\t\t\tlabel: \"Select Keyboard Range\"\n\t\t\t\t\t}, null, 8, [\n\t\t\t\t\t\t\"modelValue\",\n\t\t\t\t\t\t\"items\",\n\t\t\t\t\t\t\"onUpdate:modelValue\"\n\t\t\t\t\t]),\n\t\t\t\t\te.selectedKeyboardRange === \"custom\" ? (A(), C(\"div\", Q, [E(c, {\n\t\t\t\t\t\tmodelValue: e.lowestNote,\n\t\t\t\t\t\t\"onUpdate:modelValue\": [t[3] ||= (t) => e.lowestNote = t, e.updateRangeAndCheckChanges],\n\t\t\t\t\t\titems: e.noteOptions,\n\t\t\t\t\t\tlabel: \"Lowest Note\"\n\t\t\t\t\t}, null, 8, [\n\t\t\t\t\t\t\"modelValue\",\n\t\t\t\t\t\t\"items\",\n\t\t\t\t\t\t\"onUpdate:modelValue\"\n\t\t\t\t\t]), E(c, {\n\t\t\t\t\t\tmodelValue: e.highestNote,\n\t\t\t\t\t\t\"onUpdate:modelValue\": [t[4] ||= (t) => e.highestNote = t, e.updateRangeAndCheckChanges],\n\t\t\t\t\t\titems: e.noteOptions,\n\t\t\t\t\t\tlabel: \"Highest Note\"\n\t\t\t\t\t}, null, 8, [\n\t\t\t\t\t\t\"modelValue\",\n\t\t\t\t\t\t\"items\",\n\t\t\t\t\t\t\"onUpdate:modelValue\"\n\t\t\t\t\t])])) : S(\"\", !0),\n\t\t\t\t\tE(u, {\n\t\t\t\t\t\t\"lowest-note\": e.lowestNote,\n\t\t\t\t\t\t\"highest-note\": e.highestNote\n\t\t\t\t\t}, null, 8, [\"lowest-note\", \"highest-note\"]),\n\t\t\t\t\tw(\"div\", ue, [E(d, {\n\t\t\t\t\t\tcolor: \"primary\",\n\t\t\t\t\t\tonClick: e.playSound\n\t\t\t\t\t}, {\n\t\t\t\t\t\tdefault: I(() => t[6] ||= [T(\"Test midi output\")]),\n\t\t\t\t\t\t_: 1\n\t\t\t\t\t}, 8, [\"onClick\"]), E(d, {\n\t\t\t\t\t\tloading: e.updatePending,\n\t\t\t\t\t\tdisabled: !e.configChanged && !e.updatePending,\n\t\t\t\t\t\tcolor: \"info\",\n\t\t\t\t\t\tclass: \"save-button\",\n\t\t\t\t\t\tonClick: e.saveSettings\n\t\t\t\t\t}, {\n\t\t\t\t\t\tdefault: I(() => t[7] ||= [T(\" Save these settings \")]),\n\t\t\t\t\t\t_: 1\n\t\t\t\t\t}, 8, [\n\t\t\t\t\t\t\"loading\",\n\t\t\t\t\t\t\"disabled\",\n\t\t\t\t\t\t\"onClick\"\n\t\t\t\t\t])])\n\t\t\t\t]),\n\t\t\t\t_: 1\n\t\t\t})) : (A(), C(\"div\", de, t[9] ||= [w(\"p\", null, \"This quilt requires a midi input device, which is not supported by this browser.\", -1), w(\"div\", null, [w(\"p\", null, \"Try one of the following browsers:\"), w(\"ul\", null, [\n\t\t\t\tw(\"li\", null, [w(\"a\", { href: \"https://www.google.com/chrome/\" }, \"Google Chrome\")]),\n\t\t\t\tw(\"li\", null, [w(\"a\", { href: \"https://www.microsoft.com/edge\" }, \"Microsoft Edge\")]),\n\t\t\t\tw(\"li\", null, [w(\"a\", { href: \"https://brave.com/\" }, \"Brave\")])\n\t\t\t])], -1)]))]),\n\t\t\t_: 1\n\t\t})]),\n\t\t_: 1\n\t});\n}\nvar fe = /* @__PURE__ */ i(le, [[\"render\", _sfc_render], [\"__scopeId\", \"data-v-6ee9020f\"]]), pe = ee;\nasync function loadSubcourse(e) {\n\tlet t;\n\tswitch (e) {\n\t\tcase \"chess\":\n\t\t\tt = await import(\"./chess-Lfm7Fsvs.js\");\n\t\t\tbreak;\n\t\tcase \"french\":\n\t\t\tt = await import(\"./french-evUMlbbq.js\");\n\t\t\tbreak;\n\t\tcase \"math\":\n\t\t\tt = await import(\"./math-DYni7rRl.js\");\n\t\t\tbreak;\n\t\tcase \"piano\":\n\t\t\tt = await import(\"./piano-BN5Btq91.js\");\n\t\t\tbreak;\n\t\tcase \"pitch\":\n\t\t\tt = await import(\"./pitch-Dn0iNqiS.js\");\n\t\t\tbreak;\n\t\tcase \"sightSing\":\n\t\t\tt = await import(\"./sightsing-CJX3k0Fd.js\");\n\t\t\tbreak;\n\t\tcase \"typing\":\n\t\t\tt = await import(\"./typing-k-ojjO7G.js\");\n\t\t\tbreak;\n\t\tcase \"wordWork\":\n\t\t\tt = await import(\"./word-work-Dd6tIKrt.js\");\n\t\t\tbreak;\n\t}\n\tlet n = t.default;\n\treturn $.courses.find((e) => e.name === n.name) || $.courses.push(n), n;\n}\nasync function loadAllSubcourses() {\n\tawait Promise.all([\n\t\t\"chess\",\n\t\t\"french\",\n\t\t\"math\",\n\t\t\"piano\",\n\t\t\"pitch\",\n\t\t\"sightSing\",\n\t\t\"typing\",\n\t\t\"wordWork\"\n\t].map((e) => loadSubcourse(e)));\n}\nvar AllCourseWare = class {\n\tcourseWareList;\n\tget courses() {\n\t\treturn this.courseWareList;\n\t}\n\tconstructor(e) {\n\t\tthis.courseWareList = e;\n\t}\n\tgetCourseWare(e) {\n\t\treturn this.courseWareList.find((t) => t.name === e);\n\t}\n\tcachedRawViews = null;\n\tallViewsRaw() {\n\t\tif (!this.cachedRawViews) {\n\t\t\tlet e = this.allViews();\n\t\t\tthis.cachedRawViews = Object.fromEntries(Object.entries(e).map(([e, t]) => [e, O(t)]));\n\t\t}\n\t\treturn this.cachedRawViews;\n\t}\n\tallViews() {\n\t\tlet e = {};\n\t\treturn this.courseWareList.forEach((t) => {\n\t\t\tObject.assign(e, t.allViewsMap);\n\t\t}), e;\n\t}\n\tgetView(e) {\n\t\tlet t;\n\t\tt = typeof e == \"string\" ? B.getViewDescriptor(e) : e;\n\t\tlet n = this.getCourseWare(t.course);\n\t\tif (n) {\n\t\t\tlet e = n.getQuestion(t.questionType);\n\t\t\tif (e) {\n\t\t\t\tlet r = e.views.find((e) => e.name === t.view);\n\t\t\t\tif (r) return r;\n\t\t\t\tthrow console.error(`QuestionView ${t.view} not found in course ${t.course}\n\n descriptor: ${JSON.stringify(t)}\n\n course: ${n.name}\n question: ${e.name}\n views: ${e.views.map((e) => e.name).join(\", \")}\n `), Error(`view ${t.view} does not exist.`);\n\t\t\t} else throw console.error(`Question ${t.questionType} not found in course ${t.course}\n\n descriptor: ${JSON.stringify(t)}\n\n course: ${n.name}\n questions: ${n.questions.map((e) => e.name).join(\", \")}\n `), Error(`question ${t.questionType} does not exist.`);\n\t\t} else throw console.error(`Course ${t.course} not found.\n\n descriptor: ${JSON.stringify(t)}`), Error(`course ${t.course} does not exist.`);\n\t}\n\ttoString() {\n\t\tlet e = \"\";\n\t\treturn this.courses.forEach((t) => {\n\t\t\te += `Course: ${t.name}\\n`, t.questions.forEach((t) => {\n\t\t\t\te += ` Question: ${t.name}\\n`, t.views.forEach((t) => {\n\t\t\t\t\te += ` View: ${t.name}\\n`;\n\t\t\t\t});\n\t\t\t});\n\t\t}), e;\n\t}\n\tallDataShapesRaw() {\n\t\tlet e = [];\n\t\treturn this.courseWareList.forEach((t) => {\n\t\t\tt.questions.forEach((t) => {\n\t\t\t\tt.dataShapes.forEach((t) => {\n\t\t\t\t\te.includes(t) || e.push(t);\n\t\t\t\t});\n\t\t\t});\n\t\t}), e;\n\t}\n\tallDataShapes() {\n\t\tlet e = [];\n\t\treturn this.courseWareList.forEach((t) => {\n\t\t\tt.questions.forEach((n) => {\n\t\t\t\tn.dataShapes.forEach((r) => {\n\t\t\t\t\te.findIndex((e) => e.course === t.name && e.dataShape === r.name) === -1 && e.push({\n\t\t\t\t\t\tcourse: t.name,\n\t\t\t\t\t\tdataShape: r.name,\n\t\t\t\t\t\tdisplayable: n\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}), e;\n\t}\n\tgetDataShape(e) {\n\t\tlet t;\n\t\tif (this.getCourseWare(e.course).questions.forEach((n) => {\n\t\t\tn.dataShapes.forEach((n) => {\n\t\t\t\tn.name === e.dataShape && (t = n);\n\t\t\t});\n\t\t}), t) return t;\n\t\tthrow Error(`DataShape ${B.getDataShapeString(e)} not found`);\n\t}\n}, $ = new AllCourseWare([]);\n//#endregion\nexport { AllCourseWare, r as BlanksCard, t as BlanksCardDataShapes, a as CourseWare, L as Displayable, fe as MidiConfig, R as Question, p as SkMidi, d as SyllableSeqVis, u as SyllableSequence, $ as allCourseWare, o as chess, U as defaultCourse, l as eventsToSyllableSequence, s as french, n as gradeSpellingAttempt, loadAllSubcourses, loadSubcourse, c as math, m as piano, h as pitch, g as sightSing, f as transposeSyllableSeq, _ as typing, pe as useQuestionView, te as useViewable, v as wordWork };\n\n//# sourceMappingURL=index.mjs.map"],"file":"dist-DcjcehoT.js"}
1
+ {"version":3,"mappings":"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","names":["a","r","D","j","b","k","A","C","w","y","M","S","P","e","i","V","F","H","z","p","N","x","I","E","T","O","B"],"ignoreList":[],"sources":["../../../courseware/dist/index.mjs"],"sourcesContent":["import { r as e, t } from \"./shapes-BQUVJdp5.js\";\nimport { i as n, n as r, r as i, t as a } from \"./CourseWare-BTFRjgBR.js\";\nimport { t as o } from \"./chess-E2uOAyQS.js\";\nimport { t as s } from \"./french-Dk7YG8Td.js\";\nimport { t as c } from \"./math-B4HbgYf6.js\";\nimport { a as l, i as u, n as d, o as f, r as p, t as m } from \"./piano-DF1g6yaX.js\";\nimport { t as h } from \"./pitch-CgGJFkZ1.js\";\nimport { t as g } from \"./sightsing-BFQ7HRig.js\";\nimport { t as _ } from \"./typing-BevtfWlp.js\";\nimport { t as v } from \"./word-work-BOnRlZgd.js\";\nimport { Fragment as y, computed as b, createBlock as x, createCommentVNode as S, createElementBlock as C, createElementVNode as w, createTextVNode as T, createVNode as E, defineComponent as D, markRaw as O, onMounted as k, openBlock as A, ref as j, renderList as M, resolveComponent as N, toDisplayString as P, watch as F, withCtx as I } from \"vue\";\nimport { Displayable as L, Question as R, alertUser as z, useQuestionView as ee, useViewable as te } from \"@vue-skuilder/common-ui\";\nimport { NameSpacer as B, Status as V } from \"@vue-skuilder/common\";\nimport { getDataLayer as H } from \"@vue-skuilder/db\";\nimport './assets/index.css';//#region src/default/index.ts\nvar U = new a(\"default\", [r]), W = D({\n\tname: \"PianoRangeVisualizer\",\n\tprops: {\n\t\tlowestNote: {\n\t\t\ttype: Number,\n\t\t\trequired: !0\n\t\t},\n\t\thighestNote: {\n\t\t\ttype: Number,\n\t\t\trequired: !0\n\t\t},\n\t\tmaxWidth: {\n\t\t\ttype: Number,\n\t\t\tdefault: 1e3\n\t\t}\n\t},\n\tsetup(e) {\n\t\tlet t = j(null), n = j(800), r = b(() => {\n\t\t\tlet e = 0;\n\t\t\tfor (let t = 21; t <= 108; t++) isWhiteKey(t) && e++;\n\t\t\treturn e;\n\t\t}), i = b(() => Math.min(22, n.value / Math.max(25, r.value))), a = b(() => i.value * .6), o = b(() => Math.min(e.maxWidth, i.value * r.value + 10)), isWhiteKey = (e) => {\n\t\t\tlet t = e % 12;\n\t\t\treturn [\n\t\t\t\t0,\n\t\t\t\t2,\n\t\t\t\t4,\n\t\t\t\t5,\n\t\t\t\t7,\n\t\t\t\t9,\n\t\t\t\t11\n\t\t\t].includes(t);\n\t\t}, getKeyPosition = (e) => {\n\t\t\tlet t = 0;\n\t\t\tfor (let n = 21; n < e; n++) isWhiteKey(n) && t++;\n\t\t\treturn isWhiteKey(e) ? t * i.value : t * i.value - a.value / 2;\n\t\t}, getNoteLabel = (e) => {\n\t\t\tlet t = [\n\t\t\t\t\"C\",\n\t\t\t\t\"C#\",\n\t\t\t\t\"D\",\n\t\t\t\t\"D#\",\n\t\t\t\t\"E\",\n\t\t\t\t\"F\",\n\t\t\t\t\"F#\",\n\t\t\t\t\"G\",\n\t\t\t\t\"G#\",\n\t\t\t\t\"A\",\n\t\t\t\t\"A#\",\n\t\t\t\t\"B\"\n\t\t\t], n = e % 12, r = Math.floor(e / 12) - 1;\n\t\t\treturn `${t[n]}${r}`;\n\t\t};\n\t\treturn k(() => {\n\t\t\tt.value && (n.value = t.value.clientWidth, new ResizeObserver((e) => {\n\t\t\t\tfor (let t of e) n.value = t.contentRect.width;\n\t\t\t}).observe(t.value));\n\t\t}), {\n\t\t\tpianoWrapper: t,\n\t\t\tkeyHeight: 100,\n\t\t\tblackKeyHeight: 60,\n\t\t\twhiteKeyWidth: i,\n\t\t\tblackKeyWidth: a,\n\t\t\tsvgWidth: o,\n\t\t\tisWhiteKey,\n\t\t\tgetKeyPosition,\n\t\t\tgetNoteLabel\n\t\t};\n\t}\n}), G = { class: \"piano-range-container\" }, K = {\n\tclass: \"piano-wrapper\",\n\tref: \"pianoWrapper\"\n}, q = [\"width\", \"height\"], J = {\n\tclass: \"background-keys\",\n\topacity: \"0.15\"\n}, Y = [\n\t\"x\",\n\t\"width\",\n\t\"height\"\n], X = [\n\t\"x\",\n\t\"width\",\n\t\"height\"\n], Z = { class: \"selected-range\" }, ne = [\n\t\"x\",\n\t\"width\",\n\t\"height\"\n], re = [\n\t\"x\",\n\t\"width\",\n\t\"height\"\n], ie = { class: \"range-markers\" }, ae = [\"x\", \"height\"], oe = [\"x\", \"height\"], se = [\"x\", \"y\"], ce = [\"x\", \"y\"];\nfunction _sfc_render$1(e, t, n, r, i, a) {\n\treturn A(), C(\"div\", G, [w(\"div\", K, [(A(), C(\"svg\", {\n\t\twidth: e.svgWidth,\n\t\theight: e.keyHeight + 20,\n\t\tclass: \"piano-svg\"\n\t}, [\n\t\tw(\"g\", J, [(A(), C(y, null, M(88, (t) => (A(), C(y, { key: `bg-${t}` }, [e.isWhiteKey(t + 20) ? (A(), C(\"rect\", {\n\t\t\tkey: 0,\n\t\t\tx: e.getKeyPosition(t + 20),\n\t\t\ty: \"0\",\n\t\t\twidth: e.whiteKeyWidth,\n\t\t\theight: e.keyHeight,\n\t\t\tclass: \"white-key\",\n\t\t\tstroke: \"#999\",\n\t\t\t\"stroke-width\": \"1\"\n\t\t}, null, 8, Y)) : S(\"\", !0)], 64))), 64)), (A(), C(y, null, M(88, (t) => (A(), C(y, { key: `bg-black-${t}` }, [e.isWhiteKey(t + 20) ? S(\"\", !0) : (A(), C(\"rect\", {\n\t\t\tkey: 0,\n\t\t\tx: e.getKeyPosition(t + 20),\n\t\t\ty: \"0\",\n\t\t\twidth: e.blackKeyWidth,\n\t\t\theight: e.blackKeyHeight,\n\t\t\tclass: \"black-key\"\n\t\t}, null, 8, X))], 64))), 64))]),\n\t\tw(\"g\", Z, [(A(), C(y, null, M(128, (t) => (A(), C(y, { key: `white-${t}` }, [e.isWhiteKey(t) && t >= e.lowestNote && t <= e.highestNote ? (A(), C(\"rect\", {\n\t\t\tkey: 0,\n\t\t\tx: e.getKeyPosition(t),\n\t\t\ty: \"0\",\n\t\t\twidth: e.whiteKeyWidth,\n\t\t\theight: e.keyHeight,\n\t\t\tclass: \"white-key active\",\n\t\t\tstroke: \"#666\",\n\t\t\t\"stroke-width\": \"1\"\n\t\t}, null, 8, ne)) : S(\"\", !0)], 64))), 64)), (A(), C(y, null, M(128, (t) => (A(), C(y, { key: `black-${t}` }, [!e.isWhiteKey(t) && t >= e.lowestNote && t <= e.highestNote ? (A(), C(\"rect\", {\n\t\t\tkey: 0,\n\t\t\tx: e.getKeyPosition(t),\n\t\t\ty: \"0\",\n\t\t\twidth: e.blackKeyWidth,\n\t\t\theight: e.blackKeyHeight,\n\t\t\tclass: \"black-key active\"\n\t\t}, null, 8, re)) : S(\"\", !0)], 64))), 64))]),\n\t\tw(\"g\", ie, [w(\"rect\", {\n\t\t\tx: e.getKeyPosition(e.lowestNote) - 2,\n\t\t\ty: \"0\",\n\t\t\twidth: 4,\n\t\t\theight: e.keyHeight + 5,\n\t\t\tclass: \"range-marker start\"\n\t\t}, null, 8, ae), w(\"rect\", {\n\t\t\tx: e.getKeyPosition(e.highestNote) + e.whiteKeyWidth - 2,\n\t\t\ty: \"0\",\n\t\t\twidth: 4,\n\t\t\theight: e.keyHeight + 5,\n\t\t\tclass: \"range-marker end\"\n\t\t}, null, 8, oe)]),\n\t\tw(\"text\", {\n\t\t\tx: e.getKeyPosition(e.lowestNote) + 3,\n\t\t\ty: e.keyHeight + 12,\n\t\t\tclass: \"note-label\"\n\t\t}, P(e.getNoteLabel(e.lowestNote)), 9, se),\n\t\tw(\"text\", {\n\t\t\tx: e.getKeyPosition(e.highestNote) + e.whiteKeyWidth - 3,\n\t\t\ty: e.keyHeight + 12,\n\t\t\t\"text-anchor\": \"end\",\n\t\t\tclass: \"note-label\"\n\t\t}, P(e.getNoteLabel(e.highestNote)), 9, ce)\n\t], 8, q))], 512)]);\n}\ne(_sfc_render$1, \"_sfc_render\");\n//#endregion\n//#region src/piano/utility/MidiConfig.vue?vue&type=script&lang.ts\nvar le = D({\n\tname: \"MidiConfig\",\n\tcomponents: { PianoRangeVisualizer: /* @__PURE__ */ i(W, [[\"render\", _sfc_render$1], [\"__scopeId\", \"data-v-4b232a8b\"]]) },\n\tprops: {\n\t\t_id: {\n\t\t\ttype: String,\n\t\t\trequired: !0\n\t\t},\n\t\tuser: {\n\t\t\ttype: Object,\n\t\t\trequired: !0\n\t\t}\n\t},\n\tsetup(e) {\n\t\tlet t = j(), n = j(!0), r = j([]), i = j([]), a = j(\"\"), o = j(\"\"), s = j(!1), c = j(\"\"), l = j(\"\"), u = j(!1), d = j(\"full-88\"), f = j(21), m = j(108), h = j(\"\"), g = j(0), _ = j(0), v = j([]), initNoteOptions = () => {\n\t\t\tlet e = [\n\t\t\t\t\"C\",\n\t\t\t\t\"C#\",\n\t\t\t\t\"D\",\n\t\t\t\t\"D#\",\n\t\t\t\t\"E\",\n\t\t\t\t\"F\",\n\t\t\t\t\"F#\",\n\t\t\t\t\"G\",\n\t\t\t\t\"G#\",\n\t\t\t\t\"A\",\n\t\t\t\t\"A#\",\n\t\t\t\t\"B\"\n\t\t\t], t = [];\n\t\t\tfor (let n = 0; n <= 127; n++) {\n\t\t\t\tlet r = Math.floor(n / 12) - 1, i = e[n % 12];\n\t\t\t\tt.push({\n\t\t\t\t\ttitle: `${i}${r} (${n})`,\n\t\t\t\t\tvalue: n\n\t\t\t\t});\n\t\t\t}\n\t\t\tv.value = t;\n\t\t}, y = j([\n\t\t\t{\n\t\t\t\ttitle: \"Full 88-key Piano (A0-C8)\",\n\t\t\t\tvalue: \"full-88\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"76-key Keyboard (E1-G7)\",\n\t\t\t\tvalue: \"76-key\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"61-key Keyboard (C2-C7)\",\n\t\t\t\tvalue: \"61-key\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"49-key Keyboard (C3-C7)\",\n\t\t\t\tvalue: \"49-key\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"37-key Keyboard (C3-C6)\",\n\t\t\t\tvalue: \"37-key\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"25-key Keyboard (C4-C6)\",\n\t\t\t\tvalue: \"25-key\"\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: \"Custom Range\",\n\t\t\t\tvalue: \"custom\"\n\t\t\t}\n\t\t]), checkConfigChanged = () => {\n\t\t\tu.value = a.value !== c.value || o.value !== l.value || d.value !== h.value || d.value === \"custom\" && (f.value !== g.value || m.value !== _.value);\n\t\t}, updateCustomRangeFromPreset = () => {\n\t\t\tswitch (d.value) {\n\t\t\t\tcase \"full-88\":\n\t\t\t\t\tf.value = 21, m.value = 108;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"76-key\":\n\t\t\t\t\tf.value = 28, m.value = 103;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"61-key\":\n\t\t\t\t\tf.value = 36, m.value = 96;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"49-key\":\n\t\t\t\t\tf.value = 48, m.value = 96;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"37-key\":\n\t\t\t\t\tf.value = 48, m.value = 84;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"25-key\":\n\t\t\t\t\tf.value = 60, m.value = 84;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcheckConfigChanged();\n\t\t}, updateRangeAndCheckChanges = () => {\n\t\t\tf.value >= m.value && (m.value = f.value + 12), checkConfigChanged();\n\t\t}, playSound = () => {\n\t\t\tt.value?.play([\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 64,\n\t\t\t\t\t\tname: \"E\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .4251968503937008,\n\t\t\t\t\ttimestamp: 0\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 64,\n\t\t\t\t\t\tname: \"E\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .3779527559055118,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 511.90500000002794\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .5275590551181102,\n\t\t\t\t\ttimestamp: 535.8800000001211\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .33858267716535434,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 674.9899999999907\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .5590551181102362,\n\t\t\t\t\ttimestamp: 1070.8800000000047\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .3464566929133858,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 1214.8999999999069\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 64,\n\t\t\t\t\t\tname: \"E\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .5118110236220472,\n\t\t\t\t\ttimestamp: 1424.9400000000605\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 64,\n\t\t\t\t\t\tname: \"E\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .2755905511811024,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 1576.9150000000373\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 62,\n\t\t\t\t\t\tname: \"D\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .3937007874015748,\n\t\t\t\t\ttimestamp: 1756.9149999999208\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 62,\n\t\t\t\t\t\tname: \"D\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .36220472440944884,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 1926.9899999998743\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .5196850393700787,\n\t\t\t\t\ttimestamp: 1970.9600000000792\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .36220472440944884,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 2126.009999999893\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .5984251968503937,\n\t\t\t\t\ttimestamp: 2502.0050000000047\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 60,\n\t\t\t\t\t\tname: \"C\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .3858267716535433,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 2853.920000000042\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 67,\n\t\t\t\t\t\tname: \"G\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\ttype: \"noteon\",\n\t\t\t\t\tvelocity: .6850393700787402,\n\t\t\t\t\ttimestamp: 2875.8649999999907\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnote: {\n\t\t\t\t\t\tnumber: 67,\n\t\t\t\t\t\tname: \"G\",\n\t\t\t\t\t\toctave: 4\n\t\t\t\t\t},\n\t\t\t\t\tvelocity: .6377952755905512,\n\t\t\t\t\ttype: \"noteoff\",\n\t\t\t\t\ttimestamp: 4497.004999999888\n\t\t\t\t}\n\t\t\t]);\n\t\t}, indicateHeardNotes = (e) => {\n\t\t\tz({\n\t\t\t\ttext: `I hear a ${e.note.name}!`,\n\t\t\t\tstatus: V.ok\n\t\t\t});\n\t\t};\n\t\tF(a, () => {\n\t\t\tt.value?.selectInput(a.value), checkConfigChanged();\n\t\t}), F(o, () => {\n\t\t\tt.value?.selectOutput(o.value), checkConfigChanged();\n\t\t});\n\t\tlet retrieveSettings = async () => {\n\t\t\tlet t = await (await e.user.getCourseInterface(e._id)).getCourseSettings();\n\t\t\tif (t?.midiinput) {\n\t\t\t\tlet e = t.midiinput.toString();\n\t\t\t\tr.value.some((t) => t.value === e) && (a.value = e, c.value = e);\n\t\t\t}\n\t\t\tif (t?.midioutput) {\n\t\t\t\tlet e = t.midioutput.toString();\n\t\t\t\ti.value.some((t) => t.value === e) && (o.value = e, l.value = e);\n\t\t\t}\n\t\t\tt?.keyboardRange && (h.value = t.keyboardRange.toString(), d.value = h.value), t?.lowestNote && (g.value = parseInt(t.lowestNote.toString()), f.value = g.value), t?.highestNote && (_.value = parseInt(t.highestNote.toString()), m.value = _.value), t?.lowestNote && t?.highestNote && !t?.keyboardRange && (d.value = \"custom\"), u.value = !1;\n\t\t}, saveSettings = async () => {\n\t\t\ts.value = !0, (await H().getUserDB().getCourseInterface(e._id)).updateCourseSettings([\n\t\t\t\t{\n\t\t\t\t\tkey: \"midiinput\",\n\t\t\t\t\tvalue: a.value\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkey: \"midioutput\",\n\t\t\t\t\tvalue: o.value\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkey: \"keyboardRange\",\n\t\t\t\t\tvalue: d.value\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkey: \"lowestNote\",\n\t\t\t\t\tvalue: f.value\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tkey: \"highestNote\",\n\t\t\t\t\tvalue: m.value\n\t\t\t\t}\n\t\t\t]), c.value = a.value, l.value = o.value, h.value = d.value, g.value = f.value, _.value = m.value, u.value = !1, s.value = !1, z({\n\t\t\t\ttext: \"Settings updated.\",\n\t\t\t\tstatus: V.ok\n\t\t\t});\n\t\t};\n\t\treturn k(async () => {\n\t\t\tinitNoteOptions();\n\t\t\ttry {\n\t\t\t\tt.value = await p.instance(), n.value = t.value.state === \"ready\" || t.value.state === \"nodevice\";\n\t\t\t} catch (e) {\n\t\t\t\tconsole.log(`Error on midi Init: ${e}`), n.value = !1;\n\t\t\t}\n\t\t\tn.value && (t.value?.addNoteonListenter(indicateHeardNotes), t.value ? (r.value = t.value.inputs.filter((e) => e.state === \"connected\").map((e) => ({\n\t\t\t\ttitle: `${e.manufacturer}: ${e.name}`,\n\t\t\t\tvalue: e.id\n\t\t\t})), i.value = t.value?.outputs.filter((e) => e.state === \"connected\").map((e) => ({\n\t\t\t\ttitle: `${e.manufacturer}: ${e.name}`,\n\t\t\t\tvalue: e.id\n\t\t\t}))) : (r.value = [{\n\t\t\t\ttitle: \"No inputs available\",\n\t\t\t\tvalue: \"\"\n\t\t\t}], i.value = [{\n\t\t\t\ttitle: \"No outputs available\",\n\t\t\t\tvalue: \"\"\n\t\t\t}]), await retrieveSettings(), !a.value && r.value.length > 0 && (a.value = r.value[0].value), !o.value && i.value.length > 0 && (o.value = i.value[0].value));\n\t\t}), {\n\t\t\tmidiSupported: n,\n\t\t\tinputs: r,\n\t\t\toutputs: i,\n\t\t\tselectedInput: a,\n\t\t\tselectedOutput: o,\n\t\t\tupdatePending: s,\n\t\t\tplaySound,\n\t\t\tsaveSettings,\n\t\t\tconfigChanged: u,\n\t\t\tlowestNote: f,\n\t\t\thighestNote: m,\n\t\t\tkeyboardRangeOptions: y,\n\t\t\tselectedKeyboardRange: d,\n\t\t\tnoteOptions: v,\n\t\t\tupdateCustomRangeFromPreset,\n\t\t\tupdateRangeAndCheckChanges\n\t\t};\n\t}\n}), Q = {\n\tkey: 0,\n\tclass: \"custom-range-inputs d-flex gap-4\"\n}, ue = { class: \"d-flex justify-space-between mt-3\" }, de = { key: 1 };\nfunction _sfc_render(e, t, n, r, i, a) {\n\tlet o = N(\"v-toolbar-title\"), s = N(\"v-toolbar\"), c = N(\"v-select\"), l = N(\"v-divider\"), u = N(\"piano-range-visualizer\"), d = N(\"v-btn\"), f = N(\"v-form\"), p = N(\"v-card-text\"), m = N(\"v-card\");\n\treturn A(), x(m, null, {\n\t\tdefault: I(() => [E(s, { dense: \"\" }, {\n\t\t\tdefault: I(() => [E(o, null, {\n\t\t\t\tdefault: I(() => t[5] ||= [T(\"Configure Midi Device\")]),\n\t\t\t\t_: 1\n\t\t\t})]),\n\t\t\t_: 1\n\t\t}), E(p, null, {\n\t\t\tdefault: I(() => [e.midiSupported ? (A(), x(f, {\n\t\t\t\tkey: 0,\n\t\t\t\tonsubmit: \"return false;\"\n\t\t\t}, {\n\t\t\t\tdefault: I(() => [\n\t\t\t\t\tE(c, {\n\t\t\t\t\t\tmodelValue: e.selectedInput,\n\t\t\t\t\t\t\"onUpdate:modelValue\": t[0] ||= (t) => e.selectedInput = t,\n\t\t\t\t\t\titems: e.inputs,\n\t\t\t\t\t\tlabel: \"Select Input\",\n\t\t\t\t\t\thint: \"Play some notes on your input device to test the connection\"\n\t\t\t\t\t}, null, 8, [\"modelValue\", \"items\"]),\n\t\t\t\t\tE(c, {\n\t\t\t\t\t\tmodelValue: e.selectedOutput,\n\t\t\t\t\t\t\"onUpdate:modelValue\": t[1] ||= (t) => e.selectedOutput = t,\n\t\t\t\t\t\titems: e.outputs,\n\t\t\t\t\t\tlabel: \"Select Output\"\n\t\t\t\t\t}, null, 8, [\"modelValue\", \"items\"]),\n\t\t\t\t\tE(l, { class: \"my-4\" }),\n\t\t\t\t\tt[8] ||= w(\"h3\", { class: \"text-subtitle-1 mb-2\" }, \"Keyboard Range\", -1),\n\t\t\t\t\tE(c, {\n\t\t\t\t\t\tmodelValue: e.selectedKeyboardRange,\n\t\t\t\t\t\t\"onUpdate:modelValue\": [t[2] ||= (t) => e.selectedKeyboardRange = t, e.updateCustomRangeFromPreset],\n\t\t\t\t\t\titems: e.keyboardRangeOptions,\n\t\t\t\t\t\tlabel: \"Select Keyboard Range\"\n\t\t\t\t\t}, null, 8, [\n\t\t\t\t\t\t\"modelValue\",\n\t\t\t\t\t\t\"items\",\n\t\t\t\t\t\t\"onUpdate:modelValue\"\n\t\t\t\t\t]),\n\t\t\t\t\te.selectedKeyboardRange === \"custom\" ? (A(), C(\"div\", Q, [E(c, {\n\t\t\t\t\t\tmodelValue: e.lowestNote,\n\t\t\t\t\t\t\"onUpdate:modelValue\": [t[3] ||= (t) => e.lowestNote = t, e.updateRangeAndCheckChanges],\n\t\t\t\t\t\titems: e.noteOptions,\n\t\t\t\t\t\tlabel: \"Lowest Note\"\n\t\t\t\t\t}, null, 8, [\n\t\t\t\t\t\t\"modelValue\",\n\t\t\t\t\t\t\"items\",\n\t\t\t\t\t\t\"onUpdate:modelValue\"\n\t\t\t\t\t]), E(c, {\n\t\t\t\t\t\tmodelValue: e.highestNote,\n\t\t\t\t\t\t\"onUpdate:modelValue\": [t[4] ||= (t) => e.highestNote = t, e.updateRangeAndCheckChanges],\n\t\t\t\t\t\titems: e.noteOptions,\n\t\t\t\t\t\tlabel: \"Highest Note\"\n\t\t\t\t\t}, null, 8, [\n\t\t\t\t\t\t\"modelValue\",\n\t\t\t\t\t\t\"items\",\n\t\t\t\t\t\t\"onUpdate:modelValue\"\n\t\t\t\t\t])])) : S(\"\", !0),\n\t\t\t\t\tE(u, {\n\t\t\t\t\t\t\"lowest-note\": e.lowestNote,\n\t\t\t\t\t\t\"highest-note\": e.highestNote\n\t\t\t\t\t}, null, 8, [\"lowest-note\", \"highest-note\"]),\n\t\t\t\t\tw(\"div\", ue, [E(d, {\n\t\t\t\t\t\tcolor: \"primary\",\n\t\t\t\t\t\tonClick: e.playSound\n\t\t\t\t\t}, {\n\t\t\t\t\t\tdefault: I(() => t[6] ||= [T(\"Test midi output\")]),\n\t\t\t\t\t\t_: 1\n\t\t\t\t\t}, 8, [\"onClick\"]), E(d, {\n\t\t\t\t\t\tloading: e.updatePending,\n\t\t\t\t\t\tdisabled: !e.configChanged && !e.updatePending,\n\t\t\t\t\t\tcolor: \"info\",\n\t\t\t\t\t\tclass: \"save-button\",\n\t\t\t\t\t\tonClick: e.saveSettings\n\t\t\t\t\t}, {\n\t\t\t\t\t\tdefault: I(() => t[7] ||= [T(\" Save these settings \")]),\n\t\t\t\t\t\t_: 1\n\t\t\t\t\t}, 8, [\n\t\t\t\t\t\t\"loading\",\n\t\t\t\t\t\t\"disabled\",\n\t\t\t\t\t\t\"onClick\"\n\t\t\t\t\t])])\n\t\t\t\t]),\n\t\t\t\t_: 1\n\t\t\t})) : (A(), C(\"div\", de, t[9] ||= [w(\"p\", null, \"This quilt requires a midi input device, which is not supported by this browser.\", -1), w(\"div\", null, [w(\"p\", null, \"Try one of the following browsers:\"), w(\"ul\", null, [\n\t\t\t\tw(\"li\", null, [w(\"a\", { href: \"https://www.google.com/chrome/\" }, \"Google Chrome\")]),\n\t\t\t\tw(\"li\", null, [w(\"a\", { href: \"https://www.microsoft.com/edge\" }, \"Microsoft Edge\")]),\n\t\t\t\tw(\"li\", null, [w(\"a\", { href: \"https://brave.com/\" }, \"Brave\")])\n\t\t\t])], -1)]))]),\n\t\t\t_: 1\n\t\t})]),\n\t\t_: 1\n\t});\n}\nvar fe = /* @__PURE__ */ i(le, [[\"render\", _sfc_render], [\"__scopeId\", \"data-v-6ee9020f\"]]), pe = ee;\nasync function loadSubcourse(e) {\n\tlet t;\n\tswitch (e) {\n\t\tcase \"chess\":\n\t\t\tt = await import(\"./chess-Lfm7Fsvs.js\");\n\t\t\tbreak;\n\t\tcase \"french\":\n\t\t\tt = await import(\"./french-evUMlbbq.js\");\n\t\t\tbreak;\n\t\tcase \"math\":\n\t\t\tt = await import(\"./math-DYni7rRl.js\");\n\t\t\tbreak;\n\t\tcase \"piano\":\n\t\t\tt = await import(\"./piano-BN5Btq91.js\");\n\t\t\tbreak;\n\t\tcase \"pitch\":\n\t\t\tt = await import(\"./pitch-Dn0iNqiS.js\");\n\t\t\tbreak;\n\t\tcase \"sightSing\":\n\t\t\tt = await import(\"./sightsing-CJX3k0Fd.js\");\n\t\t\tbreak;\n\t\tcase \"typing\":\n\t\t\tt = await import(\"./typing-k-ojjO7G.js\");\n\t\t\tbreak;\n\t\tcase \"wordWork\":\n\t\t\tt = await import(\"./word-work-Dd6tIKrt.js\");\n\t\t\tbreak;\n\t}\n\tlet n = t.default;\n\treturn $.courses.find((e) => e.name === n.name) || $.courses.push(n), n;\n}\nasync function loadAllSubcourses() {\n\tawait Promise.all([\n\t\t\"chess\",\n\t\t\"french\",\n\t\t\"math\",\n\t\t\"piano\",\n\t\t\"pitch\",\n\t\t\"sightSing\",\n\t\t\"typing\",\n\t\t\"wordWork\"\n\t].map((e) => loadSubcourse(e)));\n}\nvar AllCourseWare = class {\n\tcourseWareList;\n\tget courses() {\n\t\treturn this.courseWareList;\n\t}\n\tconstructor(e) {\n\t\tthis.courseWareList = e;\n\t}\n\tgetCourseWare(e) {\n\t\treturn this.courseWareList.find((t) => t.name === e);\n\t}\n\tcachedRawViews = null;\n\tallViewsRaw() {\n\t\tif (!this.cachedRawViews) {\n\t\t\tlet e = this.allViews();\n\t\t\tthis.cachedRawViews = Object.fromEntries(Object.entries(e).map(([e, t]) => [e, O(t)]));\n\t\t}\n\t\treturn this.cachedRawViews;\n\t}\n\tallViews() {\n\t\tlet e = {};\n\t\treturn this.courseWareList.forEach((t) => {\n\t\t\tObject.assign(e, t.allViewsMap);\n\t\t}), e;\n\t}\n\tgetView(e) {\n\t\tlet t;\n\t\tt = typeof e == \"string\" ? B.getViewDescriptor(e) : e;\n\t\tlet n = this.getCourseWare(t.course);\n\t\tif (n) {\n\t\t\tlet e = n.getQuestion(t.questionType);\n\t\t\tif (e) {\n\t\t\t\tlet r = e.views.find((e) => e.name === t.view);\n\t\t\t\tif (r) return r;\n\t\t\t\tthrow console.error(`QuestionView ${t.view} not found in course ${t.course}\n\n descriptor: ${JSON.stringify(t)}\n\n course: ${n.name}\n question: ${e.name}\n views: ${e.views.map((e) => e.name).join(\", \")}\n `), Error(`view ${t.view} does not exist.`);\n\t\t\t} else throw console.error(`Question ${t.questionType} not found in course ${t.course}\n\n descriptor: ${JSON.stringify(t)}\n\n course: ${n.name}\n questions: ${n.questions.map((e) => e.name).join(\", \")}\n `), Error(`question ${t.questionType} does not exist.`);\n\t\t} else throw console.error(`Course ${t.course} not found.\n\n descriptor: ${JSON.stringify(t)}`), Error(`course ${t.course} does not exist.`);\n\t}\n\ttoString() {\n\t\tlet e = \"\";\n\t\treturn this.courses.forEach((t) => {\n\t\t\te += `Course: ${t.name}\\n`, t.questions.forEach((t) => {\n\t\t\t\te += ` Question: ${t.name}\\n`, t.views.forEach((t) => {\n\t\t\t\t\te += ` View: ${t.name}\\n`;\n\t\t\t\t});\n\t\t\t});\n\t\t}), e;\n\t}\n\tallDataShapesRaw() {\n\t\tlet e = [];\n\t\treturn this.courseWareList.forEach((t) => {\n\t\t\tt.questions.forEach((t) => {\n\t\t\t\tt.dataShapes.forEach((t) => {\n\t\t\t\t\te.includes(t) || e.push(t);\n\t\t\t\t});\n\t\t\t});\n\t\t}), e;\n\t}\n\tallDataShapes() {\n\t\tlet e = [];\n\t\treturn this.courseWareList.forEach((t) => {\n\t\t\tt.questions.forEach((n) => {\n\t\t\t\tn.dataShapes.forEach((r) => {\n\t\t\t\t\te.findIndex((e) => e.course === t.name && e.dataShape === r.name) === -1 && e.push({\n\t\t\t\t\t\tcourse: t.name,\n\t\t\t\t\t\tdataShape: r.name,\n\t\t\t\t\t\tdisplayable: n\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}), e;\n\t}\n\tgetDataShape(e) {\n\t\tlet t;\n\t\tif (this.getCourseWare(e.course).questions.forEach((n) => {\n\t\t\tn.dataShapes.forEach((n) => {\n\t\t\t\tn.name === e.dataShape && (t = n);\n\t\t\t});\n\t\t}), t) return t;\n\t\tthrow Error(`DataShape ${B.getDataShapeString(e)} not found`);\n\t}\n}, $ = new AllCourseWare([]);\n//#endregion\nexport { AllCourseWare, r as BlanksCard, t as BlanksCardDataShapes, a as CourseWare, L as Displayable, fe as MidiConfig, R as Question, p as SkMidi, d as SyllableSeqVis, u as SyllableSequence, $ as allCourseWare, o as chess, U as defaultCourse, l as eventsToSyllableSequence, s as french, n as gradeSpellingAttempt, loadAllSubcourses, loadSubcourse, c as math, m as piano, h as pitch, g as sightSing, f as transposeSyllableSeq, _ as typing, pe as useQuestionView, te as useViewable, v as wordWork };\n\n//# sourceMappingURL=index.mjs.map"],"file":"dist-CWTz_ocg.js"}
@@ -370,9 +370,9 @@ Example:
370
370
  sessionId: ${this.sessionId}
371
371
  startTime: ${this.startTime}
372
372
  endTime: ${this.endTime}
373
- defaultBatchLimit: ${this._defaultBatchLimit}`),registerActiveController(this)}tick(){this._secondsRemaining=Math.floor((this.endTime.valueOf()-Date.now())/1e3),this._secondsRemaining<=0&&clearInterval(this._intervalHandle)}estimateCleanupTime(){let e=0;for(let t=0;t<this.failedQ.length;t++){let n=this.failedQ.peek(t),r=this._sessionRecord.find(e=>e.item.cardID===n.cardID),a=0;if(r){for(let e=0;e<r.records.length;e++)a+=r.records[e].timeSpent;a/=r.records.length,e+=a}}let t=e/1e3;return this.log(`Failed card cleanup estimate: ${Math.round(t)}`),t}async prepareSession(){if(this.sources.some(e=>typeof e.getWeightedCards!=`function`))throw Error(`[SessionController] All content sources must implement getWeightedCards().`);clearStaleSessionDebugState();let e=await this.getWeightedContent();this._recordRuns(`bootstrap`),this._wellIndicatedRemaining=e,e>=0&&e<_SessionController.MIN_WELL_INDICATED&&this.log(`[Init] Only ${e}/${_SessionController.MIN_WELL_INDICATED} well-indicated cards in initial load`),await this.hydrationService.ensureHydratedCards(),startSessionTracking(this.sessionId,this.supplyQ.length,this.failedQ.length),this._openDocPromise=this._openSessionDoc(),this._intervalHandle=setInterval(()=>{this.tick()},1e3)}_recordRuns(e,t){for(let n of drainCapturedRuns()){if(this._runLog.length>=_SessionController.MAX_LOGGED_RUNS)break;this._runLog.push({runId:n.runId,at:n.timestamp.toISOString(),label:e,...t?{mode:t}:{},generatedCount:n.generatedCount,finalCount:n.finalCount,reviewsSelected:n.reviewsSelected,newSelected:n.newSelected})}}async _captureState(e){if(!this._stateSnapshotProvider)return;let t=3e3;try{return await Promise.race([Promise.resolve(this._stateSnapshotProvider(e)),new Promise(e=>setTimeout(()=>e(void 0),3e3))])}catch(t){this.log(`[Session] state snapshot (${e}) failed: ${t}`);return}}async _openSessionDoc(){if(this._courseId)try{let e=this.dataLayer.getUserDB(),t={_id:makeStudySessionId(this._courseId,e.getUsername(),this.sessionId),docType:`STUDY_SESSION`,sessionId:this.sessionId,courseId:this._courseId,userId:e.getUsername(),startTime:this.startTime.toISOString(),status:`open`,plannedSeconds:Math.round((this.endTime.valueOf()-this.startTime.valueOf())/1e3),config:{defaultBatchLimit:this._defaultBatchLimit,sourceCount:this.sources.length,initHints:this._sessionHints},initialQueues:{supplyQ:this.supplyQ.length,failedQ:this.failedQ.length},runs:[...this._runLog],stateAtStart:await this._captureState(`start`)};this._sessionDoc=t,await e.putStudySession(t),this.log(`[Session] Opened session record ${t._id}`)}catch(e){logger.warn(`[SessionController] Failed to open session record: ${e}`)}}async requestReplan(e){let t=this.normalizeReplanOptions(e),n=this._replanHasIntent(t);if(this._replanPromise){if(!n)return this.log(`Replan already in progress, coalescing unhinted auto-replan`),this._replanPromise;let e=t.label?` [${t.label}]`:``;this.log(`Replan in progress; queueing hint-bearing replan${e} behind in-flight run`);let r=this._replanPromise.catch(()=>void 0).then(()=>this._runReplan(t)),a=r.finally(()=>{this._replanPromise===a&&(this._replanPromise=null,this._activeReplanLabel=null)});return this._replanPromise=a,r}let r=this._runReplan(t),a=r.finally(()=>{this._replanPromise===a&&(this._replanPromise=null,this._activeReplanLabel=null)});this._replanPromise=a,await r}_replanHasIntent(e){return!!(e.limit!==void 0||e.minFollowUpCards!==void 0||e.mode&&e.mode!==`replace`||e.hints&&Object.keys(e.hints).length>0||e.sessionHints!==void 0||e.mergeSessionHints!==void 0)}async _runReplan(e){this._activeReplanLabel=e.label??`(auto)`,e.hints||(e.hints={});let t=e.hints,n=new Set(t.excludeCards??[]);this._currentCard?.item.cardID&&n.add(this._currentCard.item.cardID);for(let e of this._sessionRecord)n.add(e.card.card_id);this.supplyQ.length>0&&n.add(this.supplyQ.peek(0).cardID),t.excludeCards=[...n],e.sessionHints!==void 0&&(this._sessionHints=e.sessionHints,this.log(`[Replan] Session hints ${e.sessionHints?`set`:`cleared`}: ${JSON.stringify(e.sessionHints)}`)),e.mergeSessionHints!==void 0&&(this._sessionHints=mergeHints2([this._sessionHints,e.mergeSessionHints])??null,this.log(`[Replan] Session hints merged: ${JSON.stringify(this._sessionHints)}`)),this._applyHintsToSources(e.hints,e.label);let r=e.label?` [${e.label}]`:``;this.log(`Mid-session replan requested${r} (limit: ${e.limit??`default`}, mode: ${e.mode??`replace`}${e.hints?`, with hints`:``})`),e.minFollowUpCards!==void 0&&e.minFollowUpCards>0&&(this._minCardsGuarantee=Math.max(this._minCardsGuarantee,e.minFollowUpCards),this.log(`[Replan] Card guarantee set to ${this._minCardsGuarantee}`)),await this._executeReplan(e)}setSessionHints(e){this._sessionHints=e,this.log(`Session hints ${e?`set`:`cleared`}: ${JSON.stringify(e)}`)}getSessionHints(){return this._sessionHints}getDebugSnapshot(){let describe=e=>{let t=[];for(let n=0;n<e.length;n++){let r=e.peek(n);t.push({cardID:r.cardID,status:r.status,origin:isReview(r)?`review`:`new`,score:r.score})}return{length:e.length,dequeueCount:e.dequeueCount,cards:t}},e=this._sessionRecord.map(e=>{let t=e.records[e.records.length-1];return{cardID:e.item.cardID,status:e.item.status,attempts:e.records.length,correct:t&&isQuestionRecord(t)?t.isCorrect:null,timeSpentMs:e.records.reduce((e,t)=>e+t.timeSpent,0)}});return{sessionId:this.sessionId,secondsRemaining:this.secondsRemaining,hasCardGuarantee:this.hasCardGuarantee,minCardsGuarantee:this._minCardsGuarantee,wellIndicatedRemaining:this._wellIndicatedRemaining,currentCard:this._currentCard?.item.cardID??null,sessionHints:this._sessionHints,replanActive:this._replanPromise!==null,replanLabel:this._activeReplanLabel,supplyQ:describe(this.supplyQ),failedQ:describe(this.failedQ),reviewBacklog:getSrsBacklogDebug(),strategyPressure:getStrategyPressureDebug(),drawnCards:e}}mergeSessionHints(e){this._sessionHints=mergeHints2([this._sessionHints,e])??null,this.log(`Session hints merged: ${JSON.stringify(this._sessionHints)}`)}_applyHintsToSources(e,t){let n=e&&t?{...e,_label:t}:e,r=mergeHints2([this._sessionHints,n]);if(r)for(let e of this.sources)e.setEphemeralHints?.(r)}_getSessionControls(){return this._sessionControls||(this._sessionControls={getSessionHints:()=>this.getSessionHints(),setSessionHints:e=>this.setSessionHints(e),mergeSessionHints:e=>this.mergeSessionHints(e),requestReplan:e=>this.requestReplan(e)}),this._sessionControls}async _notifyOutcomeObservers(e,t,n){if(this._outcomeObservers.length===0||!isQuestionRecord(e))return;let r={record:e,card:t.card,result:n},a=this._getSessionControls();for(let e of this._outcomeObservers)try{await e(r,a)}catch(e){this.error(`[OutcomeObserver] observer threw; ignoring`,e)}}async _replanUncoalesced(e){let t=this._runReplan(e),n=t.finally(()=>{this._replanPromise===n&&(this._replanPromise=null,this._activeReplanLabel=null)});this._replanPromise=n,await t}normalizeReplanOptions(e){if(!e)return{};let t=[`hints`,`sessionHints`,`limit`,`mode`,`label`,`minFollowUpCards`];return Object.keys(e).some(e=>t.includes(e))?e:{hints:e}}async _executeReplan(e={}){let t=e.limit,n=e.mode??`replace`,r=await this.getWeightedContent({replan:!0,additive:n===`merge`,limit:t});this._recordRuns(e.label??`(auto)`,n),this._wellIndicatedRemaining=r,t!==void 0&&t<this._defaultBatchLimit?(this._suppressQualityReplan=!0,this.log(`[Replan] Burst mode (limit=${t}): suppressing quality-based auto-replan`)):this._suppressQualityReplan=!1,r>=0&&r<_SessionController.MIN_WELL_INDICATED&&this.log(`[Replan] Only ${r}/${_SessionController.MIN_WELL_INDICATED} well-indicated cards after replan`),await this.hydrationService.ensureHydratedCards();let a=e.label?` [${e.label}]`:``;this.log(`Replan complete${a}: supplyQ now has ${this.supplyQ.length} cards (mode=${n})`),snapshotQueues(this.supplyQ.length,this.failedQ.length)}addTime(e){this.endTime=new Date(this.endTime.valueOf()+1e3*e)}get failedCount(){return this.failedQ.length}toString(){return`Session: ${this.supplyQ.length} supply, ${this.failedQ.length} failed`}reportString(){return`${this.supplyQ.dequeueCount} supply, ${this.failedQ.dequeueCount} failed`}getDebugInfo(){let e=this.sources.some(e=>typeof e.getWeightedCards==`function`),extractQueueItems=(e,t=10)=>{let n=[];for(let r=0;r<Math.min(e.length,t);r++){let t=e.peek(r);n.push({courseID:t.courseID||`unknown`,cardID:t.cardID||`unknown`,status:t.status||`unknown`,score:t.score})}return n};return{api:{mode:e?`weighted`:`legacy`,description:e?`Using getWeightedCards() API with scored candidates`:`ERROR: getWeightedCards() not a function.`},supplyQueue:{length:this.supplyQ.length,dequeueCount:this.supplyQ.dequeueCount,items:extractQueueItems(this.supplyQ)},failedQueue:{length:this.failedQ.length,dequeueCount:this.failedQ.dequeueCount,items:extractQueueItems(this.failedQ)},hydratedCache:{count:this.hydrationService.hydratedCount,cardIds:this.hydrationService.getHydratedCardIds()},replan:{inProgress:this._replanPromise!==null,suppressQualityReplan:this._suppressQualityReplan,defaultBatchLimit:this._defaultBatchLimit,minCardsGuarantee:this._minCardsGuarantee}}}async getWeightedContent(e){let t=e?.replan??!1,n=e?.additive??!1,r=e?.limit??this._defaultBatchLimit,a=r;t||this._applyHintsToSources();let o=[];for(let e=0;e<this.sources.length;e++){let t=this.sources[e];try{let n=(await t.getWeightedCards(a)).cards;o.push({sourceIndex:e,weighted:n})}catch(t){if(this.error(`Failed to get content from source ${e}:`,t),this.sources.length===1)throw Error(`Cannot start session: failed to load content from source ${e}`)}}if(o.length===0){if(t)return this.log(`Replan: no content from any source, keeping existing supplyQ`),-1;throw Error(`Cannot start session: failed to load content from all ${this.sources.length} source(s). Check logs for details.`)}let s=this.mixer.mix(o,a*this.sources.length),c=o.map(e=>e.weighted[0]?.courseId||`source-${e.sourceIndex}`);await Promise.all(c.map(async e=>{if(!this.courseNameCache.has(e))try{let t=await this.dataLayer.getCoursesDB().getCourseConfig(e);this.courseNameCache.set(e,t.name)}catch{}}));let l=c.map(e=>this.courseNameCache.get(e)),u=this.mixer instanceof QuotaRoundRobinMixer?Math.ceil(a*this.sources.length/o.length):void 0;captureMixerRun(this.mixer.constructor.name,o,c,l,a*this.sources.length,u,s);let d=s.filter(e=>!this._servedCardIds.has(e.cardId)),p=d.filter(e=>e.score===1/0),m=d.filter(e=>e.score!==1/0),g=[...p,...m.slice(0,Math.max(0,r-p.length))],_=new Set(p.map(e=>e.cardId)),v=g.filter(e=>e.score>=_SessionController.WELL_INDICATED_SCORE).length,y=t?`Replan content:
373
+ defaultBatchLimit: ${this._defaultBatchLimit}`),registerActiveController(this)}tick(){this._secondsRemaining=Math.floor((this.endTime.valueOf()-Date.now())/1e3),this._secondsRemaining<=0&&clearInterval(this._intervalHandle)}estimateCleanupTime(){let e=0;for(let t=0;t<this.failedQ.length;t++){let n=this.failedQ.peek(t),r=this._sessionRecord.find(e=>e.item.cardID===n.cardID),a=0;if(r){for(let e=0;e<r.records.length;e++)a+=r.records[e].timeSpent;a/=r.records.length,e+=a}}let t=e/1e3;return this.log(`Failed card cleanup estimate: ${Math.round(t)}`),t}async prepareSession(){if(this.sources.some(e=>typeof e.getWeightedCards!=`function`))throw Error(`[SessionController] All content sources must implement getWeightedCards().`);clearStaleSessionDebugState();let e=await this.getWeightedContent();this._recordRuns(`bootstrap`),this._wellIndicatedRemaining=e,e>=0&&e<_SessionController.MIN_WELL_INDICATED&&this.log(`[Init] Only ${e}/${_SessionController.MIN_WELL_INDICATED} well-indicated cards in initial load`),await this.hydrationService.ensureHydratedCards(),startSessionTracking(this.sessionId,this.supplyQ.length,this.failedQ.length),this._openDocPromise=this._openSessionDoc(),this._intervalHandle=setInterval(()=>{this.tick()},1e3)}_recordRuns(e,t){for(let n of drainCapturedRuns()){if(this._runLog.length>=_SessionController.MAX_LOGGED_RUNS)break;this._runLog.push({runId:n.runId,at:n.timestamp.toISOString(),label:e,...t?{mode:t}:{},generatedCount:n.generatedCount,finalCount:n.finalCount,reviewsSelected:n.reviewsSelected,newSelected:n.newSelected,...typeof n.userElo==`number`?{userElo:n.userElo}:{},...n.generators?{generators:n.generators}:{},...n.filters?{filters:n.filters}:{},...n.hints?{hints:n.hints}:{},...n.discardedTail?{discardedTail:n.discardedTail}:{}})}}async _captureState(e){if(!this._stateSnapshotProvider)return;let t=3e3;try{return await Promise.race([Promise.resolve(this._stateSnapshotProvider(e)),new Promise(e=>setTimeout(()=>e(void 0),3e3))])}catch(t){this.log(`[Session] state snapshot (${e}) failed: ${t}`);return}}async _openSessionDoc(){if(this._courseId)try{let e=this.dataLayer.getUserDB(),t={_id:makeStudySessionId(this._courseId,e.getUsername(),this.sessionId),docType:`STUDY_SESSION`,sessionId:this.sessionId,courseId:this._courseId,userId:e.getUsername(),startTime:this.startTime.toISOString(),status:`open`,plannedSeconds:Math.round((this.endTime.valueOf()-this.startTime.valueOf())/1e3),config:{defaultBatchLimit:this._defaultBatchLimit,sourceCount:this.sources.length,initHints:this._sessionHints},initialQueues:{supplyQ:this.supplyQ.length,failedQ:this.failedQ.length},runs:[...this._runLog],stateAtStart:await this._captureState(`start`)};this._sessionDoc=t,await e.putStudySession(t),this.log(`[Session] Opened session record ${t._id}`)}catch(e){logger.warn(`[SessionController] Failed to open session record: ${e}`)}}async requestReplan(e){let t=this.normalizeReplanOptions(e),n=this._replanHasIntent(t);if(this._replanPromise){if(!n)return this.log(`Replan already in progress, coalescing unhinted auto-replan`),this._replanPromise;let e=t.label?` [${t.label}]`:``;this.log(`Replan in progress; queueing hint-bearing replan${e} behind in-flight run`);let r=this._replanPromise.catch(()=>void 0).then(()=>this._runReplan(t)),a=r.finally(()=>{this._replanPromise===a&&(this._replanPromise=null,this._activeReplanLabel=null)});return this._replanPromise=a,r}let r=this._runReplan(t),a=r.finally(()=>{this._replanPromise===a&&(this._replanPromise=null,this._activeReplanLabel=null)});this._replanPromise=a,await r}_replanHasIntent(e){return!!(e.limit!==void 0||e.minFollowUpCards!==void 0||e.mode&&e.mode!==`replace`||e.hints&&Object.keys(e.hints).length>0||e.sessionHints!==void 0||e.mergeSessionHints!==void 0)}async _runReplan(e){this._activeReplanLabel=e.label??`(auto)`,e.hints||(e.hints={});let t=e.hints,n=new Set(t.excludeCards??[]);this._currentCard?.item.cardID&&n.add(this._currentCard.item.cardID);for(let e of this._sessionRecord)n.add(e.card.card_id);this.supplyQ.length>0&&n.add(this.supplyQ.peek(0).cardID),t.excludeCards=[...n],e.sessionHints!==void 0&&(this._sessionHints=e.sessionHints,this.log(`[Replan] Session hints ${e.sessionHints?`set`:`cleared`}: ${JSON.stringify(e.sessionHints)}`)),e.mergeSessionHints!==void 0&&(this._sessionHints=mergeHints2([this._sessionHints,e.mergeSessionHints])??null,this.log(`[Replan] Session hints merged: ${JSON.stringify(this._sessionHints)}`)),this._applyHintsToSources(e.hints,e.label);let r=e.label?` [${e.label}]`:``;this.log(`Mid-session replan requested${r} (limit: ${e.limit??`default`}, mode: ${e.mode??`replace`}${e.hints?`, with hints`:``})`),e.minFollowUpCards!==void 0&&e.minFollowUpCards>0&&(this._minCardsGuarantee=Math.max(this._minCardsGuarantee,e.minFollowUpCards),this.log(`[Replan] Card guarantee set to ${this._minCardsGuarantee}`)),await this._executeReplan(e)}setSessionHints(e){this._sessionHints=e,this.log(`Session hints ${e?`set`:`cleared`}: ${JSON.stringify(e)}`)}getSessionHints(){return this._sessionHints}getDebugSnapshot(){let describe=e=>{let t=[];for(let n=0;n<e.length;n++){let r=e.peek(n);t.push({cardID:r.cardID,status:r.status,origin:isReview(r)?`review`:`new`,score:r.score})}return{length:e.length,dequeueCount:e.dequeueCount,cards:t}},e=this._sessionRecord.map(e=>{let t=e.records[e.records.length-1];return{cardID:e.item.cardID,status:e.item.status,attempts:e.records.length,correct:t&&isQuestionRecord(t)?t.isCorrect:null,timeSpentMs:e.records.reduce((e,t)=>e+t.timeSpent,0)}});return{sessionId:this.sessionId,secondsRemaining:this.secondsRemaining,hasCardGuarantee:this.hasCardGuarantee,minCardsGuarantee:this._minCardsGuarantee,wellIndicatedRemaining:this._wellIndicatedRemaining,currentCard:this._currentCard?.item.cardID??null,sessionHints:this._sessionHints,replanActive:this._replanPromise!==null,replanLabel:this._activeReplanLabel,supplyQ:describe(this.supplyQ),failedQ:describe(this.failedQ),reviewBacklog:getSrsBacklogDebug(),strategyPressure:getStrategyPressureDebug(),drawnCards:e}}mergeSessionHints(e){this._sessionHints=mergeHints2([this._sessionHints,e])??null,this.log(`Session hints merged: ${JSON.stringify(this._sessionHints)}`)}_applyHintsToSources(e,t){let n=e&&t?{...e,_label:t}:e,r=mergeHints2([this._sessionHints,n]);if(r)for(let e of this.sources)e.setEphemeralHints?.(r)}_getSessionControls(){return this._sessionControls||(this._sessionControls={getSessionHints:()=>this.getSessionHints(),setSessionHints:e=>this.setSessionHints(e),mergeSessionHints:e=>this.mergeSessionHints(e),requestReplan:e=>this.requestReplan(e)}),this._sessionControls}async _notifyOutcomeObservers(e,t,n){if(this._outcomeObservers.length===0||!isQuestionRecord(e))return;let r={record:e,card:t.card,result:n},a=this._getSessionControls();for(let e of this._outcomeObservers)try{await e(r,a)}catch(e){this.error(`[OutcomeObserver] observer threw; ignoring`,e)}}async _replanUncoalesced(e){let t=this._runReplan(e),n=t.finally(()=>{this._replanPromise===n&&(this._replanPromise=null,this._activeReplanLabel=null)});this._replanPromise=n,await t}normalizeReplanOptions(e){if(!e)return{};let t=[`hints`,`sessionHints`,`limit`,`mode`,`label`,`minFollowUpCards`];return Object.keys(e).some(e=>t.includes(e))?e:{hints:e}}async _executeReplan(e={}){let t=e.limit,n=e.mode??`replace`,r=await this.getWeightedContent({replan:!0,additive:n===`merge`,limit:t});this._recordRuns(e.label??`(auto)`,n),this._wellIndicatedRemaining=r,t!==void 0&&t<this._defaultBatchLimit?(this._suppressQualityReplan=!0,this.log(`[Replan] Burst mode (limit=${t}): suppressing quality-based auto-replan`)):this._suppressQualityReplan=!1,r>=0&&r<_SessionController.MIN_WELL_INDICATED&&this.log(`[Replan] Only ${r}/${_SessionController.MIN_WELL_INDICATED} well-indicated cards after replan`),await this.hydrationService.ensureHydratedCards();let a=e.label?` [${e.label}]`:``;this.log(`Replan complete${a}: supplyQ now has ${this.supplyQ.length} cards (mode=${n})`),snapshotQueues(this.supplyQ.length,this.failedQ.length)}addTime(e){this.endTime=new Date(this.endTime.valueOf()+1e3*e)}get failedCount(){return this.failedQ.length}toString(){return`Session: ${this.supplyQ.length} supply, ${this.failedQ.length} failed`}reportString(){return`${this.supplyQ.dequeueCount} supply, ${this.failedQ.dequeueCount} failed`}getDebugInfo(){let e=this.sources.some(e=>typeof e.getWeightedCards==`function`),extractQueueItems=(e,t=10)=>{let n=[];for(let r=0;r<Math.min(e.length,t);r++){let t=e.peek(r);n.push({courseID:t.courseID||`unknown`,cardID:t.cardID||`unknown`,status:t.status||`unknown`,score:t.score})}return n};return{api:{mode:e?`weighted`:`legacy`,description:e?`Using getWeightedCards() API with scored candidates`:`ERROR: getWeightedCards() not a function.`},supplyQueue:{length:this.supplyQ.length,dequeueCount:this.supplyQ.dequeueCount,items:extractQueueItems(this.supplyQ)},failedQueue:{length:this.failedQ.length,dequeueCount:this.failedQ.dequeueCount,items:extractQueueItems(this.failedQ)},hydratedCache:{count:this.hydrationService.hydratedCount,cardIds:this.hydrationService.getHydratedCardIds()},replan:{inProgress:this._replanPromise!==null,suppressQualityReplan:this._suppressQualityReplan,defaultBatchLimit:this._defaultBatchLimit,minCardsGuarantee:this._minCardsGuarantee}}}async getWeightedContent(e){let t=e?.replan??!1,n=e?.additive??!1,r=e?.limit??this._defaultBatchLimit,a=r;t||this._applyHintsToSources();let o=[];for(let e=0;e<this.sources.length;e++){let t=this.sources[e];try{let n=(await t.getWeightedCards(a)).cards;o.push({sourceIndex:e,weighted:n})}catch(t){if(this.error(`Failed to get content from source ${e}:`,t),this.sources.length===1)throw Error(`Cannot start session: failed to load content from source ${e}`)}}if(o.length===0){if(t)return this.log(`Replan: no content from any source, keeping existing supplyQ`),-1;throw Error(`Cannot start session: failed to load content from all ${this.sources.length} source(s). Check logs for details.`)}let s=this.mixer.mix(o,a*this.sources.length),c=o.map(e=>e.weighted[0]?.courseId||`source-${e.sourceIndex}`);await Promise.all(c.map(async e=>{if(!this.courseNameCache.has(e))try{let t=await this.dataLayer.getCoursesDB().getCourseConfig(e);this.courseNameCache.set(e,t.name)}catch{}}));let l=c.map(e=>this.courseNameCache.get(e)),u=this.mixer instanceof QuotaRoundRobinMixer?Math.ceil(a*this.sources.length/o.length):void 0;captureMixerRun(this.mixer.constructor.name,o,c,l,a*this.sources.length,u,s);let d=s.filter(e=>!this._servedCardIds.has(e.cardId)),p=d.filter(e=>e.score===1/0),m=d.filter(e=>e.score!==1/0),g=[...p,...m.slice(0,Math.max(0,r-p.length))],_=new Set(p.map(e=>e.cardId)),v=g.filter(e=>e.score>=_SessionController.WELL_INDICATED_SCORE).length,y=t?`Replan content:
374
374
  `:`Mixed content session created with:
375
375
  `,b=g.map(e=>{let t=getCardOrigin(e),n=Number.isFinite(e.score)?e.score.toFixed(2):`+INF`;return y+=`${t===`review`?`Review`:`New`}: ${e.courseId}::${e.cardId} (score: ${n})
376
376
  `,this._buildSupplyItem(e,t)});if(n){let e=this.supplyQ.mergeToFront(b,e=>e.cardID,_);y+=`Additive merge: ${e} cards added to front of supplyQ
377
377
  `}else if(t)this.supplyQ.replaceAll(b,e=>e.cardID);else for(let e of b)this.supplyQ.add(e,e.cardID);return this.log(y),v}_buildSupplyItem(e,t=getCardOrigin(e)){let n={cardID:e.cardId,courseID:e.courseId,contentSourceType:`course`,contentSourceID:e.courseId,score:e.score};return t===`review`?{...n,status:`review`,reviewID:e.reviewID}:{...n,status:`new`}}_getItemsToHydrate(){let e=[],t=3,n=2;for(let t=0;t<Math.min(3,this.supplyQ.length);t++)e.push(this.supplyQ.peek(t));for(let t=0;t<Math.min(2,this.failedQ.length);t++)e.push(this.failedQ.peek(t));return e}_selectNextItemToHydrate(){if(this.supplyQ.length===0&&this.failedQ.length===0||this._secondsRemaining<2&&this.failedQ.length===0&&this._minCardsGuarantee<=0)return null;if(this._secondsRemaining<=0&&this._minCardsGuarantee<=0)return this.failedQ.length>0?this.failedQ.peek(0):null;let e=this.supplyQ.length>0?this.supplyQ.peek(0):null;return this._minCardsGuarantee>0&&e?e:this.failedQ.length>0&&this._shouldInterleaveFailed(e!==null)?this.failedQ.peek(0):e||(this.failedQ.length>0?this.failedQ.peek(0):(this.log(`No more cards available for the session!`),null))}_shouldInterleaveFailed(e){return this.failedQ.length===0?!1:!e||this._secondsRemaining-this.estimateCleanupTime()<=_SessionController.FAILED_ENDGAME_SLACK_SECONDS?!0:this._supplyDrawsSinceFailed>=_SessionController.FAILED_INTERLEAVE_EVERY}async nextCard(e=`dismiss-success`){if(this.dismissCurrentCard(e),this._minCardsGuarantee>0&&(this._minCardsGuarantee--,this.log(`[CardGuarantee] ${this._minCardsGuarantee} guaranteed cards remaining`)),this._replanPromise&&this.supplyQ.length===0&&this.failedQ.length===0&&(this.log(`nextCard: queues empty, awaiting in-flight replan before drawing`),await this._replanPromise),this.supplyQ.length<=_SessionController.DEPLETION_PREFETCH_THRESHOLD&&this._secondsRemaining>0&&!this._replanPromise&&(this._suppressQualityReplan=!1,this.log(`[AutoReplan:depletion] supplyQ has ${this.supplyQ.length} card(s) (${this.failedQ.length} failed pending) with ${this._secondsRemaining}s remaining. Triggering background replan.`),this.requestReplan({label:`auto:depletion`,mode:`merge`})),!this._suppressQualityReplan&&this._wellIndicatedRemaining<=3&&this.supplyQ.length>0&&!this._replanPromise&&(this.log(`[AutoReplan:quality] ${this._wellIndicatedRemaining} well-indicated cards remaining (supplyQ: ${this.supplyQ.length}). Triggering background replan.`),this.requestReplan({label:`auto:quality`})),this._secondsRemaining<=0&&this.failedQ.length===0&&this._minCardsGuarantee<=0)return this._currentCard=null,endSessionTracking(),this._terminate(),null;let t=3,n=250,r=0;for(;this._secondsRemaining>0&&this.supplyQ.length===0&&this.failedQ.length===0;)if(this.log(`[WedgeBreaker] All queues empty with ${this._secondsRemaining}s remaining. Running pipeline (attempt ${r+1}/3).`),await this._replanUncoalesced({label:`wedge-breaker`}),this.supplyQ.length===0&&this.failedQ.length===0){if(r++,r>=3){this.log(`[WedgeBreaker] Pipeline returned no content 3 consecutive times. Giving up; session will end.`);break}await new Promise(e=>setTimeout(e,250))}else r=0;let a=20;for(let e=0;e<20;e++){let e=this._selectNextItemToHydrate();if(!e)return this._currentCard=null,endSessionTracking(),this._terminate(),null;let t=this.hydrationService.getHydratedCard(e.cardID);if(t||(t=await this.hydrationService.waitForCard(e.cardID)),this.removeItemFromQueue(e),t){await this.hydrationService.ensureHydratedCards(),this._currentCard=t;let n=e.status===`review`||e.status===`failed-review`?`review`:e.status===`new`||e.status===`failed-new`?`new`:`failed`,r=e.status.startsWith(`failed`)?`failedQ`:`supplyQ`;return recordCardPresentation(e.cardID,e.courseID,this.courseNameCache.get(e.courseID),n,r,e.score),snapshotQueues(this.supplyQ.length,this.failedQ.length),t}this.log(`Skipping card ${e.cardID}: hydration failed, trying next`),isReview(e)&&this.srsService.removeReview(e.reviewID)}return this.log(`Exhausted 20 skip attempts finding a hydratable card`),this._currentCard=null,endSessionTracking(),this._terminate(),null}_terminate(){this.endSession().catch(e=>{logger.warn(`[SessionController] endSession failed: ${e}`)})}async submitResponse(e,t,n,r,a,o,s,c,l){let u={...r.item},d=await this.services.response.processResponse(e,t,u,n,r,a,o,s,c,l);return await this._notifyOutcomeObservers(e,r,d),d}dismissCurrentCard(e=`dismiss-success`){if(this._currentCard)if(e===`dismiss-success`)this.hydrationService.removeCard(this._currentCard.item.cardID);else if(e===`marked-failed`){let e;e=isReview(this._currentCard.item)?{cardID:this._currentCard.item.cardID,courseID:this._currentCard.item.courseID,contentSourceID:this._currentCard.item.contentSourceID,contentSourceType:this._currentCard.item.contentSourceType,status:`failed-review`,reviewID:this._currentCard.item.reviewID}:{cardID:this._currentCard.item.cardID,courseID:this._currentCard.item.courseID,contentSourceID:this._currentCard.item.contentSourceID,contentSourceType:this._currentCard.item.contentSourceType,status:`failed-new`},this.failedQ.add(e,e.cardID),this._supplyDrawsSinceFailed=0}else (e===`dismiss-error`||e===`dismiss-failed`)&&this.hydrationService.removeCard(this._currentCard.item.cardID)}removeItemFromQueue(e){this._clearDurableRequirement(e.cardID),this._servedCardIds.add(e.cardID),this.failedQ.peek(0)?.cardID===e.cardID?(this.failedQ.dequeue(e=>e.cardID),this._supplyDrawsSinceFailed=0):this.supplyQ.peek(0)?.cardID===e.cardID&&(this.supplyQ.dequeue(e=>e.cardID),this._supplyDrawsSinceFailed++,this._wellIndicatedRemaining>0&&this._wellIndicatedRemaining--)}_clearDurableRequirement(e){let t=this._sessionHints?.requireCards;if(!t||t.length===0)return;let n=t.filter(t=>t!==e);n.length!==t.length&&(this._sessionHints={...this._sessionHints,requireCards:n.length>0?n:void 0},this.log(`[Replan] Durable requirement satisfied & cleared on draw: ${e}`))}async endSession(e=`closed`){if(this._sessionClosed||(this._sessionClosed=!0,clearInterval(this._intervalHandle),setDebugSessionId(void 0),await this._closeSessionDoc(e),!this._sessionRecord||this._sessionRecord.length===0))return;let t=this._sessionRecord.flatMap(e=>e.records).filter(e=>e.userAnswer!==void 0);if(t.length===0)return;let n=null,r=[];for(let e of this.sources)if(e.getOrchestrationContext){try{n=await e.getOrchestrationContext(),e.getStrategyIds&&r.push(...e.getStrategyIds())}catch(e){logger.warn(`[SessionController] Failed to get orchestration context: ${e}`)}if(n)break}if(!n){logger.debug(`[SessionController] No orchestration context available, skipping outcome recording`);return}let a=new Date().toISOString(),o=new Date(this.startTime).toISOString();await recordUserOutcome(n,o,a,t,r)}async _closeSessionDoc(e){this._openDocPromise&&await this._openDocPromise;let t=this._sessionDoc;if(!t)return;let n=this._sessionRecord.flatMap(e=>e.records),r=n.filter(isQuestionRecord);try{let a={...t,status:e,endTime:new Date().toISOString(),tally:{cardsPresented:this._sessionRecord.length,responses:n.length,correct:r.filter(e=>e.isCorrect).length,incorrect:r.filter(e=>!e.isCorrect).length,failedQRemaining:this.failedQ.length,secondsRemaining:Math.max(0,this._secondsRemaining)},runs:[...this._runLog],finalHints:this._sessionHints,stateAtEnd:await this._captureState(`end`)};this._sessionDoc=a,await this.dataLayer.getUserDB().putStudySession(a),this.log(`[Session] Session record ${a._id} -> ${e} (${a.tally.cardsPresented} cards, ${a.tally.responses} responses, ${this._runLog.length} pipeline runs)`)}catch(e){logger.warn(`[SessionController] Failed to close session record: ${e}`)}}},_defineProperty(_SessionController2,`MAX_LOGGED_RUNS`,100),_defineProperty(_SessionController2,`MIN_WELL_INDICATED`,5),_defineProperty(_SessionController2,`WELL_INDICATED_SCORE`,.1),_defineProperty(_SessionController2,`DEPLETION_PREFETCH_THRESHOLD`,3),_defineProperty(_SessionController2,`FAILED_INTERLEAVE_EVERY`,4),_defineProperty(_SessionController2,`FAILED_ENDGAME_SLACK_SECONDS`,20),_SessionController2);init_TagFilteredContentSource(),init_factory(),init_userDBHelpers();export{initializeDataLayer as $,computeSpread as A,snapshotQueues as At,getCardOrigin as B,captureStrategyPressure as C,registerQuestionType as Ct,computeDeviation as D,scoreAccuracyInZone as Dt,clearStrategyPressureDebug as E,removeQuestionType as Et,ensureAppDataDirectory as F,userDBDebugAPI as Ft,getRegisteredNavigatorRole as G,getDbPath as H,getActiveController as I,validateMigration as It,getStrategyPressureDebug as J,getRunsForSession as K,getActivePipeline as L,validateProcessorConfig as Lt,diversityRerank as M,toggleSessionOverlay as Mt,drainCapturedRuns as N,updateLearningState as Nt,computeEffectiveWeight as O,sessionDebugAPI as Ot,endSessionTracking as P,updateStrategyWeight as Pt,initializeDataDirectory as Q,getAppDataDirectory as R,validateStaticCourse as Rt,captureMixerRun as S,registerNavigator as St,clearStaleSessionDebugState as T,removeDataShape as Tt,getRegisteredNavigator as U,getDataLayer as V,getRegisteredNavigatorNames as W,hasRegisteredNavigator as X,getStudySource as Y,importParsedCards as Z,REVIEW_TIME_FORMAT as _,processCustomQuestionsData as _t,DocType as a,isReview as at,areQuestionRecords as b,registerActiveController as bt,FileSystemError as c,makeStudySessionId as ct,Loggable as d,mountPipelineDebugger as dt,initializeNavigatorRegistry as et,NOT_SET as f,mountSessionDebugger as ft,QuotaRoundRobinMixer as g,pipelineDebugAPI as gt,Navigators as h,newSessionId as ht,DIVERSITY_STRENGTH as i,isQuestionTypeRegistered as it,createOrchestrationContext as j,startSessionTracking as jt,computeOutcomeSignal as k,setDebugSessionId as kt,GuestUsername as l,mixerDebugAPI as lt,NavigatorRoles as m,newInterval as mt,CourseLookup as n,isGenerator as nt,DocTypePrefixes as o,log as ot,NavigatorRole as p,mountUserDBDebugger as pt,getSrsBacklogDebug as q,DIVERSITY_FLOOR as r,isQuestionRecord as rt,ENV as s,makeScheduledCardId as st,ContentNavigator as t,isFilter as tt,HYDRATION_MARKER_ID as u,mountMixerDebugger as ut,SessionController as v,recordCardPresentation as vt,clearSrsBacklogDebug as w,registerSeedData as wt,buildStrategyStateId as x,registerDataShape as xt,TagFilteredContentSource as y,recordUserOutcome as yt,getCardHistoryID as z};
378
- //# sourceMappingURL=dist-ByU4XK4n.js.map
378
+ //# sourceMappingURL=dist-DpHREB7I.js.map