@ihabdevteam/core 0.127.0 → 0.130.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/dist/components.cjs.js +178 -178
  3. package/dist/components.esm.css +2 -2
  4. package/dist/hooks.cjs.js +1 -1
  5. package/dist/i18n.cjs.js +3 -3
  6. package/dist/ihabdevteam-core-tokens.css +1 -1
  7. package/dist/ihabdevteam-core.cjs.js +182 -182
  8. package/dist/ihabdevteam-core.css +1 -1
  9. package/dist/ihabdevteam-core.d.ts +276 -66
  10. package/dist/packages/core/src/components/AudioMeter.js +29 -15
  11. package/dist/packages/core/src/components/Avatar.js +6 -2
  12. package/dist/packages/core/src/components/Badge.d.ts +5 -1
  13. package/dist/packages/core/src/components/Badge.js +19 -5
  14. package/dist/packages/core/src/components/BulkBar.d.ts +2 -1
  15. package/dist/packages/core/src/components/BulkBar.js +9 -2
  16. package/dist/packages/core/src/components/Calendar.js +1 -1
  17. package/dist/packages/core/src/components/ColorPicker.d.ts +3 -1
  18. package/dist/packages/core/src/components/ColorPicker.js +4 -2
  19. package/dist/packages/core/src/components/DatePicker.d.ts +2 -1
  20. package/dist/packages/core/src/components/DatePicker.js +9 -4
  21. package/dist/packages/core/src/components/Effect/EffectPartyPopper.d.ts +9 -0
  22. package/dist/packages/core/src/components/Effect/EffectPartyPopper.js +30 -25
  23. package/dist/packages/core/src/components/EmptyState.js +3 -1
  24. package/dist/packages/core/src/components/ErrorState.js +3 -1
  25. package/dist/packages/core/src/components/FilterPanel.js +7 -0
  26. package/dist/packages/core/src/components/Header.css +8 -0
  27. package/dist/packages/core/src/components/Header.d.ts +6 -0
  28. package/dist/packages/core/src/components/Header.js +25 -1
  29. package/dist/packages/core/src/components/Icon.css +22 -0
  30. package/dist/packages/core/src/components/Icon.d.ts +7 -3
  31. package/dist/packages/core/src/components/Icon.js +7 -1
  32. package/dist/packages/core/src/components/IconGridMenu.css +4 -2
  33. package/dist/packages/core/src/components/IconGridMenu.d.ts +1 -1
  34. package/dist/packages/core/src/components/IconGridMenu.js +6 -3
  35. package/dist/packages/core/src/components/LandingHeader.js +6 -3
  36. package/dist/packages/core/src/components/Loader.d.ts +1 -1
  37. package/dist/packages/core/src/components/Loader.js +7 -2
  38. package/dist/packages/core/src/components/NoticeBox.d.ts +5 -0
  39. package/dist/packages/core/src/components/NoticeBox.js +3 -1
  40. package/dist/packages/core/src/components/Pagination.d.ts +2 -2
  41. package/dist/packages/core/src/components/Pagination.js +2 -2
  42. package/dist/packages/core/src/components/PanelRow.js +5 -1
  43. package/dist/packages/core/src/components/PassCard/PassCard.d.ts +10 -1
  44. package/dist/packages/core/src/components/PaymentPlan.d.ts +8 -1
  45. package/dist/packages/core/src/components/Popup/ConfirmPopup.d.ts +1 -1
  46. package/dist/packages/core/src/components/Popup/ListPopup.d.ts +8 -1
  47. package/dist/packages/core/src/components/Popup/ListPopup.js +17 -2
  48. package/dist/packages/core/src/components/Popup/Popup.css +1 -1
  49. package/dist/packages/core/src/components/Popup/Popup.d.ts +9 -1
  50. package/dist/packages/core/src/components/Popup/Popup.js +21 -2
  51. package/dist/packages/core/src/components/Popup/TrainingResultPopup.js +3 -2
  52. package/dist/packages/core/src/components/Popup/WordDataUpdatePopup.d.ts +4 -1
  53. package/dist/packages/core/src/components/Popup/WordDataUpdatePopup.js +8 -3
  54. package/dist/packages/core/src/components/Popup/customerDetailUtils.d.ts +7 -2
  55. package/dist/packages/core/src/components/Popup/customerDetailUtils.js +20 -3
  56. package/dist/packages/core/src/components/ProgressIndicator.d.ts +2 -5
  57. package/dist/packages/core/src/components/PromoBanner.js +23 -6
  58. package/dist/packages/core/src/components/RadioGroup.d.ts +3 -1
  59. package/dist/packages/core/src/components/RadioGroup.js +2 -2
  60. package/dist/packages/core/src/components/Report/ReportDocument.d.ts +4 -1
  61. package/dist/packages/core/src/components/Report/ReportDocument.js +4 -1
  62. package/dist/packages/core/src/components/Section.d.ts +7 -1
  63. package/dist/packages/core/src/components/Section.js +6 -2
  64. package/dist/packages/core/src/components/SideNav.css +16 -7
  65. package/dist/packages/core/src/components/SideNav.js +11 -1
  66. package/dist/packages/core/src/components/Table.d.ts +1 -1
  67. package/dist/packages/core/src/components/TextField.css +2 -1
  68. package/dist/packages/core/src/components/TextField.js +10 -2
  69. package/dist/packages/core/src/components/Toggle.js +4 -1
  70. package/dist/packages/core/src/components/Tooltip/DebugTooltip.d.ts +1 -6
  71. package/dist/packages/core/src/components/Tooltip/DebugTooltip.js +4 -7
  72. package/dist/packages/core/src/components/Tooltip/Tooltip.js +11 -1
  73. package/dist/packages/core/src/components/Training/AudioPlayerWaveForm.js +3 -3
  74. package/dist/packages/core/src/components/Training/TrainingBlock.d.ts +8 -3
  75. package/dist/packages/core/src/components/Training/TrainingStepConfirmWithText.js +10 -11
  76. package/dist/packages/core/src/components/Training/trainingBlockButtonTypes.d.ts +4 -4
  77. package/dist/packages/core/src/components/Training/trainingScenario.d.ts +6 -2
  78. package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +3 -1
  79. package/dist/packages/core/src/components/Word/WordTableBlock.js +6 -0
  80. package/dist/packages/core/src/components/Word/WordTableButton.d.ts +2 -2
  81. package/dist/packages/core/src/components/Word/WordTableButton.js +1 -1
  82. package/dist/packages/core/src/components/Word/wordTableBlockTypes.d.ts +1 -1
  83. package/dist/packages/core/src/components/Word/wordTableScoring.d.ts +1 -4
  84. package/dist/packages/core/src/components/Word/wordTableScoring.js +1 -4
  85. package/dist/packages/core/src/components/WordTable.d.ts +1 -1
  86. package/dist/packages/core/src/components/WordTable.js +3 -1
  87. package/dist/packages/core/src/components.d.ts +3 -0
  88. package/dist/packages/core/src/components.js +5 -0
  89. package/dist/packages/core/src/hooks/useDeviceManagement.js +11 -2
  90. package/dist/packages/core/src/hooks/useFontScale.js +3 -1
  91. package/dist/packages/core/src/hooks/useLucideIcon.d.ts +3 -4
  92. package/dist/packages/core/src/hooks/useLucideIcon.js +3 -4
  93. package/dist/packages/core/src/hooks/usePasswordChange.js +20 -7
  94. package/dist/packages/core/src/hooks/useVisitAllPanel.d.ts +7 -0
  95. package/dist/packages/core/src/hooks/useVisitAllPanel.js +8 -0
  96. package/dist/packages/core/src/hooks/useWordMeanings.js +3 -0
  97. package/dist/packages/core/src/hooks/useWordTrainingFilter.d.ts +5 -0
  98. package/dist/packages/core/src/hooks/useWordTrainingFilter.js +23 -33
  99. package/dist/packages/core/src/i18n/locales/en.json +32 -5
  100. package/dist/packages/core/src/i18n/locales/ko.json +32 -5
  101. package/dist/packages/core/src/tokens.css +2 -1
  102. package/dist/packages/core/src/utils/CategoryData.js +2 -2
  103. package/dist/packages/core/src/utils/assets.js +7 -3
  104. package/dist/packages/core/src/utils/clipboard.js +16 -2
  105. package/dist/packages/core/src/utils/errorMessage.d.ts +2 -1
  106. package/dist/packages/core/src/utils/errorMessage.js +19 -2
  107. package/dist/packages/core/src/utils/getTrainingData.d.ts +8 -1
  108. package/dist/packages/core/src/utils/getTrainingData.js +8 -1
  109. package/dist/packages/core/src/utils/koreanSyllable.d.ts +15 -12
  110. package/dist/packages/core/src/utils/koreanSyllable.js +16 -13
  111. package/dist/packages/core/src/utils/lucideIconSet.d.ts +4 -3
  112. package/dist/packages/core/src/utils/lucideIconSet.js +4 -3
  113. package/dist/packages/core/src/utils/ttsResolver.d.ts +5 -0
  114. package/dist/packages/core/src/utils/wordTrainingGenerators.d.ts +3 -3
  115. package/dist/packages/core/src/utils/wordTrainingGenerators.js +28 -7
  116. package/dist/packages/core/src/version.d.ts +1 -1
  117. package/dist/packages/core/src/version.js +1 -1
  118. package/dist/utils.cjs.js +2 -2
  119. package/package.json +4 -2
