@vue-skuilder/platform-ui 0.2.15 → 0.2.16

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-BL35bBRG.js → About-Kg4cHRA7.js} +2 -2
  2. package/dist/assets/{About-BL35bBRG.js.map → About-Kg4cHRA7.js.map} +1 -1
  3. package/dist/assets/{AdminDashboard-CHIrP6wJ.js → AdminDashboard-BhifTq30.js} +2 -2
  4. package/dist/assets/{AdminDashboard-CHIrP6wJ.js.map → AdminDashboard-BhifTq30.js.map} +1 -1
  5. package/dist/assets/{ClassroomCtrlPanel-D5HDBHG3.js → ClassroomCtrlPanel-DQqDWIxc.js} +2 -2
  6. package/dist/assets/{ClassroomCtrlPanel-D5HDBHG3.js.map → ClassroomCtrlPanel-DQqDWIxc.js.map} +1 -1
  7. package/dist/assets/{Classrooms-C3_pfwmS.js → Classrooms-8e5Wk1o8.js} +2 -2
  8. package/dist/assets/{Classrooms-C3_pfwmS.js.map → Classrooms-8e5Wk1o8.js.map} +1 -1
  9. package/dist/assets/{CourseRouter-CkXlaIr7.js → CourseRouter-Z_6VfTiW.js} +2 -2
  10. package/dist/assets/{CourseRouter-CkXlaIr7.js.map → CourseRouter-Z_6VfTiW.js.map} +1 -1
  11. package/dist/assets/{CourseWare-BTFRjgBR-HPmMaK3s.js → CourseWare-BTFRjgBR-BHFtLEh3.js} +3 -3
  12. package/dist/assets/{CourseWare-BTFRjgBR-HPmMaK3s.js.map → CourseWare-BTFRjgBR-BHFtLEh3.js.map} +1 -1
  13. package/dist/assets/{Courses-saYW1BHp.js → Courses-C6OIEqTq.js} +2 -2
  14. package/dist/assets/{Courses-saYW1BHp.js.map → Courses-C6OIEqTq.js.map} +1 -1
  15. package/dist/assets/{EloModeration-CnM0h1WE.js → EloModeration-Dd53o_8r.js} +2 -2
  16. package/dist/assets/{EloModeration-CnM0h1WE.js.map → EloModeration-Dd53o_8r.js.map} +1 -1
  17. package/dist/assets/{JoinCode-GDtNknof.js → JoinCode-B-OjUSym.js} +2 -2
  18. package/dist/assets/{JoinCode-GDtNknof.js.map → JoinCode-B-OjUSym.js.map} +1 -1
  19. package/dist/assets/{NewCourseDialog-BAw_DBGj.js → NewCourseDialog-C-cpZLL_.js} +2 -2
  20. package/dist/assets/{NewCourseDialog-BAw_DBGj.js.map → NewCourseDialog-C-cpZLL_.js.map} +1 -1
  21. package/dist/assets/{ReleaseNotes-CkW42-2H.js → ReleaseNotes-B3FiZzqR.js} +2 -2
  22. package/dist/assets/{ReleaseNotes-CkW42-2H.js.map → ReleaseNotes-B3FiZzqR.js.map} +1 -1
  23. package/dist/assets/{RequestPasswordReset-BFRbdHvx.js → RequestPasswordReset-DoETVGCN.js} +2 -2
  24. package/dist/assets/{RequestPasswordReset-BFRbdHvx.js.map → RequestPasswordReset-DoETVGCN.js.map} +1 -1
  25. package/dist/assets/{ResetPassword-dXiKK-UY.js → ResetPassword-DPT_Ca0b.js} +2 -2
  26. package/dist/assets/{ResetPassword-dXiKK-UY.js.map → ResetPassword-DPT_Ca0b.js.map} +1 -1
  27. package/dist/assets/{Study-KCL30Dbw.js → Study-BWyV7au5.js} +2 -2
  28. package/dist/assets/{Study-KCL30Dbw.js.map → Study-BWyV7au5.js.map} +1 -1
  29. package/dist/assets/{TagInformation-BG3_lsZe.js → TagInformation-DpEi6wOX.js} +2 -2
  30. package/dist/assets/{TagInformation-BG3_lsZe.js.map → TagInformation-DpEi6wOX.js.map} +1 -1
  31. package/dist/assets/{User-DTaFI5Xn.js → User-Co2jlwaX.js} +2 -2
  32. package/dist/assets/{User-DTaFI5Xn.js.map → User-Co2jlwaX.js.map} +1 -1
  33. package/dist/assets/{UserStats-Diw2CCyK.js → UserStats-D_klmQRZ.js} +2 -2
  34. package/dist/assets/{UserStats-Diw2CCyK.js.map → UserStats-D_klmQRZ.js.map} +1 -1
  35. package/dist/assets/{VerifyEmail-CIJkfafd.js → VerifyEmail-Di-_3y5p.js} +2 -2
  36. package/dist/assets/{VerifyEmail-CIJkfafd.js.map → VerifyEmail-Di-_3y5p.js.map} +1 -1
  37. package/dist/assets/{chess-E2uOAyQS-C4lsxA_t.js → chess-E2uOAyQS-DN9Rkv-e.js} +2 -2
  38. package/dist/assets/{chess-E2uOAyQS-C4lsxA_t.js.map → chess-E2uOAyQS-DN9Rkv-e.js.map} +1 -1
  39. package/dist/assets/chess-Lfm7Fsvs-RUEctCqI.js +1 -0
  40. package/dist/assets/common-ui.es-BET7U3Ss.js +1 -0
  41. package/dist/assets/{common-ui.es-D4ONLK-2.js → common-ui.es-C_nNPpCR.js} +4 -4
  42. package/dist/assets/{common-ui.es-D4ONLK-2.js.map → common-ui.es-C_nNPpCR.js.map} +1 -1
  43. package/dist/assets/dist-B3ubsUEd.js +1 -0
  44. package/dist/assets/dist-C41zzhNl.js +1 -0
  45. package/dist/assets/{dist-Bhnqo4Bh.js → dist-D2x1mJ2O.js} +3 -3
  46. package/dist/assets/{dist-Bhnqo4Bh.js.map → dist-D2x1mJ2O.js.map} +1 -1
  47. package/dist/assets/{dist-D-U4aj-T.js → dist-DFv5eKpx.js} +2 -2
  48. package/dist/assets/{dist-D-U4aj-T.js.map → dist-DFv5eKpx.js.map} +1 -1
  49. package/dist/assets/edit-ui.es-BNdU4Xoa.js +1 -0
  50. package/dist/assets/{edit-ui.es-CDXO8YfK.js → edit-ui.es-Cbuvpf4V.js} +2 -2
  51. package/dist/assets/{edit-ui.es-CDXO8YfK.js.map → edit-ui.es-Cbuvpf4V.js.map} +1 -1
  52. package/dist/assets/{french-Dk7YG8Td-Yv88vqfH.js → french-Dk7YG8Td-C3NlMZjj.js} +2 -2
  53. package/dist/assets/{french-Dk7YG8Td-Yv88vqfH.js.map → french-Dk7YG8Td-C3NlMZjj.js.map} +1 -1
  54. package/dist/assets/french-evUMlbbq-Dg8jfbcg.js +1 -0
  55. package/dist/assets/{index-Dc5AJpy0.js → index-C4T6j65e.js} +4 -4
  56. package/dist/assets/{index-Dc5AJpy0.js.map → index-C4T6j65e.js.map} +1 -1
  57. package/dist/assets/{math-B4HbgYf6-Cx-RybKI.js → math-B4HbgYf6-CsVPXXUh.js} +2 -2
  58. package/dist/assets/{math-B4HbgYf6-Cx-RybKI.js.map → math-B4HbgYf6-CsVPXXUh.js.map} +1 -1
  59. package/dist/assets/math-DYni7rRl-WwVJ2oGh.js +1 -0
  60. package/dist/assets/piano-BN5Btq91-BzjcNdzf.js +1 -0
  61. package/dist/assets/{piano-DF1g6yaX-Defm-mCv.js → piano-DF1g6yaX-BTSBCU2K.js} +2 -2
  62. package/dist/assets/{piano-DF1g6yaX-Defm-mCv.js.map → piano-DF1g6yaX-BTSBCU2K.js.map} +1 -1
  63. package/dist/assets/{pitch-CgGJFkZ1-DOP-P-5H.js → pitch-CgGJFkZ1-BHlLBYH_.js} +2 -2
  64. package/dist/assets/{pitch-CgGJFkZ1-DOP-P-5H.js.map → pitch-CgGJFkZ1-BHlLBYH_.js.map} +1 -1
  65. package/dist/assets/pitch-Dn0iNqiS-DkAyhSvi.js +1 -0
  66. package/dist/assets/{server-BzxnFSol.js → server-TgFoAznT.js} +2 -2
  67. package/dist/assets/{server-BzxnFSol.js.map → server-TgFoAznT.js.map} +1 -1
  68. package/dist/assets/{sightsing-BFQ7HRig-DWCQKbwk.js → sightsing-BFQ7HRig-C5zm4HmL.js} +2 -2
  69. package/dist/assets/{sightsing-BFQ7HRig-DWCQKbwk.js.map → sightsing-BFQ7HRig-C5zm4HmL.js.map} +1 -1
  70. package/dist/assets/sightsing-CJX3k0Fd-CzRkhx2h.js +1 -0
  71. package/dist/assets/{typing-BevtfWlp-D7GOg1RO.js → typing-BevtfWlp-GDFoSOWw.js} +2 -2
  72. package/dist/assets/{typing-BevtfWlp-D7GOg1RO.js.map → typing-BevtfWlp-GDFoSOWw.js.map} +1 -1
  73. package/dist/assets/typing-k-ojjO7G-DS1lIVgX.js +1 -0
  74. package/dist/assets/{word-work-BOnRlZgd-B5Yxy9XL.js → word-work-BOnRlZgd-DRfYkDSG.js} +2 -2
  75. package/dist/assets/{word-work-BOnRlZgd-B5Yxy9XL.js.map → word-work-BOnRlZgd-DRfYkDSG.js.map} +1 -1
  76. package/dist/assets/word-work-Dd6tIKrt-C8tadgOD.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-BR8WaisG.js +0 -1
  82. package/dist/assets/common-ui.es-CurGCE_J.js +0 -1
  83. package/dist/assets/dist-CmXduvjb.js +0 -1
  84. package/dist/assets/dist-D7xZ4mlO.js +0 -1
  85. package/dist/assets/edit-ui.es-DcBSSNEH.js +0 -1
  86. package/dist/assets/french-evUMlbbq-YKB5hrAp.js +0 -1
  87. package/dist/assets/math-DYni7rRl-fhvz7wGs.js +0 -1
  88. package/dist/assets/piano-BN5Btq91-Cc3IP-Th.js +0 -1
  89. package/dist/assets/pitch-Dn0iNqiS-O9V65QPk.js +0 -1
  90. package/dist/assets/sightsing-CJX3k0Fd-ChGZn4ut.js +0 -1
  91. package/dist/assets/typing-k-ojjO7G-BrYg4daE.js +0 -1
  92. package/dist/assets/word-work-Dd6tIKrt-Bk_0SoP1.js +0 -1
@@ -0,0 +1 @@
1
+ import"./vue.runtime.esm-bundler-C3q8JS9f.js";import"./common-ui.es-C_nNPpCR.js";import"./dist-leWgtXBf.js";import"./MarkdownRenderer-kStoDRNE-CwICngq1.js";import"./dist-DFv5eKpx.js";import"./CourseWare-BTFRjgBR-BHFtLEh3.js";import"./chess-E2uOAyQS-DN9Rkv-e.js";import"./french-Dk7YG8Td-C3NlMZjj.js";import"./math-B4HbgYf6-CsVPXXUh.js";import"./piano-DF1g6yaX-BTSBCU2K.js";import"./pitch-CgGJFkZ1-BHlLBYH_.js";import"./sightsing-BFQ7HRig-C5zm4HmL.js";import"./typing-BevtfWlp-GDFoSOWw.js";import"./word-work-BOnRlZgd-DRfYkDSG.js";import{a as e,r as t,t as n}from"./dist-D2x1mJ2O.js";export{n as allCourseWare,t as defaultCourse,e as loadAllSubcourses};
@@ -0,0 +1 @@
1
+ import"./dist-leWgtXBf.js";import{n as e}from"./dist-DFv5eKpx.js";export{e as CourseLookup};
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chess-Lfm7Fsvs-BR8WaisG.js","assets/dist-leWgtXBf.js","assets/chunk-D6hFPZc3.js","assets/common-ui.es-D4ONLK-2.js","assets/dist-D-U4aj-T.js","assets/vue.runtime.esm-bundler-C3q8JS9f.js","assets/MarkdownRenderer-kStoDRNE-CwICngq1.js","assets/common-ui-BY2Ut5jf.css","assets/CourseWare-BTFRjgBR-HPmMaK3s.js","assets/CourseWare-BTFRjgBR-D750E7i0.css","assets/chess-E2uOAyQS-C4lsxA_t.js","assets/chess-E2uOAyQS-DB7z_kWx.css","assets/french-evUMlbbq-YKB5hrAp.js","assets/french-Dk7YG8Td-Yv88vqfH.js","assets/math-DYni7rRl-fhvz7wGs.js","assets/math-B4HbgYf6-Cx-RybKI.js","assets/math-B4HbgYf6-CZyvKZtp.css","assets/piano-BN5Btq91-Cc3IP-Th.js","assets/piano-DF1g6yaX-Defm-mCv.js","assets/piano-DF1g6yaX-BLvDAgl1.css","assets/pitch-Dn0iNqiS-O9V65QPk.js","assets/pitch-CgGJFkZ1-DOP-P-5H.js","assets/sightsing-CJX3k0Fd-ChGZn4ut.js","assets/sightsing-BFQ7HRig-DWCQKbwk.js","assets/sightsing-BFQ7HRig-DkUGf5Yf.css","assets/typing-k-ojjO7G-BrYg4daE.js","assets/typing-BevtfWlp-D7GOg1RO.js","assets/typing-BevtfWlp-B7ZMUAQJ.css","assets/word-work-Dd6tIKrt-Bk_0SoP1.js","assets/word-work-BOnRlZgd-B5Yxy9XL.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{H as v,y}from"./common-ui.es-D4ONLK-2.js";import{C as b,T as x,y as S}from"./dist-leWgtXBf.js";import{L as C}from"./dist-D-U4aj-T.js";import{n as w,r as T,t as E,u as D}from"./CourseWare-BTFRjgBR-HPmMaK3s.js";import{r as O}from"./piano-DF1g6yaX-Defm-mCv.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-BR8WaisG.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]));break;case`french`:t=await v(()=>import(`./french-evUMlbbq-YKB5hrAp.js`),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,13]));break;case`math`:t=await v(()=>import(`./math-DYni7rRl-fhvz7wGs.js`),__vite__mapDeps([14,1,2,3,4,5,6,7,8,9,15,16]));break;case`piano`:t=await v(()=>import(`./piano-BN5Btq91-Cc3IP-Th.js`),__vite__mapDeps([17,1,2,3,4,5,6,7,8,9,18,19]));break;case`pitch`:t=await v(()=>import(`./pitch-Dn0iNqiS-O9V65QPk.js`),__vite__mapDeps([20,1,2,3,4,5,6,7,8,9,21]));break;case`sightSing`:t=await v(()=>import(`./sightsing-CJX3k0Fd-ChGZn4ut.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-BrYg4daE.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-Bk_0SoP1.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-RUEctCqI.js","assets/dist-leWgtXBf.js","assets/chunk-D6hFPZc3.js","assets/common-ui.es-C_nNPpCR.js","assets/dist-DFv5eKpx.js","assets/vue.runtime.esm-bundler-C3q8JS9f.js","assets/MarkdownRenderer-kStoDRNE-CwICngq1.js","assets/common-ui-BY2Ut5jf.css","assets/CourseWare-BTFRjgBR-BHFtLEh3.js","assets/CourseWare-BTFRjgBR-D750E7i0.css","assets/chess-E2uOAyQS-DN9Rkv-e.js","assets/chess-E2uOAyQS-DB7z_kWx.css","assets/french-evUMlbbq-Dg8jfbcg.js","assets/french-Dk7YG8Td-C3NlMZjj.js","assets/math-DYni7rRl-WwVJ2oGh.js","assets/math-B4HbgYf6-CsVPXXUh.js","assets/math-B4HbgYf6-CZyvKZtp.css","assets/piano-BN5Btq91-BzjcNdzf.js","assets/piano-DF1g6yaX-BTSBCU2K.js","assets/piano-DF1g6yaX-BLvDAgl1.css","assets/pitch-Dn0iNqiS-DkAyhSvi.js","assets/pitch-CgGJFkZ1-BHlLBYH_.js","assets/sightsing-CJX3k0Fd-CzRkhx2h.js","assets/sightsing-BFQ7HRig-C5zm4HmL.js","assets/sightsing-BFQ7HRig-DkUGf5Yf.css","assets/typing-k-ojjO7G-DS1lIVgX.js","assets/typing-BevtfWlp-GDFoSOWw.js","assets/typing-BevtfWlp-B7ZMUAQJ.css","assets/word-work-Dd6tIKrt-C8tadgOD.js","assets/word-work-BOnRlZgd-DRfYkDSG.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{H as v,y}from"./common-ui.es-C_nNPpCR.js";import{C as b,T as x,y as S}from"./dist-leWgtXBf.js";import{L as C}from"./dist-DFv5eKpx.js";import{n as w,r as T,t as E,u as D}from"./CourseWare-BTFRjgBR-BHFtLEh3.js";import{r as O}from"./piano-DF1g6yaX-BTSBCU2K.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-RUEctCqI.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11]));break;case`french`:t=await v(()=>import(`./french-evUMlbbq-Dg8jfbcg.js`),__vite__mapDeps([12,1,2,3,4,5,6,7,8,9,13]));break;case`math`:t=await v(()=>import(`./math-DYni7rRl-WwVJ2oGh.js`),__vite__mapDeps([14,1,2,3,4,5,6,7,8,9,15,16]));break;case`piano`:t=await v(()=>import(`./piano-BN5Btq91-BzjcNdzf.js`),__vite__mapDeps([17,1,2,3,4,5,6,7,8,9,18,19]));break;case`pitch`:t=await v(()=>import(`./pitch-Dn0iNqiS-DkAyhSvi.js`),__vite__mapDeps([20,1,2,3,4,5,6,7,8,9,21]));break;case`sightSing`:t=await v(()=>import(`./sightsing-CJX3k0Fd-CzRkhx2h.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-DS1lIVgX.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-C8tadgOD.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-Bhnqo4Bh.js.map
18
+ //# sourceMappingURL=dist-D2x1mJ2O.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-Bhnqo4Bh.js"}
1
+ {"version":3,"mappings":";wdAeI,EAAI,IAAIA,EAAE,UAAW,CAACC,EAAE,CAAC,CAAE,EAAIC,EAAE,CACpC,KAAM,uBACN,MAAO,CACN,WAAY,CACX,KAAM,OACN,SAAU,CAAC,EACX,CACD,YAAa,CACZ,KAAM,OACN,SAAU,CAAC,EACX,CACD,SAAU,CACT,KAAM,OACN,QAAS,IACT,CACD,CACD,MAAM,EAAG,CACR,IAAI,EAAIC,EAAE,KAAK,CAAE,EAAIA,EAAE,IAAI,CAAE,EAAIC,MAAQ,CACxC,IAAI,EAAI,EACR,IAAK,IAAI,EAAI,GAAI,GAAK,IAAK,IAAK,WAAW,EAAE,EAAI,IACjD,OAAO,GACN,CAAE,EAAIA,MAAQ,KAAK,IAAI,GAAI,EAAE,MAAQ,KAAK,IAAI,GAAI,EAAE,MAAM,CAAC,CAAC,CAAE,EAAIA,MAAQ,EAAE,MAAQ,GAAG,CAAE,EAAIA,MAAQ,KAAK,IAAI,EAAE,SAAU,EAAE,MAAQ,EAAE,MAAQ,GAAG,CAAC,CAAE,WAAc,GAAM,CACzK,IAAI,EAAI,EAAI,GACZ,MAAO,CACN,EACA,EACA,EACA,EACA,EACA,EACA,GACA,CAAC,SAAS,EAAE,EACX,eAAkB,GAAM,CAC1B,IAAI,EAAI,EACR,IAAK,IAAI,EAAI,GAAI,EAAI,EAAG,IAAK,WAAW,EAAE,EAAI,IAC9C,OAAO,WAAW,EAAE,CAAG,EAAI,EAAE,MAAQ,EAAI,EAAE,MAAQ,EAAE,MAAQ,GAC3D,aAAgB,GAAM,CACxB,IAAI,EAAI,CACP,IACA,KACA,IACA,KACA,IACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,CAAE,EAAI,EAAI,GAAI,EAAI,KAAK,MAAM,EAAI,GAAG,CAAG,EACxC,MAAO,GAAG,EAAE,KAAK,KAElB,OAAOC,MAAQ,CACd,EAAE,QAAU,EAAE,MAAQ,EAAE,MAAM,YAAa,IAAI,eAAgB,GAAM,CACpE,IAAK,IAAI,KAAK,EAAG,EAAE,MAAQ,EAAE,YAAY,OACxC,CAAC,QAAQ,EAAE,MAAM,GAClB,CAAE,CACH,aAAc,EACd,UAAW,IACX,eAAgB,GAChB,cAAe,EACf,cAAe,EACf,SAAU,EACV,WACA,eACA,aACA,EAEF,CAAC,CAAE,EAAI,CAAE,MAAO,wBAAyB,CAAE,EAAI,CAC/C,MAAO,gBACP,IAAK,eACL,CAAE,EAAI,CAAC,QAAS,SAAS,CAAE,EAAI,CAC/B,MAAO,kBACP,QAAS,OACT,CAAE,EAAI,CACN,IACA,QACA,SACA,CAAE,EAAI,CACN,IACA,QACA,SACA,CAAE,EAAI,CAAE,MAAO,iBAAkB,CAAE,EAAK,CACxC,IACA,QACA,SACA,CAAE,EAAK,CACP,IACA,QACA,SACA,CAAE,EAAK,CAAE,MAAO,gBAAiB,CAAE,EAAK,CAAC,IAAK,SAAS,CAAE,EAAK,CAAC,IAAK,SAAS,CAAE,EAAK,CAAC,IAAK,IAAI,CAAE,EAAK,CAAC,IAAK,IAAI,CAChH,SAAS,cAAc,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CACxC,OAAOC,GAAG,CAAEC,EAAE,MAAO,EAAG,CAACC,EAAE,MAAO,EAAG,EAAEF,GAAG,CAAEC,EAAE,MAAO,CACpD,MAAO,EAAE,SACT,OAAQ,EAAE,UAAY,GACtB,MAAO,YACP,CAAE,CACFC,EAAE,IAAK,EAAG,EAAEF,GAAG,CAAEC,EAAEE,EAAG,KAAMC,EAAE,GAAK,IAAOJ,GAAG,CAAEC,EAAEE,EAAG,CAAE,IAAK,MAAM,IAAK,CAAE,CAAC,EAAE,WAAW,EAAI,GAAG,EAAIH,GAAG,CAAEC,EAAE,OAAQ,CAC/G,IAAK,EACL,EAAG,EAAE,eAAe,EAAI,GAAG,CAC3B,EAAG,IACH,MAAO,EAAE,cACT,OAAQ,EAAE,UACV,MAAO,YACP,OAAQ,OACR,eAAgB,IAChB,CAAE,KAAM,EAAG,EAAE,EAAII,EAAE,GAAI,CAAC,EAAE,CAAC,CAAE,GAAG,EAAE,CAAE,GAAG,GAAIL,GAAG,CAAEC,EAAEE,EAAG,KAAMC,EAAE,GAAK,IAAOJ,GAAG,CAAEC,EAAEE,EAAG,CAAE,IAAK,YAAY,IAAK,CAAE,CAAC,EAAE,WAAW,EAAI,GAAG,CAAGE,EAAE,GAAI,CAAC,EAAE,EAAIL,GAAG,CAAEC,EAAE,OAAQ,CACjK,IAAK,EACL,EAAG,EAAE,eAAe,EAAI,GAAG,CAC3B,EAAG,IACH,MAAO,EAAE,cACT,OAAQ,EAAE,eACV,MAAO,YACP,CAAE,KAAM,EAAG,EAAE,EAAE,CAAE,GAAG,EAAE,CAAE,GAAG,EAAE,CAAC,CAC/BC,EAAE,IAAK,EAAG,EAAEF,GAAG,CAAEC,EAAEE,EAAG,KAAMC,EAAE,IAAM,IAAOJ,GAAG,CAAEC,EAAEE,EAAG,CAAE,IAAK,SAAS,IAAK,CAAE,CAAC,EAAE,WAAW,EAAE,EAAI,GAAK,EAAE,YAAc,GAAK,EAAE,aAAeH,GAAG,CAAEC,EAAE,OAAQ,CACzJ,IAAK,EACL,EAAG,EAAE,eAAe,EAAE,CACtB,EAAG,IACH,MAAO,EAAE,cACT,OAAQ,EAAE,UACV,MAAO,mBACP,OAAQ,OACR,eAAgB,IAChB,CAAE,KAAM,EAAG,EAAG,EAAII,EAAE,GAAI,CAAC,EAAE,CAAC,CAAE,GAAG,EAAE,CAAE,GAAG,GAAIL,GAAG,CAAEC,EAAEE,EAAG,KAAMC,EAAE,IAAM,IAAOJ,GAAG,CAAEC,EAAEE,EAAG,CAAE,IAAK,SAAS,IAAK,CAAE,CAAC,CAAC,EAAE,WAAW,EAAE,EAAI,GAAK,EAAE,YAAc,GAAK,EAAE,aAAeH,GAAG,CAAEC,EAAE,OAAQ,CAC3L,IAAK,EACL,EAAG,EAAE,eAAe,EAAE,CACtB,EAAG,IACH,MAAO,EAAE,cACT,OAAQ,EAAE,eACV,MAAO,mBACP,CAAE,KAAM,EAAG,EAAG,EAAII,EAAE,GAAI,CAAC,EAAE,CAAC,CAAE,GAAG,EAAE,CAAE,GAAG,EAAE,CAAC,CAC5CH,EAAE,IAAK,EAAI,CAACA,EAAE,OAAQ,CACrB,EAAG,EAAE,eAAe,EAAE,WAAW,CAAG,EACpC,EAAG,IACH,MAAO,EACP,OAAQ,EAAE,UAAY,EACtB,MAAO,qBACP,CAAE,KAAM,EAAG,EAAG,CAAEA,EAAE,OAAQ,CAC1B,EAAG,EAAE,eAAe,EAAE,YAAY,CAAG,EAAE,cAAgB,EACvD,EAAG,IACH,MAAO,EACP,OAAQ,EAAE,UAAY,EACtB,MAAO,mBACP,CAAE,KAAM,EAAG,EAAG,CAAC,CAAC,CACjBA,EAAE,OAAQ,CACT,EAAG,EAAE,eAAe,EAAE,WAAW,CAAG,EACpC,EAAG,EAAE,UAAY,GACjB,MAAO,aACP,CAAEI,EAAE,EAAE,aAAa,EAAE,WAAW,CAAC,CAAE,EAAG,EAAG,CAC1CJ,EAAE,OAAQ,CACT,EAAG,EAAE,eAAe,EAAE,YAAY,CAAG,EAAE,cAAgB,EACvD,EAAG,EAAE,UAAY,GACjB,cAAe,MACf,MAAO,aACP,CAAEI,EAAE,EAAE,aAAa,EAAE,YAAY,CAAC,CAAE,EAAG,EAAG,CAC3C,CAAE,EAAG,EAAE,EAAE,CAAE,IAAI,CAAC,CAAC,CAEnBC,EAAE,cAAe,cAAc,KAG3B,EAAKX,EAAE,CACV,KAAM,aACN,WAAY,CAAE,qBAAsCY,EAAE,EAAG,CAAC,CAAC,SAAU,cAAc,CAAE,CAAC,YAAa,kBAAkB,CAAC,CAAC,CAAE,CACzH,MAAO,CACN,IAAK,CACJ,KAAM,OACN,SAAU,CAAC,EACX,CACD,KAAM,CACL,KAAM,OACN,SAAU,CAAC,EACX,CACD,CACD,MAAM,EAAG,CACR,IAAI,EAAIX,GAAG,CAAE,EAAIA,EAAE,CAAC,EAAE,CAAE,EAAIA,EAAE,EAAE,CAAC,CAAE,EAAIA,EAAE,EAAE,CAAC,CAAE,EAAIA,EAAE,GAAG,CAAE,EAAIA,EAAE,GAAG,CAAE,EAAIA,EAAE,CAAC,EAAE,CAAE,EAAIA,EAAE,GAAG,CAAE,EAAIA,EAAE,GAAG,CAAE,EAAIA,EAAE,CAAC,EAAE,CAAE,EAAIA,EAAE,UAAU,CAAE,EAAIA,EAAE,GAAG,CAAE,EAAIA,EAAE,IAAI,CAAE,EAAIA,EAAE,GAAG,CAAE,EAAIA,EAAE,EAAE,CAAE,EAAIA,EAAE,EAAE,CAAE,EAAIA,EAAE,EAAE,CAAC,CAAE,oBAAwB,CAC1N,IAAI,EAAI,CACP,IACA,KACA,IACA,KACA,IACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,CAAE,EAAI,EAAE,CACT,IAAK,IAAI,EAAI,EAAG,GAAK,IAAK,IAAK,CAC9B,IAAI,EAAI,KAAK,MAAM,EAAI,GAAG,CAAG,EAAG,EAAI,EAAE,EAAI,IAC1C,EAAE,KAAK,CACN,MAAO,GAAG,IAAI,EAAE,IAAI,EAAE,GACtB,MAAO,EACP,CAAC,CAEH,EAAE,MAAQ,GACR,EAAIA,EAAE,CACR,CACC,MAAO,4BACP,MAAO,UACP,CACD,CACC,MAAO,0BACP,MAAO,SACP,CACD,CACC,MAAO,0BACP,MAAO,SACP,CACD,CACC,MAAO,0BACP,MAAO,SACP,CACD,CACC,MAAO,0BACP,MAAO,SACP,CACD,CACC,MAAO,0BACP,MAAO,SACP,CACD,CACC,MAAO,eACP,MAAO,SACP,CACD,CAAC,CAAE,uBAA2B,CAC9B,EAAE,MAAQ,EAAE,QAAU,EAAE,OAAS,EAAE,QAAU,EAAE,OAAS,EAAE,QAAU,EAAE,OAAS,EAAE,QAAU,WAAa,EAAE,QAAU,EAAE,OAAS,EAAE,QAAU,EAAE,QAC3I,gCAAoC,CACtC,OAAQ,EAAE,MAAV,CACC,IAAK,UACJ,EAAE,MAAQ,GAAI,EAAE,MAAQ,IACxB,MACD,IAAK,SACJ,EAAE,MAAQ,GAAI,EAAE,MAAQ,IACxB,MACD,IAAK,SACJ,EAAE,MAAQ,GAAI,EAAE,MAAQ,GACxB,MACD,IAAK,SACJ,EAAE,MAAQ,GAAI,EAAE,MAAQ,GACxB,MACD,IAAK,SACJ,EAAE,MAAQ,GAAI,EAAE,MAAQ,GACxB,MACD,IAAK,SACJ,EAAE,MAAQ,GAAI,EAAE,MAAQ,GACxB,MAEF,oBAAoB,EAClB,+BAAmC,CACrC,EAAE,OAAS,EAAE,QAAU,EAAE,MAAQ,EAAE,MAAQ,IAAK,oBAAoB,EAClE,cAAkB,CACpB,EAAE,OAAO,KAAK,CACb,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,KAAM,SACN,SAAU,kBACV,UAAW,EACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,SAAU,kBACV,KAAM,UACN,UAAW,mBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,KAAM,SACN,SAAU,kBACV,UAAW,kBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,SAAU,mBACV,KAAM,UACN,UAAW,kBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,KAAM,SACN,SAAU,kBACV,UAAW,mBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,SAAU,kBACV,KAAM,UACN,UAAW,mBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,KAAM,SACN,SAAU,kBACV,UAAW,mBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,SAAU,kBACV,KAAM,UACN,UAAW,mBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,KAAM,SACN,SAAU,kBACV,UAAW,mBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,SAAU,mBACV,KAAM,UACN,UAAW,mBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,KAAM,SACN,SAAU,kBACV,UAAW,mBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,SAAU,mBACV,KAAM,UACN,UAAW,kBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,KAAM,SACN,SAAU,kBACV,UAAW,mBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,SAAU,kBACV,KAAM,UACN,UAAW,kBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,KAAM,SACN,SAAU,kBACV,UAAW,mBACX,CACD,CACC,KAAM,CACL,OAAQ,GACR,KAAM,IACN,OAAQ,EACR,CACD,SAAU,kBACV,KAAM,UACN,UAAW,kBACX,CACD,CAAC,EACA,mBAAsB,GAAM,CAC9B,EAAE,CACD,KAAM,YAAY,EAAE,KAAK,KAAK,GAC9B,OAAQY,EAAE,GACV,CAAC,EAEH,EAAE,MAAS,CACV,EAAE,OAAO,YAAY,EAAE,MAAM,CAAE,oBAAoB,EAClD,CAAEC,EAAE,MAAS,CACd,EAAE,OAAO,aAAa,EAAE,MAAM,CAAE,oBAAoB,EACnD,CACF,IAAI,iBAAmB,SAAY,CAClC,IAAI,EAAI,MAAO,MAAM,EAAE,KAAK,mBAAmB,EAAE,IAAI,EAAE,mBAAmB,CAC1E,GAAI,GAAG,UAAW,CACjB,IAAI,EAAI,EAAE,UAAU,UAAU,CAC9B,EAAE,MAAM,KAAM,GAAM,EAAE,QAAU,EAAE,GAAK,EAAE,MAAQ,EAAG,EAAE,MAAQ,GAE/D,GAAI,GAAG,WAAY,CAClB,IAAI,EAAI,EAAE,WAAW,UAAU,CAC/B,EAAE,MAAM,KAAM,GAAM,EAAE,QAAU,EAAE,GAAK,EAAE,MAAQ,EAAG,EAAE,MAAQ,GAE/D,GAAG,gBAAkB,EAAE,MAAQ,EAAE,cAAc,UAAU,CAAE,EAAE,MAAQ,EAAE,OAAQ,GAAG,aAAe,EAAE,MAAQ,SAAS,EAAE,WAAW,UAAU,CAAC,CAAE,EAAE,MAAQ,EAAE,OAAQ,GAAG,cAAgB,EAAE,MAAQ,SAAS,EAAE,YAAY,UAAU,CAAC,CAAE,EAAE,MAAQ,EAAE,OAAQ,GAAG,YAAc,GAAG,aAAe,CAAC,GAAG,gBAAkB,EAAE,MAAQ,UAAW,EAAE,MAAQ,CAAC,GAC9U,aAAe,SAAY,CAC7B,EAAE,MAAQ,CAAC,GAAI,MAAMC,GAAG,CAAC,WAAW,CAAC,mBAAmB,EAAE,IAAI,EAAE,qBAAqB,CACpF,CACC,IAAK,YACL,MAAO,EAAE,MACT,CACD,CACC,IAAK,aACL,MAAO,EAAE,MACT,CACD,CACC,IAAK,gBACL,MAAO,EAAE,MACT,CACD,CACC,IAAK,aACL,MAAO,EAAE,MACT,CACD,CACC,IAAK,cACL,MAAO,EAAE,MACT,CACD,CAAC,CAAE,EAAE,MAAQ,EAAE,MAAO,EAAE,MAAQ,EAAE,MAAO,EAAE,MAAQ,EAAE,MAAO,EAAE,MAAQ,EAAE,MAAO,EAAE,MAAQ,EAAE,MAAO,EAAE,MAAQ,CAAC,EAAG,EAAE,MAAQ,CAAC,EAAGC,EAAE,CAChI,KAAM,oBACN,OAAQH,EAAE,GACV,CAAC,EAEH,OAAOV,EAAE,SAAY,CACpB,iBAAiB,CACjB,GAAI,CACH,EAAE,MAAQ,MAAMc,EAAE,UAAU,CAAE,EAAE,MAAQ,EAAE,MAAM,QAAU,SAAW,EAAE,MAAM,QAAU,iBAC/E,EAAG,CACX,QAAQ,IAAI,uBAAuB,IAAI,CAAE,EAAE,MAAQ,CAAC,EAErD,EAAE,QAAU,EAAE,OAAO,mBAAmB,mBAAmB,CAAE,EAAE,OAAS,EAAE,MAAQ,EAAE,MAAM,OAAO,OAAQ,GAAM,EAAE,QAAU,YAAY,CAAC,IAAK,IAAO,CACnJ,MAAO,GAAG,EAAE,aAAa,IAAI,EAAE,OAC/B,MAAO,EAAE,GACT,EAAE,CAAE,EAAE,MAAQ,EAAE,OAAO,QAAQ,OAAQ,GAAM,EAAE,QAAU,YAAY,CAAC,IAAK,IAAO,CAClF,MAAO,GAAG,EAAE,aAAa,IAAI,EAAE,OAC/B,MAAO,EAAE,GACT,EAAE,GAAK,EAAE,MAAQ,CAAC,CAClB,MAAO,sBACP,MAAO,GACP,CAAC,CAAE,EAAE,MAAQ,CAAC,CACd,MAAO,uBACP,MAAO,GACP,CAAC,EAAG,MAAM,kBAAkB,CAAE,CAAC,EAAE,OAAS,EAAE,MAAM,OAAS,IAAM,EAAE,MAAQ,EAAE,MAAM,GAAG,OAAQ,CAAC,EAAE,OAAS,EAAE,MAAM,OAAS,IAAM,EAAE,MAAQ,EAAE,MAAM,GAAG,SACtJ,CAAE,CACH,cAAe,EACf,OAAQ,EACR,QAAS,EACT,cAAe,EACf,eAAgB,EAChB,cAAe,EACf,UACA,aACA,cAAe,EACf,WAAY,EACZ,YAAa,EACb,qBAAsB,EACtB,sBAAuB,EACvB,YAAa,EACb,4BACA,2BACA,EAEF,CAAC,CAAE,EAAI,CACP,IAAK,EACL,MAAO,mCACP,CAAE,EAAK,CAAE,MAAO,oCAAqC,CAAE,EAAK,CAAE,IAAK,EAAG,CACvE,SAAS,YAAY,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,KAClC,EAAIC,EAAE,kBAAkB,CAAE,EAAIA,EAAE,YAAY,CAAE,EAAIA,EAAE,WAAW,CAAE,EAAIA,EAAE,YAAY,CAAE,EAAIA,EAAE,yBAAyB,CAAE,EAAIA,EAAE,QAAQ,CAAE,EAAIA,EAAE,SAAS,CAAE,EAAIA,EAAE,cAAc,CAAE,EAAIA,EAAE,SAAS,CAChM,OAAOd,GAAG,CAAEe,EAAE,EAAG,KAAM,CACtB,QAASC,MAAQ,CAACC,EAAE,EAAG,CAAE,MAAO,GAAI,CAAE,CACrC,QAASD,MAAQ,CAACC,EAAE,EAAG,KAAM,CAC5B,QAASD,MAAQ,EAAE,KAAF,EAAE,GAAO,CAACE,EAAE,wBAAwB,CAAC,EAAC,CACvD,EAAG,EACH,CAAC,CAAC,CAAC,CACJ,EAAG,EACH,CAAC,CAAED,EAAE,EAAG,KAAM,CACd,QAASD,MAAQ,CAAC,EAAE,eAAiBhB,GAAG,CAAEe,EAAE,EAAG,CAC9C,IAAK,EACL,SAAU,gBACV,CAAE,CACF,QAASC,MAAQ,CAChBC,EAAE,EAAG,CACJ,WAAY,EAAE,cACd,sBAAuB,EAAE,KAAF,EAAE,GAAQ,GAAM,EAAE,cAAgB,GACzD,MAAO,EAAE,OACT,MAAO,eACP,KAAM,8DACN,CAAE,KAAM,EAAG,CAAC,aAAc,QAAQ,CAAC,CACpCA,EAAE,EAAG,CACJ,WAAY,EAAE,eACd,sBAAuB,EAAE,KAAF,EAAE,GAAQ,GAAM,EAAE,eAAiB,GAC1D,MAAO,EAAE,QACT,MAAO,gBACP,CAAE,KAAM,EAAG,CAAC,aAAc,QAAQ,CAAC,CACpCA,EAAE,EAAG,CAAE,MAAO,OAAQ,CAAC,CACvB,EAAE,KAAF,EAAE,GAAOf,EAAE,KAAM,CAAE,MAAO,uBAAwB,CAAE,iBAAkB,GAAG,EACzEe,EAAE,EAAG,CACJ,WAAY,EAAE,sBACd,sBAAuB,CAAC,EAAE,KAAF,EAAE,GAAQ,GAAM,EAAE,sBAAwB,GAAG,EAAE,4BAA4B,CACnG,MAAO,EAAE,qBACT,MAAO,wBACP,CAAE,KAAM,EAAG,CACX,aACA,QACA,sBACA,CAAC,CACF,EAAE,wBAA0B,UAAYjB,GAAG,CAAEC,EAAE,MAAO,EAAG,CAACgB,EAAE,EAAG,CAC9D,WAAY,EAAE,WACd,sBAAuB,CAAC,EAAE,KAAF,EAAE,GAAQ,GAAM,EAAE,WAAa,GAAG,EAAE,2BAA2B,CACvF,MAAO,EAAE,YACT,MAAO,cACP,CAAE,KAAM,EAAG,CACX,aACA,QACA,sBACA,CAAC,CAAEA,EAAE,EAAG,CACR,WAAY,EAAE,YACd,sBAAuB,CAAC,EAAE,KAAF,EAAE,GAAQ,GAAM,EAAE,YAAc,GAAG,EAAE,2BAA2B,CACxF,MAAO,EAAE,YACT,MAAO,eACP,CAAE,KAAM,EAAG,CACX,aACA,QACA,sBACA,CAAC,CAAC,CAAC,EAAIZ,EAAE,GAAI,CAAC,EAAE,CACjBY,EAAE,EAAG,CACJ,cAAe,EAAE,WACjB,eAAgB,EAAE,YAClB,CAAE,KAAM,EAAG,CAAC,cAAe,eAAe,CAAC,CAC5Cf,EAAE,MAAO,EAAI,CAACe,EAAE,EAAG,CAClB,MAAO,UACP,QAAS,EAAE,UACX,CAAE,CACF,QAASD,MAAQ,EAAE,KAAF,EAAE,GAAO,CAACE,EAAE,mBAAmB,CAAC,EAAC,CAClD,EAAG,EACH,CAAE,EAAG,CAAC,UAAU,CAAC,CAAED,EAAE,EAAG,CACxB,QAAS,EAAE,cACX,SAAU,CAAC,EAAE,eAAiB,CAAC,EAAE,cACjC,MAAO,OACP,MAAO,cACP,QAAS,EAAE,aACX,CAAE,CACF,QAASD,MAAQ,EAAE,KAAF,EAAE,GAAO,CAACE,EAAE,wBAAwB,CAAC,EAAC,CACvD,EAAG,EACH,CAAE,EAAG,CACL,UACA,WACA,UACA,CAAC,CAAC,CAAC,CACJ,CAAC,CACF,EAAG,EACH,CAAC,GAAKlB,GAAG,CAAEC,EAAE,MAAO,EAAI,EAAE,KAAF,EAAE,GAAO,CAACC,EAAE,IAAK,KAAM,mFAAoF,GAAG,CAAEA,EAAE,MAAO,KAAM,CAACA,EAAE,IAAK,KAAM,qCAAqC,CAAEA,EAAE,KAAM,KAAM,CAC1NA,EAAE,KAAM,KAAM,CAACA,EAAE,IAAK,CAAE,KAAM,iCAAkC,CAAE,gBAAgB,CAAC,CAAC,CACpFA,EAAE,KAAM,KAAM,CAACA,EAAE,IAAK,CAAE,KAAM,iCAAkC,CAAE,iBAAiB,CAAC,CAAC,CACrFA,EAAE,KAAM,KAAM,CAACA,EAAE,IAAK,CAAE,KAAM,qBAAsB,CAAE,QAAQ,CAAC,CAAC,CAChE,CAAC,CAAC,CAAE,GAAG,CAAC,EAAC,EAAE,CAAC,CACb,EAAG,EACH,CAAC,CAAC,CAAC,CACJ,EAAG,EACH,CAAC,KAEC,EAAqBM,EAAE,EAAI,CAAC,CAAC,SAAU,YAAY,CAAE,CAAC,YAAa,kBAAkB,CAAC,CAAC,CAC3F,eAAe,cAAc,EAAG,CAC/B,IAAI,EACJ,OAAQ,EAAR,CACC,IAAK,QACJ,EAAI,YAAM,OAAO,8EACjB,MACD,IAAK,SACJ,EAAI,YAAM,OAAO,6EACjB,MACD,IAAK,OACJ,EAAI,YAAM,OAAO,8EACjB,MACD,IAAK,QACJ,EAAI,YAAM,OAAO,+EACjB,MACD,IAAK,QACJ,EAAI,YAAM,OAAO,4EACjB,MACD,IAAK,YACJ,EAAI,YAAM,OAAO,mFACjB,MACD,IAAK,SACJ,EAAI,YAAM,OAAO,gFACjB,MACD,IAAK,WACJ,EAAI,YAAM,OAAO,gFACjB,MAEF,IAAI,EAAI,EAAE,QACV,OAAO,EAAE,QAAQ,KAAM,GAAM,EAAE,OAAS,EAAE,KAAK,EAAI,EAAE,QAAQ,KAAK,EAAE,CAAE,EAEvE,eAAe,mBAAoB,CAClC,MAAM,QAAQ,IAAI,CACjB,QACA,SACA,OACA,QACA,QACA,YACA,SACA,WACA,CAAC,IAAK,GAAM,cAAc,EAAE,CAAC,CAAC,KAE5B,cAAgB,KAAM,CAEzB,IAAI,SAAU,CACb,OAAO,KAAK,eAEb,YAAY,EAAG,QAJf,wBAAe,QAUf,iBAAiB,KAAK,CALrB,KAAK,eAAiB,EAEvB,cAAc,EAAG,CAChB,OAAO,KAAK,eAAe,KAAM,GAAM,EAAE,OAAS,EAAE,CAGrD,aAAc,CACb,GAAI,CAAC,KAAK,eAAgB,CACzB,IAAI,EAAI,KAAK,UAAU,CACvB,KAAK,eAAiB,OAAO,YAAY,OAAO,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAG,KAAO,CAAC,EAAGW,EAAE,EAAE,CAAC,CAAC,CAAC,CAEvF,OAAO,KAAK,eAEb,UAAW,CACV,IAAI,EAAI,EAAE,CACV,OAAO,KAAK,eAAe,QAAS,GAAM,CACzC,OAAO,OAAO,EAAG,EAAE,YAAY,EAC9B,CAAE,EAEL,QAAQ,EAAG,CACV,IAAI,EACJ,EAAI,OAAO,GAAK,SAAWC,EAAE,kBAAkB,EAAE,CAAG,EACpD,IAAI,EAAI,KAAK,cAAc,EAAE,OAAO,CACpC,GAAI,EAAG,CACN,IAAI,EAAI,EAAE,YAAY,EAAE,aAAa,CACrC,GAAI,EAAG,CACN,IAAI,EAAI,EAAE,MAAM,KAAM,GAAM,EAAE,OAAS,EAAE,KAAK,CAC9C,GAAI,EAAG,OAAO,EACd,MAAM,QAAQ,MAAM,gBAAgB,EAAE,KAAK,uBAAuB,EAAE;;0BAE9C,KAAK,UAAU,EAAE;;sBAErB,EAAE;wBACA,EAAE;qBACL,EAAE,MAAM,IAAK,GAAM,EAAE,KAAK,CAAC,KAAK,KAAK;cAC5C,CAAE,MAAM,QAAQ,EAAE,KAAK,kBAAkB,MAC7C,MAAM,QAAQ,MAAM,YAAY,EAAE,aAAa,uBAAuB,EAAE;;wBAE1D,KAAK,UAAU,EAAE;;oBAErB,EAAE;uBACC,EAAE,UAAU,IAAK,GAAM,EAAE,KAAK,CAAC,KAAK,KAAK;YACpD,CAAE,MAAM,YAAY,EAAE,aAAa,kBAAkB,MACxD,MAAM,QAAQ,MAAM,UAAU,EAAE,OAAO;;sBAE1B,KAAK,UAAU,EAAE,GAAG,CAAE,MAAM,UAAU,EAAE,OAAO,kBAAkB,CAEtF,UAAW,CACV,IAAI,EAAI,GACR,OAAO,KAAK,QAAQ,QAAS,GAAM,CAClC,GAAK,WAAW,EAAE,KAAK,IAAK,EAAE,UAAU,QAAS,GAAM,CACtD,GAAK,eAAe,EAAE,KAAK,IAAK,EAAE,MAAM,QAAS,GAAM,CACtD,GAAK,aAAa,EAAE,KAAK,KACxB,EACD,EACD,CAAE,EAEL,kBAAmB,CAClB,IAAI,EAAI,EAAE,CACV,OAAO,KAAK,eAAe,QAAS,GAAM,CACzC,EAAE,UAAU,QAAS,GAAM,CAC1B,EAAE,WAAW,QAAS,GAAM,CAC3B,EAAE,SAAS,EAAE,EAAI,EAAE,KAAK,EAAE,EACzB,EACD,EACD,CAAE,EAEL,eAAgB,CACf,IAAI,EAAI,EAAE,CACV,OAAO,KAAK,eAAe,QAAS,GAAM,CACzC,EAAE,UAAU,QAAS,GAAM,CAC1B,EAAE,WAAW,QAAS,GAAM,CAC3B,EAAE,UAAW,GAAM,EAAE,SAAW,EAAE,MAAQ,EAAE,YAAc,EAAE,KAAK,GAAK,IAAM,EAAE,KAAK,CAClF,OAAQ,EAAE,KACV,UAAW,EAAE,KACb,YAAa,EACb,CAAC,EACD,EACD,EACD,CAAE,EAEL,aAAa,EAAG,CACf,IAAI,EACJ,GAAI,KAAK,cAAc,EAAE,OAAO,CAAC,UAAU,QAAS,GAAM,CACzD,EAAE,WAAW,QAAS,GAAM,CAC3B,EAAE,OAAS,EAAE,YAAc,EAAI,IAC9B,EACD,CAAE,EAAG,OAAO,EACd,MAAM,MAAM,aAAaA,EAAE,mBAAmB,EAAE,CAAC,YAAY,GAE5D,EAAI,IAAI,cAAc,EAAE,CAAC","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-D2x1mJ2O.js"}
@@ -316,7 +316,7 @@ Examples:
316
316
  Card: ${JSON.stringify(e.cardElo)})
317
317
  `)}}else logger.warn(`[EloService] Partial ELO update (per-tag):
318
318
  User ELO update: ${a?`SUCCESS`:`FAILED`}
319
- Card ELO update: ${l?`SUCCESS`:`FAILED`}`),!a&&r[0].status===`rejected`&&logger.error(`[EloService] User ELO update error:`,r[0].reason),!l&&r[1].status===`rejected`&&logger.error(`[EloService] Card ELO update error:`,r[1].reason)}}};init_core(),init_logger();var ResponseProcessor=class{constructor(e,t){_defineProperty(this,`srsService`,void 0),_defineProperty(this,`eloService`,void 0),this.srsService=e,this.eloService=t}logEloFailure(e,t){return n=>logger.error(`[ResponseProcessor] ELO update failed (${e}) for ${t}:`,n)}parsePerformance(e){return typeof e==`number`?{globalScore:e,taggedPerformance:null}:isTaggedPerformance(e)?{globalScore:e._global,taggedPerformance:e}:(logger.warn(`[ResponseProcessor] Unexpected performance structure, using neutral score`,{performance:e}),{globalScore:.5,taggedPerformance:null})}async processResponse(e,t,n,r,a,o,s,c,l,u){if(!isQuestionRecord(e))return{nextCardAction:`dismiss-success`,shouldLoadNextCard:!0,isCorrect:!0,shouldClearFeedbackShadow:!0};try{let d=await t,p;return p=e.isCorrect?this.processCorrectResponse(e,d,n,r,a,o,s):this.processIncorrectResponse(e,d,r,a,o,s,c,l,u),e.deferAdvance&&p.shouldLoadNextCard&&(logger.info(`[ResponseProcessor] deferAdvance requested — suppressing navigation, action stashed:`,{nextCardAction:p.nextCardAction}),p={...p,shouldLoadNextCard:!1,deferred:!0}),p}catch(e){throw logger.error(`[ResponseProcessor] Failed to load card history`,{e,cardId:s}),e}}processCorrectResponse(e,t,n,r,a,o,s){if(e.priorAttemps===0){a.card.tags.includes(`srs:skip`)||this.srsService.scheduleReview(t,n);let{globalScore:c,taggedPerformance:l}=this.parsePerformance(e.performance);if(l){let n=Object.keys(l).filter(e=>e!==`_global`),c=n.filter(e=>l[e]===null),u=n.filter(e=>l[e]!==null);logger.info(`[FirstContactElo] correct first-attempt per-tag ELO update for ${s} (historyLen=${t.records.length}, priorAttemps=${e.priorAttemps}): scored=[${u.join(`, `)}] count-only=[${c.join(`, `)}]`),this.eloService.updateUserAndCardEloPerTag(l,o,s,r,a).catch(this.logEloFailure(`correct per-tag`,s))}else{let n=.5+c/2;if(t.records.length===1)this.eloService.updateUserAndCardElo(n,o,s,r,a).catch(this.logEloFailure(`correct`,s));else{let e=Math.ceil(32/t.records.length);this.eloService.updateUserAndCardElo(n,o,s,r,a,e).catch(this.logEloFailure(`correct repeat-view`,s))}logger.info(`[FirstContactElo] correct first-attempt ELO update (score=${n.toFixed(3)}) for ${s} (historyLen=${t.records.length}, priorAttemps=${e.priorAttemps})`)}return{nextCardAction:`dismiss-success`,shouldLoadNextCard:!0,isCorrect:!0,performanceScore:c,shouldClearFeedbackShadow:!0}}else{logger.info(`[ResponseProcessor] Processed correct response (retry attempt - no scheduling/ELO)`);let{globalScore:t}=this.parsePerformance(e.performance);return{nextCardAction:`marked-failed`,shouldLoadNextCard:!0,isCorrect:!0,performanceScore:t,shouldClearFeedbackShadow:!0}}}processIncorrectResponse(e,t,n,r,a,o,s,c,l){let{taggedPerformance:u}=this.parsePerformance(e.performance),d=!1;return e.priorAttemps===0?(u?(this.eloService.updateUserAndCardEloPerTag(u,a,o,n,r).catch(this.logEloFailure(`incorrect per-tag`,o)),logger.info(`[FirstContactElo] incorrect first-attempt per-tag ELO update for ${o} (historyLen=${t.records.length}, priorAttemps=${e.priorAttemps}, tags=${Object.keys(u).length-1})`)):(this.eloService.updateUserAndCardElo(0,a,o,n,r).catch(this.logEloFailure(`incorrect`,o)),logger.info(`[FirstContactElo] incorrect first-attempt ELO update (score=0) for ${o} (historyLen=${t.records.length}, priorAttemps=${e.priorAttemps})`)),d=!0):logger.info(`[FirstContactElo] incorrect retry \u2014 no ELO update for ${o} (historyLen=${t.records.length}, priorAttemps=${e.priorAttemps})`),r.records.length>=s?l>=c?(d?logger.info(`[FirstContactElo] dismiss-failed \u2014 ELO already updated this response, skipping double penalty for ${o}`):(u?this.eloService.updateUserAndCardEloPerTag(u,a,o,n,r).catch(this.logEloFailure(`dismiss-failed per-tag`,o)):this.eloService.updateUserAndCardElo(0,a,o,n,r).catch(this.logEloFailure(`dismiss-failed`,o)),logger.info(`[FirstContactElo] dismiss-failed final ELO penalty for ${o} (historyLen=${t.records.length}, sessionViews=${l})`)),{nextCardAction:`dismiss-failed`,shouldLoadNextCard:!0,isCorrect:!1,shouldClearFeedbackShadow:!0}):{nextCardAction:`marked-failed`,shouldLoadNextCard:!0,isCorrect:!1,shouldClearFeedbackShadow:!0}:{nextCardAction:`none`,shouldLoadNextCard:!1,isCorrect:!1,shouldClearFeedbackShadow:!0}}};init_logger();function parseAudioURIs(e){return typeof e==`string`?e.match(/https?:\/\/[^\s"'<>]+\.(wav|mp3|ogg|m4a|aac|webm)/gi)??[]:[]}function prefetchAudio(e){return new Promise(t=>{let n=new Audio;n.preload=`auto`;let cleanup=()=>{n.oncanplaythrough=null,n.onerror=null};n.oncanplaythrough=()=>{cleanup(),t()},n.onerror=()=>{cleanup(),logger.warn(`[CardHydrationService] Failed to prefetch audio: ${e}`),t()},n.src=e})}var CardHydrationService=class{constructor(e,t,n){_defineProperty(this,`hydratedCards`,new Map),_defineProperty(this,`hydrationInFlight`,new Set),_defineProperty(this,`hydrationInProgress`,!1),this.getViewComponent=e,this.getCourseDB=t,this.getItemsToHydrate=n}getHydratedCard(e){return this.hydratedCards.get(e)??null}hasHydratedCard(e){return this.hydratedCards.has(e)}removeCard(e){this.hydratedCards.delete(e)}async ensureHydratedCards(){this.fillHydratedCards()}async waitForCard(e){if(this.hydratedCards.has(e))return this.hydratedCards.get(e);this.hydrationInProgress||this.fillHydratedCards();let t=1e4,n=25,r=0;for(;r<1e4;){if(this.hydratedCards.has(e))return this.hydratedCards.get(e);if(!this.hydrationInFlight.has(e)&&!this.hydrationInProgress)break;await new Promise(e=>setTimeout(e,25)),r+=25}return this.hydratedCards.get(e)??null}get hydratedCount(){return this.hydratedCards.size}getHydratedCardIds(){return Array.from(this.hydratedCards.keys())}async fillHydratedCards(){if(!this.hydrationInProgress){this.hydrationInProgress=!0;try{let e=this.getItemsToHydrate();for(let t of e)if(!(this.hydratedCards.has(t.cardID)||this.hydrationInFlight.has(t.cardID)))try{await this.hydrateCard(t)}catch(e){logger.error(`[CardHydrationService] Error hydrating card ${t.cardID}:`,e)}}finally{this.hydrationInProgress=!1}}}async hydrateCard(e){if(!(this.hydratedCards.has(e.cardID)||this.hydrationInFlight.has(e.cardID))){this.hydrationInFlight.add(e.cardID);try{let t=this.getCourseDB(e.courseID),[n,r]=await Promise.all([t.getCourseDoc(e.cardID),t.getAppliedTagsBatch([e.cardID])]);isCourseElo(n.elo)||(n.elo=toCourseElo(n.elo));let a=this.getViewComponent(n.id_view),o=await Promise.all(n.id_displayable_data.map(e=>t.getCourseDoc(e,{attachments:!0,binary:!0}))),s=[];o.forEach(e=>{e.data.forEach(e=>{s.push(...parseAudioURIs(e.data))})});let c=[...new Set(s)];c.length>0&&(logger.debug(`[CardHydrationService] Prefetching ${c.length} audio files for card ${e.cardID}`),await Promise.allSettled(c.map(prefetchAudio)));let l=o.map(displayableDataToViewData).reverse();this.hydratedCards.set(e.cardID,{item:e,view:a,data:l,tags:r.get(e.cardID)??[]}),logger.debug(`[CardHydrationService] Hydrated card ${e.cardID}`)}finally{this.hydrationInFlight.delete(e.cardID)}}}},ItemQueue=class{constructor(){_defineProperty(this,`q`,[]),_defineProperty(this,`seenCardIds`,[]),_defineProperty(this,`_dequeueCount`,0)}get dequeueCount(){return this._dequeueCount}add(e,t){this.seenCardIds.find(e=>e===t)||(this.seenCardIds.push(t),this.q.push(e))}addAll(e,t){e.forEach(e=>this.add(e,t(e)))}get length(){return this.q.length}peek(e){return this.q[e]}dequeue(e){if(this.q.length!==0){this._dequeueCount++;let t=this.q.splice(0,1)[0];if(e){let n=e(t),r=this.seenCardIds.indexOf(n);r>-1&&this.seenCardIds.splice(r,1)}return t}else return null}replaceAll(e,t){this.q=[],this.seenCardIds=[];for(let n of e){let e=t(n);this.seenCardIds.includes(e)||(this.seenCardIds.push(e),this.q.push(n))}}mergeToFront(e,t,n){let r=0,a=[];for(let o of e){let e=t(o);if(!this.seenCardIds.includes(e))this.seenCardIds.push(e),a.push(o),r++;else if(n?.has(e)){let n=this.q.findIndex(n=>t(n)===e);n>=0&&a.push(...this.q.splice(n,1))}}return this.q.unshift(...a),r}get toString(){return`${typeof this.q[0]}:
319
+ Card ELO update: ${l?`SUCCESS`:`FAILED`}`),!a&&r[0].status===`rejected`&&logger.error(`[EloService] User ELO update error:`,r[0].reason),!l&&r[1].status===`rejected`&&logger.error(`[EloService] Card ELO update error:`,r[1].reason)}}};init_core(),init_logger();var ResponseProcessor=class{constructor(e,t){_defineProperty(this,`srsService`,void 0),_defineProperty(this,`eloService`,void 0),this.srsService=e,this.eloService=t}logEloFailure(e,t){return n=>logger.error(`[ResponseProcessor] ELO update failed (${e}) for ${t}:`,n)}parsePerformance(e){return typeof e==`number`?{globalScore:e,taggedPerformance:null}:isTaggedPerformance(e)?{globalScore:e._global,taggedPerformance:e}:(logger.warn(`[ResponseProcessor] Unexpected performance structure, using neutral score`,{performance:e}),{globalScore:.5,taggedPerformance:null})}async processResponse(e,t,n,r,a,o,s,c,l,u){if(!isQuestionRecord(e))return{nextCardAction:`dismiss-success`,shouldLoadNextCard:!0,isCorrect:!0,shouldClearFeedbackShadow:!0};try{let d=await t,p;return p=e.isCorrect?this.processCorrectResponse(e,d,n,r,a,o,s):this.processIncorrectResponse(e,d,r,a,o,s,c,l,u),e.deferAdvance&&p.shouldLoadNextCard&&(logger.info(`[ResponseProcessor] deferAdvance requested — suppressing navigation, action stashed:`,{nextCardAction:p.nextCardAction}),p={...p,shouldLoadNextCard:!1,deferred:!0}),p}catch(e){throw logger.error(`[ResponseProcessor] Failed to load card history`,{e,cardId:s}),e}}processCorrectResponse(e,t,n,r,a,o,s){if(e.priorAttemps===0){a.card.tags.includes(`srs:skip`)||this.srsService.scheduleReview(t,n);let{globalScore:c,taggedPerformance:l}=this.parsePerformance(e.performance);if(l){let n=Object.keys(l).filter(e=>e!==`_global`),c=n.filter(e=>l[e]===null),u=n.filter(e=>l[e]!==null);logger.info(`[FirstContactElo] correct first-attempt per-tag ELO update for ${s} (historyLen=${t.records.length}, priorAttemps=${e.priorAttemps}): scored=[${u.join(`, `)}] count-only=[${c.join(`, `)}]`),this.eloService.updateUserAndCardEloPerTag(l,o,s,r,a).catch(this.logEloFailure(`correct per-tag`,s))}else{let n=.5+c/2;if(t.records.length===1)this.eloService.updateUserAndCardElo(n,o,s,r,a).catch(this.logEloFailure(`correct`,s));else{let e=Math.ceil(32/t.records.length);this.eloService.updateUserAndCardElo(n,o,s,r,a,e).catch(this.logEloFailure(`correct repeat-view`,s))}logger.info(`[FirstContactElo] correct first-attempt ELO update (score=${n.toFixed(3)}) for ${s} (historyLen=${t.records.length}, priorAttemps=${e.priorAttemps})`)}return{nextCardAction:`dismiss-success`,shouldLoadNextCard:!0,isCorrect:!0,performanceScore:c,shouldClearFeedbackShadow:!0}}else{logger.info(`[ResponseProcessor] Processed correct response (retry attempt - no scheduling/ELO)`);let{globalScore:t}=this.parsePerformance(e.performance);return{nextCardAction:`marked-failed`,shouldLoadNextCard:!0,isCorrect:!0,performanceScore:t,shouldClearFeedbackShadow:!0}}}processIncorrectResponse(e,t,n,r,a,o,s,c,l){let{taggedPerformance:u}=this.parsePerformance(e.performance),d=!1;return e.priorAttemps===0?(u?(this.eloService.updateUserAndCardEloPerTag(u,a,o,n,r).catch(this.logEloFailure(`incorrect per-tag`,o)),logger.info(`[FirstContactElo] incorrect first-attempt per-tag ELO update for ${o} (historyLen=${t.records.length}, priorAttemps=${e.priorAttemps}, tags=${Object.keys(u).length-1})`)):(this.eloService.updateUserAndCardElo(0,a,o,n,r).catch(this.logEloFailure(`incorrect`,o)),logger.info(`[FirstContactElo] incorrect first-attempt ELO update (score=0) for ${o} (historyLen=${t.records.length}, priorAttemps=${e.priorAttemps})`)),d=!0):logger.info(`[FirstContactElo] incorrect retry \u2014 no ELO update for ${o} (historyLen=${t.records.length}, priorAttemps=${e.priorAttemps})`),r.records.length>=s?l>=c?(d?logger.info(`[FirstContactElo] dismiss-failed \u2014 ELO already updated this response, skipping double penalty for ${o}`):(u?this.eloService.updateUserAndCardEloPerTag(u,a,o,n,r).catch(this.logEloFailure(`dismiss-failed per-tag`,o)):this.eloService.updateUserAndCardElo(0,a,o,n,r).catch(this.logEloFailure(`dismiss-failed`,o)),logger.info(`[FirstContactElo] dismiss-failed final ELO penalty for ${o} (historyLen=${t.records.length}, sessionViews=${l})`)),{nextCardAction:`dismiss-failed`,shouldLoadNextCard:!0,isCorrect:!1,shouldClearFeedbackShadow:!0}):{nextCardAction:`marked-failed`,shouldLoadNextCard:!0,isCorrect:!1,shouldClearFeedbackShadow:!0}:{nextCardAction:`none`,shouldLoadNextCard:!1,isCorrect:!1,shouldClearFeedbackShadow:!0}}};init_logger();function parseAudioURIs(e){return typeof e==`string`?e.match(/https?:\/\/[^\s"'<>]+\.(wav|mp3|ogg|m4a|aac|webm)/gi)??[]:[]}function prefetchAudio(e){return new Promise(t=>{let n=new Audio;n.preload=`auto`;let cleanup=()=>{n.oncanplaythrough=null,n.onerror=null};n.oncanplaythrough=()=>{cleanup(),t()},n.onerror=()=>{cleanup(),logger.warn(`[CardHydrationService] Failed to prefetch audio: ${e}`),t()},n.src=e})}var CardHydrationService=class{constructor(e,t,n){_defineProperty(this,`hydratedCards`,new Map),_defineProperty(this,`hydrationInFlight`,new Set),_defineProperty(this,`hydrationInProgress`,!1),this.getViewComponent=e,this.getCourseDB=t,this.getItemsToHydrate=n}getHydratedCard(e){return this.hydratedCards.get(e)??null}hasHydratedCard(e){return this.hydratedCards.has(e)}removeCard(e){this.hydratedCards.delete(e)}async ensureHydratedCards(){this.fillHydratedCards()}async waitForCard(e){if(this.hydratedCards.has(e))return this.hydratedCards.get(e);this.hydrationInProgress||this.fillHydratedCards();let t=1e4,n=25,r=0;for(;r<1e4;){if(this.hydratedCards.has(e))return this.hydratedCards.get(e);if(!this.hydrationInFlight.has(e)&&!this.hydrationInProgress)break;await new Promise(e=>setTimeout(e,25)),r+=25}return this.hydratedCards.get(e)??null}get hydratedCount(){return this.hydratedCards.size}getHydratedCardIds(){return Array.from(this.hydratedCards.keys())}async fillHydratedCards(){if(!this.hydrationInProgress){this.hydrationInProgress=!0;try{let e=this.getItemsToHydrate();for(let t of e)if(!(this.hydratedCards.has(t.cardID)||this.hydrationInFlight.has(t.cardID)))try{await this.hydrateCard(t)}catch(e){logger.error(`[CardHydrationService] Error hydrating card ${t.cardID}:`,e)}}finally{this.hydrationInProgress=!1}}}async hydrateCard(e){if(!(this.hydratedCards.has(e.cardID)||this.hydrationInFlight.has(e.cardID))){this.hydrationInFlight.add(e.cardID);try{let t=this.getCourseDB(e.courseID),[n,r]=await Promise.all([t.getCourseDoc(e.cardID),t.getAppliedTagsBatch([e.cardID])]);isCourseElo(n.elo)||(n.elo=toCourseElo(n.elo));let a=this.getViewComponent(n.id_view),o=await Promise.all(n.id_displayable_data.map(e=>t.getCourseDoc(e,{attachments:!0,binary:!0}))),s=[];o.forEach(e=>{e.data.forEach(e=>{s.push(...parseAudioURIs(e.data))})});let c=[...new Set(s)];c.length>0&&(logger.debug(`[CardHydrationService] Prefetching ${c.length} audio files for card ${e.cardID}`),await Promise.allSettled(c.map(prefetchAudio)));let l=o.map(displayableDataToViewData).reverse();this.hydratedCards.set(e.cardID,{item:{...e,elo:toCourseElo(n.elo).global.score},view:a,data:l,tags:r.get(e.cardID)??[]}),logger.debug(`[CardHydrationService] Hydrated card ${e.cardID}`)}finally{this.hydrationInFlight.delete(e.cardID)}}}},ItemQueue=class{constructor(){_defineProperty(this,`q`,[]),_defineProperty(this,`seenCardIds`,[]),_defineProperty(this,`_dequeueCount`,0)}get dequeueCount(){return this._dequeueCount}add(e,t){this.seenCardIds.find(e=>e===t)||(this.seenCardIds.push(t),this.q.push(e))}addAll(e,t){e.forEach(e=>this.add(e,t(e)))}get length(){return this.q.length}peek(e){return this.q[e]}dequeue(e){if(this.q.length!==0){this._dequeueCount++;let t=this.q.splice(0,1)[0];if(e){let n=e(t),r=this.seenCardIds.indexOf(n);r>-1&&this.seenCardIds.splice(r,1)}return t}else return null}replaceAll(e,t){this.q=[],this.seenCardIds=[];for(let n of e){let e=t(n);this.seenCardIds.includes(e)||(this.seenCardIds.push(e),this.q.push(n))}}mergeToFront(e,t,n){let r=0,a=[];for(let o of e){let e=t(o);if(!this.seenCardIds.includes(e))this.seenCardIds.push(e),a.push(o),r++;else if(n?.has(e)){let n=this.q.findIndex(n=>t(n)===e);n>=0&&a.push(...this.q.splice(n,1))}}return this.q.unshift(...a),r}get toString(){return`${typeof this.q[0]}:
320
320
  `+this.q.map(e=>` ${e.courseID}+${e.cardID}: ${e.status}`).join(`
321
321
  `)}};init_couch(),init_core(),init_recording(),init_Loggable(),init_types_legacy(),init_logger();var CouchDBToStaticPacker=class{constructor(e={}){_defineProperty(this,`config`,void 0),_defineProperty(this,`sourceDB`,null),this.config={chunkSize:1e3,includeAttachments:!0,...e}}async packCourse(e,t){logger.info(`Starting static pack for course: ${t}`),this.sourceDB=e;let n={version:`1.0.0`,courseId:t,courseName:``,courseConfig:null,lastUpdated:new Date().toISOString(),documentCount:0,chunks:[],indices:[],designDocs:[]},r=await this.extractCourseConfig(e);n.courseName=r.name,n.courseConfig=r,n.designDocs=await this.extractDesignDocs(e);let a=await this.extractDocumentsByType(e),o=new Map;this.config.includeAttachments&&await this.extractAllAttachments(a,o);let s=new Map;for(let[e,t]of Object.entries(a)){let r=this.createChunks(t,e);n.chunks.push(...r),n.documentCount+=t.length,this.prepareChunkData(r,t,s)}let c=new Map;return n.indices=await this.buildIndices(a,n.designDocs,c),{manifest:n,chunks:s,indices:c,attachments:o}}async packCourseToFiles(e,t,n,r){logger.info(`Packing course ${t} to files in ${n}`);let a=await this.packCourse(e,t),o=await this.writePackedDataToFiles(a,n,r);return{manifest:a.manifest,filesWritten:o,attachmentsFound:a.attachments?a.attachments.size:0}}async writePackedDataToFiles(e,t,n){let r=0;await n.ensureDir(t);let a=n.joinPath(t,`manifest.json`);await n.writeJson(a,e.manifest,{spaces:2}),r++,logger.info(`Wrote manifest: ${a}`);let o=n.joinPath(t,`chunks`),s=n.joinPath(t,`indices`);await n.ensureDir(o),await n.ensureDir(s);for(let[t,a]of e.chunks){let e=n.joinPath(o,`${t}.json`);await n.writeJson(e,a),r++}logger.info(`Wrote ${e.chunks.size} chunk files`);for(let[t,a]of e.indices){let e=n.joinPath(s,`${t}.json`);await n.writeJson(e,a,{spaces:2}),r++}if(logger.info(`Wrote ${e.indices.size} index files`),e.attachments&&e.attachments.size>0){for(let[a,o]of e.attachments){let e=n.joinPath(t,a),s=n.dirname(e);await n.ensureDir(s),await n.writeFile(e,o.buffer),r++}logger.info(`Wrote ${e.attachments.size} attachment files`)}return r}async extractCourseConfig(e){try{return await e.get(`CourseConfig`)}catch(e){throw logger.error(`Failed to extract course config:`,e),Error(`Course config not found`)}}async extractDesignDocs(e){return(await e.allDocs({startkey:`_design/`,endkey:`_design/￰`,include_docs:!0})).rows.map(e=>({_id:e.id,views:e.doc.views||{}}))}async extractDocumentsByType(e){let t=await e.allDocs({include_docs:!0}),n={};for(let e of t.rows){if(e.id.startsWith(`_`))continue;let t=e.doc;t.docType&&(n[t.docType]||(n[t.docType]=[]),n[t.docType].push(t))}return n}createChunks(e,t){let n=[],r=e.sort((e,t)=>e._id.localeCompare(t._id));for(let e=0;e<r.length;e+=this.config.chunkSize){let a=r.slice(e,e+this.config.chunkSize),o=`${t}-${String(Math.floor(e/this.config.chunkSize)).padStart(4,`0`)}`;n.push({id:o,docType:t,startKey:a[0]._id,endKey:a[a.length-1]._id,documentCount:a.length,path:`chunks/${o}.json`})}return n}prepareChunkData(e,t,n){let r=t.sort((e,t)=>e._id.localeCompare(t._id));for(let t of e){let e=r.filter(e=>e._id>=t.startKey&&e._id<=t.endKey).map(e=>{let t={...e};return delete t._rev,this.config.includeAttachments&&t._attachments?t._attachments=this.transformAttachmentStubs(t._attachments,t._id):this.config.includeAttachments||delete t._attachments,t});n.set(t.id,e)}}async buildIndices(e,t,n){let r=[];if(e.CARD){let t=await this.buildEloIndex(e.CARD,n);r.push(t)}if(e.TAG){let t=await this.buildTagIndex(e.TAG,n);r.push(t)}for(let e of t)for(let[t,a]of Object.entries(e.views))if(a.map){logger.info(`Processing view: ${e._id}/${t}`);let a=await this.buildViewIndex(t,e,n);a?(r.push(a),logger.info(`Successfully built index: ${a.name}`)):logger.warn(`Skipped view index: ${e._id}/${t}`)}return r}async buildEloIndex(e,t){let n=[];for(let t of e)t.elo?.global?.score&&n.push({elo:t.elo.global.score,cardId:t._id});n.sort((e,t)=>e.elo-t.elo);let r={},a=50;for(let e of n){let t=Math.floor(e.elo/50)*50;r[t]||(r[t]=[]),r[t].push(e.cardId)}return t.set(`elo`,{sorted:n,buckets:r,stats:{min:n[0]?.elo||0,max:n[n.length-1]?.elo||0,count:n.length}}),{name:`elo`,type:`btree`,path:`indices/elo.json`}}async buildTagIndex(e,t){let n={};for(let t of e)n[t.name]={cardIds:t.taggedCards,snippet:t.snippet,count:t.taggedCards.length};let r={};for(let t of e)for(let e of t.taggedCards)r[e]||(r[e]=[]),r[e].push(t.name);return t.set(`tags`,{byTag:n,byCard:r}),{name:`tags`,type:`hash`,path:`indices/tags.json`}}async buildViewIndex(e,t,n){if(!this.sourceDB)return logger.error(`Source database not available for view querying`),null;try{let r=`${t._id.replace(`_design/`,``)}/${e}`;logger.info(`Querying CouchDB view: ${r}`);let a=await this.sourceDB.query(r,{include_docs:!1});if(!a.rows||a.rows.length===0)return logger.warn(`View ${r} returned no results`),null;logger.info(`Successfully queried view ${r}: ${a.rows.length} results`);let o=this.formatViewResults(e,a.rows,t),s=`view-${t._id.replace(`_design/`,``)}-${e}`;return n.set(s,o),{name:s,type:`view`,path:`indices/${s}.json`}}catch(n){return logger.error(`Failed to query view ${t._id}/${e}:`,n),null}}formatViewResults(e,t,n){let r={type:`couchdb-view`,viewName:e,designDoc:n._id,results:t,metadata:{resultCount:t.length,generatedAt:new Date().toISOString()}};switch(e){case`elo`:return this.formatEloViewIndex(t,r);case`getTags`:return this.formatTagsViewIndex(t,r);case`cardsByInexperience`:return this.formatInexperienceViewIndex(t,r);default:return this.formatGenericViewIndex(t,r)}}formatEloViewIndex(e,t){let n=e.sort((e,t)=>typeof e.key==`number`&&typeof t.key==`number`?e.key-t.key:0);return{...t,sorted:n,stats:{min:n[0]?.key||0,max:n[n.length-1]?.key||0,count:n.length}}}formatTagsViewIndex(e,t){let n={};for(let t of e){let e=t.key;typeof e==`string`&&(n[e]||(n[e]=[]),n[e].push(t.id))}return{...t,byTag:n,tagCount:Object.keys(n).length}}formatInexperienceViewIndex(e,t){let n=e.sort((e,t)=>typeof e.key==`number`&&typeof t.key==`number`?e.key-t.key:0);return{...t,sorted:n,stats:{minInexperience:n[0]?.key||0,maxInexperience:n[n.length-1]?.key||0,count:n.length}}}formatGenericViewIndex(e,t){return{...t}}async extractAllAttachments(e,t){logger.info(`Extracting attachments...`);let n=[];for(let t of Object.values(e))n.push(...t);let r=n.filter(e=>e._attachments&&Object.keys(e._attachments).length>0);if(r.length===0){logger.info(`No attachments found`);return}logger.info(`Found ${r.length} documents with attachments`);let a=r.map(e=>this.extractDocumentAttachments(e,t));await Promise.all(a),logger.info(`Extracted ${t.size} attachment files`)}async extractDocumentAttachments(e,t){if(!e._attachments||!this.sourceDB)return;let n=e._id;for(let[r,a]of Object.entries(e._attachments))try{let e=await this.sourceDB.getAttachment(n,r),o;if(e instanceof ArrayBuffer)o=Buffer.from(e);else if(Buffer.isBuffer(e))o=e;else{let t=e;o=Buffer.from(await t.arrayBuffer())}let s=`${r}${this.getFileExtension(a.content_type)}`,c=`attachments/${n}/${s}`;t.set(c,{docId:n,attachmentName:r,filename:s,path:c,contentType:a.content_type,length:a.length||o.length,digest:a.digest,buffer:o}),logger.debug(`Extracted attachment: ${c}`)}catch(e){throw logger.error(`Failed to extract attachment ${n}/${r}:`,e),Error(`Failed to extract attachment ${n}/${r}: ${e}`)}}transformAttachmentStubs(e,t){let n={};for(let[r,a]of Object.entries(e))n[r]={path:`attachments/${t}/${`${r}${this.getFileExtension(a.content_type)}`}`,content_type:a.content_type,length:a.length,digest:a.digest,stub:!1};return n}getFileExtension(e){return{"image/jpeg":`.jpg`,"image/jpg":`.jpg`,"image/png":`.png`,"image/gif":`.gif`,"image/webp":`.webp`,"audio/mpeg":`.mp3`,"audio/mp3":`.mp3`,"audio/wav":`.wav`,"audio/ogg":`.ogg`,"video/mp4":`.mp4`,"video/webm":`.webm`,"application/pdf":`.pdf`,"text/plain":`.txt`,"application/json":`.json`}[e]||``}};init_logger();var DEFAULT_MIGRATION_OPTIONS={chunkBatchSize:100,validateRoundTrip:!1,cleanupOnFailure:!0,timeout:3e5};init_logger();var FileSystemError=class extends Error{constructor(e,t,n,r){super(e),this.operation=t,this.filePath=n,this.cause=r,this.name=`FileSystemError`}},nodeFS2=null;try{typeof window>`u`&&typeof process<`u`&&process.versions?.node&&(nodeFS2=eval(`require`)(`fs`),nodeFS2.promises=nodeFS2.promises||eval(`require`)(`fs`).promises)}catch{}async function validateStaticCourse(e,t){let n={valid:!0,manifestExists:!1,chunksExist:!1,attachmentsExist:!1,errors:[],warnings:[]};try{if(t){if(!(await t.stat(e)).isDirectory())return n.errors.push(`Path is not a directory: ${e}`),n.valid=!1,n}else if(!nodeFS2)return n.errors.push(`File system access not available - validation skipped`),n.valid=!1,n;else if(!(await nodeFS2.promises.stat(e)).isDirectory())return n.errors.push(`Path is not a directory: ${e}`),n.valid=!1,n;let r=`${e}/manifest.json`;try{if(t)if(r=t.joinPath(e,`manifest.json`),await t.exists(r)){n.manifestExists=!0;let e=await t.readFile(r),a=JSON.parse(e);n.courseId=a.courseId,n.courseName=a.courseName,(!a.version||!a.courseId||!a.chunks||!Array.isArray(a.chunks))&&(n.errors.push(`Invalid manifest structure`),n.valid=!1)}else n.errors.push(`Manifest not found: ${r}`),n.valid=!1;else{r=`${e}/manifest.json`,await nodeFS2.promises.access(r),n.manifestExists=!0;let t=await nodeFS2.promises.readFile(r,`utf8`),a=JSON.parse(t);n.courseId=a.courseId,n.courseName=a.courseName,(!a.version||!a.courseId||!a.chunks||!Array.isArray(a.chunks))&&(n.errors.push(`Invalid manifest structure`),n.valid=!1)}}catch(e){let t=e instanceof FileSystemError?e.message:`Manifest not found or invalid: ${r}`;n.errors.push(t),n.valid=!1}let a=`${e}/chunks`;try{t?(a=t.joinPath(e,`chunks`),await t.exists(a)?(await t.stat(a)).isDirectory()?n.chunksExist=!0:(n.errors.push(`Chunks path is not a directory: ${a}`),n.valid=!1):(n.errors.push(`Chunks directory not found: ${a}`),n.valid=!1)):(a=`${e}/chunks`,(await nodeFS2.promises.stat(a)).isDirectory()?n.chunksExist=!0:(n.errors.push(`Chunks path is not a directory: ${a}`),n.valid=!1))}catch(e){let t=e instanceof FileSystemError?e.message:`Chunks directory not found: ${a}`;n.errors.push(t),n.valid=!1}let o;try{t?(o=t.joinPath(e,`attachments`),await t.exists(o)?(await t.stat(o)).isDirectory()&&(n.attachmentsExist=!0):n.warnings.push(`Attachments directory not found: ${o} (this is OK if course has no attachments)`)):(o=`${e}/attachments`,(await nodeFS2.promises.stat(o)).isDirectory()&&(n.attachmentsExist=!0))}catch(t){o=o||`${e}/attachments`;let r=t instanceof FileSystemError?t.message:`Attachments directory not found: ${o} (this is OK if course has no attachments)`;n.warnings.push(r)}}catch(e){n.errors.push(`Failed to validate static course: ${e instanceof Error?e.message:String(e)}`),n.valid=!1}return n}async function validateMigration(e,t,n){let r={valid:!0,documentCountMatch:!1,attachmentIntegrity:!1,viewFunctionality:!1,issues:[]};try{logger.info(`Starting migration validation...`),r.documentCountMatch=compareDocumentCounts(t,await getActualDocumentCounts(e),r.issues),await validateCourseConfig(e,n,r.issues),r.viewFunctionality=await validateViews(e,n,r.issues),r.attachmentIntegrity=await validateAttachmentIntegrity(e,r.issues),r.valid=r.documentCountMatch&&r.viewFunctionality&&r.attachmentIntegrity,logger.info(`Migration validation completed. Valid: ${r.valid}`),r.issues.length>0&&(logger.info(`Validation issues: ${r.issues.length}`),r.issues.forEach(e=>{e.type===`error`?logger.error(`${e.category}: ${e.message}`):logger.warn(`${e.category}: ${e.message}`)}))}catch(e){r.valid=!1,r.issues.push({type:`error`,category:`metadata`,message:`Validation failed: ${e instanceof Error?e.message:String(e)}`})}return r}async function getActualDocumentCounts(e){let t={};try{let n=await e.allDocs({include_docs:!0});for(let e of n.rows){if(e.id.startsWith(`_design/`)){t._design=(t._design||0)+1;continue}let n=e.doc;n&&n.docType?t[n.docType]=(t[n.docType]||0)+1:t.unknown=(t.unknown||0)+1}}catch(e){logger.error(`Failed to get actual document counts:`,e)}return t}function compareDocumentCounts(e,t,n){let r=!0;for(let[a,o]of Object.entries(e)){let e=t[a]||0;e!==o&&(r=!1,n.push({type:`error`,category:`documents`,message:`Document count mismatch for ${a}: expected ${o}, got ${e}`}))}for(let[r,a]of Object.entries(t))!e[r]&&r!==`_design`&&n.push({type:`warning`,category:`documents`,message:`Unexpected document type found: ${r} (${a} documents)`});return r}async function validateCourseConfig(e,t,n){try{let r=await e.get(`CourseConfig`);if(!r){n.push({type:`error`,category:`course_config`,message:`CourseConfig document not found after migration`});return}r.courseID||n.push({type:`warning`,category:`course_config`,message:`CourseConfig document missing courseID field`}),r.courseID!==t.courseId&&n.push({type:`warning`,category:`course_config`,message:`CourseConfig courseID mismatch: expected ${t.courseId}, got ${r.courseID}`}),logger.debug(`CourseConfig document validation passed`)}catch(e){e.status===404?n.push({type:`error`,category:`course_config`,message:`CourseConfig document not found in database`}):n.push({type:`error`,category:`course_config`,message:`Failed to validate CourseConfig document: ${e instanceof Error?e.message:String(e)}`})}}async function validateViews(e,t,n){let r=!0;try{for(let a of t.designDocs)try{if(!await e.get(a._id)){r=!1,n.push({type:`error`,category:`views`,message:`Design document not found: ${a._id}`});continue}for(let t of Object.keys(a.views))try{let n=`${a._id}/${t}`;await e.query(n,{limit:1})}catch(e){r=!1,n.push({type:`error`,category:`views`,message:`View not accessible: ${a._id}/${t} - ${e}`})}}catch(e){r=!1,n.push({type:`error`,category:`views`,message:`Failed to validate design document ${a._id}: ${e}`})}}catch(e){r=!1,n.push({type:`error`,category:`views`,message:`View validation failed: ${e instanceof Error?e.message:String(e)}`})}return r}async function validateAttachmentIntegrity(e,t){let n=!0;try{let r=await e.allDocs({include_docs:!0,limit:10}),a=0,o=0;for(let s of r.rows){let r=s.doc;if(r&&r._attachments)for(let[s,c]of Object.entries(r._attachments)){a++;try{await e.getAttachment(r._id,s)&&o++}catch(e){n=!1,t.push({type:`error`,category:`attachments`,message:`Attachment not accessible: ${r._id}/${s} - ${e}`})}}}a===0?t.push({type:`warning`,category:`attachments`,message:`No attachments found in sampled documents`}):logger.info(`Validated ${o}/${a} sampled attachments`)}catch(e){n=!1,t.push({type:`error`,category:`attachments`,message:`Attachment validation failed: ${e instanceof Error?e.message:String(e)}`})}return n}var nodeFS3=null,nodePath=null;try{typeof window>`u`&&typeof process<`u`&&process.versions?.node&&(nodeFS3=eval(`require`)(`fs`),nodePath=eval(`require`)(`path`),nodeFS3.promises=nodeFS3.promises||eval(`require`)(`fs`).promises)}catch{}var StaticToCouchDBMigrator=class{constructor(e={},t){_defineProperty(this,`options`,void 0),_defineProperty(this,`progressCallback`,void 0),_defineProperty(this,`fs`,void 0),this.options={...DEFAULT_MIGRATION_OPTIONS,...e},this.fs=t}setProgressCallback(e){this.progressCallback=e}async migrateCourse(e,t){let n=Date.now(),r={success:!1,documentsRestored:0,attachmentsRestored:0,designDocsRestored:0,courseConfigRestored:0,errors:[],warnings:[],migrationTime:0};try{logger.info(`Starting migration from ${e} to CouchDB`),this.reportProgress(`manifest`,0,1,`Validating static course...`);let a=await validateStaticCourse(e,this.fs);if(!a.valid)throw r.errors.push(...a.errors),Error(`Static course validation failed: ${a.errors.join(`, `)}`);r.warnings.push(...a.warnings),this.reportProgress(`manifest`,1,1,`Loading course manifest...`);let o=await this.loadManifest(e);logger.info(`Loaded manifest for course: ${o.courseId} (${o.courseName})`),this.reportProgress(`design_docs`,0,o.designDocs.length,`Restoring design documents...`);let s=await this.restoreDesignDocuments(o.designDocs,t);r.designDocsRestored=s.restored,r.errors.push(...s.errors),r.warnings.push(...s.warnings),this.reportProgress(`course_config`,0,1,`Restoring CourseConfig document...`);let c=await this.restoreCourseConfig(o,t);r.courseConfigRestored=c.restored,r.errors.push(...c.errors),r.warnings.push(...c.warnings),this.reportProgress(`course_config`,1,1,`CourseConfig document restored`);let l=this.calculateExpectedCounts(o);this.reportProgress(`documents`,0,o.documentCount,`Aggregating documents from chunks...`);let u=await this.aggregateDocuments(e,o),d=u.filter(e=>e._id!==`CourseConfig`);u.length!==d.length&&r.warnings.push(`Filtered out ${u.length-d.length} CourseConfig document(s) from chunks to prevent conflicts`),this.reportProgress(`documents`,d.length,o.documentCount,`Uploading documents to CouchDB...`);let p=await this.uploadDocuments(d,t);r.documentsRestored=p.restored,r.errors.push(...p.errors),r.warnings.push(...p.warnings);let m=u.filter(e=>e._attachments&&Object.keys(e._attachments).length>0);this.reportProgress(`attachments`,0,m.length,`Uploading attachments...`);let g=await this.uploadAttachments(e,m,t);if(r.attachmentsRestored=g.restored,r.errors.push(...g.errors),r.warnings.push(...g.warnings),this.options.validateRoundTrip){this.reportProgress(`validation`,0,1,`Validating migration...`);let e=await validateMigration(t,l,o);e.valid||(r.warnings.push(`Migration validation found issues`),e.issues.forEach(e=>{e.type===`error`?r.errors.push(`Validation: ${e.message}`):r.warnings.push(`Validation: ${e.message}`)})),this.reportProgress(`validation`,1,1,`Migration validation completed`)}r.success=r.errors.length===0,r.migrationTime=Date.now()-n,logger.info(`Migration completed in ${r.migrationTime}ms`),logger.info(`Documents restored: ${r.documentsRestored}`),logger.info(`Attachments restored: ${r.attachmentsRestored}`),logger.info(`Design docs restored: ${r.designDocsRestored}`),logger.info(`CourseConfig restored: ${r.courseConfigRestored}`),r.errors.length>0&&logger.error(`Migration completed with ${r.errors.length} errors`),r.warnings.length>0&&logger.warn(`Migration completed with ${r.warnings.length} warnings`)}catch(e){r.success=!1,r.migrationTime=Date.now()-n;let a=e instanceof Error?e.message:String(e);if(r.errors.push(`Migration failed: ${a}`),logger.error(`Migration failed:`,e),this.options.cleanupOnFailure)try{await this.cleanupFailedMigration(t)}catch(e){logger.error(`Failed to cleanup after migration failure:`,e),r.warnings.push(`Failed to cleanup after migration failure`)}}return r}async loadManifest(e){try{let t,n;if(this.fs)n=this.fs.joinPath(e,`manifest.json`),t=await this.fs.readFile(n);else if(n=nodeFS3&&nodePath?nodePath.join(e,`manifest.json`):`${e}/manifest.json`,nodeFS3&&this.isLocalPath(e))t=await nodeFS3.promises.readFile(n,`utf8`);else{let e=await fetch(n);if(!e.ok)throw Error(`Failed to fetch manifest: ${e.status} ${e.statusText}`);t=await e.text()}let r=JSON.parse(t);if(!r.version||!r.courseId||!r.chunks)throw Error(`Invalid manifest structure`);return r}catch(e){let t=e instanceof FileSystemError?e.message:`Failed to load manifest: ${e instanceof Error?e.message:String(e)}`;throw Error(t)}}async restoreDesignDocuments(e,t){let n={restored:0,errors:[],warnings:[]};for(let r=0;r<e.length;r++){let a=e[r];this.reportProgress(`design_docs`,r,e.length,`Restoring ${a._id}...`);try{let e;try{e=await t.get(a._id)}catch{}let r={_id:a._id,views:a.views};e?(r._rev=e._rev,logger.debug(`Updating existing design document: ${a._id}`)):logger.debug(`Creating new design document: ${a._id}`),await t.put(r),n.restored++}catch(e){let t=`Failed to restore design document ${a._id}: ${e instanceof Error?e.message:String(e)}`;n.errors.push(t),logger.error(t)}}return this.reportProgress(`design_docs`,e.length,e.length,`Restored ${n.restored} design documents`),n}async aggregateDocuments(e,t){let n=[],r=new Map;for(let a=0;a<t.chunks.length;a++){let o=t.chunks[a];this.reportProgress(`documents`,n.length,t.documentCount,`Loading chunk ${o.id}...`);try{let t=await this.loadChunk(e,o);for(let e of t){if(!e._id){logger.warn(`Document without _id found in chunk ${o.id}, skipping`);continue}r.has(e._id)&&logger.warn(`Duplicate document ID found: ${e._id}, using latest version`),r.set(e._id,e)}}catch(e){throw Error(`Failed to load chunk ${o.id}: ${e instanceof Error?e.message:String(e)}`)}}return n.push(...r.values()),logger.info(`Aggregated ${n.length} unique documents from ${t.chunks.length} chunks`),n}async loadChunk(e,t){try{let n,r;if(this.fs)r=this.fs.joinPath(e,t.path),n=await this.fs.readFile(r);else if(r=nodeFS3&&nodePath?nodePath.join(e,t.path):`${e}/${t.path}`,nodeFS3&&this.isLocalPath(e))n=await nodeFS3.promises.readFile(r,`utf8`);else{let e=await fetch(r);if(!e.ok)throw Error(`Failed to fetch chunk: ${e.status} ${e.statusText}`);n=await e.text()}let a=JSON.parse(n);if(!Array.isArray(a))throw Error(`Chunk file does not contain an array of documents`);return a}catch(e){let t=e instanceof FileSystemError?e.message:`Failed to load chunk: ${e instanceof Error?e.message:String(e)}`;throw Error(t)}}async uploadDocuments(e,t){let n={restored:0,errors:[],warnings:[]},r=this.options.chunkBatchSize;for(let a=0;a<e.length;a+=r){let o=e.slice(a,a+r);this.reportProgress(`documents`,a,e.length,`Uploading batch ${Math.floor(a/r)+1}...`);try{let e=o.map(e=>{let t={...e};return delete t._rev,delete t._attachments,t}),r=await t.bulkDocs(e);for(let e=0;e<r.length;e++){let t=r[e],a=o[e];if(`error`in t){let e=`Failed to upload document ${a._id}: ${t.error} - ${t.reason}`;n.errors.push(e),logger.error(e)}else n.restored++}}catch(e){let t;t=e instanceof Error||e&&typeof e==`object`&&`message`in e?`Failed to upload document batch starting at index ${a}: ${e.message}`:`Failed to upload document batch starting at index ${a}: ${JSON.stringify(e)}`,n.errors.push(t),logger.error(t)}}return this.reportProgress(`documents`,e.length,e.length,`Uploaded ${n.restored} documents`),n}async uploadAttachments(e,t,n){let r={restored:0,errors:[],warnings:[]},a=0;for(let o of t)if(this.reportProgress(`attachments`,a,t.length,`Processing attachments for ${o._id}...`),a++,o._attachments)for(let[t,a]of Object.entries(o._attachments))try{let s=await this.uploadSingleAttachment(e,o._id,t,a,n);s.success?r.restored++:r.errors.push(s.error||`Unknown attachment upload error`)}catch(e){let n=`Failed to upload attachment ${o._id}/${t}: ${e instanceof Error?e.message:String(e)}`;r.errors.push(n),logger.error(n)}return this.reportProgress(`attachments`,t.length,t.length,`Uploaded ${r.restored} attachments`),r}async uploadSingleAttachment(e,t,n,r,a){let o={success:!1,attachmentName:n,docId:t};try{if(!r.path)return o.error=`Attachment metadata missing file path`,o;let s,c;if(this.fs)c=this.fs.joinPath(e,r.path),s=await this.fs.readBinary(c);else if(c=nodeFS3&&nodePath?nodePath.join(e,r.path):`${e}/${r.path}`,nodeFS3&&this.isLocalPath(e))s=await nodeFS3.promises.readFile(c);else{let e=await fetch(c);if(!e.ok)return o.error=`Failed to fetch attachment: ${e.status} ${e.statusText}`,o;s=await e.arrayBuffer()}let l=await a.get(t);await a.putAttachment(t,n,l._rev,s,r.content_type),o.success=!0}catch(e){o.error=e instanceof Error?e.message:String(e)}return o}async restoreCourseConfig(e,t){let n={restored:0,errors:[],warnings:[]};try{if(!e.courseConfig)return n.warnings.push(`No courseConfig found in manifest, skipping CourseConfig document creation`),n;let r={_id:`CourseConfig`,...e.courseConfig,courseID:e.courseId};delete r._rev,await t.put(r),n.restored=1,logger.info(`CourseConfig document created for course: ${e.courseId}`)}catch(e){let t=e instanceof Error?e.message:JSON.stringify(e);n.errors.push(`Failed to restore CourseConfig: ${t}`),logger.error(`CourseConfig restoration failed:`,e)}return n}calculateExpectedCounts(e){let t={};for(let n of e.chunks)t[n.docType]=(t[n.docType]||0)+n.documentCount;return e.designDocs.length>0&&(t._design=e.designDocs.length),t}async cleanupFailedMigration(e){logger.info(`Cleaning up failed migration...`);try{let t=(await e.allDocs()).rows.map(e=>({_id:e.id,_rev:e.value.rev,_deleted:!0}));t.length>0&&(await e.bulkDocs(t),logger.info(`Cleaned up ${t.length} documents from failed migration`))}catch(e){throw logger.error(`Failed to cleanup documents:`,e),e}}reportProgress(e,t,n,r){this.progressCallback&&this.progressCallback({phase:e,current:t,total:n,message:r})}isLocalPath(e){return!e.startsWith(`http://`)&&!e.startsWith(`https://`)}};init_dataDirectory(),init_navigators(),init_Pipeline();var QuotaRoundRobinMixer=class{mix(e,t){if(e.length===0)return[];let n=Math.ceil(t/e.length),r=e.map(e=>[...e.weighted].sort((e,t)=>t.score-e.score).slice(0,n));for(let e=r.length-1;e>0;e--){let t=Math.floor(Math.random()*(e+1));[r[e],r[t]]=[r[t],r[e]]}let a=[],o=0,s=Array(r.length).fill(0);for(;a.length<t&&o<r.length;){o=0;for(let e=0;e<r.length&&!(a.length>=t);e++)s[e]<r[e].length?(a.push(r[e][s[e]]),s[e]++):o++}return a}};init_logger(),init_navigators();var MAX_RUNS2=10,runHistory2=[];function buildSourceSummary(e,t,n){let r=e.weighted.map(e=>e.score),a=e.weighted.filter(e=>getCardOrigin(e)===`review`).length,o=e.weighted.filter(e=>getCardOrigin(e)===`new`).length;return{sourceIndex:e.sourceIndex,sourceId:t,sourceName:n,totalCards:e.weighted.length,reviewCount:a,newCount:o,topScore:r.length>0?Math.max(...r):0,bottomScore:r.length>0?Math.min(...r):0,scoreRange:r.length>0?[Math.min(...r),Math.max(...r)]:[0,0],avgScore:r.length>0?r.reduce((e,t)=>e+t,0)/r.length:0}}function buildSourceBreakdown(e,t,n){let r=n.filter(t=>t.courseId===e),a=r.filter(e=>e.selected);return{sourceId:e,sourceName:t,reviewsProvided:r.filter(e=>e.origin===`review`).length,newProvided:r.filter(e=>e.origin===`new`).length,reviewsSelected:a.filter(e=>e.origin===`review`).length,newSelected:a.filter(e=>e.origin===`new`).length,totalSelected:a.length,selectionRate:r.length>0?a.length/r.length*100:0}}function captureMixerRun(e,t,n,r,a,o,s){let c=t.map((e,t)=>buildSourceSummary(e,n[t]||`source-${t}`,r[t])),l=new Set(s.map(e=>e.cardId)),u=new Map;t.forEach(e=>{let t=[...e.weighted].sort((e,t)=>t.score-e.score),r=new Map;t.forEach((e,t)=>{r.set(e.cardId,t+1)}),u.set(n[e.sourceIndex]||`source-${e.sourceIndex}`,r)});let d=new Map;s.forEach((e,t)=>{d.set(e.cardId,t+1)});let p=new Map;t.forEach(e=>{e.weighted.forEach(e=>{p.set(e.cardId,e)})});let m=Array.from(p.values()).map(e=>({cardId:e.cardId,courseId:e.courseId,origin:getCardOrigin(e),score:e.score,sourceIndex:t.findIndex(t=>t.weighted.some(t=>t.cardId===e.cardId)),selected:l.has(e.cardId),rankInSource:u.get(e.courseId)?.get(e.cardId),rankInMix:d.get(e.cardId)})),g=Array.from(new Set(n.filter(e=>e))).map((e,t)=>buildSourceBreakdown(e,r[t],m)),_={runId:`mix-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,timestamp:new Date,mixerType:e,requestedLimit:a,quotaPerSource:o,sourceSummaries:c,cards:m,finalCount:s.length,reviewsSelected:s.filter(e=>getCardOrigin(e)===`review`).length,newSelected:s.filter(e=>getCardOrigin(e)===`new`).length,sourceBreakdowns:g};runHistory2.unshift(_),runHistory2.length>MAX_RUNS2&&runHistory2.pop()}function printMixerSummary(e){console.group(`\u{1F3A8} Mixer Run: ${e.mixerType}`),logger.info(`Run ID: ${e.runId}`),logger.info(`Time: ${e.timestamp.toISOString()}`),logger.info(`Config: limit=${e.requestedLimit}${e.quotaPerSource?`, quota/source=${e.quotaPerSource}`:``}`),console.group(`\u{1F4E5} Input: ${e.sourceSummaries.length} sources`);for(let t of e.sourceSummaries)logger.info(` ${t.sourceName||t.sourceId}: ${t.totalCards} cards (${t.reviewCount} reviews, ${t.newCount} new)`),logger.info(` Score range: [${t.scoreRange[0].toFixed(2)}, ${t.scoreRange[1].toFixed(2)}], avg: ${t.avgScore.toFixed(2)}`);console.groupEnd(),console.group(`\u{1F4E4} Output: ${e.finalCount} cards selected (${e.reviewsSelected} reviews, ${e.newSelected} new)`);for(let t of e.sourceBreakdowns){let e=t.sourceName||t.sourceId;logger.info(` ${e}: ${t.totalSelected} selected (${t.reviewsSelected} reviews, ${t.newSelected} new) - ${t.selectionRate.toFixed(1)}% selection rate`)}console.groupEnd(),console.groupEnd()}var mixerDebugAPI={get runs(){return[...runHistory2]},showRun(e=0){if(runHistory2.length===0){logger.info(`[Mixer Debug] No runs captured yet.`);return}let t;if(typeof e==`number`){if(t=runHistory2[e],!t){logger.info(`[Mixer Debug] No run found at index ${e}. History length: ${runHistory2.length}`);return}}else if(t=runHistory2.find(t=>t.runId.endsWith(e)),!t){logger.info(`[Mixer Debug] No run found matching ID '${e}'.`);return}printMixerSummary(t)},showLastMix(){this.showRun(0)},explainSourceBalance(){if(runHistory2.length===0){logger.info(`[Mixer Debug] No runs captured yet.`);return}let e=runHistory2[0];console.group(`⚖️ Source Balance Analysis`),logger.info(`Mixer: ${e.mixerType}`),logger.info(`Requested limit: ${e.requestedLimit}`),e.quotaPerSource&&logger.info(`Quota per source: ${e.quotaPerSource}`),console.group(`Input Distribution:`);for(let t of e.sourceSummaries){let e=t.sourceName||t.sourceId;logger.info(`${e}:`),logger.info(` Provided: ${t.totalCards} cards (${t.reviewCount} reviews, ${t.newCount} new)`),logger.info(` Score range: [${t.scoreRange[0].toFixed(2)}, ${t.scoreRange[1].toFixed(2)}]`)}console.groupEnd(),console.group(`Selection Results:`);for(let t of e.sourceBreakdowns){let e=t.sourceName||t.sourceId;logger.info(`${e}:`),logger.info(` Selected: ${t.totalSelected}/${t.reviewsProvided+t.newProvided} (${t.selectionRate.toFixed(1)}%)`),logger.info(` Reviews: ${t.reviewsSelected}/${t.reviewsProvided}`),logger.info(` New: ${t.newSelected}/${t.newProvided}`),t.reviewsProvided>0&&t.reviewsSelected===0&&logger.info(` ⚠️ Had reviews but none selected!`),t.totalSelected===0&&t.reviewsProvided+t.newProvided>0&&logger.info(` ⚠️ Had cards but none selected!`)}console.groupEnd();let t=e.sourceBreakdowns.map(e=>e.selectionRate),n=t.reduce((e,t)=>e+t,0)/t.length,r=Math.max(...t.map(e=>Math.abs(e-n)));r>20&&(logger.info(`
322
322
  \u26A0\uFE0F Significant imbalance detected (max deviation: ${r.toFixed(1)}%)`),logger.info(`Possible causes:`),logger.info(` - Score range differences between sources`),logger.info(` - One source has much better quality cards`),logger.info(` - Different card availability (reviews vs new)`)),console.groupEnd()},compareScores(){if(runHistory2.length===0){logger.info(`[Mixer Debug] No runs captured yet.`);return}let e=runHistory2[0];console.group(`📊 Score Distribution Comparison`),console.table(e.sourceSummaries.map(e=>({source:e.sourceName||e.sourceId,cards:e.totalCards,min:e.bottomScore.toFixed(3),max:e.topScore.toFixed(3),avg:e.avgScore.toFixed(3),range:(e.topScore-e.bottomScore).toFixed(3)})));let t=e.sourceSummaries.map(e=>e.topScore-e.bottomScore),n=e.sourceSummaries.map(e=>e.avgScore),r=Math.max(...t)-Math.min(...t),a=Math.max(...n)-Math.min(...n);(r>.3||a>.2)&&(logger.info(`
@@ -374,4 +374,4 @@ Example:
374
374
  `,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})
375
375
  `,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
376
376
  `}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(),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(),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(),null}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(){if(!this._sessionRecord||this._sessionRecord.length===0)return;let e=this._sessionRecord.flatMap(e=>e.records).filter(e=>e.userAnswer!==void 0);if(e.length===0)return;let t=null,n=[];for(let e of this.sources)if(e.getOrchestrationContext){try{t=await e.getOrchestrationContext(),e.getStrategyIds&&n.push(...e.getStrategyIds())}catch(e){logger.warn(`[SessionController] Failed to get orchestration context: ${e}`)}if(t)break}if(!t){logger.debug(`[SessionController] No orchestration context available, skipping outcome recording`);return}let r=new Date().toISOString(),a=new Date(this.startTime).toISOString();await recordUserOutcome(t,a,r,e,n)}},_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{isReview as $,endSessionTracking as A,getRegisteredNavigatorNames as B,clearStaleSessionDebugState as C,toggleSessionOverlay as Ct,computeSpread as D,validateMigration as Dt,computeOutcomeSignal as E,userDBDebugAPI as Et,getCardHistoryID as F,importParsedCards as G,getSrsBacklogDebug as H,getCardOrigin as I,initializeNavigatorRegistry as J,initializeDataDirectory as K,getDataLayer as L,getActiveController as M,getActivePipeline as N,createOrchestrationContext as O,validateProcessorConfig as Ot,getAppDataDirectory as P,isQuestionTypeRegistered as Q,getDbPath as R,clearSrsBacklogDebug as S,startSessionTracking as St,computeEffectiveWeight as T,updateStrategyWeight as Tt,getStudySource as U,getRegisteredNavigatorRole as V,hasRegisteredNavigator as W,isGenerator as X,isFilter as Y,isQuestionRecord as Z,SessionController as _,removeDataShape as _t,DocType as a,mountSessionDebugger as at,buildStrategyStateId as b,sessionDebugAPI as bt,FileSystemError as c,pipelineDebugAPI as ct,NOT_SET as d,recordUserOutcome as dt,log as et,NavigatorRole as f,registerActiveController as ft,REVIEW_TIME_FORMAT as g,registerSeedData as gt,QuotaRoundRobinMixer as h,registerQuestionType as ht,DIVERSITY_STRENGTH as i,mountPipelineDebugger as it,ensureAppDataDirectory as j,diversityRerank as k,validateStaticCourse as kt,GuestUsername as l,processCustomQuestionsData as lt,Navigators as m,registerNavigator as mt,CourseLookup as n,mixerDebugAPI as nt,DocTypePrefixes as o,mountUserDBDebugger as ot,NavigatorRoles as p,registerDataShape as pt,initializeDataLayer as q,DIVERSITY_FLOOR as r,mountMixerDebugger as rt,ENV as s,newInterval as st,ContentNavigator as t,makeScheduledCardId as tt,Loggable as u,recordCardPresentation as ut,TagFilteredContentSource as v,removeQuestionType as vt,computeDeviation as w,updateLearningState as wt,captureMixerRun as x,snapshotQueues as xt,areQuestionRecords as y,scoreAccuracyInZone as yt,getRegisteredNavigator as z};
377
- //# sourceMappingURL=dist-D-U4aj-T.js.map
377
+ //# sourceMappingURL=dist-DFv5eKpx.js.map