package/dist/hooks.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";var i=require("react"),Se=require("react-i18next"),ru=typeof document<"u"?document.currentScript:null;function xt({storageKey:e="fontScale",baseFont:u=20,minScale:t=.8,maxScale:n=1.4,step:o=.1,lineHeightRatio:l=1.4}={}){const a=E=>Math.max(t,Math.min(n,Number(E))),[r,c]=i.useState(()=>{try{const E=localStorage.getItem(e),h=E?Number(E):1;return Number.isFinite(h)?h:1}catch{return 1}});i.useEffect(()=>{try{localStorage.setItem(e,String(r))}catch{}},[e,r]);const C=E=>{c(typeof E=="function"?h=>a(E(h)):a(E))},d=()=>C(E=>+(E+o).toFixed(6)),f=()=>C(E=>+(E-o).toFixed(6)),s=r<n-Number.EPSILON,g=r>t+Number.EPSILON,p=Math.round(u*r),w=Math.round(p*l);return{scale:r,setScale:C,increase:d,decrease:f,canIncrease:s,canDecrease:g,fontSize:p,lineHeight:w}}const Iu=i.createContext(null);function vt(e){return/max-width:\s*7[0-9][0-9]px/.test(e)}function Ft(e){const u=i.useContext(Iu),t=l=>typeof window>"u"||!window.matchMedia?!1:window.matchMedia(l).matches,[n,o]=i.useState(t(e));return i.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const l=window.matchMedia(e),a=c=>o(c.matches),r=l;return r.addEventListener?r.addEventListener("change",a):r.addListener&&r.addListener(a),o(l.matches),()=>{r.removeEventListener?r.removeEventListener("change",a):r.removeListener&&r.removeListener(a)}},[e]),u&&typeof u.mobile=="boolean"&&vt(e)?u.mobile:n}function Ru(e){const u=i.useRef(e);return i.useEffect(()=>{u.current=e}),u}function Lu(e,u){const t=Ru(u);i.useEffect(()=>{const n=()=>t.current();try{window.addEventListener(e,n)}catch{}return()=>{try{window.removeEventListener(e,n)}catch{}}},[e,t])}const au=" \xB7 ",Mu=(()=>{if(typeof document>"u")return"";const e=document.title;return e.includes(au)?e.split(au).pop()??e:e})(),ku=i.createContext(!1);function Vt(e){const u=i.useContext(ku);i.useEffect(()=>{if(u||typeof e!="string"||!e)return;const t=document.title;return document.title=Mu?`${e}${au}${Mu}`:e,()=>{document.title=t}},[e,u])}function Ht(){const{t:e}=Se.useTranslation();return i.useCallback(u=>{if(!u)return"";const t=new Date(u).getTime();if(Number.isNaN(t))return"";const n=Math.floor((Date.now()-t)/864e5);return n<=0?e("myHomework.relativeDay.today","\uC624\uB298"):n===1?e("myHomework.relativeDay.yesterday","\uC5B4\uC81C"):e("myHomework.relativeDay.daysAgo",{n})},[e])}function $t(e){const[u,t]=i.useState({current:"",next:"",confirm:""}),[n,o]=i.useState(null),[l,a]=i.useState(!1),r=i.useRef(null);i.useEffect(()=>()=>{r.current!==null&&clearTimeout(r.current)},[]);const c=i.useCallback(()=>{t({current:"",next:"",confirm:""}),o(null)},[]),C=i.useCallback(async()=>{if(!u.current){o({type:"error",text:"\uD604\uC7AC \uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694."});return}if(!u.next){o({type:"error",text:"\uC0C8 \uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694."});return}if(u.next!==u.confirm){o({type:"error",text:"\uC0C8 \uBE44\uBC00\uBC88\uD638\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."});return}a(!0);const d=e?await e(u.current,u.next):null;if(a(!1),d){o({type:"error",text:d});return}o({type:"success",text:"\uBE44\uBC00\uBC88\uD638\uAC00 \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}),t({current:"",next:"",confirm:""}),r.current!==null&&clearTimeout(r.current),r.current=setTimeout(()=>o(null),1500)},[u,e]);return{pw:u,setPw:t,pwMsg:n,setPwMsg:o,pwLoading:l,handleChangePw:C,reset:c}}const q=["\u3131","\u3132","\u3134","\u3137","\u3138","\u3139","\u3141","\u3142","\u3143","\u3145","\u3146","\u3147","\u3148","\u3149","\u314A","\u314B","\u314C","\u314D","\u314E"],ae=["\u314F","\u3150","\u3151","\u3152","\u3153","\u3154","\u3155","\u3156","\u3157","\u3158","\u3159","\u315A","\u315B","\u315C","\u315D","\u315E","\u315F","\u3160","\u3161","\u3162","\u3163"],Q=["","\u3131","\u3132","\u3133","\u3134","\u3135","\u3136","\u3137","\u3139","\u313A","\u313B","\u313C","\u313D","\u313E","\u313F","\u3140","\u3141","\u3142","\u3144","\u3145","\u3146","\u3147","\u3148","\u314A","\u314B","\u314C","\u314D","\u314E"];function V(e){if(!e)return null;const u=e.charCodeAt(0)-44032;return u<0||u>=11172?null:{cho:Math.floor(u/588),jung:Math.floor(u%588/28),jong:u%28}}function Gt(){const e=new Map;return u=>{let t=e.get(u);return t||(t=[...u].map(n=>V(n)),e.set(u,t)),t}}function de(e,u,t=0){return String.fromCharCode(44032+(e*21+u)*28+t)}function Yt(e,u){if(!e||!u||e===u||e.length!==u.length)return"random";let t=0,n=null;for(let o=0;o<e.length;o++){const l=V(e[o]),a=V(u[o]);if(!l||!a)return"random";if(l.cho===a.cho&&l.jung===a.jung&&l.jong===a.jong)continue;t++;const r=l.cho!==a.cho,c=l.jung!==a.jung,C=l.jong!==a.jong;(r?1:0)+(c?1:0)+(C?1:0)>1?n="multi":r?n="cho":c?n="jung":n="jong"}return t!==1?"random":n==="cho"?"cho":n==="jung"?"jung":n==="jong"?"jong":"random"}const we={3:["\u3131","\u3145"],5:["\u3134","\u3148"],6:["\u3134","\u314E"],9:["\u3139","\u3131"],10:["\u3139","\u3141"],11:["\u3139","\u3142"],12:["\u3139","\u3145"],13:["\u3139","\u314C"],14:["\u3139","\u314D"],15:["\u3139","\u314E"],18:["\u3142","\u3145"]};Object.fromEntries(Object.entries(we).map(([e,u])=>[u.join(""),Q[Number(e)]]));function Ut(e,u){if(!e||!u)return!1;for(const t of e){const n=V(t);if(n){if(q[n.cho]===u)return!0;if(n.jong>0){if(Q[n.jong]===u)return!0;const o=we[n.jong];if(o&&o.includes(u))return!0}}}return!1}function He(e){if(!e)return 0;let u=0;for(const t of e)V(t)&&u++;return u}function Kt(e){if(!e)return!1;let u=!1;for(const t of e){const n=V(t);if(n&&(u=!0,n.jong>0))return!1}return u}function Wt(e,u){if(e.jong<=0)return!1;if(u.includes(Q[e.jong]))return!0;const t=we[e.jong];return!!t&&t.some(n=>u.includes(n))}function qt(e,u,t){if(!e)return!1;const n=[...e],o=l=>{const a=V(n[l]);if(!a||u.cho&&!u.cho.includes(q[a.cho])||u.jung&&!u.jung.includes(ae[a.jung]))return!1;if(u.jongNone){if(a.jong>0)return!1}else if(u.jong&&!Wt(a,u.jong))return!1;return!0};if(t==="head")return o(0);if(t==="tail")return o(n.length-1);if(t==="mid"){for(let l=1;l<n.length-1;l++)if(o(l))return!0;return!1}for(let l=0;l<n.length;l++)if(o(l))return!0;return!1}const zt={cho:q.length,jung:ae.length,jong:Q.length};function Jt(e,u,t,n,o=1/0){if(!e||t<1)return[];const l=[...e].map(f=>V(f));if(l.some(f=>!f))return[];const a=l,r=a.length;if(t>r)return[];const c=zt[u],C=new Set,d=[];(function f(s,g){if(g.length===t){d.push([...g]);return}for(let p=s;p<r;p++)g.push(p),f(p+1,g),g.pop()})(0,[]);for(const f of d)if((function s(g,p){if(C.size>=o)return;if(g===f.length){const h=p.map(S=>de(S.cho,S.jung,S.jong)).join("");h!==e&&n.has(h)&&C.add(h);return}const w=f[g],E=a[w][u];for(let h=0;h<c;h++){if(h===E)continue;const S=p.slice();if(S[w]={...p[w],[u]:h},s(g+1,S),C.size>=o)return}})(0,a),C.size>=o)break;return[...C]}function Zt(e,u){if(!e||!u||e.length!==u.length)return-1;let t=0;for(let n=0;n<e.length;n++){const o=V(e[n]),l=V(u[n]);if(!o||!l)return-1;o.cho!==l.cho&&t++,o.jung!==l.jung&&t++,o.jong!==l.jong&&t++}return t}const Pu="word_pair_index_v2",xu="word_pair_index_sig_v2";let be=null;function Qt(){try{if(typeof localStorage>"u")return null;const e=localStorage.getItem(Pu),u=localStorage.getItem(xu);return!e||!u?null:{index:JSON.parse(e),sig:u}}catch{return null}}function Ae(){if(be)return be;const e=Qt();return e?(be=e.index,e.sig,be):null}function Xt(){be=null;try{typeof localStorage<"u"&&(localStorage.removeItem(Pu),localStorage.removeItem(xu))}catch{}}const vu="word_image_existence_map_v1";let Ee=null;function Fu(){if(Ee)return Ee;try{const e=typeof localStorage<"u"?localStorage.getItem(vu):null;Ee=e?JSON.parse(e):{}}catch{Ee={}}return Ee}function en(e,u){return`${e}_${u??1}`}function un(e,u){const t=Fu(),n=en(e,u);return n in t?t[n]:void 0}function Vu(){const e=Fu(),u=Object.values(e);return u.length===0?null:{total:u.length,exists:u.filter(Boolean).length}}function tn(){Ee={};try{typeof localStorage<"u"&&localStorage.removeItem(vu)}catch{}}const Hu=[{id:"wordData",labelKey:"settings.cache.group.wordData.label",subKey:"settings.cache.group.wordData.sub",keys:["word_data_cache","word_data_version"]},{id:"pairIndex",labelKey:"settings.cache.group.pairIndex.label",subKey:"settings.cache.group.pairIndex.sub",keys:["word_pair_index_v2","word_pair_index_sig_v2"]},{id:"imageCache",labelKey:"settings.cache.group.imageCache.label",subKey:"settings.cache.group.imageCache.sub",keys:["word_image_existence_map_v1"]}];function $u(e){return e.reduce((u,t)=>{try{const n=localStorage.getItem(t);return u+(n?new Blob([n]).size:0)}catch{return u}},0)}function nn(e){return e===0?"0 B":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/(1024*1024)).toFixed(2)} MB`:`${(e/(1024*1024*1024)).toFixed(2)} GB`}function on(e){const{t:u}=Se.useTranslation(),[t,n]=i.useState({}),[o,l]=i.useState(null),[a,r]=i.useState(null),[c,C]=i.useState(null),d=i.useCallback(()=>{const s={};Hu.forEach(g=>{s[g.id]=$u([...g.keys])}),n(s),typeof navigator<"u"&&navigator.storage?.estimate&&navigator.storage.estimate().then(g=>{C({usage:g.usage??0,quota:g.quota??0})}).catch(()=>{})},[]);i.useEffect(()=>{d()},[d]);const f=i.useCallback(async s=>{l(s);try{s==="wordData"?(localStorage.removeItem("word_data_cache"),localStorage.removeItem("word_data_version")):s==="pairIndex"?Xt():s==="imageCache"&&tn(),d(),e?.(u("settings.cache.cleared","\uCE90\uC2DC\uAC00 \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4."))}finally{l(null)}},[d,e,u]);return{cacheSizes:t,clearingId:o,confirmCacheId:a,setConfirmCacheId:r,storageEstimate:c,refreshCacheSizes:d,handleClearCache:f}}function ln(e){const[u,t]=i.useState(null),[n,o]=i.useState(null),l=i.useCallback(()=>{const a=Ae();if(a){const c=Object.values(a),C=c.filter(d=>d.cho.length+d.jung.length+d.jong.length>0).length;t({matched:C,total:c.length})}else t(null);const r=Vu();o(r?{exists:r.exists,total:r.total}:null)},[]);return i.useEffect(()=>{l();const a=setTimeout(l,1e3);return()=>clearTimeout(a)},[e?.length,l]),{pairStats:u,imgStats:n,setPairStats:t,setImgStats:o,refreshStats:l}}function Gu(e,u=[]){const[t,n]=i.useState(u),[o,l]=i.useState(null),[a,r]=i.useState(!1),[c,C]=i.useState(e),d=i.useRef(a);i.useEffect(()=>{d.current=a});const f=i.useRef(null);i.useEffect(()=>{if(d.current)return;const h=f.current;h!==null&&h.length===u.length&&h.every((S,B)=>S===u[B])||(f.current=u,n(u))},[u]);const s=i.useCallback(h=>{l(h),r(!1),C({...h})},[]),g=i.useCallback(()=>r(!0),[]),p=i.useCallback(()=>r(!1),[]),w=i.useCallback((h,S)=>{n(h),l(S),r(!1)},[]),E=i.useCallback(h=>{n(S=>S.filter(B=>B!==h)),l(null)},[]);return{list:t,setList:n,selected:o,setSelected:l,isEditing:a,setIsEditing:r,editForm:c,setEditForm:C,openDetail:s,startEditing:g,cancelEditing:p,commitEdit:w,remove:E}}const _e=()=>{const e=new Date;return{year:String(e.getFullYear()),month:String(e.getMonth()+1).padStart(2,"0"),day:String(e.getDate()).padStart(2,"0")}},rn={year:"",month:"",day:"",hour:"09",minute:"00",memo:""};function an(e=[]){const{list:u,setList:t,selected:n,setSelected:o,isEditing:l,setIsEditing:a,editForm:r,setEditForm:c,openDetail:C,commitEdit:d}=Gu(rn,e),{year:f,month:s,day:g}=_e(),[p,w]=i.useState({year:f,month:s,day:g,hour:"09",minute:"00",memo:""});return{visitHistory:u,visitForm:p,setVisitForm:w,setVisit:E=>h=>w(S=>({...S,[E]:h})),selectedVisit:n,setSelectedVisit:o,isEditingVisit:l,setIsEditingVisit:a,editVisitForm:r,setEditVisitForm:c,openVisitDetail:C,handleVisitSave:E=>{t(A=>[p,...A]);const{year:h,month:S,day:B}=_e();w({year:h,month:S,day:B,hour:"09",minute:"00",memo:""}),E?.()},handleVisitEditSave:()=>{d(E=>E.map(h=>h===n?r:h),r)},addVisit:E=>{t(h=>[E,...h])},removeVisit:E=>{t(h=>h.filter(S=>S!==E))},revertVisitEdit:(E,h)=>{t(S=>S.map(B=>B===h?E:B)),o(S=>S===h?E:S)}}}const Yu=e=>`${e.year.padStart(4,"0")}-${e.month.padStart(2,"0")}-${e.day.padStart(2,"0")} ${e.hour.padStart(2,"0")}:${e.minute.padStart(2,"0")}`,$e=e=>[...e].sort((u,t)=>{const n=Yu(u),o=Yu(t);return n<o?-1:n>o?1:0}),sn={year:"",month:"",day:"",hour:"09",minute:"00",memo:""};function cn(e,u=[]){const t=i.useMemo(()=>$e(u),[u]),{list:n,setList:o,selected:l,setSelected:a,isEditing:r,setIsEditing:c,editForm:C,setEditForm:d,openDetail:f,commitEdit:s,remove:g}=Gu(sn,t),[p,w]=i.useState([]),{year:E,month:h,day:S}=_e(),[B,A]=i.useState({year:E,month:h,day:S,hour:"09",minute:"00",memo:""}),D=T=>P=>A(G=>({...G,[T]:P})),b=T=>{o(le=>$e([...le,B]));const{year:P,month:G,day:X}=_e();A({year:P,month:G,day:X,hour:"09",minute:"00",memo:""}),T?.()},I=()=>{s(T=>$e(T.map(P=>P===l?C:P)),C)},L=i.useCallback(T=>{g(T)},[g]),F=i.useCallback(T=>{e({year:T.year,month:T.month,day:T.day,hour:T.hour,minute:T.minute,memo:T.memo}),g(T)},[e,g]),j=i.useCallback(T=>{o(P=>P.filter(G=>G!==T)),w(P=>[T,...P]),a(null)},[o,a]),H=i.useCallback(T=>{o(P=>$e([...P,T]))},[o]),k=i.useCallback(T=>{o(P=>P.filter(G=>G!==T))},[o]),v=i.useCallback((T,P)=>{o(G=>G.map(X=>X===P?T:X)),a(G=>G===P?T:G)},[o,a]);return{scheduleList:n,noShowList:p,addSchedule:H,removeSchedule:k,revertScheduleEdit:v,scheduleForm:B,setScheduleForm:A,setSchedule:D,selectedSchedule:l,setSelectedSchedule:a,isEditingSchedule:r,setIsEditingSchedule:c,editScheduleForm:C,setEditScheduleForm:d,openScheduleDetail:f,handleScheduleSave:b,handleScheduleEditSave:I,handleScheduleDelete:L,handleScheduleToVisit:F,handleScheduleNoVisit:j}}const iu=[{value:"10",label:"10\uAC1C\uC529 \uBCF4\uAE30"},{value:"25",label:"25\uAC1C\uC529 \uBCF4\uAE30"},{value:"50",label:"50\uAC1C\uC529 \uBCF4\uAE30"},{value:"100",label:"100\uAC1C\uC529 \uBCF4\uAE30"}];function Cn(e){const[u,t]=i.useState(""),[n,o]=i.useState("25"),[l,a]=i.useState("all"),[r,c]=i.useState(1),C=i.useMemo(()=>e.filter(({item:g,status:p})=>!(u&&!g.memo.includes(u)||l!=="all"&&p!==l)),[e,u,l]),d=Math.max(1,Math.ceil(C.length/Number(n))),f=Math.min(r,d),s=i.useMemo(()=>C.slice((f-1)*Number(n),f*Number(n)),[C,f,n]);return{vapSearch:u,setVapSearch:t,vapPageSize:n,setVapPageSize:o,vapStatus:l,setVapStatus:a,vapPage:f,setVapPage:c,vapFiltered:C,vapTotal:d,vapPageItems:s}}function dn(e,u,t){const{t:n}=Se.useTranslation(),[o,l]=i.useState(()=>{const p=t?.initialPageSize;return p&&iu.some(w=>w.value===p)?p:"25"}),[a,r]=i.useState(1),[c,C]=i.useState(u);c!==u&&(C(u),a!==1&&r(1));const d=i.useMemo(()=>iu.map(p=>({...p,label:n("visits.showN",{n:p.value})})),[n]),f=i.useCallback(p=>{l(p),r(1)},[]),s=Math.max(1,Math.ceil(e.length/Number(o))),g=Math.min(a,s);return{pageRows:i.useMemo(()=>e.slice((g-1)*Number(o),g*Number(o)),[e,g,o]),pageSizeProps:{options:d,value:o,onChange:f},paginationProps:{page:g,total:s,onChange:r},setPage:r}}function fn(){const[e,u]=i.useState(null),t=i.useCallback(o=>{u(l=>l?.key===o?{key:o,asc:!l.asc}:{key:o,asc:!0})},[]),n=i.useCallback((o,l)=>({label:o,sortDir:e?.key===l?e.asc?"asc":"desc":null,onClick:()=>t(l)}),[e,t]);return{\uC815\uB82C:e,\uCE78:n}}function gn(){const[e,u]=i.useState(!1),[t,n]=i.useState("\uC88C"),[o,l]=i.useState({\uC88C:null,\uC6B0:null}),[a,r]=i.useState({\uC88C:[],\uC6B0:[]}),[c,C]=i.useState(!1),[d,f]=i.useState("\uC88C"),s=i.useCallback(p=>{const w=p.direction;l(E=>({...E,[w]:p})),r(E=>({...E,[w]:[p,...E[w]]})),u(!1)},[]),g=i.useCallback(p=>{const w=p.direction;l(E=>({...E,[w]:p})),C(!1)},[]);return{showDevice:e,setShowDevice:u,deviceDirection:t,setDeviceDirection:n,devices:o,setDevices:l,deviceHistory:a,setDeviceHistory:r,showDeviceList:c,setShowDeviceList:C,listForSide:d,setListForSide:f,handleDeviceSubmit:s,handleSelectFromList:g}}const hn="__ihab_core_word_pool__";function Ge(){return globalThis[hn]??null}function x(e,u=Math.random){const t=e.slice();for(let n=t.length-1;n>0;n--){const o=Math.floor(u()*(n+1));[t[n],t[o]]=[t[o],t[n]]}return t}function ie(e,u,t=Math.random){return!Array.isArray(e)||e.length===0||u<=0?[]:u>=e.length?x(e,t):x(e,t).slice(0,u)}const su={SAME_SOUND_PICK:{difficulty:!0,choseong:!0,group:"discrimination"},SAME_OR_DIFF:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_SAME:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_INCLUDED:{difficulty:!0,choseong:!0,group:"discrimination"},STARTS_WITH_SAME_SOUND:{difficulty:!1,choseong:!0,group:"discrimination"},LISTEN_AND_REMEMBER_ORDER:{difficulty:!1,choseong:!0,group:"attention"},MERGE_2_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_2_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},DROP_1_FROM_2SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_1_FROM_3SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_PART_FROM_COMPOUND:{difficulty:!1,choseong:!0,group:"deletion"},DROP_FINAL_CONSONANT_FROM_1SYLL:{difficulty:!1,choseong:!0,group:"deletion"},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{difficulty:!1,choseong:!0,group:"deletion"},CHANGE_1_SYLL_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_SYLL_IN_3SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_1SYLL:{difficulty:!1,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"}},mn=q.indexOf("\u3147"),Uu={DROP_FINAL_CONSONANT_FROM_1SYLL:{syllables:1,syllable:e=>e.jong>0},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{syllables:1,syllable:e=>e.jong===0&&e.cho!==mn},MERGE_2_SYLLABLES:{syllables:2,syllable:()=>!0},MERGE_3_SYLLABLES:{syllables:3,syllable:()=>!0},MERGE_2_PHONEMES:{syllables:1,syllable:e=>e.jong===0},MERGE_3_PHONEMES:{syllables:1,syllable:e=>e.jong>0}},pn={\u3131:"\u3131",\u3132:"\u3131",\u314B:"\u3131",\u3133:"\u3131",\u313A:"\u3131",\u3134:"\u3134",\u3135:"\u3134",\u3136:"\u3134",\u3137:"\u3137",\u3145:"\u3137",\u3146:"\u3137",\u3148:"\u3137",\u314A:"\u3137",\u314C:"\u3137",\u314E:"\u3137",\u3139:"\u3139",\u313C:"\u3139",\u313D:"\u3139",\u313E:"\u3139",\u3140:"\u3139",\u3141:"\u3141",\u313B:"\u3141",\u3142:"\u3142",\u314D:"\u3142",\u313F:"\u3142",\u3144:"\u3142",\u3147:"\u3147"},Sn={\u314F:{nucleus:"\u314F"},\u3151:{glide:"j",nucleus:"\u314F"},\u3153:{nucleus:"\u3153"},\u3155:{glide:"j",nucleus:"\u3153"},\u3157:{nucleus:"\u3157"},\u315B:{glide:"j",nucleus:"\u3157"},\u315C:{nucleus:"\u315C"},\u3160:{glide:"j",nucleus:"\u315C"},\u3161:{nucleus:"\u3161"},\u3163:{nucleus:"\u3163"},\u3150:{nucleus:"\u3154/\u3150"},\u3152:{glide:"j",nucleus:"\u3154/\u3150"},\u3154:{nucleus:"\u3154/\u3150"},\u3156:{glide:"j",nucleus:"\u3154/\u3150"},\u3158:{glide:"w",nucleus:"\u314F"},\u3159:{glide:"w",nucleus:"\u3154/\u3150"},\u315A:{glide:"w",nucleus:"\u3154/\u3150"},\u315D:{glide:"w",nucleus:"\u3153"},\u315E:{glide:"w",nucleus:"\u3154/\u3150"},\u315F:{glide:"w",nucleus:"\u3163"},\u3162:{glide:"\u0270",nucleus:"\u3163"}};function Ku(e){return pn[e]??e}const cu={cho:q,jung:ae,jong:Q},K=e=>Array.isArray(e)?e.length>0:!!e;function Cu(e,u){if(e.length!==u.length)return!1;for(let t=0;t<e.length;t++){const n=e[t],o=u[t];if(!(!n||!o)&&(n.cho!==o.cho&&q[n.cho]==="\u3147"!=(q[o.cho]==="\u3147")||n.jong!==o.jong&&n.jong===0!=(o.jong===0)))return!0}return!1}function En(e,u,t){const n=t.pronOf(e),o=t.decompOf,l=t.sameStructureOnly&&o?o(n):null,a=[];for(const r of u)r!==e&&(t.okSet&&!t.okSet.has(r)||t.pronOf(r)!==n&&(l&&o&&Cu(l,o(t.pronOf(r)))||a.push(r)));return a}function Wu(e,u,t){const n=u?.[e];if(!n)return[];const o=t.kind?n[t.kind]??[]:[...n.cho??[],...n.jung??[],...n.jong??[]];return En(e,o,t)}function yn(e,u,t,n,o,l,a){const r=["cho","jung","jong"].filter(s=>K(e[s])),c={};for(const s of r){const g=e[s];c[s]=new Set(Array.isArray(g)?g:[g])}const C=o==="pron",d=new Map;for(const s of u){const g=t(l(s));if(g.some(h=>!h))continue;let p=g;if(!C&&(p=t(s),p.length!==g.length||p.some(h=>!h)))continue;const w=g.length,E=d.get(w);E?E.push({w:s,dPron:g,dPos:p}):d.set(w,[{w:s,dPron:g,dPos:p}])}const f=new Map;for(const[s,g]of d){const p=new Map,w=(E,h)=>{const S=E.dPos[h];return S!=null&&r.every(B=>c[B].has(cu[B][S[B]]))};for(const E of g){let h;if(a==="head")h=w(E,0)?0:-1;else if(a==="tail")h=w(E,s-1)?s-1:-1;else if(a==="mid"){h=-1;for(let B=1;B<s-1;B++)if(w(E,B)){h=B;break}}else h=E.dPos.findIndex(B=>B!=null&&r.every(A=>c[A].has(cu[A][B[A]])));if(h<0)continue;const S=p.get(h);S?S.push(E):p.set(h,[E])}for(const[E,h]of p){const S=new Set(r.map(D=>E+":"+D)),B=D=>{let b="";for(let I=0;I<s;I++){const L=D[I];for(const F of["cho","jung","jong"])b+=(S.has(I+":"+F)?"*":L[F])+"."}return b},A=new Map;for(const D of g){const b=B(D.dPron),I=A.get(b);I?I.push(D):A.set(b,[D])}for(const D of h){const b=A.get(B(D.dPron))??[],I=[];for(const L of b){if(L.w===D.w)continue;let F=!0;for(const j of r){const H=D.dPron[E][j],k=L.dPron[E][j];if(k===H){F=!1;break}if(C&&c[j].has(cu[j][k])){F=!1;break}}F&&(n&&Cu(D.dPron,L.dPron)||I.push(L.w))}f.set(D.w,I)}}}return f}const Bn=e=>e==null?[]:Array.isArray(e)?e:[e];function wn(e){if([...e].length!==1)return"";const u=V(e);if(!u)return"";const t=Ku(Q[u.jong]),n=t===""?0:Q.indexOf(t);return de(u.cho,u.jung,n<0?0:n)}function qu(e,u){return u.get(e)||wn(e)||e}function du(e){return e?K(e.cho)?"cho":K(e.jung)?"jung":K(e.jong)?"jong":null:null}function ye(e,u){const t=(n,o)=>!K(n)||Bn(n).includes(o);return t(u.cho,q[e.cho])&&t(u.jung,ae[e.jung])&&t(u.jong,Q[e.jong])}function De(e,u,t){const n=[...e];if(t!=="pron")return n.map(l=>V(l));const o=[...u.get(e)||e];return o.length!==n.length?n.map(l=>V(l)):o.map(l=>V(l))}function Oe(e,u,t,n,o){const l=u==="cho"?q:u==="jung"?ae:Q,a=e[u],r=[],c=new Set([qu(t,o)]),C=x(l.map((d,f)=>f).filter(d=>d!==a&&(u!=="cho"||l[d]!=="\u3147")&&(u!=="jong"||d!==0)));for(const d of C){if(r.length>=n)break;const f=u==="cho"?de(d,e.jung,e.jong):u==="jung"?de(e.cho,d,e.jong):de(e.cho,e.jung,d),s=qu(f,o);c.has(s)||(c.add(s),r.push(f))}return r}function bn(e,u,t,n,o,l=null){const a=[...e];if(a.length!==2)return null;const r=a.map(f=>V(f));if(r.some(f=>!f))return null;const c=De(e,t,n);if(c.some(f=>!f))return null;const C=du(u);let d=C&&u?c.map((f,s)=>ye(f,u)?s:-1).filter(f=>f>=0):[0,1];if(l!=null&&(d=d.filter(f=>f!==l)),!d.length)return null;for(const f of x(d)){const s=a[f];if(!o.has(s))continue;const g=Oe(r[f],C??"cho",s,40,t),p=[];for(const w of g)if(w!==s&&o.has(w)&&!p.includes(w)&&p.push(w),p.length>=2)break;if(!(p.length<2))return{question:e,distractors:[s,...p]}}return null}function An(e,u,t,n,o,l=null){const a=[...e];if(a.length!==3)return null;const r=a.map(f=>V(f));if(r.some(f=>!f))return null;const c=De(e,t,n);if(c.some(f=>!f))return null;const C=du(u),d=C&&u?c.map((f,s)=>ye(f,u)?s:-1).filter(f=>f>=0):[0,1,2];if(!d.length)return null;for(const f of x(d))for(const s of x([0,1,2].filter(g=>g!==f&&(l==null||g===l)))){const g=[0,1,2].filter(S=>S!==s),p=g.map(S=>a[S]).join("");if(!o.has(p))continue;const w=g.indexOf(f),E=Oe(r[f],C??"cho",a[f],40,t),h=[];for(const S of E){const B=g.map(D=>a[D]);B[w]=S;const A=B.join("");if(A!==p&&o.has(A)&&!h.includes(A)&&h.push(A),h.length>=2)break}if(!(h.length<2))return{question:e,distractors:[p,...h]}}return null}function _n(e,u,t,n,o,l=null){const a=[...e],r=a.length;if(r<2)return null;const c=[];for(let d=1;d<=r-1;d++)c.push({remain:a.slice(0,d).join(""),dropped:a.slice(d).join(""),droppedEnd:1}),c.push({remain:a.slice(r-d).join(""),dropped:a.slice(0,r-d).join(""),droppedEnd:0});const C=du(u);for(const{remain:d,dropped:f,droppedEnd:s}of x(c)){if(l!=null&&s!==l||d===e||!o.has(d)||!o.has(f))continue;const g=[...d],p=g.map(h=>V(h));if(p.some(h=>!h))continue;const w=De(d,t,n);if(w.some(h=>!h))continue;const E=C&&u?w.map((h,S)=>ye(h,u)?S:-1).filter(h=>h>=0):g.map((h,S)=>S);if(E.length)for(const h of x(E)){const S=Oe(p[h],C??"cho",g[h],40,t),B=[];for(const A of S){const D=[...g];D[h]=A;const b=D.join("");if(b!==d&&o.has(b)&&!B.includes(b)&&B.push(b),B.length>=2)break}if(B.length>=2)return{question:e,distractors:[d,...B]}}}return null}function Dn(e,u,t,n,o,l=null){if([...e].length!==1)return null;const a=V(t.get(e)||e);if(!a||a.jong===0)return null;const r=de(a.cho,a.jung,0),c=Oe({cho:a.cho,jung:a.jung,jong:0},"cho",r,2,t);return c.length<2?null:{question:e,distractors:[r,...c]}}const fu=q.indexOf("\u3147");function On(e,u,t,n,o,l=null){if([...e].length!==1)return null;const a=V(t.get(e)||e);if(!a||a.jong!==0||a.cho===fu)return null;const r=de(fu,a.jung,0),c=Oe({cho:fu,jung:a.jung,jong:0},"jung",r,2,t);return c.length<2?null:{question:e,distractors:[r,...c]}}function Nn(e){const u=new Map;for(const t of e){const n=[...t],o=n.length;if(!(o<2||o>3))for(let l=0;l<o;l++){let a=o+"|"+l+"|";for(let c=0;c<o;c++)a+=c===l?"*":n[c];const r=u.get(a);r?r.push(t):u.set(a,[t])}}return u}function Tn(e,u,t,n,o,l=null,a=null,r=2){const c=[...e],C=c.length;if(C<2||C>3)return null;const d=c.map(S=>V(S));if(d.some(S=>!S))return null;const f=De(e,t,n);if(f.some(S=>!S))return null;const s=S=>t.get(S)??S,g=s(e),p=!!u&&(K(u.cho)||K(u.jung)||K(u.jong)),w=!!a&&(K(a.cho)||K(a.jung)||K(a.jong)),E=S=>{let B=C+"|"+S+"|";for(let A=0;A<C;A++)B+=A===S?"*":c[A];return B};let h;if(l!=null){if(l>=C||p&&!ye(f[l],u))return null;h=[l]}else p?h=f.map((S,B)=>ye(S,u)?B:-1).filter(S=>S>=0):h=Array.from({length:C},(S,B)=>B);for(const S of x(h)){const B=o.get(E(S))??[],A=[],D=[];for(const j of B){if(j===e)continue;const H=[...j].map(P=>V(P)),k=d[S],v=H[S];if(!k||!v)continue;let T=0;if(k.cho!==v.cho&&T++,k.jung!==v.jung&&T++,k.jong!==v.jong&&T++,!(T<r||s(j)===g))if(w){const P=De(j,t,n)[S];P&&ye(P,a)?A.push(j):D.push(j)}else A.push(j)}if(!A.length)continue;const b=x(A)[0],I=[],L=new Set([g,s(b)]),F=w?D:A.filter(j=>j!==b);for(const j of x(F)){const H=s(j);if(!L.has(H)&&(L.add(H),I.push(j),I.length>=2))break}if(!w&&I.length<2)for(const j of x(B)){if(j===e||j===b)continue;const H=s(j);if(!L.has(H)&&(L.add(H),I.push(j),I.length>=2))break}if(!(I.length<2))return{question:e,distractors:[b,...I]}}return null}let Ye=null,zu=null,Ju=null;function jn(){const e=Ge();if(e&&e.entries.length>0){const u=Ae();if(Ye&&zu===e&&Ju===u)return Ye;const t=new Set,n=[];for(const o of e.entries)!o.word||t.has(o.word)||(t.add(o.word),n.push({w:o.word,s:o.syllables,p:u?.[o.word]?[...u[o.word].cho??[],...u[o.word].jung??[],...u[o.word].jong??[]]:[],pron:o.pronunciation||o.word,grade:o.grade}));return Ye=n,zu=e,Ju=u,Ye}return[]}const ue=new Proxy([],{get(e,u){const t=jn(),n=t[u];return typeof n=="function"?n.bind(t):n}});function Ue(e){return e.length?e[Math.floor(Math.random()*e.length)]:void 0}function te(e,u){if(u>=e.length)return x(e);if(u===0)return[];const t=e.slice();for(let n=0;n<u;n++){const o=n+Math.floor(Math.random()*(t.length-n)),l=t[n];t[n]=t[o],t[o]=l}return t.slice(0,u)}let gu=null,Zu=null;function fe(){const e=Ge();if(gu&&Zu===e)return gu;const u=new Map;for(const t of ue)t.w&&u.set(t.w,t.pron);return gu=u,Zu=e,u}function J(e){return fe().get(e)||e}function hu(e,u,t=new Set){const n=[];for(const o of x(e)){if(n.length>=u)break;const l=J(o);t.has(l)||(t.add(l),n.push(o))}return n}let In=0;function z(e){return`${e}-rt-${++In}`}function Ne(e){const u=Vu();if(!u||u.total===0){const n=new Set;for(const o of e)n.add(o);return n}const t=new Set;for(const n of e)un(n)===!0&&t.add(n);return t}const Ke=new Map;let Qu=null,Xu=null;function Te(e){return e==null?"":Array.isArray(e)?e.slice().sort().join(","):e}function et(e){const u=Te(e.choseong),t=e.composition,n=t?.syllable==null?"":Array.isArray(t.syllable)?t.syllable.slice().sort().join(","):String(t.syllable),o=t?`${Te(t.cho)}/${Te(t.jung)}/${Te(t.jong)}/${t.jongNone?"N":""}/${n}`:"",l=Te(e.grade);return`${e.difficulty??""}|${u}|${o}|${e.excludeNoImage?"1":"0"}|${e.count??""}|x${e.contrastCount??1}|${e.fullCount?"F":""}|s${e.sameStructureOnly===!1?"0":"1"}|v${e.phonemeView==="pron"?"p":"c"}|g${l}|t${e.targetSyllable??""}|c${e.choicesPerItem??""}`}async function Z(e){const u=Ge(),t=Ae();(u!==Qu||t!==Xu)&&(Ke.clear(),Qu=u,Xu=t);const n=et(e);return Ke.has(n)||Ke.set(n,Ln(e)),Ke.get(n)}function Rn(e){if(!e)return null;const u=a=>a==null?null:Array.isArray(a)?a.length?a:null:[a],t=u(e.cho),n=u(e.jung),o=!!e.jongNone,l=o?null:u(e.jong);return t||n||l||o?o&&!t&&!n&&!l?a=>Kt(a):a=>qt(a,{cho:t,jung:n,jong:l,jongNone:o}):null}async function Ln(e){const{difficulty:u=null,choseong:t=null,composition:n=null,targetSyllable:o=null,excludeNoImage:l=!1}=e,a=e.grade&&e.grade.length>0?new Set(e.grade):null,r=e.sameStructureOnly??!0,c=e.phonemeView==="pron"?"pron":"char",C=Math.max(1,e.contrastCount??1),d=u==="cho"||u==="jung"||u==="jong",f=d&&C>=2,s=u==="count",g=t?new Set(Array.isArray(t)?t:[t]):null,p=n?.syllable!=null?new Set(Array.isArray(n.syllable)?n.syllable:[n.syllable]):null,w=n?[Rn(n),p?y=>p.has(He(y)):null].filter(y=>y!=null):[],E=u==="random"||u===null,h=E||s,S=E||f||s;let B=ue.filter(y=>!y.w||a&&(!y.grade||!a.has(y.grade))?!1:S?!0:Array.isArray(y.p)&&y.p.length>0);g&&(B=B.filter(y=>{for(const _ of g)if(Ut(y.w,_))return!0;return!1})),w.length>0&&(B=B.filter(y=>{const _=c==="pron"?J(y.w):y.w;return w.every(Y=>Y(_))})),o&&(B=B.filter(y=>y.w[0]===o));let A;if(l){const y=new Set;for(const _ of B)if(y.add(_.w),Array.isArray(_.p))for(const Y of _.p)y.add(Y);if(h)for(const _ of ue)_.w&&y.add(_.w);A=Ne(y)}else{const y=new Set;for(const _ of B)if(y.add(_.w),Array.isArray(_.p))for(const Y of _.p)y.add(Y);if(h)for(const _ of ue)_.w&&y.add(_.w);A=y}let D=null;if(f){const y=new Set;for(const _ of ue)_.w&&y.add(_.w);D=l?Ne(y):y}const b=B.filter(y=>A.has(y.w)),I=600,L=Array.from(A),F=L.length>I?te(L,I):L,j=s&&n!=null&&(K(n.cho)||K(n.jung)||K(n.jong)),H=2500,k=new Map;if(s&&!j&&C>=2){for(const y of L){const _=He(y),Y=k.get(_);Y?Y.push(y):k.set(_,[y])}for(const[y,_]of k)_.length>H&&k.set(y,te(_,H))}const v=Gt(),T=j?yn(n,L,v,r,c,J):null,P=500,G=1500,X=e.fullCount?b:u==="random"?b.length>P?te(b,P):b:b.length>G?te(b,G):b,le=Ae(),re=[];for(const y of X){let _;const Y=J(y.w);if(f)_=Jt(y.w,u,C,D,24).filter($=>J($)!==Y);else if(s)j?_=(T.get(y.w)??[]).filter($=>J($)!==Y):C<=1?_=Wu(y.w,le,{okSet:A,pronOf:J,decompOf:v,sameStructureOnly:!1}):_=(k.get(He(y.w))??[]).filter($=>{if($===y.w||J($)===Y)return!1;const ee=Zt(y.w,$);return C>=5?ee>=5:ee===C});else if(E)_=F.filter($=>$!==y.w&&$.length===y.w.length&&J($)!==Y);else{const $=u;_=Wu(y.w,le,{kind:$,okSet:A,pronOf:J,decompOf:v,sameStructureOnly:!1}),_.length===0&&(_=(F.length>30?te(F,30):F).filter(ee=>ee!==y.w&&Yt(y.w,ee)===u&&J(ee)!==Y))}if(r&&_.length>0&&(d||s&&!j)){const $=v(J(y.w));_=_.filter(ee=>!Cu($,v(J(ee))))}_.length!==0&&re.push({word:y,usable:_})}return re}async function ut(e,u){const{choicesPerItem:t=3,count:n=10}=u,o=t-1,l=(await Z(u)).filter(r=>r.usable.length>=o),a=[];for(const r of x(l)){if(a.length>=n)break;const c=hu(r.usable,o);if(c.length<o)continue;const C=x([r.word.w,...c]);a.push({id:z(e+"-item"),index:a.length+1,word:r.word.w,syllables:r.word.s,choices:C,answerIndex:C.indexOf(r.word.w)})}return a}async function Mn(e){const{choicesPerItem:u=3,count:t=10}=e,n=u-1,o=await Z({...e,difficulty:null});if(o.length<u)return[];const l=[],a=x([...o]);for(const r of a){if(l.length>=t)break;const c=r.word.w,C=[...r.word.pron||c],d=Ue(C);if(!d)continue;const f=o.filter(p=>p.word.w!==c&&p.word.s===r.word.s&&!(p.word.pron||p.word.w).includes(d)&&p.word.pron!==r.word.pron);if(f.length<n)continue;const s=hu(f.map(p=>p.word.w),n);if(s.length<n)continue;const g=x([c,...s]);l.push({id:z("HPI-item"),index:l.length+1,targetSyllable:d,word:c,choices:g,answerIndex:g.indexOf(c)})}return l}async function kn(e){const{count:u=10}=e,t=(await Z(e)).filter(n=>n.usable.length>=1);return Array.from({length:u},(n,o)=>{const l=Ue(t);if(!l)return null;const a=o%2===0;let r;if(a)r=[l.word.w,l.word.w];else{const c=Ue(l.usable);r=Math.random()<.5?[l.word.w,c]:[c,l.word.w]}return{id:z("SOD-item"),index:o+1,word:l.word.w,pair:r,same:a}}).filter(n=>!!n)}async function Pn(e){const{choicesPerItem:u=3,count:t=10}=e,n=u-1,o=await Z({...e,difficulty:null});if(o.length<u+1)return[];const l=o.map(s=>s.word.w),a=new Map(o.map(s=>[s.word.w,s.word.pron])),r=s=>(a.get(s)||s)[0]??"",c={};for(const s of o){const g=r(s.word.w);g&&(c[g]||(c[g]=[]),c[g].push(s.word.w))}const C=Object.entries(c).filter(([,s])=>s.length>=2).map(([s])=>s);if(C.length===0)return[];const d=[],f=x([...C]);for(let s=0;d.length<t&&s<t*4;s++){const g=f[s%f.length],p=c[g];if(p.length<2)continue;const w=x([...p]),E=w[0],h=w[1];if(!E||!h||E===h||(a.get(E)||E)===(a.get(h)||h))continue;const S=a.get(h)||h,B=l.filter(b=>r(b)!==g&&b!==E&&b!==h&&b.length===h.length&&(a.get(b)||b)!==S);if(B.length<n)continue;const A=hu(B,n);if(A.length<n)continue;const D=x([h,...A]);d.push({id:z("SWS-item"),index:d.length+1,sourceWord:E,targetSyllable:g,word:h,choices:D,answerIndex:D.indexOf(h)})}return d}function tt(e,u,t){return te(e,u).map((n,o)=>{const l=Ue(n.usable)??"",a=[...n.word.w],r=[...l],c=a.findIndex((d,f)=>d!==r[f]),C=x(n.usable.filter(d=>d&&d!==l)).slice(0,2);return{id:z(t),index:o+1,word:n.word.w,original:n.word.w,changed:l,changedFrom:c>=0?a[c]:"",changedTo:c>=0?r[c]:"",distractors:C}})}async function nt(e,u,t){const{count:n=10}=u,o=fe(),l=ue.filter(g=>g.w&&g.s===e),a=u.excludeNoImage?Ne(l.map(g=>g.w)):null,r=a?l.filter(g=>a.has(g.w)):l,c=new Set(r.map(g=>g.w)),C=Nn(c),d=u.phonemeView??"char",f=u.composition??null,s=[];for(const g of x(r)){if(s.length>=n)break;const p=Tn(g.w,f,o,d,C,null,null);if(!p)continue;const w=p.distractors[0],E=[...g.w],h=[...w],S=E.findIndex((B,A)=>B!==h[A]);s.push({id:z(t),index:s.length+1,word:g.w,original:g.w,changed:w,changedFrom:S>=0?E[S]:"",changedTo:S>=0?h[S]:"",distractors:p.distractors.slice(1)})}return s}async function xn(e){return nt(2,e,"CS2-item")}async function vn(e){return nt(3,e,"CS3-item")}async function Fn(e){const u=(await Z({...e,difficulty:"count",contrastCount:1})).filter(t=>t.word.s===1&&t.usable.length>=1);return tt(u,e.count??10,"CP1-item")}async function Vn(e){const u=e.difficulty&&e.difficulty!=="random"?e.difficulty:"count",t=(await Z({...e,difficulty:u,contrastCount:1})).filter(n=>n.word.s===2&&n.usable.length>=1);return tt(t,e.count??10,"CP2-item")}async function Hn(e){const{count:u=10}=e,t=(await Z({...e})).filter(n=>n.word.s===2);return te(t,u).map((n,o)=>({id:z("M2S-item"),index:o+1,word:n.word.w,answer:n.word.w,parts:[...n.word.w]}))}async function $n(e){const{count:u=10}=e,t=(await Z({...e})).filter(n=>n.word.s===3);return te(t,u).map((n,o)=>({id:z("M3S-item"),index:o+1,word:n.word.w,answer:n.word.w,parts:[...n.word.w]}))}async function Gn(e){const{count:u=10}=e,t=(await Z({...e})).filter(r=>r.word.s===2),n=fe(),o=new Set(ue.map(r=>r.w)),l=e.phonemeView??"char",a=[];for(const r of x(t)){if(a.length>=u)break;const c=bn(r.word.w,e.composition??null,n,l,o);if(!c)continue;const[C,...d]=c.distractors,f=[...r.word.w],s=f[0]===C?f[1]:f[0];a.push({id:z("D2-item"),index:a.length+1,original:r.word.w,word:r.word.w,dropped:s,missingResult:C,distractors:d})}return a}async function Yn(e){const{count:u=10}=e,t=(await Z({...e})).filter(r=>r.word.s===3),n=fe(),o=new Set(ue.map(r=>r.w)),l=e.phonemeView??"char",a=[];for(const r of x(t)){if(a.length>=u)break;const c=An(r.word.w,e.composition??null,n,l,o);if(!c)continue;const[C,...d]=c.distractors,f=[...r.word.w];let s="";for(let g=0;g<f.length;g++)if(f.filter((p,w)=>w!==g).join("")===C){s=f[g];break}a.push({id:z("D3-item"),index:a.length+1,original:r.word.w,word:r.word.w,dropped:s,missingResult:C,distractors:d})}return a}async function Un(e){const{count:u=10}=e,t=(await Z({...e})).filter(r=>r.word.s>=2),n=fe(),o=new Set(ue.map(r=>r.w)),l=e.phonemeView??"char",a=[];for(const r of x(t)){if(a.length>=u)break;const c=_n(r.word.w,e.composition??null,n,l,o);if(!c)continue;const[C,...d]=c.distractors,f=r.word.w,s=f.startsWith(C)?f.slice(C.length):f.endsWith(C)?f.slice(0,f.length-C.length):"";a.push({id:z("DPC-item"),index:a.length+1,original:f,word:f,dropped:s,missingResult:C,distractors:d})}return a}async function Kn(e){const{count:u=10}=e,t=(await Z({...e})).map(n=>n.word.w);return t.length<3?[]:Array.from({length:u},(n,o)=>{const l=te(t,3);return{id:z("LRO-item"),index:o+1,sequence:l,choices:x(l)}})}function We(e,u,t){const n=ue.filter(a=>a.w&&a.s===e),o=u?Ne(n.map(a=>a.w)):null,l=[];for(const a of n)if(!(o&&!o.has(a.w))){if(t){const r=V(a.w);if(!r||!t(r))continue}l.push(a)}return l}function Wn(e){const u=We(1,e.excludeNoImage??!1,t=>t.jong===0);return te(u,e.count??10).map((t,n)=>{const o=V(t.w);return{id:z("M2P-item"),index:n+1,parts:[q[o.cho],ae[o.jung]],answer:t.w,word:t.w}})}function qn(e){const u=We(1,e.excludeNoImage??!1,t=>t.jong>0&&!we[t.jong]);return te(u,e.count??10).map((t,n)=>{const o=V(t.w);return{id:z("M3P-item"),index:n+1,parts:[q[o.cho],ae[o.jung],Q[o.jong]],answer:t.w,word:t.w}})}function zn(e){const u=Uu.DROP_FINAL_CONSONANT_FROM_1SYLL,t=We(u.syllables,e.excludeNoImage??!1,u.syllable),n=fe(),o=[];for(const l of x(t)){if(o.length>=(e.count??10))break;const a=Dn(l.w,null,n);if(!a)continue;const[r,...c]=a.distractors;o.push({id:z("DFC-item"),index:o.length+1,original:l.w,word:l.w,result:r,distractors:c})}return o}function Jn(e){const u=Uu.REMOVE_CONSONANT_AND_IDENTIFY_PHONEME,t=We(u.syllables,e.excludeNoImage??!1,u.syllable),n=fe(),o=[];for(const l of x(t)){if(o.length>=(e.count??10))break;const a=On(l.w,null,n);if(!a)continue;const r=V(n.get(l.w)||l.w);if(!r)continue;const[c,...C]=a.distractors;o.push({id:z("RCP-item"),index:o.length+1,base:l.w,word:l.w,missingConsonant:q[r.cho],remaining:c,distractors:C})}return o}const qe=new Map;let ot=null,lt=null;async function rt(e,u={}){const t=Ge(),n=Ae();(t!==ot||n!==lt)&&(qe.clear(),ot=t,lt=n);const o=`${e}:${et(u)}`;if(qe.has(o))return qe.get(o);const l=await Qn(e,u);return qe.set(o,l),l}const Zn={SAME_SOUND_PICK:e=>ut("SSP",e),HEAR_AND_PICK_SAME:e=>ut("HPS",e),HEAR_AND_PICK_INCLUDED:e=>Mn(e),SAME_OR_DIFF:e=>kn(e),STARTS_WITH_SAME_SOUND:e=>Pn(e),LISTEN_AND_REMEMBER_ORDER:e=>Kn(e),MERGE_2_SYLLABLES:e=>Hn(e),MERGE_3_SYLLABLES:e=>$n(e),MERGE_2_PHONEMES:e=>Wn(e),MERGE_3_PHONEMES:e=>qn(e),DROP_1_FROM_2SYLL:e=>Gn(e),DROP_1_FROM_3SYLL:e=>Yn(e),DROP_PART_FROM_COMPOUND:e=>Un(e),DROP_FINAL_CONSONANT_FROM_1SYLL:e=>zn(e),REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:e=>Jn(e),CHANGE_1_SYLL_IN_2SYLL:e=>xn(e),CHANGE_1_SYLL_IN_3SYLL:e=>vn(e),CHANGE_1_PHONEME_IN_1SYLL:e=>Fn(e),CHANGE_1_PHONEME_IN_2SYLL:e=>Vn(e)};async function Qn(e,u={}){const t=Zn[e];return t?await t(u):[]}async function Xn(e){const u=[null,"count"],t=Object.keys(su);let n=0;for(const o of u)for(const l of t){const a=su[l];rt(l,{difficulty:a.difficulty?o:null,choseong:null,count:10,excludeNoImage:e}).catch(()=>{}),++n%6===0&&await new Promise(r=>setTimeout(r,0))}}async function eo(e){return(await Z({...e,fullCount:!0})).length}async function uo(e={}){const u=[];for(const r of ue)r.w&&u.push(r.w);const t=e.excludeNoImage?Ne(u):u,n=new Set,o=new Set,l=new Set,a=new Set;for(const r of t){a.add(He(r));for(const c of r){const C=V(c);if(C&&(q[C.cho]!=="\u3147"&&n.add(q[C.cho]),o.add(ae[C.jung]),C.jong>0)){l.add(Q[C.jong]);const d=we[C.jong];d&&d.forEach(f=>l.add(f))}}}return{cho:n,jung:o,jong:l,syllable:a}}const ge="\uC804\uCCB4";function at(){const{t:e}=Se.useTranslation();return i.useMemo(()=>({difficulty:e("wordSearch.filter.difficulty","\uB4F1\uAE09"),syllables:e("wordSearch.filter.syllables","\uC74C\uC808 \uC218"),syllable5plus:e("wordSearch.filter.syllable5plus","5\uC74C\uC808 \uC774\uC0C1"),partOfSpeech:e("wordSearch.filter.partOfSpeech","\uD488\uC0AC"),wordType:e("wordSearch.filter.wordType","\uC720\uD615"),posMap:{[e("wordSearch.filter.pos.noun","\uCCB4\uC5B8(\uBA85\uC0AC, \uC218\uC0AC)")]:["\uBA85","\uC218"],[e("wordSearch.filter.pos.verb","\uC6A9\uC5B8(\uB3D9\uC0AC, \uD615\uC6A9\uC0AC)")]:["\uB3D9","\uD615"],[e("wordSearch.filter.pos.modifier","\uC218\uC2DD\uC5B8(\uBD80\uC0AC, \uAD00\uD615\uC0AC)")]:["\uBD80","\uAD00"]},typeMap:{[e("wordSearch.filter.type.native","\uACE0\uC720\uC5B4")]:"\uACE0\uC720",[e("wordSearch.filter.type.sino","\uD55C\uC790\uC5B4")]:"\uD55C\uC790",[e("wordSearch.filter.type.foreign","\uC678\uB798\uC5B4")]:"\uC678\uB798",[e("wordSearch.filter.type.mixed","\uD63C\uC885\uC5B4")]:"\uD63C\uC885"}}),[e])}function it(e,u,t){return{label:u.difficulty,items:[1,2,3,4].map(n=>e("wordSearch.filter.grade",{n})),multiple:!0,allOption:!0,allLabel:t?.allLabel,labelAction:t?.labelAction,labelInfo:t?.labelInfo}}function st(e){return{label:e.partOfSpeech,items:Object.keys(e.posMap),multiple:!0,allOption:!0}}function ct(e){return{label:e.wordType,items:Object.keys(e.typeMap),multiple:!0,allOption:!0}}function to(e,u){return{label:u.syllables,items:[e("wordSearch.filter.syllable",{n:1}),e("wordSearch.filter.syllable",{n:2}),e("wordSearch.filter.syllable",{n:3}),e("wordSearch.filter.syllable",{n:4}),u.syllable5plus],multiple:!0,allOption:!0}}function no(e,u){const t=[e("wordPairs.filter.onlyHasImage","\uC774\uBBF8\uC9C0 \uC788\uB294 \uB2E8\uC5B4\uB9CC")];return u?.includeStructure&&t.push(e("wordPairs.filter.onlySameStructure","\uC74C\uC18C \uAD6C\uC870 \uAC19\uC740 \uB2E8\uC5B4\uB9CC")),{label:e("wordPairs.filter.selectLabel","\uC120\uD0DD"),items:t,multiple:!0,labelAction:u?.labelAction,labelInfo:u?.labelInfo}}function oo(e,u){const{label:t,headValue:n,midValue:o,tailValue:l,includeMid:a=!0,headDisabled:r,midDisabled:c,tailDisabled:C,allOptionDisabled:d,groupLabel:f,labelAction:s}=u;return{label:t,...f?{groupLabel:f}:{},...s?{labelAction:s}:{},allOption:!0,allLabel:e("wordSearch.filter.positionAny",{defaultValue:"\uBB34\uAD00"}),...d?{allOptionDisabled:d}:{},items:[{value:n,displayLabel:e("wordSearch.filter.positionHead",{defaultValue:"\uC5B4\uB450"}),disabled:r},...a?[{value:o,displayLabel:e("wordSearch.filter.positionMid",{defaultValue:"\uC5B4\uC911"}),disabled:c}]:[],{value:l,displayLabel:e("wordSearch.filter.positionTail",{defaultValue:"\uC5B4\uB9D0"}),disabled:C}]}}function lo(e,u,t){if(u===ge){const{[t]:l,...a}=e;return a}const n=e[t]??[],o=n.includes(u)?n.filter(l=>l!==u):[...n,u];if(o.length===0){const{[t]:l,...a}=e;return a}return{...e,[t]:o}}Object.fromEntries(Object.entries(Sn).map(([e,{nucleus:u}])=>[e,u]));const ro={\uACE0\uC720\uC5B4:"\uACE0\uC720",\uD55C\uC790\uC5B4:"\uD55C\uC790",\uC678\uB798\uC5B4:"\uC678\uB798",\uD63C\uC885\uC5B4:"\uD63C\uC885"},ao={"\uCCB4\uC5B8(\uBA85\uC0AC,\uC218\uC0AC)":["\uBA85","\uC218"],"\uC6A9\uC5B8(\uB3D9\uC0AC,\uD615\uC6A9\uC0AC)":["\uB3D9","\uD615"],"\uC218\uC2DD\uC5B8(\uBD80\uC0AC,\uAD00\uD615\uC0AC)":["\uBD80","\uAD00"]},io={difficulty:"\uB09C\uC774\uB3C4 \uB4F1\uAE09",syllables:"\uC74C\uC808 \uC218",syllable5plus:"5\uC74C\uC808 \uC774\uC0C1",partOfSpeech:"\uD488\uC0AC",wordType:"\uC720\uD615",posMap:ao,typeMap:ro};function so(e,u,t=io){const n=u[t.difficulty];if(n?.length&&!n.some(r=>e.grade===r.replace(/\D/g,"")))return!1;const o=u[t.syllables];if(o?.length){const r=e.syllables??0;if(!o.some(c=>c===t.syllable5plus?r>=5:r===parseInt(c)))return!1}const l=u[t.partOfSpeech];if(l?.length&&!l.flatMap(r=>t.posMap[r]??[r]).some(r=>(e.pos??"").includes(r)))return!1;const a=u[t.wordType];return!(a?.length&&!a.some(r=>e.wordType===t.typeMap[r]))}const co={labial:e=>e("common.phonetics.place.labial",{defaultValue:"\uC591\uC21C\uC74C"}),alveolar:e=>e("common.phonetics.place.alveolar",{defaultValue:"\uCE58\uC870\uC74C"}),palatal:e=>e("common.phonetics.place.palatal",{defaultValue:"\uACBD\uAD6C\uAC1C\uC74C"}),velar:e=>e("common.phonetics.place.velar",{defaultValue:"\uC5F0\uAD6C\uAC1C\uC74C"}),glottal:e=>e("common.phonetics.place.glottal",{defaultValue:"\uC131\uBB38\uC74C"})},Co={frontHigh:e=>e("common.phonetics.vowel.frontHigh",{defaultValue:"\uC804\uC124 \uACE0\uBAA8\uC74C"}),backHighUnrounded:e=>e("common.phonetics.vowel.backHighUnrounded",{defaultValue:"\uD6C4\uC124 \uACE0\uBAA8\uC74C \uD3C9\uC21C"}),backHighRounded:e=>e("common.phonetics.vowel.backHighRounded",{defaultValue:"\uD6C4\uC124 \uACE0\uBAA8\uC74C \uC6D0\uC21C"}),frontMid:e=>e("common.phonetics.vowel.frontMid",{defaultValue:"\uC804\uC124 \uC911\uBAA8\uC74C"}),backMidUnrounded:e=>e("common.phonetics.vowel.backMidUnrounded",{defaultValue:"\uD6C4\uC124 \uC911\uBAA8\uC74C \uD3C9\uC21C"}),backMidRounded:e=>e("common.phonetics.vowel.backMidRounded",{defaultValue:"\uD6C4\uC124 \uC911\uBAA8\uC74C \uC6D0\uC21C"}),low:e=>e("common.phonetics.vowel.low",{defaultValue:"\uC800\uBAA8\uC74C"})},fo={j:e=>e("common.phonetics.glide.j",{defaultValue:"j\uD65C\uC74C"}),w:e=>e("common.phonetics.glide.w",{defaultValue:"w\uD65C\uC74C"}),velar:e=>e("common.phonetics.glide.velar",{defaultValue:"\u0270\uD65C\uC74C"})};function Ct(e,u){if("place"in u)return co[u.place](e);const t=Co[u.vowel](e);return u.glide?`${t} \xB7 ${fo[u.glide](e)}`:t}const go=(e,{defaultValue:u})=>u,dt=(e,u)=>({jamos:e,phonetic:u,tooltip:Ct(go,u)}),se=(e,u)=>u.map(t=>dt([t],{place:e})),W=(e,u,t)=>dt([...e],t?{vowel:u,glide:t}:{vowel:u}),mu={cho:[se("labial",["\u3142","\u3143","\u314D","\u3141"]),se("alveolar",["\u3137","\u3138","\u314C","\u3134","\u3139"]),se("alveolar",["\u3145","\u3146"]),se("palatal",["\u3148","\u3149","\u314A"]),se("velar",["\u3131","\u3132","\u314B"]),se("glottal",["\u314E"])],jung:[[W("\u3163","frontHigh"),W("\u315F","frontHigh","w"),W("\u3162","frontHigh","velar")],[W("\u3161","backHighUnrounded")],[W("\u315C","backHighRounded"),W("\u3160","backHighRounded","j")],[W("\u3154\u3150","frontMid"),W("\u3156\u3152","frontMid","j"),W("\u3159\u315A\u315E","frontMid","w")],[W("\u3153","backMidUnrounded"),W("\u3155","backMidUnrounded","j"),W("\u315D","backMidUnrounded","w")],[W("\u3157","backMidRounded"),W("\u315B","backMidRounded","j")],[W("\u314F","low"),W("\u3151","low","j"),W("\u3158","low","w")]],jong:[se("labial",["\u3142","\u3141"]),se("alveolar",["\u3137","\u3134","\u3139"]),se("velar",["\u3131","\u3147"])]},ho=[...q],mo=[...ae],po=Q.filter(e=>e!==""),ce=e=>e===ne?[]:Array.from(e),ne="__NO_CODA__",ft=[1,2,3,4],oe=5,So=12,gt="SYL_",pu=e=>`${gt}${e}`,Eo=e=>Number(e.slice(gt.length));function Su(e){return e>=oe?Array.from({length:So-oe+1},(u,t)=>oe+t):[e]}const ht={cho:ho,jung:mo,jong:po},Eu=e=>e.map(u=>u.map(({jamos:t,phonetic:n,tooltip:o})=>({v:t.join(""),phonetic:n,tooltip:o}))),yu={cho:Eu(mu.cho),jung:Eu(mu.jung),jong:Eu(mu.jong)},mt={};yu.jung.flat().forEach(({v:e})=>{for(const u of ce(e))mt[u]=e});const yo=new Set(yu.cho.flat().map(e=>e.v));function pt(e,u){return e==="cho"?yo.has(u)?u:null:e==="jung"?mt[u]??u:Ku(u)}function St(e,u,t){if(e==="jung"){const n=ce(u);return t&&n.includes(t)?t:n[0]??u}return u}function Et(e,u,t){const n=(o,l)=>l?o==="jong"&&l===ne?ne:u==="pron"?pt(o,l):St(o,l,o==="jung"?t:null):null;return{...e,cho:n("cho",e.cho),jung:n("jung",e.jung),jong:n("jong",e.jong)}}const Bu={cho:null,jung:null,jong:null,syllable:null},Bo="wt_filter",yt=e=>`wt_filter_${e}`;function Bt(e){try{const u=localStorage.getItem(yt(e))??localStorage.getItem(Bo);if(u)return JSON.parse(u)}catch{}return null}function wo(e){const u=e;return u?.composition?{cho:u.composition.cho??null,jung:u.composition.jung??null,jong:u.composition.jong??null,syllable:u.composition.syllable??null}:u?.choseong?{...Bu,cho:u.choseong}:Bu}function bo(e,u,t){const{t:n,i18n:o}=Se.useTranslation(),[l]=i.useState(()=>t?.resetOnMount?null:Bt(e)),a=l?.contrastCount,r=typeof a=="number"&&Number.isFinite(a)?a:1,[c,C]=i.useState(Math.min(5,Math.max(1,r))),[d,f]=i.useState(l?.phonemeView==="pron"?"pron":l?.phonemeView==="direct"?"direct":"char"),[s,g]=i.useState(()=>wo(l)),p=i.useCallback(()=>u.requireSyllable?{cho:"\u3131",jung:"\u314F",jong:ne,syllable:u.fixedSyllable??null}:{cho:null,jung:null,jong:u.fixedNoCoda?ne:null,syllable:u.fixedSyllable??null},[u.requireSyllable,u.fixedSyllable,u.fixedNoCoda]);i.useEffect(()=>{!u.requireSyllable&&u.fixedSyllable==null&&!u.fixedNoCoda||g(m=>m.cho||m.jung||m.syllable!=null||m.jong?m:p())},[]);const w=i.useMemo(()=>K(s.cho)||K(s.jung)||K(s.jong)?"count":"random",[s.cho,s.jung,s.jong]),E=i.useRef(d==="char"?s.jung:null);i.useEffect(()=>{d==="char"&&(E.current=s.jung)},[d,s.jung]);const[h,S]=i.useState(t?.resetOnMount?!!t?.defaultImageOnly:l?.excludeNoImage??!0),[B,A]=i.useState(t?.resetOnMount?!1:l?.sameStructureOnly??!0),[D,b]=i.useState(Array.isArray(l?.gradeFilter)?l.gradeFilter:[]),[I,L]=i.useState(Array.isArray(l?.posFilter)?l.posFilter:[]),[F,j]=i.useState(Array.isArray(l?.wordTypeFilter)?l.wordTypeFilter:[]),H=i.useRef(t?.resetKey);i.useEffect(()=>{H.current!==t?.resetKey&&(H.current=t?.resetKey,g(p()),S(!1),A(!1),b([]),L([]),j([]),C(1))},[t?.resetKey]);const k=at(),[v,T]=i.useState({cho:new Set,jung:new Set,jong:new Set,syllable:new Set}),[P,G]=i.useState(!1),[X,le]=i.useState(null),re=1,y=Math.max(1,[s.cho,s.jung,s.jong].filter(Boolean).length);i.useEffect(()=>{c<y&&C(y)},[y,c]);const[_,Y]=i.useState(e);i.useEffect(()=>{if(_!==e){if(!t?.resetOnMount){const m=Bt(e),N=typeof m?.contrastCount=="number"&&Number.isFinite(m.contrastCount)?m.contrastCount:1;C(Math.min(5,Math.max(1,N))),g(m?.composition??p()),S(m?.excludeNoImage??!0),A(m?.sameStructureOnly??!0),f(m?.phonemeView==="pron"?"pron":"char"),b(Array.isArray(m?.gradeFilter)?m.gradeFilter:[]),L(Array.isArray(m?.posFilter)?m.posFilter:[]),j(Array.isArray(m?.wordTypeFilter)?m.wordTypeFilter:[])}Y(e)}},[e,_,t?.resetOnMount]),i.useEffect(()=>{if(!t?.resetOnMount&&_===e)try{localStorage.setItem(yt(e),JSON.stringify({contrastCount:c,composition:s,excludeNoImage:h,sameStructureOnly:B,phonemeView:d,gradeFilter:D,posFilter:I,wordTypeFilter:F}))}catch{}},[t?.resetOnMount,e,_,c,s,h,B,d,D,I,F]);const[$,ee]=i.useState(0);Lu("wordpool:update",()=>ee(m=>m+1));const Du=i.useRef(o.language);i.useEffect(()=>{Du.current!==o.language&&(Du.current=o.language,ee(m=>m+1))},[o.language]),i.useEffect(()=>{if(!u.choseong)return;let m=!1;return uo({difficulty:w,excludeNoImage:h}).then(N=>{m||(T(N),N.cho.size+N.jung.size+N.jong.size>0&&G(!0))}).catch(()=>{m||T({cho:new Set,jung:new Set,jong:new Set,syllable:new Set})}),()=>{m=!0}},[u.choseong,w,h,$]),i.useEffect(()=>{let m=!1;const N=s,O=N.cho?ce(N.cho):null,M=N.jung?ce(N.jung):null,U=N.jong===ne,he=U?null:N.jong?ce(N.jong):null,me=N.syllable!=null?Su(N.syllable):null,Fe=!!(O||M||he||U||me);return eo({difficulty:u.difficulty?w:null,contrastCount:u.difficulty?c:1,composition:u.choseong&&Fe?{cho:O,jung:M,jong:he,jongNone:U,syllable:me}:null,excludeNoImage:h,sameStructureOnly:B,phonemeView:d==="pron"?"pron":"char",grade:D.length>0?D:null}).then(Ve=>{m||le(Ve)}).catch(()=>{m||le(null)}),()=>{m=!0}},[u.choseong,u.difficulty,w,c,s,d,h,B,$,D]),i.useEffect(()=>{P&&g(m=>{const N={...m};let O=!1;return["cho","jung","jong"].forEach(M=>{const U=m[M];!U||U===ne||ce(U).some(he=>v[M].has(he))||(N[M]=null,O=!0)}),m.syllable!=null&&u.fixedSyllable==null&&(m.syllable>=oe?[...v.syllable].some(M=>M>=oe)||(N.syllable=null,O=!0):(!v.syllable.has(m.syllable)||m.syllable<re)&&(N.syllable=null,O=!0)),O?N:m})},[v,P,re,u.fixedSyllable]);const Ou=i.useMemo(()=>{const m=N=>{const O=new Set;for(const M of ht[N])v[N].has(M)&&O.add(M);return O};return{cho:m("cho"),jung:m("jung"),jong:m("jong")}},[v]),tu=i.useMemo(()=>({exact:new Set(ft.filter(m=>v.syllable.has(m))),min:[...v.syllable].some(m=>m>=oe)}),[v]),R=i.useMemo(()=>({diffPhonemeCount:n("training.contrast.diffPhonemeCount",{defaultValue:"\uB2E4\uB978 \uC74C\uC18C\uC758 \uCD1D \uAC2F\uC218"}),composition:n("wordPairs.composition","\uC815\uB2F5 \uB2E8\uC5B4 \uAD6C\uC131"),syllableCount:n("wordPairs.syllableCount","\uC74C\uC808 \uC218"),onset:n("wordPairs.onset","\uCD08\uC131"),vowel:n("wordPairs.vowel","\uBAA8\uC74C"),coda:n("wordPairs.coda","\uC885\uC131"),phonemeGroup:n("training.filter.phonemeGroup",{defaultValue:"\uD6C8\uB828 \uC74C\uC808"}),trainOnset:n("training.filter.trainOnset",{defaultValue:"\uCD08\uC131"}),trainVowel:n("training.filter.trainVowel",{defaultValue:"\uBAA8\uC74C"}),trainCoda:n("training.filter.trainCoda",{defaultValue:"\uC885\uC131"}),random:n("training.filter.random","\uBB34\uC791\uC704"),exclude:n("wordSearch.filter.exclude","\uC81C\uC678"),selectLabel:n("training.filter.selectSection",{defaultValue:"\uC120\uD0DD"}),none:n("common.none","\uC5C6\uC74C"),noImage:n("wordSearch.filter.excludeNoImage","\uC774\uBBF8\uC9C0 \uC5C6\uC74C"),excludeImage:n("training.filter.excludeImage",{defaultValue:"\uC774\uBBF8\uC9C0 \uC788\uB294 \uB2E8\uC5B4\uB9CC"}),sameStructure:n("training.filter.sameStructure",{defaultValue:"\uC74C\uC18C \uAD6C\uC870 \uAC19\uC740 \uB2E8\uC5B4\uB9CC"}),noLimit:n("training.filter.noLimit",{defaultValue:"\uBB34\uAD00"}),codaExclude:n("training.filter.codaExclude",{defaultValue:"\uC81C\uC678"}),gradeLabel:n("training.filter.gradeLabel",{defaultValue:"\uB09C\uC774\uB3C4 \uB4F1\uAE09"})}),[n]),Nu=i.useMemo(()=>({[R.trainOnset]:"cho",[R.trainVowel]:"jung",[R.trainCoda]:"jong"}),[R]),ve=i.useCallback((m,N)=>({title:N,items:m}),[]),nu=i.useMemo(()=>[n("training.filter.excludeImageInfo",{defaultValue:"\uC774\uBBF8\uC9C0 \uC788\uB294 \uB2E8\uC5B4\uB9CC: \uB2E8\uC5B4 \uC911\uC5D0 \uC774\uBBF8\uC9C0\uAC00 \uC788\uB294 \uB2E8\uC5B4\uB9CC \uACB0\uACFC\uC5D0 \uBCF4\uC5EC\uC90D\uB2C8\uB2E4."}),n("training.filter.sameStructureInfo",{defaultValue:"\uC74C\uC18C \uAD6C\uC870 \uAC19\uC740 \uB2E8\uC5B4\uB9CC: \uC815\uB2F5\uACFC \uC624\uB2F5\uC758 \uC74C\uC808 \uAD6C\uC870(\uAE00\uC790 \uC218\xB7\uBC1B\uCE68 \uC720\uBB34 \uB4F1)\uAC00 \uAC19\uC740 \uACB0\uACFC\uB9CC \uB0A8\uACA8\uC694."})],[n]),Ot=i.useMemo(()=>{const m=[];if(u.choseong){const N={value:ne,displayLabel:R.codaExclude},O=u.fixedNoCoda===!0,M=(U,he)=>{const me=O&&U==="jong",Fe={label:he,groupLabel:R.phonemeGroup,allOption:!u.requireSyllable,allLabel:R.noLimit,allOptionDisabled:me};if(d==="pron"){const pe=yu[U].map(Mt=>Mt.map(({v:ou,phonetic:kt})=>{const lu=ce(ou),Tu=Ct(n,kt),ju=me||!lu.some(Pt=>v[U].has(Pt));return lu.length>1?{value:ou,labels:lu,tooltip:Tu,disabled:ju}:{value:ou,tooltip:Tu,disabled:ju}}));return U==="jong"&&!u.requireCoda&&pe.unshift([N]),{...Fe,groups:pe}}const Ve=ht[U].map(pe=>!me&&Ou[U].has(pe)?pe:{value:pe,disabled:!0});return{...Fe,items:U==="jong"&&!u.requireCoda?[N,...Ve]:Ve}};m.push(M("cho",R.trainOnset)),m.push(M("jung",R.trainVowel)),m.push(M("jong",R.trainCoda))}if(m.push({...it(n,k,{labelInfo:ve([n("wordPairs.filter.difficultyInfo",{defaultValue:"\uAD6D\uB9BD\uAD6D\uC5B4\uC6D0\uC758 \uAE30\uCD08 \uC5B4\uD718 \uB4F1\uAE09\uC774 \uACB0\uACFC\uC5D0 \uBC18\uC601\uB429\uB2C8\uB2E4."})])}),label:R.gradeLabel}),u.partOfSpeech&&m.push(st(k)),u.wordType&&m.push(ct(k)),u.choseong||u.fixedSyllable!=null){const N=u.fixedSyllable;m.push({label:R.syllableCount,items:[...ft.map(O=>({value:pu(O),displayLabel:n("wordPairs.syllableN",{n:O,defaultValue:"{{n}}\uC74C\uC808"}),disabled:N!=null?O!==N:!tu.exact.has(O)||O<re})),{value:pu(oe),displayLabel:n("wordPairs.syllableNPlus",{n:oe,defaultValue:"{{n}}\uC74C\uC808 \uC774\uC0C1"}),disabled:N!=null?oe!==N:!tu.min}],allOption:!0,allOptionDisabled:N!=null})}return u.choseong?m.push({label:R.exclude,displayLabel:R.selectLabel,multiple:!0,items:[R.excludeImage,R.sameStructure],labelInfo:ve(nu)}):m.push({label:R.exclude,displayLabel:R.selectLabel,multiple:!0,items:[R.excludeImage],labelInfo:ve([nu[0]])}),m},[u.choseong,u.partOfSpeech,u.wordType,u.requireSyllable,u.fixedSyllable,u.fixedNoCoda,u.requireCoda,re,Ou,v,d,tu,R,n,ve,nu,k]),Nt={...u.difficulty?{[R.diffPhonemeCount]:String(c)}:{},...(u.choseong||u.fixedSyllable!=null)&&s.syllable!=null?{[R.syllableCount]:pu(s.syllable)}:{},...u.choseong&&s.cho?{[R.trainOnset]:s.cho}:{},...u.choseong&&s.jung?{[R.trainVowel]:s.jung}:{},...u.choseong&&s.jong?{[R.trainCoda]:s.jong}:{},[R.exclude]:[...h?[R.excludeImage]:[],...B?[R.sameStructure]:[]],[R.gradeLabel]:D.map(m=>n("wordSearch.filter.grade",{n:Number(m),defaultValue:"{{n}}\uB4F1\uAE09"})),...u.partOfSpeech?{[k.partOfSpeech]:I}:{},...u.wordType?{[k.wordType]:F}:{}},Tt=i.useCallback((m,N)=>{if(N===R.diffPhonemeCount){const O=Number(m);O>=1&&C(O)}else if(N===R.exclude)m===R.excludeImage?S(O=>!O):m===R.sameStructure&&A(O=>!O);else if(N===R.syllableCount)g(O=>{if(!m||m===ge)return{...O,syllable:null};const M=Eo(m);return{...O,syllable:O.syllable===M?null:M}});else if(N===R.gradeLabel){if(!m||m===ge){b([]);return}const O=m.replace(/\D/g,"");b(M=>M.includes(O)?M.filter(U=>U!==O):[...M,O])}else if(N===k.partOfSpeech){if(!m||m===ge){L([]);return}L(O=>O.includes(m)?O.filter(M=>M!==m):[...O,m])}else if(N===k.wordType){if(!m||m===ge){j([]);return}j(O=>O.includes(m)?O.filter(M=>M!==m):[...O,m])}else{const O=Nu[N];if(!O)return;g(M=>u.requireSyllable?m&&m!==ge?{...M,[O]:m}:M:!m||m===ge||M[O]===m?{...M,[O]:null}:{...M,[O]:m})}},[R,Nu,k,u.requireSyllable]),jt=i.useCallback(m=>!u.partOfSpeech&&!u.wordType?!0:so(m,{...u.partOfSpeech?{[k.partOfSpeech]:I}:{},...u.wordType?{[k.wordType]:F}:{}},k),[u.partOfSpeech,u.wordType,I,F,k]),It=i.useCallback(m=>{m!==d&&(m!=="direct"&&d!=="direct"&&g(N=>Et(N,m,E.current)),f(m))},[d]),Rt=i.useCallback(()=>({composition:s,contrastCount:c,excludeNoImage:h,sameStructureOnly:B,phonemeView:d,gradeFilter:D}),[s,c,h,B,d,D]),Lt=i.useCallback(m=>{g(m.composition),C(m.contrastCount),S(m.excludeNoImage),A(m.sameStructureOnly??!0),f(m.phonemeView),b(Array.isArray(m.gradeFilter)?m.gradeFilter:[])},[]);return{difficulty:w,contrastCount:c,composition:s,choseong:s.cho,excludeNoImage:h,sameStructureOnly:B,gradeFilter:D,posFilter:I,wordTypeFilter:F,matchesWordAttributes:jt,poolVersion:$,filterSections:Ot,filterSelected:Nt,handleFilterSelect:Tt,phonemeView:d,setPhonemeView:It,phonemeGroupLabel:R.phonemeGroup,wordCount:X,getFilterSnapshot:Rt,restoreFilterSnapshot:Lt}}function Ao(e){const u=r=>r?ce(r):null,t=u(e.cho),n=u(e.jung),o=e.jong===ne,l=o?null:u(e.jong),a=e.syllable!=null?Su(e.syllable):null;return!t&&!n&&!l&&!o&&!a?null:{cho:t,jung:n,jong:l,jongNone:o,syllable:a}}function _o(e,u,t,n,o,l,a=!0,r="char",c=[]){const[C,d]=i.useState({}),[f,s]=i.useState(!1),{cho:g=null,jung:p=null,jong:w=null,syllable:E=null}=n??{},h=c.length>0?c.slice().sort().join(","):"";return i.useEffect(()=>{l>0&&Xn(o).catch(()=>{})},[l,o]),i.useEffect(()=>{let S=!1;return s(!0),(async()=>{const B=Ao({cho:g,jung:p,jong:w,syllable:E}),A=`${g??""}_${p??""}_${w??""}_${E??""}_${h}`,D={};await Promise.all(e.map(async b=>{const I=su[b.key];try{const L=await rt(b.key,{difficulty:I.difficulty?u:null,contrastCount:I.difficulty?t:1,composition:I.choseong?B:null,count:5,excludeNoImage:o,sameStructureOnly:a,phonemeView:r,grade:c.length>0?c:null});L&&L.length>0?D[b.key]={id:`wt-${b.key}-${u}-${A}-${Date.now()}`,name:b.label,training_type:b.key,category_main_code:"WORD",iconColor:b.color,subTitle:b.subTitle,items:L,itemCount:L.length}:D[b.key]={id:`wt-${b.key}-empty`,name:b.label,training_type:b.key,category_main_code:"WORD",iconColor:b.color,subTitle:b.subTitle,items:[],itemCount:0,__empty:!0}}catch{D[b.key]=null}})),S||(d(D),s(!1))})(),()=>{S=!0}},[u,t,g,p,w,E,o,a,r,l,h]),{perTypeData:C,generating:f}}function Do(){return ze(new Date)}function ze(e){if(e==null||e==="")return"";const u=e instanceof Date?e:new Date(e);return isNaN(u.getTime())?"":new Intl.DateTimeFormat("fr-CA",{timeZone:"Asia/Seoul"}).format(u)}const je=[],Ie=[],Re=[],Le=[],Je={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},Ze={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},Oo={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};let wu=null,wt=null,Ce=null;function No({counts:e,forceRefresh:u}={}){const t=Object.assign({},Oo,e||{}),n=Do(),o=ze(new Date(`${n}T00:00:00+09:00`).getTime()-864e5),l=JSON.stringify(t);if(!u&&wt===n&&wu===l&&Ce)return Object.assign(Je,Ce.today),Object.assign(Ze,Ce.yesterday?.selection||{LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),{today:Je,yesterday:Ze};const a={LISTEN_IN_NOISE:ie(je,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:ie(Ie,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:ie(Re,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:ie(Le,Math.max(0,Number(t.ORDERING_SENTENCE)||0))};let r=null;return Ce&&wu===l&&Ce.yesterday&&Ce.yesterday.date===o&&(r=Ce.yesterday.selection),r||(r={LISTEN_IN_NOISE:ie(je,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:ie(Ie,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:ie(Re,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:ie(Le,Math.max(0,Number(t.ORDERING_SENTENCE)||0))}),Object.assign(Je,a),Object.assign(Ze,r),wt=n,wu=l,Ce={today:a,yesterday:{date:o,countsKey:l,selection:r}},{today:Je,yesterday:Ze}}let bt=!1,Me=null;async function To(){try{const e={url:typeof document>"u"?require("url").pathToFileURL(__filename).href:ru&&ru.tagName.toUpperCase()==="SCRIPT"&&ru.src||new URL("hooks.cjs.js",document.baseURI).href}&&void 0||"/",u=await fetch(`${e}data/allTrainingData.json`);return u.ok?await u.json():null}catch{return null}}async function jo(){if(!bt)return Me||(Me=(async()=>{const e=await To();if(!e){Me=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}try{for(const u of Object.keys(e||{})){const t=e[u]||[];for(const n of t){const o=n,l=String(o.training_type||u),a=String(o.category_main_code||o.category_main||o.category_0||""),r=String(o.category_sub_code||o.category_sub||o.category_1||""),c=Object.assign({},o,{training_type:l,category_0:a,category_1:r});l==="LISTEN_IN_NOISE"?je.push(c):l==="SHORT_STORY"?Ie.push(c):l==="LONG_STORY"?Re.push(c):l==="ORDERING_SENTENCE"&&Le.push(c)}}}catch{Me=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}try{window.dispatchEvent(new Event("speechear.data.updated"))}catch{}try{No()}catch{}bt=!0})(),Me)}async function Io(e=3e3){const u=jo();return Promise.race([u,new Promise(t=>setTimeout(t,e))])}function Ro(e){let u=2166136261;for(let t=0;t<e.length;t++)u^=e.charCodeAt(t),u=Math.imul(u,16777619);return u>>>0}function Lo(e){let u=e>>>0;return()=>{u|=0,u=u+1831565813|0;let t=Math.imul(u^u>>>15,1|u);return t=t+Math.imul(t^t>>>7,61|t)^t,((t^t>>>14)>>>0)/4294967296}}const Qe=ie;function bu(e,u){const t=u?Lo(Ro(u)):Math.random;return{LISTEN_IN_NOISE:Qe(je,Math.max(0,e.LISTEN_IN_NOISE||0),t),SHORT_STORY:Qe(Ie,Math.max(0,e.SHORT_STORY||0),t),LONG_STORY:Qe(Re,Math.max(0,e.LONG_STORY||0),t),ORDERING_SENTENCE:Qe(Le,Math.max(0,e.ORDERING_SENTENCE||0),t)}}function At(e){return e?!!(e.LISTEN_IN_NOISE?.length||e.SHORT_STORY?.length||e.LONG_STORY?.length||e.ORDERING_SENTENCE?.length):!1}const Mo={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};function _t(e=!1,u=Mo,t){const n=ze(Date.now()),o=ze(Date.now()-864e5),l=`${t??""}|${n}`,a=`${t??""}|${o}`;return je.length>0||Ie.length>0||Re.length>0||Le.length>0?{today:bu(u,l),yesterday:bu(u,a)}:{today:bu(u,l),yesterday:null}}function ko(e){const u=i.useRef({LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),t=i.useRef(null),[n,o]=i.useState(!1),[l,a]=i.useState(!1),[r,c]=i.useState(0),[C,d]=i.useState(!1);i.useEffect(()=>{let s=!1,g,p=0;const w=40,E=()=>{g!==void 0&&(clearInterval(g),g=void 0)};let h=!1;try{const A=new URLSearchParams(window.location.search),D=A.get("forceRefresh")||A.get("force");h=D==="1"||D==="true"}catch{}const S=A=>{u.current=A.today,t.current=A.yesterday,o(!0),d(!0),c(D=>D+1),s=!0,E()},B=async()=>{if(s)return;if(!h){const D=_t(!1,void 0,e);if(At(D.today)){S(D);return}}try{await Io(3e3)}catch{}if(s)return;const A=_t(h,void 0,e);if(At(A.today)){S(A);return}++p>=w&&(o(!0),d(!1),s=!0,E())};return B(),g=setInterval(B,250),()=>{s=!0,E()}},[e]);const f=i.useCallback(s=>{const g=l?t.current:u.current,p=l?u.current:t.current;return g?.[s]?.length?g[s]:p?.[s]?.length?p[s]:void 0},[l,r]);return{loaded:n,hasData:C,showYesterday:l,setShowYesterday:a,getTrainingPerType:f}}const Be=[];let Xe=!1;function Dt(e){if(e.key!=="Escape"||e.defaultPrevented)return;const u=Be[Be.length-1];u&&(e.stopPropagation(),u())}function Po(e){return Be.push(e),!Xe&&typeof document<"u"&&(document.addEventListener("keydown",Dt),Xe=!0),()=>{const u=Be.lastIndexOf(e);u>=0&&Be.splice(u,1),Be.length===0&&Xe&&typeof document<"u"&&(document.removeEventListener("keydown",Dt),Xe=!1)}}function xo(e,u=!0){const t=Ru(e);i.useEffect(()=>{if(u)return Po(()=>{t.current?.()})},[u,t])}const Au=(e,u)=>`${e}:${u??1}`,_u=new Map;function vo(e,u){const[t,n]=i.useState(0),o=e.map(l=>Au(l.word,l.homonum)).join("|");return i.useEffect(()=>{const l=(o?o.split("|"):[]).filter(c=>!_u.has(c));if(l.length===0)return;let a=!1;const r=Array.from(new Set(l.map(c=>c.slice(0,c.lastIndexOf(":")))));return u(r).then(c=>{if(!(a||c.length===0)){for(const C of c)C.Meaning&&_u.set(Au(C.Word,C.Homonum??void 0),C.Meaning);n(C=>C+1)}}),()=>{a=!0}},[o,u]),i.useMemo(()=>{const l=o?o.split("|"):[],a=new Map;for(const r of l){const c=_u.get(r);c!=null&&a.set(r,c)}return a},[o,t])}function Fo(){const[e,u]=i.useState(null),t=i.useCallback(l=>u(l.getBoundingClientRect()),[]),n=i.useCallback(()=>u(null),[]),o=i.useCallback(l=>{const a=l.getBoundingClientRect();u(r=>r?null:a)},[]);return{anchorRect:e,isOpen:e!=null,openAt:t,close:n,toggleAt:o}}function Vo(e){const[u,t]=i.useState(null),[n,o]=i.useState(null),l=i.useRef(null);i.useEffect(()=>()=>{l.current&&clearTimeout(l.current)},[]);const a=i.useCallback((c,C)=>{l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{t(c),o(C)},e)},[e]),r=i.useCallback(()=>{l.current&&clearTimeout(l.current),t(null),o(null)},[]);return{payload:u,anchorRect:n,openAfterDelay:a,close:r}}function Ho(e,u,t){const n=Number.isFinite(u)&&u>=1?Math.floor(u):1,o=Math.max(1,Math.ceil(e.length/n)),l=Number.isFinite(t)?Math.min(Math.max(1,Math.floor(t)),o):1;return{pageItems:i.useMemo(()=>e.slice((l-1)*n,l*n),[e,l,n]),totalPages:o,curPage:l}}function $o(e="warning"){const[u,t]=i.useState(""),[n,o]=i.useState(e),[l,a]=i.useState(0),r=i.useCallback((f,s)=>{o(s),t(f),a(g=>g+1)},[]),c=i.useCallback(f=>r(f,"warning"),[r]),C=i.useCallback(f=>r(f,"normal"),[r]),d=i.useCallback(()=>t(""),[]);return{toastMessage:u,toastType:n,toastKey:l,showToast:r,showWarning:c,showNormal:C,clearToast:d}}const Go=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uB2E4\uC591\uD55C \uC18C\uC74C \uD658\uACBD\uC5D0\uC11C \uBB38\uC7A5 \uCCAD\uB825\uC744 \uD6C8\uB828\uD569\uB2C8\uB2E4."},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uB2E4\uC218\uC758 \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC5EC\uB7EC\uAC1C\uC758 \uC9E7\uC740 \uBB38\uC7A5\uC744 \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uADF8 \uC21C\uC11C\uC5D0 \uB9DE\uAC8C \uBC30\uC5F4\uD569\uB2C8\uB2E4."}],Yo={LISTEN_IN_NOISE:"listenInNoise",SHORT_STORY:"shortStory",LONG_STORY:"longStory",ORDERING_SENTENCE:"orderingSentence"};function Uo(e){return Go.map(u=>{const t=Yo[u.key];return t?{...u,label:e(`trainingType.${t}.title`),desc:e(`trainingType.${t}.desc`)}:u})}const ke={blue:"#60A5FA",green:"#4ADE80",amber:"#FBBF24",purple:"#A78BFA",pink:"#F472B6"},Pe=ke.blue,eu=ke.green,xe=ke.amber,uu=ke.purple,Ko=ke.pink,Wo=[{key:"discrimination",label:"\uBCC0\uBCC4\uD6C8\uB828",disc:"\uB450 \uC18C\uB9AC\uAC00 \uAC19\uC740\uC9C0 \uB2E4\uB978\uC9C0, \uB610\uB294 \uD2B9\uC815 \uC18C\uB9AC\uB97C \uAD6C\uBCC4\uD558\uB294 \uD6C8\uB828\uC785\uB2C8\uB2E4.",icon:"ear",types:[{key:"SAME_SOUND_PICK",label:"\uAC19\uC740 \uC18C\uB9AC \uACE0\uB974\uAE30",icon:"volume-2",color:Pe,subTitle:"\uB4E4\uC740 \uC18C\uB9AC\uC640 \uAC19\uC740 \uB2E8\uC5B4 \uCE74\uB4DC\uB97C \uACE0\uB974\uC138\uC694."},{key:"SAME_OR_DIFF",label:"\uAC19\uC740\uC9C0 \uB2E4\uB978\uC9C0 \uB9DE\uD788\uAE30",icon:"diff",color:Pe,subTitle:"\uB450 \uC18C\uB9AC\uAC00 \uAC19\uC740\uC9C0, \uB2E4\uB978\uC9C0 \uAD6C\uBD84\uD558\uC138\uC694."},{key:"HEAR_AND_PICK_SAME",label:"\uC77C\uCE58\uD558\uB294 \uB2E8\uC5B4 \uB9DE\uD788\uAE30",icon:"headphones",color:Pe,subTitle:"\uB4E4\uC740 \uC18C\uB9AC\uC758 \uB2E8\uC5B4 \uCE74\uB4DC\uB97C \uACE0\uB974\uC138\uC694."},{key:"HEAR_AND_PICK_INCLUDED",label:"\uD55C \uC74C\uC808 \uD3EC\uD568 \uB2E8\uC5B4 \uB9DE\uD788\uAE30",icon:"scan-search",color:Pe,subTitle:"\uB4E4\uC740 \uC74C\uC808\uC774 \uD3EC\uD568\uB41C \uB2E8\uC5B4 \uCE74\uB4DC\uB97C \uACE0\uB974\uC138\uC694."},{key:"STARTS_WITH_SAME_SOUND",label:"\uCCAB \uC74C\uC808\uC774 \uAC19\uC740 \uB2E8\uC5B4 \uB9DE\uD788\uAE30",icon:"play-circle",color:Pe,subTitle:"\uB4E4\uC740 \uB2E8\uC5B4\uC640 \uAC19\uC740 \uC18C\uB9AC\uB85C \uC2DC\uC791\uD558\uB294 \uB2E8\uC5B4\uB97C \uACE0\uB974\uC138\uC694."}]},{key:"synthesis",label:"\uD569\uC131\uD6C8\uB828",disc:"\uB450 \uAC1C \uC774\uC0C1\uC758 \uC74C\uC808\uC774\uB098 \uC74C\uC18C\uB97C \uD569\uCCD0 \uB2E8\uC5B4\uB97C \uB9CC\uB4DC\uB294 \uD6C8\uB828\uC785\uB2C8\uB2E4.",icon:"git-merge",types:[{key:"MERGE_2_SYLLABLES",label:"\uC74C\uC808 2\uAC1C \uD569\uCE58\uAE30",icon:"link-2",color:eu,subTitle:"\uB450 \uC74C\uC808\uC744 \uD569\uCE58\uBA74 \uC5B4\uB5A4 \uB2E8\uC5B4\uAC00 \uB420\uAE4C\uC694?"},{key:"MERGE_3_SYLLABLES",label:"\uC74C\uC808 3\uAC1C \uD569\uCE58\uAE30",icon:"git-merge",color:eu,subTitle:"\uC138 \uC74C\uC808\uC744 \uD569\uCE58\uBA74 \uC5B4\uB5A4 \uB2E8\uC5B4\uAC00 \uB420\uAE4C\uC694?"},{key:"MERGE_2_PHONEMES",label:"\uC74C\uC18C 2\uAC1C \uD569\uCE58\uAE30",icon:"combine",color:eu,subTitle:"\uB450 \uC74C\uC18C\uB97C \uD569\uCE58\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB420\uAE4C\uC694?"},{key:"MERGE_3_PHONEMES",label:"\uC74C\uC18C 3\uAC1C \uD569\uCE58\uAE30",icon:"braces",color:eu,subTitle:"\uC138 \uC74C\uC18C\uB97C \uD569\uCE58\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB420\uAE4C\uC694?"}]},{key:"deletion",label:"\uD0C8\uB77D\uD6C8\uB828",disc:"\uB2E8\uC5B4\uC5D0\uC11C \uC74C\uC808\uC774\uB098 \uC74C\uC18C\uB97C \uC81C\uAC70\uD588\uC744 \uB54C \uB0A8\uB294 \uC18C\uB9AC\uB97C \uC778\uC2DD\uD558\uB294 \uD6C8\uB828\uC785\uB2C8\uB2E4.",icon:"scissors",types:[{key:"DROP_1_FROM_2SYLL",label:"2\uC74C\uC808\uC5D0\uC11C 1\uC74C\uC808 \uD0C8\uB77D",icon:"scissors",color:xe,subTitle:"2\uC74C\uC808 \uB2E8\uC5B4\uC5D0\uC11C \uD55C \uC74C\uC808\uC744 \uBE7C\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB420\uAE4C\uC694?"},{key:"DROP_1_FROM_3SYLL",label:"3\uC74C\uC808\uC5D0\uC11C 1\uC74C\uC808 \uD0C8\uB77D",icon:"minus-circle",color:xe,subTitle:"3\uC74C\uC808 \uB2E8\uC5B4\uC5D0\uC11C \uD55C \uC74C\uC808\uC744 \uBE7C\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB420\uAE4C\uC694?"},{key:"DROP_PART_FROM_COMPOUND",label:"\uD569\uC131\uC5B4\uC5D0\uC11C \uBD80\uBD84\uD0C8\uB77D",icon:"unlink",color:xe,subTitle:"\uD569\uC131\uC5B4\uC758 \uC77C\uBD80\uB97C \uBE7C\uBA74 \uC5B4\uB5A4 \uB2E8\uC5B4\uAC00 \uB420\uAE4C\uC694?"},{key:"DROP_FINAL_CONSONANT_FROM_1SYLL",label:"1\uC74C\uC808\uC5D0\uC11C \uBC1B\uCE68 \uD0C8\uB77D",icon:"eraser",color:xe,subTitle:"\uBC1B\uCE68\uC744 \uBE7C\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB420\uAE4C\uC694?"},{key:"REMOVE_CONSONANT_AND_IDENTIFY_PHONEME",label:"1\uC74C\uC808\uC5D0\uC11C \uC790\uC74C \uD0C8\uB77D",icon:"audio-lines",color:xe,subTitle:"\uC790\uC74C\uC744 \uBE7C\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB0A8\uC744\uAE4C\uC694?"}]},{key:"substitution",label:"\uB300\uCE58\uD6C8\uB828",disc:"\uB2E8\uC5B4\uC758 \uC77C\uBD80 \uC74C\uC808\uC774\uB098 \uC74C\uC18C\uB97C \uBC14\uAFB8\uC5B4 \uC0C8\uB85C\uC6B4 \uC18C\uB9AC\uB97C \uB9CC\uB4DC\uB294 \uD6C8\uB828\uC785\uB2C8\uB2E4.",icon:"replace",types:[{key:"CHANGE_1_SYLL_IN_2SYLL",label:"2\uC74C\uC808\uC5D0\uC11C \uD55C \uC74C\uC808 \uBC14\uAFB8\uAE30",icon:"replace",color:uu,subTitle:"2\uC74C\uC808 \uB2E8\uC5B4\uC758 \uD55C \uC74C\uC808\uC744 \uBC14\uAFD4 \uC0C8 \uB2E8\uC5B4\uB97C \uB9CC\uB4DC\uC138\uC694."},{key:"CHANGE_1_SYLL_IN_3SYLL",label:"3\uC74C\uC808\uC5D0\uC11C \uD55C \uC74C\uC808 \uBC14\uAFB8\uAE30",icon:"shuffle",color:uu,subTitle:"3\uC74C\uC808 \uB2E8\uC5B4\uC758 \uD55C \uC74C\uC808\uC744 \uBC14\uAFD4 \uC0C8 \uB2E8\uC5B4\uB97C \uB9CC\uB4DC\uC138\uC694."},{key:"CHANGE_1_PHONEME_IN_1SYLL",label:"1\uC74C\uC808\uC5D0\uC11C \uD55C \uC74C\uC18C \uBC14\uAFB8\uAE30",icon:"arrow-right-left",color:uu,subTitle:"1\uC74C\uC808 \uB2E8\uC5B4\uC758 \uD55C \uC74C\uC18C\uB97C \uBC14\uAFD4 \uC0C8 \uC18C\uB9AC\uB97C \uB9CC\uB4DC\uC138\uC694."},{key:"CHANGE_1_PHONEME_IN_2SYLL",label:"2\uC74C\uC808\uC5D0\uC11C \uD55C \uC74C\uC18C \uBC14\uAFB8\uAE30",icon:"flip-horizontal",color:uu,subTitle:"2\uC74C\uC808 \uB2E8\uC5B4\uC758 \uD55C \uC74C\uC18C\uB97C \uBC14\uAFD4 \uC0C8 \uB2E8\uC5B4\uB97C \uB9CC\uB4DC\uC138\uC694."}]},{key:"attention",label:"\uCCAD\uAC01\uC801\uC8FC\uC758\uB825\uD6C8\uB828",disc:"\uC5EC\uB7EC \uC18C\uB9AC\uB97C \uB4E3\uACE0 \uC21C\uC11C\uB97C \uAE30\uC5B5\uD558\uB294 \uC8FC\uC758\uB825\uACFC \uB2E8\uAE30 \uAE30\uC5B5 \uD6C8\uB828\uC785\uB2C8\uB2E4.",icon:"list-ordered",types:[{key:"LISTEN_AND_REMEMBER_ORDER",label:"\uB4E3\uACE0 \uC21C\uC11C\uB300\uB85C \uAE30\uC5B5\uD558\uAE30",icon:"list-ordered",color:Ko,subTitle:"\uC138 \uB2E8\uC5B4\uB97C \uB4E4\uC740 \uC21C\uC11C\uB300\uB85C \uCE74\uB4DC\uB97C \uC120\uD0DD\uD558\uC138\uC694."}]}];function qo(){const{t:e}=Se.useTranslation();return i.useMemo(()=>{const u=Object.fromEntries(Uo(e).map(n=>[n.key,n.label])),t={...u};return Wo.flatMap(n=>n.types).forEach(n=>{t[n.key]=e(`trainingType.${n.key}.label`,{defaultValue:n.label})}),{sentence:u,all:t}},[e])}const zo="0.127.0";function Jo({computeStyle:e,onScroll:u="close",onResize:t="close",ignoreOutsideClickSelector:n}){const[o,l]=i.useState(!1),[a,r]=i.useState({}),c=i.useRef(null),C=i.useRef(null),d=i.useCallback(()=>{c.current&&r(e(c.current.getBoundingClientRect()))},[e]);i.useEffect(()=>{if(!o)return;d();const g=h=>{const S=h.target;n&&S.closest?.(n)||c.current?.contains(S)||C.current?.contains(S)||l(!1)};document.addEventListener("mousedown",g);const p=h=>{C.current?.contains(h.target)||(u==="reposition"?d():u==="close"&&l(!1))};u!=="ignore"&&window.addEventListener("scroll",p,!0);const w=()=>{t==="reposition"?d():t==="close"&&l(!1)};t!=="ignore"&&window.addEventListener("resize",w);const E=h=>{h.key==="Escape"&&l(!1)};return document.addEventListener("keydown",E),()=>{document.removeEventListener("mousedown",g),u!=="ignore"&&window.removeEventListener("scroll",p,!0),t!=="ignore"&&window.removeEventListener("resize",w),document.removeEventListener("keydown",E)}},[o,d,u,t,n]);const f=i.useCallback(()=>l(g=>!g),[]),s=i.useCallback(()=>l(!1),[]);return{open:o,setOpen:l,toggle:f,close:s,style:a,triggerRef:c,menuRef:C}}function Zo(e,{mode:u="playback",autoStart:t=!1,onPlaySpeaker:n,onComplete:o,playMs:l=1100,feedbackMs:a=1500}={}){const[r,c]=i.useState([]),[C,d]=i.useState(0),[f,s]=i.useState("idle"),[g,p]=i.useState(null),[w,E]=i.useState([]),[h,S]=i.useState(null),[B,A]=i.useState(0),D=i.useRef(0),b=i.useCallback(y=>{D.current=typeof y=="function"?y(D.current):y,A(D.current)},[]),I=i.useRef(n),L=i.useRef(o);i.useEffect(()=>{I.current=n,L.current=o},[n,o]);const F=i.useRef([]),j=()=>{F.current.forEach(clearTimeout),F.current=[]},H=(y,_)=>{F.current.push(setTimeout(_,y))};i.useEffect(()=>()=>j(),[]);const k=r[C]?.id??null,v=i.useCallback(()=>{j(),s("playing"),E([]),S(null),b(0);let y=0;e.forEach((_,Y)=>{H(y,()=>{d(Y),p(_.id),I.current?.(_)}),H(y+1e3,()=>{p(null),E($=>[...$,_.id])}),y+=1300}),H(y,()=>{s("done"),L.current?.({score:0,total:e.length})})},[e,b]),T=i.useCallback((y,_)=>{if(_>=y.length){s("done"),L.current?.({score:D.current,total:y.length});return}d(_),S(null),s("playing"),p(y[_].id),I.current?.(y[_]),H(l,()=>{p(null),s("waiting")})},[l]),P=i.useCallback(()=>{j();const y=x(e);c(y),b(0),E([]),T(y,0)},[e,T,b]),G=i.useCallback(()=>{u==="playback"?(c(e),v()):P()},[u,e,v,P]),X=i.useCallback(()=>{j(),s("idle"),p(null),E([]),S(null),d(0),b(0),c([])},[b]);i.useEffect(()=>{t?G():X()},[u,e.length,t]);const le=i.useCallback(y=>{f!=="waiting"||u==="playback"||(S(y),y===r[C]?.id&&b(_=>_+1),u==="exam"?(s("playing"),H(400,()=>T(r,C+1))):(s("feedback"),H(a,()=>T(r,C+1))))},[f,u,r,C,T,a,b]),re=u==="playback"?e.length:r.length;return{bind:{activeSpeakerId:g,playedIds:w,selectedId:h,answerId:k,showFeedback:f==="feedback",clickable:f==="waiting",onSelectSpeaker:le},index:C,total:re,score:B,phase:f,done:f==="done",start:G,reset:X}}exports.CACHE_GROUPS=Hu,exports.CORE_VERSION=zo,exports.DocumentTitleSuppressContext=ku,exports.EMPTY_COMPOSITION=Bu,exports.MediaQueryOverrideContext=Iu,exports.NO_CODA=ne,exports.SYLLABLE_MIN=oe,exports.VAP_PAGE_SIZE_OPTIONS=iu,exports.buildGradeSection=it,exports.buildPartOfSpeechSection=st,exports.buildPositionSection=oo,exports.buildSelectSection=no,exports.buildSyllableSection=to,exports.buildWordTypeSection=ct,exports.charToPronValue=pt,exports.convertComposition=Et,exports.fmtBytes=nn,exports.lsBytes=$u,exports.meaningKey=Au,exports.pronToCharValue=St,exports.syllableToFilter=Su,exports.today=_e,exports.toggleAttributeFilter=lo,exports.useAnchoredMenu=Jo,exports.useCacheManagement=on,exports.useDailyTrainingSelection=ko,exports.useDelayedHoverAnchor=Vo,exports.useDeviceManagement=gn,exports.useDocumentTitle=Vt,exports.useEscToClose=xo,exports.useFontScale=xt,exports.useHoverAnchor=Fo,exports.useMediaQuery=Ft,exports.usePagedList=Ho,exports.usePasswordChange=$t,exports.useRelativeDay=Ht,exports.useSoundCompassExam=Zo,exports.useTablePaging=dn,exports.useTableSort=fn,exports.useToastState=$o,exports.useTrainingTypeLabels=qo,exports.useVisitAllPanel=Cn,exports.useVisitHistory=an,exports.useVisitSchedule=cn,exports.useWindowEvent=Lu,exports.useWordAttributeFilterKeys=at,exports.useWordDataStats=ln,exports.useWordMeanings=vo,exports.useWordTrainingDataGeneration=_o,exports.useWordTrainingFilter=bo,exports.valueToJamos=ce;
1
+ "use strict";var s=require("react"),ce=require("react-i18next"),Ou=require("i18next"),lu=typeof document<"u"?document.currentScript:null;function vt({storageKey:e="fontScale",baseFont:u=20,minScale:t=.8,maxScale:n=1.4,step:o=.1,lineHeightRatio:l=1.4}={}){const r=S=>Math.max(t,Math.min(n,Number(S))),[a,i]=s.useState(()=>{try{const S=localStorage.getItem(e),g=S?Number(S):1;return Number.isFinite(g)?r(g):r(1)}catch{return 1}});s.useEffect(()=>{try{localStorage.setItem(e,String(a))}catch{}},[e,a]);const f=S=>{i(typeof S=="function"?g=>r(S(g)):r(S))},h=()=>f(S=>+(S+o).toFixed(6)),C=()=>f(S=>+(S-o).toFixed(6)),c=a<n-Number.EPSILON,d=a>t+Number.EPSILON,m=Math.round(u*a),y=Math.round(m*l);return{scale:a,setScale:f,increase:h,decrease:C,canIncrease:c,canDecrease:d,fontSize:m,lineHeight:y}}const Nu=s.createContext(null);function xt(e){return/max-width:\s*7[0-9][0-9]px/.test(e)}function Pt(e){const u=s.useContext(Nu),t=l=>typeof window>"u"||!window.matchMedia?!1:window.matchMedia(l).matches,[n,o]=s.useState(t(e));return s.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const l=window.matchMedia(e),r=i=>o(i.matches),a=l;return a.addEventListener?a.addEventListener("change",r):a.addListener&&a.addListener(r),o(l.matches),()=>{a.removeEventListener?a.removeEventListener("change",r):a.removeListener&&a.removeListener(r)}},[e]),u&&typeof u.mobile=="boolean"&&xt(e)?u.mobile:n}function Tu(e){const u=s.useRef(e);return s.useEffect(()=>{u.current=e}),u}function ju(e,u){const t=Tu(u);s.useEffect(()=>{const n=()=>t.current();try{window.addEventListener(e,n)}catch{}return()=>{try{window.removeEventListener(e,n)}catch{}}},[e,t])}const ru=" \xB7 ",Iu=(()=>{if(typeof document>"u")return"";const e=document.title;return e.includes(ru)?e.split(ru).pop()??e:e})(),Ru=s.createContext(!1);function Ft(e){const u=s.useContext(Ru);s.useEffect(()=>{if(u||typeof e!="string"||!e)return;const t=document.title;return document.title=Iu?`${e}${ru}${Iu}`:e,()=>{document.title=t}},[e,u])}function Vt(){const{t:e}=ce.useTranslation();return s.useCallback(u=>{if(!u)return"";const t=new Date(u).getTime();if(Number.isNaN(t))return"";const n=Math.floor((Date.now()-t)/864e5);return n<=0?e("myHomework.relativeDay.today","\uC624\uB298"):n===1?e("myHomework.relativeDay.yesterday","\uC5B4\uC81C"):e("myHomework.relativeDay.daysAgo",{n})},[e])}const Ht=()=>{const e="\uC54C \uC218 \uC5C6\uB294 \uC624\uB958",u=typeof Ou?.t=="function"?Ou.t("common.unknownError",{defaultValue:e}):void 0;return typeof u=="string"&&u?u:e};function $t(e,u){if(u===void 0&&(u=Ht()),e instanceof Error)return e.message||u;if(typeof e=="string")return e||u;if(e&&typeof e=="object"){const t=e;for(const n of[t.message,t.error_description,t.error])if(typeof n=="string"&&n)return n}return u}function Gt(e){const{t:u}=ce.useTranslation(),[t,n]=s.useState({current:"",next:"",confirm:""}),[o,l]=s.useState(null),[r,a]=s.useState(!1),i=s.useRef(null);s.useEffect(()=>()=>{i.current!==null&&clearTimeout(i.current)},[]);const f=s.useCallback(()=>{n({current:"",next:"",confirm:""}),l(null)},[]),h=s.useCallback(async()=>{if(!t.current){l({type:"error",text:u("account.security.password.currentRequired","\uD604\uC7AC \uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694.")});return}if(!t.next){l({type:"error",text:u("account.security.password.newRequired","\uC0C8 \uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694.")});return}if(t.next!==t.confirm){l({type:"error",text:u("account.security.password.mismatch","\uC0C8 \uBE44\uBC00\uBC88\uD638\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.")});return}a(!0);let C;try{C=e?await e(t.current,t.next):null}catch(c){C=$t(c)}finally{a(!1)}if(C){l({type:"error",text:C});return}l({type:"success",text:u("account.security.password.changed","\uBE44\uBC00\uBC88\uD638\uAC00 \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4.")}),n({current:"",next:"",confirm:""}),i.current!==null&&clearTimeout(i.current),i.current=setTimeout(()=>l(null),1500)},[t,e,u]);return{pw:t,setPw:n,pwMsg:o,setPwMsg:l,pwLoading:r,handleChangePw:h,reset:f}}const q=["\u3131","\u3132","\u3134","\u3137","\u3138","\u3139","\u3141","\u3142","\u3143","\u3145","\u3146","\u3147","\u3148","\u3149","\u314A","\u314B","\u314C","\u314D","\u314E"],ee=["\u314F","\u3150","\u3151","\u3152","\u3153","\u3154","\u3155","\u3156","\u3157","\u3158","\u3159","\u315A","\u315B","\u315C","\u315D","\u315E","\u315F","\u3160","\u3161","\u3162","\u3163"],Q=["","\u3131","\u3132","\u3133","\u3134","\u3135","\u3136","\u3137","\u3139","\u313A","\u313B","\u313C","\u313D","\u313E","\u313F","\u3140","\u3141","\u3142","\u3144","\u3145","\u3146","\u3147","\u3148","\u314A","\u314B","\u314C","\u314D","\u314E"];function P(e){if(!e)return null;const u=e.charCodeAt(0)-44032;return u<0||u>=11172?null:{cho:Math.floor(u/588),jung:Math.floor(u%588/28),jong:u%28}}function Yt(){const e=new Map;return u=>{let t=e.get(u);return t||(t=[...u].map(n=>P(n)),e.set(u,t)),t}}function Ce(e,u,t=0){return String.fromCharCode(44032+(e*21+u)*28+t)}function Ut(e,u){if(!e||!u||e===u||e.length!==u.length)return"random";let t=0,n=null;for(let o=0;o<e.length;o++){const l=P(e[o]),r=P(u[o]);if(!l||!r)return"random";if(l.cho===r.cho&&l.jung===r.jung&&l.jong===r.jong)continue;t++;const a=l.cho!==r.cho,i=l.jung!==r.jung,f=l.jong!==r.jong;(a?1:0)+(i?1:0)+(f?1:0)>1?n="multi":a?n="cho":i?n="jung":n="jong"}return t!==1?"random":n==="cho"?"cho":n==="jung"?"jung":n==="jong"?"jong":"random"}const Be={3:["\u3131","\u3145"],5:["\u3134","\u3148"],6:["\u3134","\u314E"],9:["\u3139","\u3131"],10:["\u3139","\u3141"],11:["\u3139","\u3142"],12:["\u3139","\u3145"],13:["\u3139","\u314C"],14:["\u3139","\u314D"],15:["\u3139","\u314E"],18:["\u3142","\u3145"]};Object.fromEntries(Object.entries(Be).map(([e,u])=>[u.join(""),Q[Number(e)]]));function Kt(e,u){if(!e||!u)return!1;for(const t of e){const n=P(t);if(n){if(q[n.cho]===u)return!0;if(n.jong>0){if(Q[n.jong]===u)return!0;const o=Be[n.jong];if(o&&o.includes(u))return!0}}}return!1}function Ve(e){if(!e)return 0;let u=0;for(const t of e)P(t)&&u++;return u}function Wt(e){if(!e)return!1;let u=!1;for(const t of e){const n=P(t);if(n&&(u=!0,n.jong>0))return!1}return u}function qt(e,u){if(e.jong<=0)return!1;if(u.includes(Q[e.jong]))return!0;const t=Be[e.jong];return!!t&&t.some(n=>u.includes(n))}function zt(e,u,t){if(!e)return!1;const n=[...e],o=l=>{const r=P(n[l]);if(!r||u.cho&&!u.cho.includes(q[r.cho])||u.jung&&!u.jung.includes(ee[r.jung]))return!1;if(u.jongNone){if(r.jong>0)return!1}else if(u.jong&&!qt(r,u.jong))return!1;return!0};if(t==="head")return o(0);if(t==="tail")return o(n.length-1);if(t==="mid"){for(let l=1;l<n.length-1;l++)if(o(l))return!0;return!1}for(let l=0;l<n.length;l++)if(o(l))return!0;return!1}const Jt={cho:q.length,jung:ee.length,jong:Q.length};function Xt(e,u,t,n,o=1/0){if(!e||t<1)return[];const l=[...e].map(C=>P(C));if(l.some(C=>!C))return[];const r=l,a=r.length;if(t>a)return[];const i=Jt[u],f=new Set,h=[];(function C(c,d){if(d.length===t){h.push([...d]);return}for(let m=c;m<a;m++)d.push(m),C(m+1,d),d.pop()})(0,[]);for(const C of h)if((function c(d,m){if(f.size>=o)return;if(d===C.length){const g=m.map(E=>Ce(E.cho,E.jung,E.jong)).join("");g!==e&&n.has(g)&&f.add(g);return}const y=C[d],S=r[y][u];for(let g=0;g<i;g++){if(g===S)continue;const E=m.slice();if(E[y]={...m[y],[u]:g},c(d+1,E),f.size>=o)return}})(0,r),f.size>=o)break;return[...f]}function Zt(e,u){if(!e||!u||e.length!==u.length)return-1;let t=0;for(let n=0;n<e.length;n++){const o=P(e[n]),l=P(u[n]);if(!o||!l)return-1;o.cho!==l.cho&&t++,o.jung!==l.jung&&t++,o.jong!==l.jong&&t++}return t}const Lu="word_pair_index_v2",Mu="word_pair_index_sig_v2";let we=null;function Qt(){try{if(typeof localStorage>"u")return null;const e=localStorage.getItem(Lu),u=localStorage.getItem(Mu);return!e||!u?null:{index:JSON.parse(e),sig:u}}catch{return null}}function be(){if(we)return we;const e=Qt();return e?(we=e.index,e.sig,we):null}function en(){we=null;try{typeof localStorage<"u"&&(localStorage.removeItem(Lu),localStorage.removeItem(Mu))}catch{}}const ku="word_image_existence_map_v1";let Se=null;function vu(){if(Se)return Se;try{const e=typeof localStorage<"u"?localStorage.getItem(ku):null;Se=e?JSON.parse(e):{}}catch{Se={}}return Se}function un(e,u){return`${e}_${u??1}`}function tn(e,u){const t=vu(),n=un(e,u);return n in t?t[n]:void 0}function xu(){const e=vu(),u=Object.values(e);return u.length===0?null:{total:u.length,exists:u.filter(Boolean).length}}function nn(){Se={};try{typeof localStorage<"u"&&localStorage.removeItem(ku)}catch{}}const Pu=[{id:"wordData",labelKey:"settings.cache.group.wordData.label",subKey:"settings.cache.group.wordData.sub",keys:["word_data_cache","word_data_version"]},{id:"pairIndex",labelKey:"settings.cache.group.pairIndex.label",subKey:"settings.cache.group.pairIndex.sub",keys:["word_pair_index_v2","word_pair_index_sig_v2"]},{id:"imageCache",labelKey:"settings.cache.group.imageCache.label",subKey:"settings.cache.group.imageCache.sub",keys:["word_image_existence_map_v1"]}];function Fu(e){return e.reduce((u,t)=>{try{const n=localStorage.getItem(t);return u+(n?new Blob([n]).size:0)}catch{return u}},0)}function on(e){return e===0?"0 B":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:e<1024*1024*1024?`${(e/(1024*1024)).toFixed(2)} MB`:`${(e/(1024*1024*1024)).toFixed(2)} GB`}function ln(e){const{t:u}=ce.useTranslation(),[t,n]=s.useState({}),[o,l]=s.useState(null),[r,a]=s.useState(null),[i,f]=s.useState(null),h=s.useCallback(()=>{const c={};Pu.forEach(d=>{c[d.id]=Fu([...d.keys])}),n(c),typeof navigator<"u"&&navigator.storage?.estimate&&navigator.storage.estimate().then(d=>{f({usage:d.usage??0,quota:d.quota??0})}).catch(()=>{})},[]);s.useEffect(()=>{h()},[h]);const C=s.useCallback(async c=>{l(c);try{c==="wordData"?(localStorage.removeItem("word_data_cache"),localStorage.removeItem("word_data_version")):c==="pairIndex"?en():c==="imageCache"&&nn(),h(),e?.(u("settings.cache.cleared","\uCE90\uC2DC\uAC00 \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4."))}finally{l(null)}},[h,e,u]);return{cacheSizes:t,clearingId:o,confirmCacheId:r,setConfirmCacheId:a,storageEstimate:i,refreshCacheSizes:h,handleClearCache:C}}function rn(e){const[u,t]=s.useState(null),[n,o]=s.useState(null),l=s.useCallback(()=>{const r=be();if(r){const i=Object.values(r),f=i.filter(h=>h.cho.length+h.jung.length+h.jong.length>0).length;t({matched:f,total:i.length})}else t(null);const a=xu();o(a?{exists:a.exists,total:a.total}:null)},[]);return s.useEffect(()=>{l();const r=setTimeout(l,1e3);return()=>clearTimeout(r)},[e?.length,l]),{pairStats:u,imgStats:n,setPairStats:t,setImgStats:o,refreshStats:l}}function Vu(e,u=[]){const[t,n]=s.useState(u),[o,l]=s.useState(null),[r,a]=s.useState(!1),[i,f]=s.useState(e),h=s.useRef(r);s.useEffect(()=>{h.current=r});const C=s.useRef(null);s.useEffect(()=>{if(h.current)return;const g=C.current;g!==null&&g.length===u.length&&g.every((E,w)=>E===u[w])||(C.current=u,n(u))},[u]);const c=s.useCallback(g=>{l(g),a(!1),f({...g})},[]),d=s.useCallback(()=>a(!0),[]),m=s.useCallback(()=>a(!1),[]),y=s.useCallback((g,E)=>{n(g),l(E),a(!1)},[]),S=s.useCallback(g=>{n(E=>E.filter(w=>w!==g)),l(null)},[]);return{list:t,setList:n,selected:o,setSelected:l,isEditing:r,setIsEditing:a,editForm:i,setEditForm:f,openDetail:c,startEditing:d,cancelEditing:m,commitEdit:y,remove:S}}const Ae=()=>{const e=new Date;return{year:String(e.getFullYear()),month:String(e.getMonth()+1).padStart(2,"0"),day:String(e.getDate()).padStart(2,"0")}},an={year:"",month:"",day:"",hour:"09",minute:"00",memo:""};function sn(e=[]){const{list:u,setList:t,selected:n,setSelected:o,isEditing:l,setIsEditing:r,editForm:a,setEditForm:i,openDetail:f,commitEdit:h}=Vu(an,e),{year:C,month:c,day:d}=Ae(),[m,y]=s.useState({year:C,month:c,day:d,hour:"09",minute:"00",memo:""});return{visitHistory:u,visitForm:m,setVisitForm:y,setVisit:S=>g=>y(E=>({...E,[S]:g})),selectedVisit:n,setSelectedVisit:o,isEditingVisit:l,setIsEditingVisit:r,editVisitForm:a,setEditVisitForm:i,openVisitDetail:f,handleVisitSave:S=>{t(A=>[m,...A]);const{year:g,month:E,day:w}=Ae();y({year:g,month:E,day:w,hour:"09",minute:"00",memo:""}),S?.()},handleVisitEditSave:()=>{h(S=>S.map(g=>g===n?a:g),a)},addVisit:S=>{t(g=>[S,...g])},removeVisit:S=>{t(g=>g.filter(E=>E!==S))},revertVisitEdit:(S,g)=>{t(E=>E.map(w=>w===g?S:w)),o(E=>E===g?S:E)}}}const Hu=e=>`${e.year.padStart(4,"0")}-${e.month.padStart(2,"0")}-${e.day.padStart(2,"0")} ${e.hour.padStart(2,"0")}:${e.minute.padStart(2,"0")}`,He=e=>[...e].sort((u,t)=>{const n=Hu(u),o=Hu(t);return n<o?-1:n>o?1:0}),cn={year:"",month:"",day:"",hour:"09",minute:"00",memo:""};function Cn(e,u=[]){const t=s.useMemo(()=>He(u),[u]),{list:n,setList:o,selected:l,setSelected:r,isEditing:a,setIsEditing:i,editForm:f,setEditForm:h,openDetail:C,commitEdit:c,remove:d}=Vu(cn,t),[m,y]=s.useState([]),{year:S,month:g,day:E}=Ae(),[w,A]=s.useState({year:S,month:g,day:E,hour:"09",minute:"00",memo:""}),_=I=>M=>A(F=>({...F,[I]:M})),b=I=>{o(se=>He([...se,w]));const{year:M,month:F,day:J}=Ae();A({year:M,month:F,day:J,hour:"09",minute:"00",memo:""}),I?.()},L=()=>{c(I=>He(I.map(M=>M===l?f:M)),f)},T=s.useCallback(I=>{d(I)},[d]),v=s.useCallback(I=>{e({year:I.year,month:I.month,day:I.day,hour:I.hour,minute:I.minute,memo:I.memo}),d(I)},[e,d]),R=s.useCallback(I=>{o(M=>M.filter(F=>F!==I)),y(M=>[I,...M]),r(null)},[o,r]),V=s.useCallback(I=>{o(M=>He([...M,I]))},[o]),$=s.useCallback(I=>{o(M=>M.filter(F=>F!==I))},[o]),Y=s.useCallback((I,M)=>{o(F=>F.map(J=>J===M?I:J)),r(F=>F===M?I:F)},[o,r]);return{scheduleList:n,noShowList:m,addSchedule:V,removeSchedule:$,revertScheduleEdit:Y,scheduleForm:w,setScheduleForm:A,setSchedule:_,selectedSchedule:l,setSelectedSchedule:r,isEditingSchedule:a,setIsEditingSchedule:i,editScheduleForm:f,setEditScheduleForm:h,openScheduleDetail:C,handleScheduleSave:b,handleScheduleEditSave:L,handleScheduleDelete:T,handleScheduleToVisit:v,handleScheduleNoVisit:R}}const $e=[{value:"10",label:"10\uAC1C\uC529 \uBCF4\uAE30"},{value:"25",label:"25\uAC1C\uC529 \uBCF4\uAE30"},{value:"50",label:"50\uAC1C\uC529 \uBCF4\uAE30"},{value:"100",label:"100\uAC1C\uC529 \uBCF4\uAE30"}];function dn(e){const{t:u}=ce.useTranslation(),[t,n]=s.useState(""),[o,l]=s.useState("25"),[r,a]=s.useState("all"),[i,f]=s.useState(1),h=s.useMemo(()=>e.filter(({item:y,status:S})=>!(t&&!y.memo.includes(t)||r!=="all"&&S!==r)),[e,t,r]),C=Math.max(1,Math.ceil(h.length/Number(o))),c=Math.min(i,C),d=s.useMemo(()=>h.slice((c-1)*Number(o),c*Number(o)),[h,c,o]),m=s.useMemo(()=>$e.map(y=>({...y,label:u("common.pageSizeLabel",{n:y.value,defaultValue:y.label})})),[u]);return{vapSearch:t,setVapSearch:n,vapPageSize:o,setVapPageSize:l,vapPageSizeOptions:m,vapStatus:r,setVapStatus:a,vapPage:c,setVapPage:f,vapFiltered:h,vapTotal:C,vapPageItems:d}}function fn(e,u,t){const{t:n}=ce.useTranslation(),[o,l]=s.useState(()=>{const m=t?.initialPageSize;return m&&$e.some(y=>y.value===m)?m:"25"}),[r,a]=s.useState(1),[i,f]=s.useState(u);i!==u&&(f(u),r!==1&&a(1));const h=s.useMemo(()=>$e.map(m=>({...m,label:n("visits.showN",{n:m.value})})),[n]),C=s.useCallback(m=>{l(m),a(1)},[]),c=Math.max(1,Math.ceil(e.length/Number(o))),d=Math.min(r,c);return{pageRows:s.useMemo(()=>e.slice((d-1)*Number(o),d*Number(o)),[e,d,o]),pageSizeProps:{options:h,value:o,onChange:C},paginationProps:{page:d,total:c,onChange:a},setPage:a}}function gn(){const[e,u]=s.useState(null),t=s.useCallback(o=>{u(l=>l?.key===o?{key:o,asc:!l.asc}:{key:o,asc:!0})},[]),n=s.useCallback((o,l)=>({label:o,sortDir:e?.key===l?e.asc?"asc":"desc":null,onClick:()=>t(l)}),[e,t]);return{\uC815\uB82C:e,\uCE78:n}}const $u=e=>e==="\uC88C"||e==="\uC6B0"?e:null;function hn(){const[e,u]=s.useState(!1),[t,n]=s.useState("\uC88C"),[o,l]=s.useState({\uC88C:null,\uC6B0:null}),[r,a]=s.useState({\uC88C:[],\uC6B0:[]}),[i,f]=s.useState(!1),[h,C]=s.useState("\uC88C"),c=s.useCallback(m=>{const y=$u(m.direction);y&&(l(S=>({...S,[y]:m})),a(S=>({...S,[y]:[m,...S[y]]})),u(!1))},[]),d=s.useCallback(m=>{const y=$u(m.direction);y&&(l(S=>({...S,[y]:m})),f(!1))},[]);return{showDevice:e,setShowDevice:u,deviceDirection:t,setDeviceDirection:n,devices:o,setDevices:l,deviceHistory:r,setDeviceHistory:a,showDeviceList:i,setShowDeviceList:f,listForSide:h,setListForSide:C,handleDeviceSubmit:c,handleSelectFromList:d}}const mn="__ihab_core_word_pool__";function Ge(){return globalThis[mn]??null}function x(e,u=Math.random){const t=e.slice();for(let n=t.length-1;n>0;n--){const o=Math.floor(u()*(n+1));[t[n],t[o]]=[t[o],t[n]]}return t}function le(e,u,t=Math.random){return!Array.isArray(e)||e.length===0||u<=0?[]:u>=e.length?x(e,t):x(e,t).slice(0,u)}const au={SAME_SOUND_PICK:{difficulty:!0,choseong:!0,group:"discrimination"},SAME_OR_DIFF:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_SAME:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_INCLUDED:{difficulty:!0,choseong:!0,group:"discrimination"},STARTS_WITH_SAME_SOUND:{difficulty:!1,choseong:!0,group:"discrimination"},LISTEN_AND_REMEMBER_ORDER:{difficulty:!1,choseong:!0,group:"attention"},MERGE_2_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_2_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},DROP_1_FROM_2SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_1_FROM_3SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_PART_FROM_COMPOUND:{difficulty:!1,choseong:!0,group:"deletion"},DROP_FINAL_CONSONANT_FROM_1SYLL:{difficulty:!1,choseong:!0,group:"deletion"},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{difficulty:!1,choseong:!0,group:"deletion"},CHANGE_1_SYLL_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_SYLL_IN_3SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_1SYLL:{difficulty:!1,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"}},pn=q.indexOf("\u3147"),Gu={DROP_FINAL_CONSONANT_FROM_1SYLL:{syllables:1,syllable:e=>e.jong>0},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{syllables:1,syllable:e=>e.jong===0&&e.cho!==pn},MERGE_2_SYLLABLES:{syllables:2,syllable:()=>!0},MERGE_3_SYLLABLES:{syllables:3,syllable:()=>!0},MERGE_2_PHONEMES:{syllables:1,syllable:e=>e.jong===0},MERGE_3_PHONEMES:{syllables:1,syllable:e=>e.jong>0}},Sn={\u3131:"\u3131",\u3132:"\u3131",\u314B:"\u3131",\u3133:"\u3131",\u313A:"\u3131",\u3134:"\u3134",\u3135:"\u3134",\u3136:"\u3134",\u3137:"\u3137",\u3145:"\u3137",\u3146:"\u3137",\u3148:"\u3137",\u314A:"\u3137",\u314C:"\u3137",\u314E:"\u3137",\u3139:"\u3139",\u313C:"\u3139",\u313D:"\u3139",\u313E:"\u3139",\u3140:"\u3139",\u3141:"\u3141",\u313B:"\u3141",\u3142:"\u3142",\u314D:"\u3142",\u313F:"\u3142",\u3144:"\u3142",\u3147:"\u3147"},En={\u314F:{nucleus:"\u314F"},\u3151:{glide:"j",nucleus:"\u314F"},\u3153:{nucleus:"\u3153"},\u3155:{glide:"j",nucleus:"\u3153"},\u3157:{nucleus:"\u3157"},\u315B:{glide:"j",nucleus:"\u3157"},\u315C:{nucleus:"\u315C"},\u3160:{glide:"j",nucleus:"\u315C"},\u3161:{nucleus:"\u3161"},\u3163:{nucleus:"\u3163"},\u3150:{nucleus:"\u3154/\u3150"},\u3152:{glide:"j",nucleus:"\u3154/\u3150"},\u3154:{nucleus:"\u3154/\u3150"},\u3156:{glide:"j",nucleus:"\u3154/\u3150"},\u3158:{glide:"w",nucleus:"\u314F"},\u3159:{glide:"w",nucleus:"\u3154/\u3150"},\u315A:{glide:"w",nucleus:"\u3154/\u3150"},\u315D:{glide:"w",nucleus:"\u3153"},\u315E:{glide:"w",nucleus:"\u3154/\u3150"},\u315F:{glide:"w",nucleus:"\u3163"},\u3162:{glide:"\u0270",nucleus:"\u3163"}};function Yu(e){return Sn[e]??e}const su={cho:q,jung:ee,jong:Q},K=e=>Array.isArray(e)?e.length>0:!!e;function iu(e,u){if(e.length!==u.length)return!1;for(let t=0;t<e.length;t++){const n=e[t],o=u[t];if(!(!n||!o)&&(n.cho!==o.cho&&q[n.cho]==="\u3147"!=(q[o.cho]==="\u3147")||n.jong!==o.jong&&n.jong===0!=(o.jong===0)))return!0}return!1}function yn(e,u,t){const n=t.pronOf(e),o=t.decompOf,l=t.sameStructureOnly&&o?o(n):null,r=[];for(const a of u)a!==e&&(t.okSet&&!t.okSet.has(a)||t.pronOf(a)!==n&&(l&&o&&iu(l,o(t.pronOf(a)))||r.push(a)));return r}function Uu(e,u,t){const n=u?.[e];if(!n)return[];const o=t.kind?n[t.kind]??[]:[...n.cho??[],...n.jung??[],...n.jong??[]];return yn(e,o,t)}function Bn(e,u,t,n,o,l,r){const a=["cho","jung","jong"].filter(c=>K(e[c])),i={};for(const c of a){const d=e[c];i[c]=new Set(Array.isArray(d)?d:[d])}const f=o==="pron",h=new Map;for(const c of u){const d=t(l(c));if(d.some(g=>!g))continue;let m=d;if(!f&&(m=t(c),m.length!==d.length||m.some(g=>!g)))continue;const y=d.length,S=h.get(y);S?S.push({w:c,dPron:d,dPos:m}):h.set(y,[{w:c,dPron:d,dPos:m}])}const C=new Map;for(const[c,d]of h){const m=new Map,y=(S,g)=>{const E=S.dPos[g];return E!=null&&a.every(w=>i[w].has(su[w][E[w]]))};for(const S of d){let g;if(r==="head")g=y(S,0)?0:-1;else if(r==="tail")g=y(S,c-1)?c-1:-1;else if(r==="mid"){g=-1;for(let w=1;w<c-1;w++)if(y(S,w)){g=w;break}}else g=S.dPos.findIndex(w=>w!=null&&a.every(A=>i[A].has(su[A][w[A]])));if(g<0)continue;const E=m.get(g);E?E.push(S):m.set(g,[S])}for(const[S,g]of m){const E=new Set(a.map(_=>S+":"+_)),w=_=>{let b="";for(let L=0;L<c;L++){const T=_[L];for(const v of["cho","jung","jong"])b+=(E.has(L+":"+v)?"*":T[v])+"."}return b},A=new Map;for(const _ of d){const b=w(_.dPron),L=A.get(b);L?L.push(_):A.set(b,[_])}for(const _ of g){const b=A.get(w(_.dPron))??[],L=[];for(const T of b){if(T.w===_.w)continue;let v=!0;for(const R of a){const V=_.dPron[S][R],$=T.dPron[S][R];if($===V){v=!1;break}if(f&&i[R].has(su[R][$])){v=!1;break}}v&&(n&&iu(_.dPron,T.dPron)||L.push(T.w))}C.set(_.w,L)}}}return C}const wn=e=>e==null?[]:Array.isArray(e)?e:[e];function bn(e){if([...e].length!==1)return"";const u=P(e);if(!u)return"";const t=Yu(Q[u.jong]),n=t===""?0:Q.indexOf(t);return Ce(u.cho,u.jung,n<0?0:n)}function Ku(e,u){return u.get(e)||bn(e)||e}function cu(e){return e?K(e.cho)?"cho":K(e.jung)?"jung":K(e.jong)?"jong":null:null}function Ee(e,u){const t=(n,o)=>!K(n)||wn(n).includes(o);return t(u.cho,q[e.cho])&&t(u.jung,ee[e.jung])&&t(u.jong,Q[e.jong])}function _e(e,u,t){const n=[...e];if(t!=="pron")return n.map(l=>P(l));const o=[...u.get(e)||e];return o.length!==n.length?n.map(l=>P(l)):o.map(l=>P(l))}function De(e,u,t,n,o){const l=u==="cho"?q:u==="jung"?ee:Q,r=e[u],a=[],i=C=>u==="jung"?_n(Ku(C,o)):Ku(C,o),f=new Map([[i(t),-1]]),h=x(l.map((C,c)=>c).filter(C=>C!==r&&(u!=="cho"||l[C]!=="\u3147")&&(u!=="jong"||C!==0)));for(const C of h){if(a.length>=n)break;const c=u==="cho"?Ce(C,e.jung,e.jong):u==="jung"?Ce(e.cho,C,e.jong):Ce(e.cho,e.jung,C),d=i(c),m=f.get(d);if(m!==void 0){u==="jung"&&m>=0&&o.has(c)&&!o.has(a[m])&&(a[m]=c);continue}f.set(d,a.length),a.push(c)}return a}const An={\u3154:"\u3150",\u3156:"\u3152",\u315A:"\u3159",\u315E:"\u3159"};function _n(e){if([...e].length!==1)return e;const u=P(e);if(!u)return e;const t=An[ee[u.jung]];return t?Ce(u.cho,ee.indexOf(t),u.jong):e}function Dn(e,u,t,n,o,l=null){const r=[...e];if(r.length!==2)return null;const a=r.map(C=>P(C));if(a.some(C=>!C))return null;const i=_e(e,t,n);if(i.some(C=>!C))return null;const f=cu(u);let h=f&&u?i.map((C,c)=>Ee(C,u)?c:-1).filter(C=>C>=0):[0,1];if(l!=null&&(h=h.filter(C=>C!==l)),!h.length)return null;for(const C of x(h)){const c=r[C];if(!o.has(c))continue;const d=De(a[C],f??"cho",c,40,t),m=[];for(const y of d)if(y!==c&&o.has(y)&&!m.includes(y)&&m.push(y),m.length>=2)break;if(!(m.length<2))return{question:e,distractors:[c,...m]}}return null}function On(e,u,t,n,o,l=null){const r=[...e];if(r.length!==3)return null;const a=r.map(C=>P(C));if(a.some(C=>!C))return null;const i=_e(e,t,n);if(i.some(C=>!C))return null;const f=cu(u),h=f&&u?i.map((C,c)=>Ee(C,u)?c:-1).filter(C=>C>=0):[0,1,2];if(!h.length)return null;for(const C of x(h))for(const c of x([0,1,2].filter(d=>d!==C&&(l==null||d===l)))){const d=[0,1,2].filter(E=>E!==c),m=d.map(E=>r[E]).join("");if(!o.has(m))continue;const y=d.indexOf(C),S=De(a[C],f??"cho",r[C],40,t),g=[];for(const E of S){const w=d.map(_=>r[_]);w[y]=E;const A=w.join("");if(A!==m&&o.has(A)&&!g.includes(A)&&g.push(A),g.length>=2)break}if(!(g.length<2))return{question:e,distractors:[m,...g]}}return null}function Nn(e,u,t,n,o,l=null){const r=[...e],a=r.length;if(a<2)return null;const i=[];for(let h=1;h<=a-1;h++)i.push({remain:r.slice(0,h).join(""),dropped:r.slice(h).join(""),droppedEnd:1}),i.push({remain:r.slice(a-h).join(""),dropped:r.slice(0,a-h).join(""),droppedEnd:0});const f=cu(u);for(const{remain:h,dropped:C,droppedEnd:c}of x(i)){if(l!=null&&c!==l||h===e||!o.has(h)||!o.has(C))continue;const d=[...h],m=d.map(g=>P(g));if(m.some(g=>!g))continue;const y=_e(h,t,n);if(y.some(g=>!g))continue;const S=f&&u?y.map((g,E)=>Ee(g,u)?E:-1).filter(g=>g>=0):d.map((g,E)=>E);if(S.length)for(const g of x(S)){const E=De(m[g],f??"cho",d[g],40,t),w=[];for(const A of E){const _=[...d];_[g]=A;const b=_.join("");if(b!==h&&o.has(b)&&!w.includes(b)&&w.push(b),w.length>=2)break}if(w.length>=2)return{question:e,distractors:[h,...w]}}}return null}function Tn(e,u,t,n,o,l=null){if([...e].length!==1)return null;const r=P(t.get(e)||e);if(!r||r.jong===0)return null;const a=Ce(r.cho,r.jung,0),i=De({cho:r.cho,jung:r.jung,jong:0},"cho",a,2,t);return i.length<2?null:{question:e,distractors:[a,...i]}}const Cu=q.indexOf("\u3147");function jn(e,u,t,n,o,l=null){if([...e].length!==1)return null;const r=P(t.get(e)||e);if(!r||r.jong!==0||r.cho===Cu)return null;const a=Ce(Cu,r.jung,0),i=De({cho:Cu,jung:r.jung,jong:0},"jung",a,2,t);return i.length<2?null:{question:e,distractors:[a,...i]}}function In(e){const u=new Map;for(const t of e){const n=[...t],o=n.length;if(!(o<2||o>3))for(let l=0;l<o;l++){let r=o+"|"+l+"|";for(let i=0;i<o;i++)r+=i===l?"*":n[i];const a=u.get(r);a?a.push(t):u.set(r,[t])}}return u}function Rn(e,u,t,n,o,l=null,r=null,a=2){const i=[...e],f=i.length;if(f<2||f>3)return null;const h=i.map(E=>P(E));if(h.some(E=>!E))return null;const C=_e(e,t,n);if(C.some(E=>!E))return null;const c=E=>t.get(E)??E,d=c(e),m=!!u&&(K(u.cho)||K(u.jung)||K(u.jong)),y=!!r&&(K(r.cho)||K(r.jung)||K(r.jong)),S=E=>{let w=f+"|"+E+"|";for(let A=0;A<f;A++)w+=A===E?"*":i[A];return w};let g;if(l!=null){if(l>=f||m&&!Ee(C[l],u))return null;g=[l]}else m?g=C.map((E,w)=>Ee(E,u)?w:-1).filter(E=>E>=0):g=Array.from({length:f},(E,w)=>w);for(const E of x(g)){const w=o.get(S(E))??[],A=[],_=[];for(const R of w){if(R===e)continue;const V=[...R].map(M=>P(M)),$=h[E],Y=V[E];if(!$||!Y)continue;let I=0;if($.cho!==Y.cho&&I++,$.jung!==Y.jung&&I++,$.jong!==Y.jong&&I++,!(I<a||c(R)===d))if(y){const M=_e(R,t,n)[E];M&&Ee(M,r)?A.push(R):_.push(R)}else A.push(R)}if(!A.length)continue;const b=x(A)[0],L=[],T=new Set([d,c(b)]),v=y?_:A.filter(R=>R!==b);for(const R of x(v)){const V=c(R);if(!T.has(V)&&(T.add(V),L.push(R),L.length>=2))break}if(!y&&L.length<2)for(const R of x(w)){if(R===e||R===b)continue;const V=c(R);if(!T.has(V)&&(T.add(V),L.push(R),L.length>=2))break}if(!(L.length<2))return{question:e,distractors:[b,...L]}}return null}let Ye=null,Wu=null,qu=null;function Ln(){const e=Ge();if(e&&e.entries.length>0){const u=be();if(Ye&&Wu===e&&qu===u)return Ye;const t=new Set,n=[];for(const o of e.entries)!o.word||t.has(o.word)||(t.add(o.word),n.push({w:o.word,s:o.syllables,p:u?.[o.word]?[...u[o.word].cho??[],...u[o.word].jung??[],...u[o.word].jong??[]]:[],pron:o.pronunciation||o.word,grade:o.grade}));return Ye=n,Wu=e,qu=u,Ye}return[]}const ue=new Proxy([],{get(e,u){const t=Ln(),n=t[u];return typeof n=="function"?n.bind(t):n}});function Ue(e){return e.length?e[Math.floor(Math.random()*e.length)]:void 0}function te(e,u){if(u>=e.length)return x(e);if(u===0)return[];const t=e.slice();for(let n=0;n<u;n++){const o=n+Math.floor(Math.random()*(t.length-n)),l=t[n];t[n]=t[o],t[o]=l}return t.slice(0,u)}let du=null,zu=null;function fe(){const e=Ge();if(du&&zu===e)return du;const u=new Map;for(const t of ue)t.w&&u.set(t.w,t.pron);return du=u,zu=e,u}function X(e){return fe().get(e)||e}function fu(e,u,t=new Set){const n=[];for(const o of x(e)){if(n.length>=u)break;const l=X(o);t.has(l)||(t.add(l),n.push(o))}return n}let Mn=0;function z(e){return`${e}-rt-${++Mn}`}function Oe(e){const u=xu();if(!u||u.total===0){const n=new Set;for(const o of e)n.add(o);return n}const t=new Set;for(const n of e)tn(n)===!0&&t.add(n);return t}const Ke=new Map;let Ju=null,Xu=null;function Ne(e){return e==null?"":Array.isArray(e)?e.slice().sort().join(","):e}function Zu(e){const u=Ne(e.choseong),t=e.composition,n=t?.syllable==null?"":Array.isArray(t.syllable)?t.syllable.slice().sort().join(","):String(t.syllable),o=t?`${Ne(t.cho)}/${Ne(t.jung)}/${Ne(t.jong)}/${t.jongNone?"N":""}/${n}`:"",l=Ne(e.grade);return`${e.difficulty??""}|${u}|${o}|${e.excludeNoImage?"1":"0"}|${e.count??""}|x${e.contrastCount??1}|${e.fullCount?"F":""}|s${e.sameStructureOnly===!1?"0":"1"}|v${e.phonemeView==="pron"?"p":"c"}|g${l}|t${e.targetSyllable??""}|c${e.choicesPerItem??""}`}async function Z(e){const u=Ge(),t=be();(u!==Ju||t!==Xu)&&(Ke.clear(),Ju=u,Xu=t);const n=Zu(e);return Ke.has(n)||Ke.set(n,vn(e)),Ke.get(n)}function kn(e){if(!e)return null;const u=r=>r==null?null:Array.isArray(r)?r.length?r:null:[r],t=u(e.cho),n=u(e.jung),o=!!e.jongNone,l=o?null:u(e.jong);return t||n||l||o?o&&!t&&!n&&!l?r=>Wt(r):r=>zt(r,{cho:t,jung:n,jong:l,jongNone:o}):null}async function vn(e){const{difficulty:u=null,choseong:t=null,composition:n=null,targetSyllable:o=null,excludeNoImage:l=!1}=e,r=e.grade&&e.grade.length>0?new Set(e.grade):null,a=e.sameStructureOnly??!0,i=e.phonemeView==="pron"?"pron":"char",f=Math.max(1,e.contrastCount??1),h=u==="cho"||u==="jung"||u==="jong",C=h&&f>=2,c=u==="count",d=t?new Set(Array.isArray(t)?t:[t]):null,m=n?.syllable!=null?new Set(Array.isArray(n.syllable)?n.syllable:[n.syllable]):null,y=n?[kn(n),m?B=>m.has(Ve(B)):null].filter(B=>B!=null):[],S=u==="random"||u===null,g=S||c,E=S||C||c;let w=ue.filter(B=>!B.w||r&&(!B.grade||!r.has(B.grade))?!1:E?!0:Array.isArray(B.p)&&B.p.length>0);d&&(w=w.filter(B=>{for(const D of d)if(Kt(B.w,D))return!0;return!1})),y.length>0&&(w=w.filter(B=>{const D=i==="pron"?X(B.w):B.w;return y.every(G=>G(D))})),o&&(w=w.filter(B=>B.w[0]===o));let A;if(l){const B=new Set;for(const D of w)if(B.add(D.w),Array.isArray(D.p))for(const G of D.p)B.add(G);if(g)for(const D of ue)D.w&&B.add(D.w);A=Oe(B)}else{const B=new Set;for(const D of w)if(B.add(D.w),Array.isArray(D.p))for(const G of D.p)B.add(G);if(g)for(const D of ue)D.w&&B.add(D.w);A=B}let _=null;if(C){const B=new Set;for(const D of ue)D.w&&B.add(D.w);_=l?Oe(B):B}const b=w.filter(B=>A.has(B.w)),L=600,T=Array.from(A),v=T.length>L?te(T,L):T,R=c&&n!=null&&(K(n.cho)||K(n.jung)||K(n.jong)),V=2500,$=new Map;if(c&&!R&&f>=2){for(const B of T){const D=Ve(B),G=$.get(D);G?G.push(B):$.set(D,[B])}for(const[B,D]of $)D.length>V&&$.set(B,te(D,V))}const Y=Yt(),I=R?Bn(n,T,Y,a,i,X):null,M=500,F=1500,J=e.fullCount?b:u==="random"?b.length>M?te(b,M):b:b.length>F?te(b,F):b,se=be(),ie=[];for(const B of J){let D;const G=X(B.w);if(C)D=Xt(B.w,u,f,_,24).filter(H=>X(H)!==G);else if(c)R?D=(I.get(B.w)??[]).filter(H=>X(H)!==G):f<=1?D=Uu(B.w,se,{okSet:A,pronOf:X,decompOf:Y,sameStructureOnly:!1}):D=($.get(Ve(B.w))??[]).filter(H=>{if(H===B.w||X(H)===G)return!1;const O=Zt(B.w,H);return f>=5?O>=5:O===f});else if(S)D=v.filter(H=>H!==B.w&&H.length===B.w.length&&X(H)!==G);else{const H=u;D=Uu(B.w,se,{kind:H,okSet:A,pronOf:X,decompOf:Y,sameStructureOnly:!1}),D.length===0&&(D=(v.length>30?te(v,30):v).filter(O=>O!==B.w&&Ut(B.w,O)===u&&X(O)!==G))}if(a&&D.length>0&&(h||c&&!R)){const H=Y(X(B.w));D=D.filter(O=>!iu(H,Y(X(O))))}D.length!==0&&ie.push({word:B,usable:D})}return ie}async function Qu(e,u){const{choicesPerItem:t=3,count:n=10}=u,o=t-1,l=(await Z(u)).filter(a=>a.usable.length>=o),r=[];for(const a of x(l)){if(r.length>=n)break;const i=fu(a.usable,o);if(i.length<o)continue;const f=x([a.word.w,...i]);r.push({id:z(e+"-item"),index:r.length+1,word:a.word.w,syllables:a.word.s,choices:f,answerIndex:f.indexOf(a.word.w)})}return r}async function xn(e){const{choicesPerItem:u=3,count:t=10}=e,n=u-1,o=await Z({...e,difficulty:null});if(o.length<u)return[];const l=[],r=x([...o]);for(const a of r){if(l.length>=t)break;const i=a.word.w,f=[...a.word.pron||i],h=Ue(f);if(!h)continue;const C=o.filter(m=>m.word.w!==i&&m.word.s===a.word.s&&!(m.word.pron||m.word.w).includes(h)&&m.word.pron!==a.word.pron);if(C.length<n)continue;const c=fu(C.map(m=>m.word.w),n);if(c.length<n)continue;const d=x([i,...c]);l.push({id:z("HPI-item"),index:l.length+1,targetSyllable:h,word:i,choices:d,answerIndex:d.indexOf(i)})}return l}async function Pn(e){const{count:u=10}=e,t=(await Z(e)).filter(n=>n.usable.length>=1);return Array.from({length:u},(n,o)=>{const l=Ue(t);if(!l)return null;const r=o%2===0;let a;if(r)a=[l.word.w,l.word.w];else{const i=Ue(l.usable);a=Math.random()<.5?[l.word.w,i]:[i,l.word.w]}return{id:z("SOD-item"),index:o+1,word:l.word.w,pair:a,same:r}}).filter(n=>!!n)}async function Fn(e){const{choicesPerItem:u=3,count:t=10}=e,n=u-1,o=await Z({...e,difficulty:null});if(o.length<u+1)return[];const l=o.map(c=>c.word.w),r=new Map(o.map(c=>[c.word.w,c.word.pron])),a=c=>(r.get(c)||c)[0]??"",i={};for(const c of o){const d=a(c.word.w);d&&(i[d]||(i[d]=[]),i[d].push(c.word.w))}const f=Object.entries(i).filter(([,c])=>c.length>=2).map(([c])=>c);if(f.length===0)return[];const h=[],C=x([...f]);for(let c=0;h.length<t&&c<t*4;c++){const d=C[c%C.length],m=i[d];if(m.length<2)continue;const y=x([...m]),S=y[0],g=y[1];if(!S||!g||S===g||(r.get(S)||S)===(r.get(g)||g))continue;const E=r.get(g)||g,w=l.filter(b=>a(b)!==d&&b!==S&&b!==g&&b.length===g.length&&(r.get(b)||b)!==E);if(w.length<n)continue;const A=fu(w,n);if(A.length<n)continue;const _=x([g,...A]);h.push({id:z("SWS-item"),index:h.length+1,sourceWord:S,targetSyllable:d,word:g,choices:_,answerIndex:_.indexOf(g)})}return h}function et(e,u,t){return te(e,u).map((n,o)=>{const l=Ue(n.usable)??"",r=[...n.word.w],a=[...l],i=r.findIndex((h,C)=>h!==a[C]),f=x(n.usable.filter(h=>h&&h!==l)).slice(0,2);return{id:z(t),index:o+1,word:n.word.w,original:n.word.w,changed:l,changedFrom:i>=0?r[i]:"",changedTo:i>=0?a[i]:"",distractors:f}})}async function ut(e,u,t){const{count:n=10}=u,o=fe(),l=ue.filter(d=>d.w&&d.s===e),r=u.excludeNoImage?Oe(l.map(d=>d.w)):null,a=r?l.filter(d=>r.has(d.w)):l,i=new Set(a.map(d=>d.w)),f=In(i),h=u.phonemeView??"char",C=u.composition??null,c=[];for(const d of x(a)){if(c.length>=n)break;const m=Rn(d.w,C,o,h,f,null,null);if(!m)continue;const y=m.distractors[0],S=[...d.w],g=[...y],E=S.findIndex((w,A)=>w!==g[A]);c.push({id:z(t),index:c.length+1,word:d.w,original:d.w,changed:y,changedFrom:E>=0?S[E]:"",changedTo:E>=0?g[E]:"",distractors:m.distractors.slice(1)})}return c}async function Vn(e){return ut(2,e,"CS2-item")}async function Hn(e){return ut(3,e,"CS3-item")}async function $n(e){const u=(await Z({...e,difficulty:"count",contrastCount:1})).filter(t=>t.word.s===1&&t.usable.length>=1);return et(u,e.count??10,"CP1-item")}async function Gn(e){const u=e.difficulty&&e.difficulty!=="random"?e.difficulty:"count",t=(await Z({...e,difficulty:u,contrastCount:1})).filter(n=>n.word.s===2&&n.usable.length>=1);return et(t,e.count??10,"CP2-item")}async function Yn(e){const{count:u=10}=e,t=(await Z({...e})).filter(n=>n.word.s===2);return te(t,u).map((n,o)=>({id:z("M2S-item"),index:o+1,word:n.word.w,answer:n.word.w,parts:[...n.word.w]}))}async function Un(e){const{count:u=10}=e,t=(await Z({...e})).filter(n=>n.word.s===3);return te(t,u).map((n,o)=>({id:z("M3S-item"),index:o+1,word:n.word.w,answer:n.word.w,parts:[...n.word.w]}))}async function Kn(e){const{count:u=10}=e,t=(await Z({...e})).filter(a=>a.word.s===2),n=fe(),o=new Set(ue.map(a=>a.w)),l=e.phonemeView??"char",r=[];for(const a of x(t)){if(r.length>=u)break;const i=Dn(a.word.w,e.composition??null,n,l,o);if(!i)continue;const[f,...h]=i.distractors,C=[...a.word.w],c=C[0]===f?C[1]:C[0];r.push({id:z("D2-item"),index:r.length+1,original:a.word.w,word:a.word.w,dropped:c,missingResult:f,distractors:h})}return r}async function Wn(e){const{count:u=10}=e,t=(await Z({...e})).filter(a=>a.word.s===3),n=fe(),o=new Set(ue.map(a=>a.w)),l=e.phonemeView??"char",r=[];for(const a of x(t)){if(r.length>=u)break;const i=On(a.word.w,e.composition??null,n,l,o);if(!i)continue;const[f,...h]=i.distractors,C=[...a.word.w];let c="";for(let d=0;d<C.length;d++)if(C.filter((m,y)=>y!==d).join("")===f){c=C[d];break}r.push({id:z("D3-item"),index:r.length+1,original:a.word.w,word:a.word.w,dropped:c,missingResult:f,distractors:h})}return r}async function qn(e){const{count:u=10}=e,t=(await Z({...e})).filter(a=>a.word.s>=2),n=fe(),o=new Set(ue.map(a=>a.w)),l=e.phonemeView??"char",r=[];for(const a of x(t)){if(r.length>=u)break;const i=Nn(a.word.w,e.composition??null,n,l,o);if(!i)continue;const[f,...h]=i.distractors,C=a.word.w,c=C.startsWith(f)?C.slice(f.length):C.endsWith(f)?C.slice(0,C.length-f.length):"";r.push({id:z("DPC-item"),index:r.length+1,original:C,word:C,dropped:c,missingResult:f,distractors:h})}return r}async function zn(e){const{count:u=10}=e,t=(await Z({...e})).map(n=>n.word.w);return t.length<3?[]:Array.from({length:u},(n,o)=>{const l=te(t,3);return{id:z("LRO-item"),index:o+1,sequence:l,choices:x(l)}})}function We(e,u,t){const n=ue.filter(r=>r.w&&r.s===e),o=u?Oe(n.map(r=>r.w)):null,l=[];for(const r of n)if(!(o&&!o.has(r.w))){if(t){const a=P(r.w);if(!a||!t(a))continue}l.push(r)}return l}function Jn(e){const u=We(1,e.excludeNoImage??!1,t=>t.jong===0);return te(u,e.count??10).map((t,n)=>{const o=P(t.w);return{id:z("M2P-item"),index:n+1,parts:[q[o.cho],ee[o.jung]],answer:t.w,word:t.w}})}function Xn(e){const u=We(1,e.excludeNoImage??!1,t=>t.jong>0&&!Be[t.jong]);return te(u,e.count??10).map((t,n)=>{const o=P(t.w);return{id:z("M3P-item"),index:n+1,parts:[q[o.cho],ee[o.jung],Q[o.jong]],answer:t.w,word:t.w}})}function Zn(e){const u=Gu.DROP_FINAL_CONSONANT_FROM_1SYLL,t=We(u.syllables,e.excludeNoImage??!1,u.syllable),n=fe(),o=[];for(const l of x(t)){if(o.length>=(e.count??10))break;const r=Tn(l.w,null,n);if(!r)continue;const[a,...i]=r.distractors;o.push({id:z("DFC-item"),index:o.length+1,original:l.w,word:l.w,result:a,distractors:i})}return o}function Qn(e){const u=Gu.REMOVE_CONSONANT_AND_IDENTIFY_PHONEME,t=We(u.syllables,e.excludeNoImage??!1,u.syllable),n=fe(),o=[];for(const l of x(t)){if(o.length>=(e.count??10))break;const r=jn(l.w,null,n);if(!r)continue;const a=P(n.get(l.w)||l.w);if(!a)continue;const[i,...f]=r.distractors;o.push({id:z("RCP-item"),index:o.length+1,base:l.w,word:l.w,missingConsonant:q[a.cho],remaining:i,distractors:f})}return o}const qe=new Map;let tt=null,nt=null;async function ot(e,u={}){const t=Ge(),n=be();(t!==tt||n!==nt)&&(qe.clear(),tt=t,nt=n);const o=`${e}:${Zu(u)}`;if(qe.has(o))return qe.get(o);const l=await uo(e,u);return qe.set(o,l),l}const eo={SAME_SOUND_PICK:e=>Qu("SSP",e),HEAR_AND_PICK_SAME:e=>Qu("HPS",e),HEAR_AND_PICK_INCLUDED:e=>xn(e),SAME_OR_DIFF:e=>Pn(e),STARTS_WITH_SAME_SOUND:e=>Fn(e),LISTEN_AND_REMEMBER_ORDER:e=>zn(e),MERGE_2_SYLLABLES:e=>Yn(e),MERGE_3_SYLLABLES:e=>Un(e),MERGE_2_PHONEMES:e=>Jn(e),MERGE_3_PHONEMES:e=>Xn(e),DROP_1_FROM_2SYLL:e=>Kn(e),DROP_1_FROM_3SYLL:e=>Wn(e),DROP_PART_FROM_COMPOUND:e=>qn(e),DROP_FINAL_CONSONANT_FROM_1SYLL:e=>Zn(e),REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:e=>Qn(e),CHANGE_1_SYLL_IN_2SYLL:e=>Vn(e),CHANGE_1_SYLL_IN_3SYLL:e=>Hn(e),CHANGE_1_PHONEME_IN_1SYLL:e=>$n(e),CHANGE_1_PHONEME_IN_2SYLL:e=>Gn(e)};async function uo(e,u={}){const t=eo[e];return t?await t(u):[]}async function to(e){const u=[null,"count"],t=Object.keys(au);let n=0;for(const o of u)for(const l of t){const r=au[l];ot(l,{difficulty:r.difficulty?o:null,choseong:null,count:10,excludeNoImage:e}).catch(()=>{}),++n%6===0&&await new Promise(a=>setTimeout(a,0))}}async function no(e){return(await Z({...e,fullCount:!0})).length}async function oo(e={}){const u=[];for(const a of ue)a.w&&u.push(a.w);const t=e.excludeNoImage?Oe(u):u,n=new Set,o=new Set,l=new Set,r=new Set;for(const a of t){r.add(Ve(a));for(const i of a){const f=P(i);if(f&&(q[f.cho]!=="\u3147"&&n.add(q[f.cho]),o.add(ee[f.jung]),f.jong>0)){l.add(Q[f.jong]);const h=Be[f.jong];h&&h.forEach(C=>l.add(C))}}}return{cho:n,jung:o,jong:l,syllable:r}}const ge="\uC804\uCCB4";function lt(){const{t:e}=ce.useTranslation();return s.useMemo(()=>({difficulty:e("wordSearch.filter.difficulty","\uB4F1\uAE09"),syllables:e("wordSearch.filter.syllables","\uC74C\uC808 \uC218"),syllable5plus:e("wordSearch.filter.syllable5plus","5\uC74C\uC808 \uC774\uC0C1"),partOfSpeech:e("wordSearch.filter.partOfSpeech","\uD488\uC0AC"),wordType:e("wordSearch.filter.wordType","\uC720\uD615"),posMap:{[e("wordSearch.filter.pos.noun","\uCCB4\uC5B8(\uBA85\uC0AC, \uC218\uC0AC)")]:["\uBA85","\uC218"],[e("wordSearch.filter.pos.verb","\uC6A9\uC5B8(\uB3D9\uC0AC, \uD615\uC6A9\uC0AC)")]:["\uB3D9","\uD615"],[e("wordSearch.filter.pos.modifier","\uC218\uC2DD\uC5B8(\uBD80\uC0AC, \uAD00\uD615\uC0AC)")]:["\uBD80","\uAD00"]},typeMap:{[e("wordSearch.filter.type.native","\uACE0\uC720\uC5B4")]:"\uACE0\uC720",[e("wordSearch.filter.type.sino","\uD55C\uC790\uC5B4")]:"\uD55C\uC790",[e("wordSearch.filter.type.foreign","\uC678\uB798\uC5B4")]:"\uC678\uB798",[e("wordSearch.filter.type.mixed","\uD63C\uC885\uC5B4")]:"\uD63C\uC885"}}),[e])}function rt(e,u,t){return{label:u.difficulty,items:[1,2,3,4].map(n=>e("wordSearch.filter.grade",{n})),multiple:!0,allOption:!0,allLabel:t?.allLabel,labelAction:t?.labelAction,labelInfo:t?.labelInfo}}function at(e){return{label:e.partOfSpeech,items:Object.keys(e.posMap),multiple:!0,allOption:!0}}function st(e){return{label:e.wordType,items:Object.keys(e.typeMap),multiple:!0,allOption:!0}}function lo(e,u){return{label:u.syllables,items:[e("wordSearch.filter.syllable",{n:1}),e("wordSearch.filter.syllable",{n:2}),e("wordSearch.filter.syllable",{n:3}),e("wordSearch.filter.syllable",{n:4}),u.syllable5plus],multiple:!0,allOption:!0}}function ro(e,u){const t=[e("wordPairs.filter.onlyHasImage","\uC774\uBBF8\uC9C0 \uC788\uB294 \uB2E8\uC5B4\uB9CC")];return u?.includeStructure&&t.push(e("wordPairs.filter.onlySameStructure","\uC74C\uC18C \uAD6C\uC870 \uAC19\uC740 \uB2E8\uC5B4\uB9CC")),{label:e("wordPairs.filter.selectLabel","\uC120\uD0DD"),items:t,multiple:!0,labelAction:u?.labelAction,labelInfo:u?.labelInfo}}function ao(e,u){const{label:t,headValue:n,midValue:o,tailValue:l,includeMid:r=!0,headDisabled:a,midDisabled:i,tailDisabled:f,allOptionDisabled:h,groupLabel:C,labelAction:c}=u;return{label:t,...C?{groupLabel:C}:{},...c?{labelAction:c}:{},allOption:!0,allLabel:e("wordSearch.filter.positionAny",{defaultValue:"\uBB34\uAD00"}),...h?{allOptionDisabled:h}:{},items:[{value:n,displayLabel:e("wordSearch.filter.positionHead",{defaultValue:"\uC5B4\uB450"}),disabled:a},...r?[{value:o,displayLabel:e("wordSearch.filter.positionMid",{defaultValue:"\uC5B4\uC911"}),disabled:i}]:[],{value:l,displayLabel:e("wordSearch.filter.positionTail",{defaultValue:"\uC5B4\uB9D0"}),disabled:f}]}}function so(e,u,t){if(u===ge){const{[t]:l,...r}=e;return r}const n=e[t]??[],o=n.includes(u)?n.filter(l=>l!==u):[...n,u];if(o.length===0){const{[t]:l,...r}=e;return r}return{...e,[t]:o}}Object.fromEntries(Object.entries(En).map(([e,{nucleus:u}])=>[e,u]));const io={\uACE0\uC720\uC5B4:"\uACE0\uC720",\uD55C\uC790\uC5B4:"\uD55C\uC790",\uC678\uB798\uC5B4:"\uC678\uB798",\uD63C\uC885\uC5B4:"\uD63C\uC885"},co={"\uCCB4\uC5B8(\uBA85\uC0AC,\uC218\uC0AC)":["\uBA85","\uC218"],"\uC6A9\uC5B8(\uB3D9\uC0AC,\uD615\uC6A9\uC0AC)":["\uB3D9","\uD615"],"\uC218\uC2DD\uC5B8(\uBD80\uC0AC,\uAD00\uD615\uC0AC)":["\uBD80","\uAD00"]},Co={difficulty:"\uB09C\uC774\uB3C4 \uB4F1\uAE09",syllables:"\uC74C\uC808 \uC218",syllable5plus:"5\uC74C\uC808 \uC774\uC0C1",partOfSpeech:"\uD488\uC0AC",wordType:"\uC720\uD615",posMap:co,typeMap:io};function fo(e,u,t=Co){const n=u[t.difficulty];if(n?.length&&!n.some(a=>e.grade===a.replace(/\D/g,"")))return!1;const o=u[t.syllables];if(o?.length){const a=e.syllables??0;if(!o.some(i=>i===t.syllable5plus?a>=5:a===parseInt(i)))return!1}const l=u[t.partOfSpeech];if(l?.length&&!l.flatMap(a=>t.posMap[a]??[a]).some(a=>(e.pos??"").includes(a)))return!1;const r=u[t.wordType];return!(r?.length&&!r.some(a=>e.wordType===t.typeMap[a]))}const go={labial:e=>e("common.phonetics.place.labial",{defaultValue:"\uC591\uC21C\uC74C"}),alveolar:e=>e("common.phonetics.place.alveolar",{defaultValue:"\uCE58\uC870\uC74C"}),palatal:e=>e("common.phonetics.place.palatal",{defaultValue:"\uACBD\uAD6C\uAC1C\uC74C"}),velar:e=>e("common.phonetics.place.velar",{defaultValue:"\uC5F0\uAD6C\uAC1C\uC74C"}),glottal:e=>e("common.phonetics.place.glottal",{defaultValue:"\uC131\uBB38\uC74C"})},ho={frontHigh:e=>e("common.phonetics.vowel.frontHigh",{defaultValue:"\uC804\uC124 \uACE0\uBAA8\uC74C"}),backHighUnrounded:e=>e("common.phonetics.vowel.backHighUnrounded",{defaultValue:"\uD6C4\uC124 \uACE0\uBAA8\uC74C \uD3C9\uC21C"}),backHighRounded:e=>e("common.phonetics.vowel.backHighRounded",{defaultValue:"\uD6C4\uC124 \uACE0\uBAA8\uC74C \uC6D0\uC21C"}),frontMid:e=>e("common.phonetics.vowel.frontMid",{defaultValue:"\uC804\uC124 \uC911\uBAA8\uC74C"}),backMidUnrounded:e=>e("common.phonetics.vowel.backMidUnrounded",{defaultValue:"\uD6C4\uC124 \uC911\uBAA8\uC74C \uD3C9\uC21C"}),backMidRounded:e=>e("common.phonetics.vowel.backMidRounded",{defaultValue:"\uD6C4\uC124 \uC911\uBAA8\uC74C \uC6D0\uC21C"}),low:e=>e("common.phonetics.vowel.low",{defaultValue:"\uC800\uBAA8\uC74C"})},mo={j:e=>e("common.phonetics.glide.j",{defaultValue:"j\uD65C\uC74C"}),w:e=>e("common.phonetics.glide.w",{defaultValue:"w\uD65C\uC74C"}),velar:e=>e("common.phonetics.glide.velar",{defaultValue:"\u0270\uD65C\uC74C"})};function it(e,u){if("place"in u)return go[u.place](e);const t=ho[u.vowel](e);return u.glide?`${t} \xB7 ${mo[u.glide](e)}`:t}const po=(e,{defaultValue:u})=>u,ct=(e,u)=>({jamos:e,phonetic:u,tooltip:it(po,u)}),re=(e,u)=>u.map(t=>ct([t],{place:e})),W=(e,u,t)=>ct([...e],t?{vowel:u,glide:t}:{vowel:u}),gu={cho:[re("labial",["\u3142","\u3143","\u314D","\u3141"]),re("alveolar",["\u3137","\u3138","\u314C","\u3134","\u3139"]),re("alveolar",["\u3145","\u3146"]),re("palatal",["\u3148","\u3149","\u314A"]),re("velar",["\u3131","\u3132","\u314B"]),re("glottal",["\u314E"])],jung:[[W("\u3163","frontHigh"),W("\u315F","frontHigh","w"),W("\u3162","frontHigh","velar")],[W("\u3161","backHighUnrounded")],[W("\u315C","backHighRounded"),W("\u3160","backHighRounded","j")],[W("\u3154\u3150","frontMid"),W("\u3156\u3152","frontMid","j"),W("\u3159\u315A\u315E","frontMid","w")],[W("\u3153","backMidUnrounded"),W("\u3155","backMidUnrounded","j"),W("\u315D","backMidUnrounded","w")],[W("\u3157","backMidRounded"),W("\u315B","backMidRounded","j")],[W("\u314F","low"),W("\u3151","low","j"),W("\u3158","low","w")]],jong:[re("labial",["\u3142","\u3141"]),re("alveolar",["\u3137","\u3134","\u3139"]),re("velar",["\u3131","\u3147"])]},So=[...q],Eo=[...ee],yo=Q.filter(e=>e!==""),ae=e=>e===ne?[]:Array.from(e),ne="__NO_CODA__",Ct=[1,2,3,4],oe=5,Bo=12,dt="SYL_",hu=e=>`${dt}${e}`,wo=e=>Number(e.slice(dt.length));function mu(e){return e>=oe?Array.from({length:Bo-oe+1},(u,t)=>oe+t):[e]}const ft={cho:So,jung:Eo,jong:yo},pu=e=>e.map(u=>u.map(({jamos:t,phonetic:n,tooltip:o})=>({v:t.join(""),phonetic:n,tooltip:o}))),Su={cho:pu(gu.cho),jung:pu(gu.jung),jong:pu(gu.jong)},gt={};Su.jung.flat().forEach(({v:e})=>{for(const u of ae(e))gt[u]=e});const bo=new Set(Su.cho.flat().map(e=>e.v));function ht(e,u){return e==="cho"?bo.has(u)?u:null:e==="jung"?gt[u]??u:Yu(u)}function mt(e,u,t){if(e==="jung"){const n=ae(u);return t&&n.includes(t)?t:n[0]??u}return u}function pt(e,u,t){const n=(o,l)=>l?o==="jong"&&l===ne?ne:u==="pron"?ht(o,l):mt(o,l,o==="jung"?t:null):null;return{...e,cho:n("cho",e.cho),jung:n("jung",e.jung),jong:n("jong",e.jong)}}const Eu={cho:null,jung:null,jong:null,syllable:null},Ao="wt_filter",St=e=>`wt_filter_${e}`;function Et(e){try{const u=localStorage.getItem(St(e))??localStorage.getItem(Ao);if(u)return JSON.parse(u)}catch{}return null}function yt(e){const u=e?.phonemeView;return u==="pron"?"pron":u==="direct"?"direct":"char"}function _o(e){const u=e;return u?.composition?{cho:u.composition.cho??null,jung:u.composition.jung??null,jong:u.composition.jong??null,syllable:u.composition.syllable??null}:u?.choseong?{...Eu,cho:u.choseong}:Eu}function Do(e,u,t){const{t:n,i18n:o}=ce.useTranslation(),[l]=s.useState(()=>t?.resetOnMount?null:Et(e)),[r,a]=s.useState(yt(l)),[i,f]=s.useState(()=>_o(l)),h=s.useCallback(()=>u.requireSyllable?{cho:"\u3131",jung:"\u314F",jong:ne,syllable:u.fixedSyllable??null}:{cho:null,jung:null,jong:u.fixedNoCoda?ne:null,syllable:u.fixedSyllable??null},[u.requireSyllable,u.fixedSyllable,u.fixedNoCoda]);s.useEffect(()=>{!u.requireSyllable&&u.fixedSyllable==null&&!u.fixedNoCoda||f(p=>p.cho||p.jung||p.syllable!=null||p.jong?p:h())},[]);const C=s.useMemo(()=>K(i.cho)||K(i.jung)||K(i.jong)?"count":"random",[i.cho,i.jung,i.jong]),c=s.useRef(r==="char"?i.jung:null);s.useEffect(()=>{r==="char"&&(c.current=i.jung)},[r,i.jung]);const[d,m]=s.useState(t?.resetOnMount?!!t?.defaultImageOnly:l?.excludeNoImage??!0),[y,S]=s.useState(t?.resetOnMount?!1:l?.sameStructureOnly??!0),[g,E]=s.useState(Array.isArray(l?.gradeFilter)?l.gradeFilter:[]),[w,A]=s.useState(Array.isArray(l?.posFilter)?l.posFilter:[]),[_,b]=s.useState(Array.isArray(l?.wordTypeFilter)?l.wordTypeFilter:[]),L=s.useRef(t?.resetKey);s.useEffect(()=>{L.current!==t?.resetKey&&(L.current=t?.resetKey,f(h()),m(!1),S(!1),E([]),A([]),b([]))},[t?.resetKey]);const T=lt(),[v,R]=s.useState({cho:new Set,jung:new Set,jong:new Set,syllable:new Set}),[V,$]=s.useState(!1),[Y,I]=s.useState(null),M=1,F=Math.max(1,[i.cho,i.jung,i.jong].filter(Boolean).length),[J,se]=s.useState(e);s.useEffect(()=>{if(J!==e){if(!t?.resetOnMount){const p=Et(e);f(p?.composition??h()),m(p?.excludeNoImage??!0),S(p?.sameStructureOnly??!0),a(yt(p)),E(Array.isArray(p?.gradeFilter)?p.gradeFilter:[]),A(Array.isArray(p?.posFilter)?p.posFilter:[]),b(Array.isArray(p?.wordTypeFilter)?p.wordTypeFilter:[])}se(e)}},[e,J,t?.resetOnMount]),s.useEffect(()=>{if(!t?.resetOnMount&&J===e)try{localStorage.setItem(St(e),JSON.stringify({contrastCount:F,composition:i,excludeNoImage:d,sameStructureOnly:y,phonemeView:r,gradeFilter:g,posFilter:w,wordTypeFilter:_}))}catch{}},[t?.resetOnMount,e,J,F,i,d,y,r,g,w,_]);const[ie,B]=s.useState(0);ju("wordpool:update",()=>B(p=>p+1));const D=s.useRef(o.language);s.useEffect(()=>{D.current!==o.language&&(D.current=o.language,B(p=>p+1))},[o.language]),s.useEffect(()=>{if(!u.choseong)return;let p=!1;return oo({difficulty:C,excludeNoImage:d}).then(j=>{p||(R(j),j.cho.size+j.jung.size+j.jong.size>0&&$(!0))}).catch(()=>{p||R({cho:new Set,jung:new Set,jong:new Set,syllable:new Set})}),()=>{p=!0}},[u.choseong,C,d,ie]),s.useEffect(()=>{let p=!1;const j=i,N=j.cho?ae(j.cho):null,k=j.jung?ae(j.jung):null,U=j.jong===ne,he=U?null:j.jong?ae(j.jong):null,me=j.syllable!=null?mu(j.syllable):null,Pe=!!(N||k||he||U||me);return no({difficulty:u.difficulty?C:null,contrastCount:u.difficulty?F:1,composition:u.choseong&&Pe?{cho:N,jung:k,jong:he,jongNone:U,syllable:me}:null,excludeNoImage:d,sameStructureOnly:y,phonemeView:r==="pron"?"pron":"char",grade:g.length>0?g:null}).then(Fe=>{p||I(Fe)}).catch(()=>{p||I(null)}),()=>{p=!0}},[u.choseong,u.difficulty,C,F,i,r,d,y,ie,g]),s.useEffect(()=>{V&&f(p=>{const j={...p};let N=!1;return["cho","jung","jong"].forEach(k=>{const U=p[k];!U||U===ne||ae(U).some(he=>v[k].has(he))||(j[k]=null,N=!0)}),p.syllable!=null&&u.fixedSyllable==null&&(p.syllable>=oe?[...v.syllable].some(k=>k>=oe)||(j.syllable=null,N=!0):(!v.syllable.has(p.syllable)||p.syllable<M)&&(j.syllable=null,N=!0)),N?j:p})},[v,V,M,u.fixedSyllable]);const G=s.useMemo(()=>{const p=j=>{const N=new Set;for(const k of ft[j])v[j].has(k)&&N.add(k);return N};return{cho:p("cho"),jung:p("jung"),jong:p("jong")}},[v]),H=s.useMemo(()=>({exact:new Set(Ct.filter(p=>v.syllable.has(p))),min:[...v.syllable].some(p=>p>=oe)}),[v]),O=s.useMemo(()=>({composition:n("wordPairs.composition","\uC815\uB2F5 \uB2E8\uC5B4 \uAD6C\uC131"),syllableCount:n("wordPairs.syllableCount","\uC74C\uC808 \uC218"),onset:n("wordPairs.onset","\uCD08\uC131"),vowel:n("wordPairs.vowel","\uBAA8\uC74C"),coda:n("wordPairs.coda","\uC885\uC131"),phonemeGroup:n("training.filter.phonemeGroup",{defaultValue:"\uD6C8\uB828 \uC74C\uC808"}),trainOnset:n("training.filter.trainOnset",{defaultValue:"\uCD08\uC131"}),trainVowel:n("training.filter.trainVowel",{defaultValue:"\uBAA8\uC74C"}),trainCoda:n("training.filter.trainCoda",{defaultValue:"\uC885\uC131"}),random:n("training.filter.random","\uBB34\uC791\uC704"),exclude:n("wordSearch.filter.exclude","\uC81C\uC678"),selectLabel:n("training.filter.selectSection",{defaultValue:"\uC120\uD0DD"}),none:n("common.none","\uC5C6\uC74C"),noImage:n("wordSearch.filter.excludeNoImage","\uC774\uBBF8\uC9C0 \uC5C6\uC74C"),excludeImage:n("training.filter.excludeImage",{defaultValue:"\uC774\uBBF8\uC9C0 \uC788\uB294 \uB2E8\uC5B4\uB9CC"}),sameStructure:n("training.filter.sameStructure",{defaultValue:"\uC74C\uC18C \uAD6C\uC870 \uAC19\uC740 \uB2E8\uC5B4\uB9CC"}),noLimit:n("training.filter.noLimit",{defaultValue:"\uBB34\uAD00"}),codaExclude:n("training.filter.codaExclude",{defaultValue:"\uC81C\uC678"}),gradeLabel:n("training.filter.gradeLabel",{defaultValue:"\uB09C\uC774\uB3C4 \uB4F1\uAE09"})}),[n]),Au=s.useMemo(()=>({[O.trainOnset]:"cho",[O.trainVowel]:"jung",[O.trainCoda]:"jong"}),[O]),xe=s.useCallback((p,j)=>({title:j,items:p}),[]),tu=s.useMemo(()=>[n("training.filter.excludeImageInfo",{defaultValue:"\uC774\uBBF8\uC9C0 \uC788\uB294 \uB2E8\uC5B4\uB9CC: \uB2E8\uC5B4 \uC911\uC5D0 \uC774\uBBF8\uC9C0\uAC00 \uC788\uB294 \uB2E8\uC5B4\uB9CC \uACB0\uACFC\uC5D0 \uBCF4\uC5EC\uC90D\uB2C8\uB2E4."}),n("training.filter.sameStructureInfo",{defaultValue:"\uC74C\uC18C \uAD6C\uC870 \uAC19\uC740 \uB2E8\uC5B4\uB9CC: \uC815\uB2F5\uACFC \uC624\uB2F5\uC758 \uC74C\uC808 \uAD6C\uC870(\uAE00\uC790 \uC218\xB7\uBC1B\uCE68 \uC720\uBB34 \uB4F1)\uAC00 \uAC19\uC740 \uACB0\uACFC\uB9CC \uB0A8\uACA8\uC694."})],[n]),Dt=s.useMemo(()=>{const p=[];if(u.choseong){const j={value:ne,displayLabel:O.codaExclude},N=u.fixedNoCoda===!0,k=(U,he)=>{const me=N&&U==="jong",Pe={label:he,groupLabel:O.phonemeGroup,allOption:!u.requireSyllable,allLabel:O.noLimit,allOptionDisabled:me};if(r==="pron"){const pe=Su[U].map(Lt=>Lt.map(({v:nu,phonetic:Mt})=>{const ou=ae(nu),_u=it(n,Mt),Du=me||!ou.some(kt=>v[U].has(kt));return ou.length>1?{value:nu,labels:ou,tooltip:_u,disabled:Du}:{value:nu,tooltip:_u,disabled:Du}}));return U==="jong"&&!u.requireCoda&&pe.unshift([j]),{...Pe,groups:pe}}const Fe=ft[U].map(pe=>!me&&G[U].has(pe)?pe:{value:pe,disabled:!0});return{...Pe,items:U==="jong"&&!u.requireCoda?[j,...Fe]:Fe}};p.push(k("cho",O.trainOnset)),p.push(k("jung",O.trainVowel)),p.push(k("jong",O.trainCoda))}if(p.push({...rt(n,T,{labelInfo:xe([n("wordPairs.filter.difficultyInfo",{defaultValue:"\uAD6D\uB9BD\uAD6D\uC5B4\uC6D0\uC758 \uAE30\uCD08 \uC5B4\uD718 \uB4F1\uAE09\uC774 \uACB0\uACFC\uC5D0 \uBC18\uC601\uB429\uB2C8\uB2E4."})])}),label:O.gradeLabel}),u.partOfSpeech&&p.push(at(T)),u.wordType&&p.push(st(T)),u.choseong||u.fixedSyllable!=null){const j=u.fixedSyllable;p.push({label:O.syllableCount,items:[...Ct.map(N=>({value:hu(N),displayLabel:n("wordPairs.syllableN",{n:N,defaultValue:"{{n}}\uC74C\uC808"}),disabled:j!=null?N!==j:!H.exact.has(N)||N<M})),{value:hu(oe),displayLabel:n("wordPairs.syllableNPlus",{n:oe,defaultValue:"{{n}}\uC74C\uC808 \uC774\uC0C1"}),disabled:j!=null?oe!==j:!H.min}],allOption:!0,allOptionDisabled:j!=null})}return u.choseong?p.push({label:O.exclude,displayLabel:O.selectLabel,multiple:!0,items:[O.excludeImage,O.sameStructure],labelInfo:xe(tu)}):p.push({label:O.exclude,displayLabel:O.selectLabel,multiple:!0,items:[O.excludeImage],labelInfo:xe([tu[0]])}),p},[u.choseong,u.partOfSpeech,u.wordType,u.requireSyllable,u.fixedSyllable,u.fixedNoCoda,u.requireCoda,M,G,v,r,H,O,n,xe,tu,T]),Ot={...(u.choseong||u.fixedSyllable!=null)&&i.syllable!=null?{[O.syllableCount]:hu(i.syllable)}:{},...u.choseong&&i.cho?{[O.trainOnset]:i.cho}:{},...u.choseong&&i.jung?{[O.trainVowel]:i.jung}:{},...u.choseong&&i.jong?{[O.trainCoda]:i.jong}:{},[O.exclude]:[...d?[O.excludeImage]:[],...y?[O.sameStructure]:[]],[O.gradeLabel]:g.map(p=>n("wordSearch.filter.grade",{n:Number(p),defaultValue:"{{n}}\uB4F1\uAE09"})),...u.partOfSpeech?{[T.partOfSpeech]:w}:{},...u.wordType?{[T.wordType]:_}:{}},Nt=s.useCallback((p,j)=>{if(j===O.exclude)p===O.excludeImage?m(N=>!N):p===O.sameStructure&&S(N=>!N);else if(j===O.syllableCount)f(N=>{if(!p||p===ge)return{...N,syllable:null};const k=wo(p);return{...N,syllable:N.syllable===k?null:k}});else if(j===O.gradeLabel){if(!p||p===ge){E([]);return}const N=p.replace(/\D/g,"");E(k=>k.includes(N)?k.filter(U=>U!==N):[...k,N])}else if(j===T.partOfSpeech){if(!p||p===ge){A([]);return}A(N=>N.includes(p)?N.filter(k=>k!==p):[...N,p])}else if(j===T.wordType){if(!p||p===ge){b([]);return}b(N=>N.includes(p)?N.filter(k=>k!==p):[...N,p])}else{const N=Au[j];if(!N)return;f(k=>u.requireSyllable?p&&p!==ge?{...k,[N]:p}:k:!p||p===ge||k[N]===p?{...k,[N]:null}:{...k,[N]:p})}},[O,Au,T,u.requireSyllable]),Tt=s.useCallback(p=>!u.partOfSpeech&&!u.wordType?!0:fo(p,{...u.partOfSpeech?{[T.partOfSpeech]:w}:{},...u.wordType?{[T.wordType]:_}:{}},T),[u.partOfSpeech,u.wordType,w,_,T]),jt=s.useCallback(p=>{p!==r&&(p!=="direct"&&r!=="direct"&&f(j=>pt(j,p,c.current)),a(p))},[r]),It=s.useCallback(()=>({composition:i,contrastCount:F,excludeNoImage:d,sameStructureOnly:y,phonemeView:r,gradeFilter:g,posFilter:w,wordTypeFilter:_}),[i,F,d,y,r,g,w,_]),Rt=s.useCallback(p=>{f(p.composition),m(p.excludeNoImage),S(p.sameStructureOnly??!0),a(p.phonemeView),E(Array.isArray(p.gradeFilter)?p.gradeFilter:[]),Array.isArray(p.posFilter)&&A(p.posFilter),Array.isArray(p.wordTypeFilter)&&b(p.wordTypeFilter)},[]);return{difficulty:C,contrastCount:F,composition:i,choseong:i.cho,excludeNoImage:d,sameStructureOnly:y,gradeFilter:g,posFilter:w,wordTypeFilter:_,matchesWordAttributes:Tt,poolVersion:ie,filterSections:Dt,filterSelected:Ot,handleFilterSelect:Nt,phonemeView:r,setPhonemeView:jt,phonemeGroupLabel:O.phonemeGroup,wordCount:Y,getFilterSnapshot:It,restoreFilterSnapshot:Rt}}function Oo(e){const u=a=>a?ae(a):null,t=u(e.cho),n=u(e.jung),o=e.jong===ne,l=o?null:u(e.jong),r=e.syllable!=null?mu(e.syllable):null;return!t&&!n&&!l&&!o&&!r?null:{cho:t,jung:n,jong:l,jongNone:o,syllable:r}}function No(e,u,t,n,o,l,r=!0,a="char",i=[]){const[f,h]=s.useState({}),[C,c]=s.useState(!1),{cho:d=null,jung:m=null,jong:y=null,syllable:S=null}=n??{},g=i.length>0?i.slice().sort().join(","):"";return s.useEffect(()=>{l>0&&to(o).catch(()=>{})},[l,o]),s.useEffect(()=>{let E=!1;return c(!0),(async()=>{const w=Oo({cho:d,jung:m,jong:y,syllable:S}),A=`${d??""}_${m??""}_${y??""}_${S??""}_${g}`,_={};await Promise.all(e.map(async b=>{const L=au[b.key];try{const T=await ot(b.key,{difficulty:L.difficulty?u:null,contrastCount:L.difficulty?t:1,composition:L.choseong?w:null,count:5,excludeNoImage:o,sameStructureOnly:r,phonemeView:a,grade:i.length>0?i:null});T&&T.length>0?_[b.key]={id:`wt-${b.key}-${u}-${A}-${Date.now()}`,name:b.label,training_type:b.key,category_main_code:"WORD",iconColor:b.color,subTitle:b.subTitle,items:T,itemCount:T.length}:_[b.key]={id:`wt-${b.key}-empty`,name:b.label,training_type:b.key,category_main_code:"WORD",iconColor:b.color,subTitle:b.subTitle,items:[],itemCount:0,__empty:!0}}catch{_[b.key]=null}})),E||(h(_),c(!1))})(),()=>{E=!0}},[u,t,d,m,y,S,o,r,a,l,g]),{perTypeData:f,generating:C}}function To(){return ze(new Date)}function ze(e){if(e==null||e==="")return"";const u=e instanceof Date?e:new Date(e);return isNaN(u.getTime())?"":new Intl.DateTimeFormat("fr-CA",{timeZone:"Asia/Seoul"}).format(u)}const Te=[],je=[],Ie=[],Re=[],Je={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},Xe={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},jo={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};let yu=null,Bt=null,de=null;function Io({counts:e,forceRefresh:u}={}){const t=Object.assign({},jo,e||{}),n=To(),o=ze(new Date(`${n}T00:00:00+09:00`).getTime()-864e5),l=JSON.stringify(t);if(!u&&Bt===n&&yu===l&&de)return Object.assign(Je,de.today),Object.assign(Xe,de.yesterday?.selection||{LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),{today:Je,yesterday:Xe};const r={LISTEN_IN_NOISE:le(Te,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:le(je,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:le(Ie,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:le(Re,Math.max(0,Number(t.ORDERING_SENTENCE)||0))};let a=null;return de&&yu===l&&de.yesterday&&de.yesterday.date===o&&(a=de.yesterday.selection),a||(a={LISTEN_IN_NOISE:le(Te,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:le(je,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:le(Ie,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:le(Re,Math.max(0,Number(t.ORDERING_SENTENCE)||0))}),Object.assign(Je,r),Object.assign(Xe,a),Bt=n,yu=l,de={today:r,yesterday:{date:o,countsKey:l,selection:a}},{today:Je,yesterday:Xe}}let wt=!1,Le=null;async function Ro(){try{const e={url:typeof document>"u"?require("url").pathToFileURL(__filename).href:lu&&lu.tagName.toUpperCase()==="SCRIPT"&&lu.src||new URL("hooks.cjs.js",document.baseURI).href}&&void 0||"/",u=await fetch(`${e}data/allTrainingData.json`);return u.ok?await u.json():null}catch{return null}}async function Lo(){if(!wt)return Le||(Le=(async()=>{const e=await Ro();if(!e){Le=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}try{for(const u of Object.keys(e||{})){const t=e[u]||[];for(const n of t){const o=n,l=String(o.training_type||u),r=String(o.category_main_code||o.category_main||o.category_0||""),a=String(o.category_sub_code||o.category_sub||o.category_1||""),i=Object.assign({},o,{training_type:l,category_0:r,category_1:a});l==="LISTEN_IN_NOISE"?Te.push(i):l==="SHORT_STORY"?je.push(i):l==="LONG_STORY"?Ie.push(i):l==="ORDERING_SENTENCE"&&Re.push(i)}}}catch{Le=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}try{window.dispatchEvent(new Event("speechear.data.updated"))}catch{}try{Io()}catch{}wt=!0})(),Le)}async function Mo(e=3e3){const u=Lo();return Promise.race([u,new Promise(t=>setTimeout(t,e))])}function ko(e){let u=2166136261;for(let t=0;t<e.length;t++)u^=e.charCodeAt(t),u=Math.imul(u,16777619);return u>>>0}function vo(e){let u=e>>>0;return()=>{u|=0,u=u+1831565813|0;let t=Math.imul(u^u>>>15,1|u);return t=t+Math.imul(t^t>>>7,61|t)^t,((t^t>>>14)>>>0)/4294967296}}const Ze=le;function Bu(e,u){const t=u?vo(ko(u)):Math.random;return{LISTEN_IN_NOISE:Ze(Te,Math.max(0,e.LISTEN_IN_NOISE||0),t),SHORT_STORY:Ze(je,Math.max(0,e.SHORT_STORY||0),t),LONG_STORY:Ze(Ie,Math.max(0,e.LONG_STORY||0),t),ORDERING_SENTENCE:Ze(Re,Math.max(0,e.ORDERING_SENTENCE||0),t)}}function bt(e){return e?!!(e.LISTEN_IN_NOISE?.length||e.SHORT_STORY?.length||e.LONG_STORY?.length||e.ORDERING_SENTENCE?.length):!1}const xo={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};function At(e=!1,u=xo,t){const n=ze(Date.now()),o=ze(Date.now()-864e5),l=`${t??""}|${n}`,r=`${t??""}|${o}`;return Te.length>0||je.length>0||Ie.length>0||Re.length>0?{today:Bu(u,l),yesterday:Bu(u,r)}:{today:Bu(u,l),yesterday:null}}function Po(e){const u=s.useRef({LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),t=s.useRef(null),[n,o]=s.useState(!1),[l,r]=s.useState(!1),[a,i]=s.useState(0),[f,h]=s.useState(!1);s.useEffect(()=>{let c=!1,d,m=0;const y=40,S=()=>{d!==void 0&&(clearInterval(d),d=void 0)};let g=!1;try{const A=new URLSearchParams(window.location.search),_=A.get("forceRefresh")||A.get("force");g=_==="1"||_==="true"}catch{}const E=A=>{u.current=A.today,t.current=A.yesterday,o(!0),h(!0),i(_=>_+1),c=!0,S()},w=async()=>{if(c)return;if(!g){const _=At(!1,void 0,e);if(bt(_.today)){E(_);return}}try{await Mo(3e3)}catch{}if(c)return;const A=At(g,void 0,e);if(bt(A.today)){E(A);return}++m>=y&&(o(!0),h(!1),c=!0,S())};return w(),d=setInterval(w,250),()=>{c=!0,S()}},[e]);const C=s.useCallback(c=>{const d=l?t.current:u.current,m=l?u.current:t.current;return d?.[c]?.length?d[c]:m?.[c]?.length?m[c]:void 0},[l,a]);return{loaded:n,hasData:f,showYesterday:l,setShowYesterday:r,getTrainingPerType:C}}const ye=[];let Qe=!1;function _t(e){if(e.key!=="Escape"||e.defaultPrevented)return;const u=ye[ye.length-1];u&&(e.stopPropagation(),u())}function Fo(e){return ye.push(e),!Qe&&typeof document<"u"&&(document.addEventListener("keydown",_t),Qe=!0),()=>{const u=ye.lastIndexOf(e);u>=0&&ye.splice(u,1),ye.length===0&&Qe&&typeof document<"u"&&(document.removeEventListener("keydown",_t),Qe=!1)}}function Vo(e,u=!0){const t=Tu(e);s.useEffect(()=>{if(u)return Fo(()=>{t.current?.()})},[u,t])}const wu=(e,u)=>`${e}:${u??1}`,bu=new Map;function Ho(e,u){const[t,n]=s.useState(0),o=e.map(l=>wu(l.word,l.homonum)).join("|");return s.useEffect(()=>{const l=(o?o.split("|"):[]).filter(i=>!bu.has(i));if(l.length===0)return;let r=!1;const a=Array.from(new Set(l.map(i=>i.slice(0,i.lastIndexOf(":")))));return u(a).then(i=>{if(!(r||i.length===0)){for(const f of i)f.Meaning&&bu.set(wu(f.Word,f.Homonum??void 0),f.Meaning);n(f=>f+1)}}).catch(()=>{}),()=>{r=!0}},[o,u]),s.useMemo(()=>{const l=o?o.split("|"):[],r=new Map;for(const a of l){const i=bu.get(a);i!=null&&r.set(a,i)}return r},[o,t])}function $o(){const[e,u]=s.useState(null),t=s.useCallback(l=>u(l.getBoundingClientRect()),[]),n=s.useCallback(()=>u(null),[]),o=s.useCallback(l=>{const r=l.getBoundingClientRect();u(a=>a?null:r)},[]);return{anchorRect:e,isOpen:e!=null,openAt:t,close:n,toggleAt:o}}function Go(e){const[u,t]=s.useState(null),[n,o]=s.useState(null),l=s.useRef(null);s.useEffect(()=>()=>{l.current&&clearTimeout(l.current)},[]);const r=s.useCallback((i,f)=>{l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{t(i),o(f)},e)},[e]),a=s.useCallback(()=>{l.current&&clearTimeout(l.current),t(null),o(null)},[]);return{payload:u,anchorRect:n,openAfterDelay:r,close:a}}function Yo(e,u,t){const n=Number.isFinite(u)&&u>=1?Math.floor(u):1,o=Math.max(1,Math.ceil(e.length/n)),l=Number.isFinite(t)?Math.min(Math.max(1,Math.floor(t)),o):1;return{pageItems:s.useMemo(()=>e.slice((l-1)*n,l*n),[e,l,n]),totalPages:o,curPage:l}}function Uo(e="warning"){const[u,t]=s.useState(""),[n,o]=s.useState(e),[l,r]=s.useState(0),a=s.useCallback((C,c)=>{o(c),t(C),r(d=>d+1)},[]),i=s.useCallback(C=>a(C,"warning"),[a]),f=s.useCallback(C=>a(C,"normal"),[a]),h=s.useCallback(()=>t(""),[]);return{toastMessage:u,toastType:n,toastKey:l,showToast:a,showWarning:i,showNormal:f,clearToast:h}}const Ko=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uB2E4\uC591\uD55C \uC18C\uC74C \uD658\uACBD\uC5D0\uC11C \uBB38\uC7A5 \uCCAD\uB825\uC744 \uD6C8\uB828\uD569\uB2C8\uB2E4."},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uB2E4\uC218\uC758 \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC5EC\uB7EC\uAC1C\uC758 \uC9E7\uC740 \uBB38\uC7A5\uC744 \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uADF8 \uC21C\uC11C\uC5D0 \uB9DE\uAC8C \uBC30\uC5F4\uD569\uB2C8\uB2E4."}],Wo={LISTEN_IN_NOISE:"listenInNoise",SHORT_STORY:"shortStory",LONG_STORY:"longStory",ORDERING_SENTENCE:"orderingSentence"};function qo(e){return Ko.map(u=>{const t=Wo[u.key];return t?{...u,label:e(`trainingType.${t}.title`),desc:e(`trainingType.${t}.desc`)}:u})}const Me={blue:"#60A5FA",green:"#4ADE80",amber:"#FBBF24",purple:"#A78BFA",pink:"#F472B6"},ke=Me.blue,eu=Me.green,ve=Me.amber,uu=Me.purple,zo=Me.pink,Jo=[{key:"discrimination",label:"\uBCC0\uBCC4\uD6C8\uB828",disc:"\uB450 \uC18C\uB9AC\uAC00 \uAC19\uC740\uC9C0 \uB2E4\uB978\uC9C0, \uB610\uB294 \uD2B9\uC815 \uC18C\uB9AC\uB97C \uAD6C\uBCC4\uD558\uB294 \uD6C8\uB828\uC785\uB2C8\uB2E4.",icon:"ear",types:[{key:"SAME_SOUND_PICK",label:"\uAC19\uC740 \uC18C\uB9AC \uACE0\uB974\uAE30",icon:"volume-2",color:ke,subTitle:"\uB4E4\uC740 \uC18C\uB9AC\uC640 \uAC19\uC740 \uB2E8\uC5B4 \uCE74\uB4DC\uB97C \uACE0\uB974\uC138\uC694."},{key:"SAME_OR_DIFF",label:"\uAC19\uC740\uC9C0 \uB2E4\uB978\uC9C0 \uB9DE\uD788\uAE30",icon:"diff",color:ke,subTitle:"\uB450 \uC18C\uB9AC\uAC00 \uAC19\uC740\uC9C0, \uB2E4\uB978\uC9C0 \uAD6C\uBD84\uD558\uC138\uC694."},{key:"HEAR_AND_PICK_SAME",label:"\uC77C\uCE58\uD558\uB294 \uB2E8\uC5B4 \uB9DE\uD788\uAE30",icon:"headphones",color:ke,subTitle:"\uB4E4\uC740 \uC18C\uB9AC\uC758 \uB2E8\uC5B4 \uCE74\uB4DC\uB97C \uACE0\uB974\uC138\uC694."},{key:"HEAR_AND_PICK_INCLUDED",label:"\uD55C \uC74C\uC808 \uD3EC\uD568 \uB2E8\uC5B4 \uB9DE\uD788\uAE30",icon:"scan-search",color:ke,subTitle:"\uB4E4\uC740 \uC74C\uC808\uC774 \uD3EC\uD568\uB41C \uB2E8\uC5B4 \uCE74\uB4DC\uB97C \uACE0\uB974\uC138\uC694."},{key:"STARTS_WITH_SAME_SOUND",label:"\uCCAB \uC74C\uC808\uC774 \uAC19\uC740 \uB2E8\uC5B4 \uB9DE\uD788\uAE30",icon:"play-circle",color:ke,subTitle:"\uB4E4\uC740 \uB2E8\uC5B4\uC640 \uAC19\uC740 \uC18C\uB9AC\uB85C \uC2DC\uC791\uD558\uB294 \uB2E8\uC5B4\uB97C \uACE0\uB974\uC138\uC694."}]},{key:"synthesis",label:"\uD569\uC131\uD6C8\uB828",disc:"\uB450 \uAC1C \uC774\uC0C1\uC758 \uC74C\uC808\uC774\uB098 \uC74C\uC18C\uB97C \uD569\uCCD0 \uB2E8\uC5B4\uB97C \uB9CC\uB4DC\uB294 \uD6C8\uB828\uC785\uB2C8\uB2E4.",icon:"git-merge",types:[{key:"MERGE_2_SYLLABLES",label:"\uC74C\uC808 2\uAC1C \uD569\uCE58\uAE30",icon:"link-2",color:eu,subTitle:"\uB450 \uC74C\uC808\uC744 \uD569\uCE58\uBA74 \uC5B4\uB5A4 \uB2E8\uC5B4\uAC00 \uB420\uAE4C\uC694?"},{key:"MERGE_3_SYLLABLES",label:"\uC74C\uC808 3\uAC1C \uD569\uCE58\uAE30",icon:"git-merge",color:eu,subTitle:"\uC138 \uC74C\uC808\uC744 \uD569\uCE58\uBA74 \uC5B4\uB5A4 \uB2E8\uC5B4\uAC00 \uB420\uAE4C\uC694?"},{key:"MERGE_2_PHONEMES",label:"\uC74C\uC18C 2\uAC1C \uD569\uCE58\uAE30",icon:"combine",color:eu,subTitle:"\uB450 \uC74C\uC18C\uB97C \uD569\uCE58\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB420\uAE4C\uC694?"},{key:"MERGE_3_PHONEMES",label:"\uC74C\uC18C 3\uAC1C \uD569\uCE58\uAE30",icon:"braces",color:eu,subTitle:"\uC138 \uC74C\uC18C\uB97C \uD569\uCE58\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB420\uAE4C\uC694?"}]},{key:"deletion",label:"\uD0C8\uB77D\uD6C8\uB828",disc:"\uB2E8\uC5B4\uC5D0\uC11C \uC74C\uC808\uC774\uB098 \uC74C\uC18C\uB97C \uC81C\uAC70\uD588\uC744 \uB54C \uB0A8\uB294 \uC18C\uB9AC\uB97C \uC778\uC2DD\uD558\uB294 \uD6C8\uB828\uC785\uB2C8\uB2E4.",icon:"scissors",types:[{key:"DROP_1_FROM_2SYLL",label:"2\uC74C\uC808\uC5D0\uC11C 1\uC74C\uC808 \uD0C8\uB77D",icon:"scissors",color:ve,subTitle:"2\uC74C\uC808 \uB2E8\uC5B4\uC5D0\uC11C \uD55C \uC74C\uC808\uC744 \uBE7C\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB420\uAE4C\uC694?"},{key:"DROP_1_FROM_3SYLL",label:"3\uC74C\uC808\uC5D0\uC11C 1\uC74C\uC808 \uD0C8\uB77D",icon:"minus-circle",color:ve,subTitle:"3\uC74C\uC808 \uB2E8\uC5B4\uC5D0\uC11C \uD55C \uC74C\uC808\uC744 \uBE7C\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB420\uAE4C\uC694?"},{key:"DROP_PART_FROM_COMPOUND",label:"\uD569\uC131\uC5B4\uC5D0\uC11C \uBD80\uBD84\uD0C8\uB77D",icon:"unlink",color:ve,subTitle:"\uD569\uC131\uC5B4\uC758 \uC77C\uBD80\uB97C \uBE7C\uBA74 \uC5B4\uB5A4 \uB2E8\uC5B4\uAC00 \uB420\uAE4C\uC694?"},{key:"DROP_FINAL_CONSONANT_FROM_1SYLL",label:"1\uC74C\uC808\uC5D0\uC11C \uBC1B\uCE68 \uD0C8\uB77D",icon:"eraser",color:ve,subTitle:"\uBC1B\uCE68\uC744 \uBE7C\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB420\uAE4C\uC694?"},{key:"REMOVE_CONSONANT_AND_IDENTIFY_PHONEME",label:"1\uC74C\uC808\uC5D0\uC11C \uC790\uC74C \uD0C8\uB77D",icon:"audio-lines",color:ve,subTitle:"\uC790\uC74C\uC744 \uBE7C\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB0A8\uC744\uAE4C\uC694?"}]},{key:"substitution",label:"\uB300\uCE58\uD6C8\uB828",disc:"\uB2E8\uC5B4\uC758 \uC77C\uBD80 \uC74C\uC808\uC774\uB098 \uC74C\uC18C\uB97C \uBC14\uAFB8\uC5B4 \uC0C8\uB85C\uC6B4 \uC18C\uB9AC\uB97C \uB9CC\uB4DC\uB294 \uD6C8\uB828\uC785\uB2C8\uB2E4.",icon:"replace",types:[{key:"CHANGE_1_SYLL_IN_2SYLL",label:"2\uC74C\uC808\uC5D0\uC11C \uD55C \uC74C\uC808 \uBC14\uAFB8\uAE30",icon:"replace",color:uu,subTitle:"2\uC74C\uC808 \uB2E8\uC5B4\uC758 \uD55C \uC74C\uC808\uC744 \uBC14\uAFD4 \uC0C8 \uB2E8\uC5B4\uB97C \uB9CC\uB4DC\uC138\uC694."},{key:"CHANGE_1_SYLL_IN_3SYLL",label:"3\uC74C\uC808\uC5D0\uC11C \uD55C \uC74C\uC808 \uBC14\uAFB8\uAE30",icon:"shuffle",color:uu,subTitle:"3\uC74C\uC808 \uB2E8\uC5B4\uC758 \uD55C \uC74C\uC808\uC744 \uBC14\uAFD4 \uC0C8 \uB2E8\uC5B4\uB97C \uB9CC\uB4DC\uC138\uC694."},{key:"CHANGE_1_PHONEME_IN_1SYLL",label:"1\uC74C\uC808\uC5D0\uC11C \uD55C \uC74C\uC18C \uBC14\uAFB8\uAE30",icon:"arrow-right-left",color:uu,subTitle:"1\uC74C\uC808 \uB2E8\uC5B4\uC758 \uD55C \uC74C\uC18C\uB97C \uBC14\uAFD4 \uC0C8 \uC18C\uB9AC\uB97C \uB9CC\uB4DC\uC138\uC694."},{key:"CHANGE_1_PHONEME_IN_2SYLL",label:"2\uC74C\uC808\uC5D0\uC11C \uD55C \uC74C\uC18C \uBC14\uAFB8\uAE30",icon:"flip-horizontal",color:uu,subTitle:"2\uC74C\uC808 \uB2E8\uC5B4\uC758 \uD55C \uC74C\uC18C\uB97C \uBC14\uAFD4 \uC0C8 \uB2E8\uC5B4\uB97C \uB9CC\uB4DC\uC138\uC694."}]},{key:"attention",label:"\uCCAD\uAC01\uC801\uC8FC\uC758\uB825\uD6C8\uB828",disc:"\uC5EC\uB7EC \uC18C\uB9AC\uB97C \uB4E3\uACE0 \uC21C\uC11C\uB97C \uAE30\uC5B5\uD558\uB294 \uC8FC\uC758\uB825\uACFC \uB2E8\uAE30 \uAE30\uC5B5 \uD6C8\uB828\uC785\uB2C8\uB2E4.",icon:"list-ordered",types:[{key:"LISTEN_AND_REMEMBER_ORDER",label:"\uB4E3\uACE0 \uC21C\uC11C\uB300\uB85C \uAE30\uC5B5\uD558\uAE30",icon:"list-ordered",color:zo,subTitle:"\uC138 \uB2E8\uC5B4\uB97C \uB4E4\uC740 \uC21C\uC11C\uB300\uB85C \uCE74\uB4DC\uB97C \uC120\uD0DD\uD558\uC138\uC694."}]}];function Xo(){const{t:e}=ce.useTranslation();return s.useMemo(()=>{const u=Object.fromEntries(qo(e).map(n=>[n.key,n.label])),t={...u};return Jo.flatMap(n=>n.types).forEach(n=>{t[n.key]=e(`trainingType.${n.key}.label`,{defaultValue:n.label})}),{sentence:u,all:t}},[e])}const Zo="0.130.0";function Qo({computeStyle:e,onScroll:u="close",onResize:t="close",ignoreOutsideClickSelector:n}){const[o,l]=s.useState(!1),[r,a]=s.useState({}),i=s.useRef(null),f=s.useRef(null),h=s.useCallback(()=>{i.current&&a(e(i.current.getBoundingClientRect()))},[e]);s.useEffect(()=>{if(!o)return;h();const d=g=>{const E=g.target;n&&E.closest?.(n)||i.current?.contains(E)||f.current?.contains(E)||l(!1)};document.addEventListener("mousedown",d);const m=g=>{f.current?.contains(g.target)||(u==="reposition"?h():u==="close"&&l(!1))};u!=="ignore"&&window.addEventListener("scroll",m,!0);const y=()=>{t==="reposition"?h():t==="close"&&l(!1)};t!=="ignore"&&window.addEventListener("resize",y);const S=g=>{g.key==="Escape"&&l(!1)};return document.addEventListener("keydown",S),()=>{document.removeEventListener("mousedown",d),u!=="ignore"&&window.removeEventListener("scroll",m,!0),t!=="ignore"&&window.removeEventListener("resize",y),document.removeEventListener("keydown",S)}},[o,h,u,t,n]);const C=s.useCallback(()=>l(d=>!d),[]),c=s.useCallback(()=>l(!1),[]);return{open:o,setOpen:l,toggle:C,close:c,style:r,triggerRef:i,menuRef:f}}function el(e,{mode:u="playback",autoStart:t=!1,onPlaySpeaker:n,onComplete:o,playMs:l=1100,feedbackMs:r=1500}={}){const[a,i]=s.useState([]),[f,h]=s.useState(0),[C,c]=s.useState("idle"),[d,m]=s.useState(null),[y,S]=s.useState([]),[g,E]=s.useState(null),[w,A]=s.useState(0),_=s.useRef(0),b=s.useCallback(B=>{_.current=typeof B=="function"?B(_.current):B,A(_.current)},[]),L=s.useRef(n),T=s.useRef(o);s.useEffect(()=>{L.current=n,T.current=o},[n,o]);const v=s.useRef([]),R=()=>{v.current.forEach(clearTimeout),v.current=[]},V=(B,D)=>{v.current.push(setTimeout(D,B))};s.useEffect(()=>()=>R(),[]);const $=a[f]?.id??null,Y=s.useCallback(()=>{R(),c("playing"),S([]),E(null),b(0);let B=0;e.forEach((D,G)=>{V(B,()=>{h(G),m(D.id),L.current?.(D)}),V(B+1e3,()=>{m(null),S(H=>[...H,D.id])}),B+=1300}),V(B,()=>{c("done"),T.current?.({score:0,total:e.length})})},[e,b]),I=s.useCallback((B,D)=>{if(D>=B.length){c("done"),T.current?.({score:_.current,total:B.length});return}h(D),E(null),c("playing"),m(B[D].id),L.current?.(B[D]),V(l,()=>{m(null),c("waiting")})},[l]),M=s.useCallback(()=>{R();const B=x(e);i(B),b(0),S([]),I(B,0)},[e,I,b]),F=s.useCallback(()=>{u==="playback"?(i(e),Y()):M()},[u,e,Y,M]),J=s.useCallback(()=>{R(),c("idle"),m(null),S([]),E(null),h(0),b(0),i([])},[b]);s.useEffect(()=>{t?F():J()},[u,e.length,t]);const se=s.useCallback(B=>{C!=="waiting"||u==="playback"||(E(B),B===a[f]?.id&&b(D=>D+1),u==="exam"?(c("playing"),V(400,()=>I(a,f+1))):(c("feedback"),V(r,()=>I(a,f+1))))},[C,u,a,f,I,r,b]),ie=u==="playback"?e.length:a.length;return{bind:{activeSpeakerId:d,playedIds:y,selectedId:g,answerId:$,showFeedback:C==="feedback",clickable:C==="waiting",onSelectSpeaker:se},index:f,total:ie,score:w,phase:C,done:C==="done",start:F,reset:J}}exports.CACHE_GROUPS=Pu,exports.CORE_VERSION=Zo,exports.DocumentTitleSuppressContext=Ru,exports.EMPTY_COMPOSITION=Eu,exports.MediaQueryOverrideContext=Nu,exports.NO_CODA=ne,exports.SYLLABLE_MIN=oe,exports.VAP_PAGE_SIZE_OPTIONS=$e,exports.buildGradeSection=rt,exports.buildPartOfSpeechSection=at,exports.buildPositionSection=ao,exports.buildSelectSection=ro,exports.buildSyllableSection=lo,exports.buildWordTypeSection=st,exports.charToPronValue=ht,exports.convertComposition=pt,exports.fmtBytes=on,exports.lsBytes=Fu,exports.meaningKey=wu,exports.pronToCharValue=mt,exports.syllableToFilter=mu,exports.today=Ae,exports.toggleAttributeFilter=so,exports.useAnchoredMenu=Qo,exports.useCacheManagement=ln,exports.useDailyTrainingSelection=Po,exports.useDelayedHoverAnchor=Go,exports.useDeviceManagement=hn,exports.useDocumentTitle=Ft,exports.useEscToClose=Vo,exports.useFontScale=vt,exports.useHoverAnchor=$o,exports.useMediaQuery=Pt,exports.usePagedList=Yo,exports.usePasswordChange=Gt,exports.useRelativeDay=Vt,exports.useSoundCompassExam=el,exports.useTablePaging=fn,exports.useTableSort=gn,exports.useToastState=Uo,exports.useTrainingTypeLabels=Xo,exports.useVisitAllPanel=dn,exports.useVisitHistory=sn,exports.useVisitSchedule=Cn,exports.useWindowEvent=ju,exports.useWordAttributeFilterKeys=lt,exports.useWordDataStats=rn,exports.useWordMeanings=Ho,exports.useWordTrainingDataGeneration=No,exports.useWordTrainingFilter=Do,exports.valueToJamos=ae;