@ihabdevteam/core 0.134.0 → 0.135.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 (40) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/dist/components.cjs.js +174 -174
  3. package/dist/hooks.cjs.js +1 -1
  4. package/dist/i18n.cjs.js +3 -3
  5. package/dist/ihabdevteam-core.cjs.js +181 -181
  6. package/dist/ihabdevteam-core.d.ts +1 -1
  7. package/dist/packages/core/src/components/BarChart.js +3 -1
  8. package/dist/packages/core/src/components/Popup/ConfirmPopup.js +34 -21
  9. package/dist/packages/core/src/components/Popup/CouponInputPopup.js +4 -1
  10. package/dist/packages/core/src/components/Popup/ListPopup.js +7 -2
  11. package/dist/packages/core/src/components/Popup/SaveTablePopup.js +13 -3
  12. package/dist/packages/core/src/components/Popup/TrainingResultPopup.js +5 -1
  13. package/dist/packages/core/src/components/Report/ReportDocument.js +35 -10
  14. package/dist/packages/core/src/components/RingChart.js +14 -3
  15. package/dist/packages/core/src/components/Table.js +15 -5
  16. package/dist/packages/core/src/components/Training/TrainingBlockButton.js +3 -1
  17. package/dist/packages/core/src/components/Training/TrainingPagePopup.js +28 -2
  18. package/dist/packages/core/src/components/Training/TrainingStepOrderList.js +11 -7
  19. package/dist/packages/core/src/components/Training/TrainingWordCard.js +4 -0
  20. package/dist/packages/core/src/components/Word/WordTableBlock.js +2 -1
  21. package/dist/packages/core/src/components/barChartData.d.ts +8 -0
  22. package/dist/packages/core/src/components/barChartData.js +21 -0
  23. package/dist/packages/core/src/components/useBarChartControl.js +5 -3
  24. package/dist/packages/core/src/hooks/useDailyTrainingSelection.js +17 -1
  25. package/dist/packages/core/src/hooks/useEditableList.d.ts +6 -0
  26. package/dist/packages/core/src/hooks/useEditableList.js +20 -1
  27. package/dist/packages/core/src/hooks/useTablePaging.js +4 -0
  28. package/dist/packages/core/src/hooks/useVisitHistory.js +2 -2
  29. package/dist/packages/core/src/hooks/useVisitSchedule.js +5 -4
  30. package/dist/packages/core/src/hooks/useWordMeanings.js +13 -4
  31. package/dist/packages/core/src/i18n/locales/en.json +2 -1
  32. package/dist/packages/core/src/i18n/locales/ko.json +2 -1
  33. package/dist/packages/core/src/utils/getTrainingData.js +11 -4
  34. package/dist/packages/core/src/utils/imageConfig.js +6 -3
  35. package/dist/packages/core/src/utils/wordTrainingRuntime.d.ts +1 -1
  36. package/dist/packages/core/src/utils/wordTrainingRuntime.js +11 -4
  37. package/dist/packages/core/src/version.d.ts +1 -1
  38. package/dist/packages/core/src/version.js +1 -1
  39. package/dist/utils.cjs.js +1 -1
  40. package/package.json +1 -1
package/dist/hooks.cjs.js CHANGED
@@ -1 +1 @@
1
- "use strict";var i=require("react"),ce=require("react-i18next"),ju=require("i18next"),au=typeof document<"u"?document.currentScript:null;function Ht({storageKey:e="fontScale",baseFont:u=20,minScale:t=.8,maxScale:n=1.4,step:o=.1,lineHeightRatio:l=1.4}={}){const r=p=>Math.max(t,Math.min(n,Number(p))),[a,s]=i.useState(()=>{try{const p=localStorage.getItem(e),h=p?Number(p):1;return Number.isFinite(h)?r(h):r(1)}catch{return 1}});i.useEffect(()=>{try{localStorage.setItem(e,String(a))}catch{}},[e,a]);const d=p=>{s(typeof p=="function"?h=>r(p(h)):r(p))},m=()=>d(p=>+(p+o).toFixed(6)),C=()=>d(p=>+(p-o).toFixed(6)),c=a<n-Number.EPSILON,g=a>t+Number.EPSILON,f=Math.round(u*a),E=Math.round(f*l);return{scale:a,setScale:d,increase:m,decrease:C,canIncrease:c,canDecrease:g,fontSize:f,lineHeight:E}}const Iu=i.createContext(null);function Gt(e){return/max-width:\s*7[0-9][0-9]px/.test(e)}function Yt(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),r=s=>o(s.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"&&Gt(e)?u.mobile:n}function Ru(e){const u=i.useRef(e);return i.useEffect(()=>{u.current=e}),u}function Mu(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 su=" \xB7 ",Lu=(()=>{if(typeof document>"u")return"";const e=document.title;return e.includes(su)?e.split(su).pop()??e:e})(),ku=i.createContext(!1),ge=[];let vu=null;function Ut(e){const u=i.useContext(ku);i.useEffect(()=>{if(u||typeof e!="string"||!e)return;ge.length===0&&(vu=document.title);const t={text:Lu?`${e}${su}${Lu}`:e};return ge.push(t),document.title=t.text,()=>{const n=ge.lastIndexOf(t);n>=0&&ge.splice(n,1),document.title=ge.length?ge[ge.length-1].text:vu??document.title}},[e,u])}function Kt(){const{t:e}=ce.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])}const Wt=()=>{const e="\uC54C \uC218 \uC5C6\uB294 \uC624\uB958",u=typeof ju?.t=="function"?ju.t("common.unknownError",{defaultValue:e}):void 0;return typeof u=="string"&&u?u:e};function qt(e,u){if(u===void 0&&(u=Wt()),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 zt(e){const{t:u}=ce.useTranslation(),[t,n]=i.useState({current:"",next:"",confirm:""}),[o,l]=i.useState(null),[r,a]=i.useState(!1),s=i.useRef(null);i.useEffect(()=>()=>{s.current!==null&&clearTimeout(s.current)},[]);const d=i.useCallback(()=>{n({current:"",next:"",confirm:""}),l(null)},[]),m=i.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=qt(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:""}),s.current!==null&&clearTimeout(s.current),s.current=setTimeout(()=>l(null),1500)},[t,e,u]);return{pw:t,setPw:n,pwMsg:o,setPwMsg:l,pwLoading:r,handleChangePw:m,reset:d}}const z=["\u3131","\u3132","\u3134","\u3137","\u3138","\u3139","\u3141","\u3142","\u3143","\u3145","\u3146","\u3147","\u3148","\u3149","\u314A","\u314B","\u314C","\u314D","\u314E"],ne=["\u314F","\u3150","\u3151","\u3152","\u3153","\u3154","\u3155","\u3156","\u3157","\u3158","\u3159","\u315A","\u315B","\u315C","\u315D","\u315E","\u315F","\u3160","\u3161","\u3162","\u3163"],ee=["","\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 x(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 Jt(){const e=new Map;return u=>{let t=e.get(u);return t||(t=[...u].map(n=>x(n)),e.set(u,t)),t}}function Ce(e,u,t=0){return String.fromCharCode(44032+(e*21+u)*28+t)}function Qt(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=x(e[o]),r=x(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,s=l.jung!==r.jung,d=l.jong!==r.jong;(a?1:0)+(s?1:0)+(d?1:0)>1?n="multi":a?n="cho":s?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(""),ee[Number(e)]]));function Zt(e,u){if(!e||!u)return!1;for(const t of e){const n=x(t);if(n){if(z[n.cho]===u)return!0;if(n.jong>0){if(ee[n.jong]===u)return!0;const o=be[n.jong];if(o&&o.includes(u))return!0}}}return!1}function Ae(e){if(!e)return 0;let u=0;for(const t of e)x(t)&&u++;return u}function Xt(e){if(!e)return!1;let u=!1;for(const t of e){const n=x(t);if(n&&(u=!0,n.jong>0))return!1}return u}function en(e,u){if(e.jong<=0)return!1;if(u.includes(ee[e.jong]))return!0;const t=be[e.jong];return!!t&&t.some(n=>u.includes(n))}function un(e,u,t){if(!e)return!1;const n=[...e],o=l=>{const r=x(n[l]);if(!r||u.cho&&!u.cho.includes(z[r.cho])||u.jung&&!u.jung.includes(ne[r.jung]))return!1;if(u.jongNone){if(r.jong>0)return!1}else if(u.jong&&!en(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 tn={cho:z.length,jung:ne.length,jong:ee.length};function nn(e,u,t,n,o=1/0){if(!e||t<1)return[];const l=[...e].map(C=>x(C));if(l.some(C=>!C))return[];const r=l,a=r.length;if(t>a)return[];const s=tn[u],d=new Set,m=[];(function C(c,g){if(g.length===t){m.push([...g]);return}for(let f=c;f<a;f++)g.push(f),C(f+1,g),g.pop()})(0,[]);for(const C of m)if((function c(g,f){if(d.size>=o)return;if(g===C.length){const h=f.map(y=>Ce(y.cho,y.jung,y.jong)).join("");h!==e&&n.has(h)&&d.add(h);return}const E=C[g],p=r[E][u];for(let h=0;h<s;h++){if(h===p)continue;const y=f.slice();if(y[E]={...f[E],[u]:h},c(g+1,y),d.size>=o)return}})(0,r),d.size>=o)break;return[...d]}function on(e,u){if(!e||!u||e.length!==u.length)return-1;let t=0;for(let n=0;n<e.length;n++){const o=x(e[n]),l=x(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 _e=null;function ln(){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 De(){if(_e)return _e;const e=ln();return e?(_e=e.index,e.sig,_e):null}function rn(){_e=null;try{typeof localStorage<"u"&&(localStorage.removeItem(Pu),localStorage.removeItem(xu))}catch{}}const Fu="word_image_existence_map_v1";let Ee=null;function Vu(){if(Ee)return Ee;try{const e=typeof localStorage<"u"?localStorage.getItem(Fu):null;Ee=e?JSON.parse(e):{}}catch{Ee={}}return Ee}function an(e,u){return`${e}_${u??1}`}function sn(e,u){const t=Vu(),n=an(e,u);return n in t?t[n]:void 0}function $u(){const e=Vu(),u=Object.values(e);return u.length===0?null:{total:u.length,exists:u.filter(Boolean).length}}function cn(){Ee={};try{typeof localStorage<"u"&&localStorage.removeItem(Fu)}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 Gu(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 Cn(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 dn(e){const{t:u}=ce.useTranslation(),[t,n]=i.useState({}),[o,l]=i.useState(null),[r,a]=i.useState(null),[s,d]=i.useState(null),m=i.useCallback(()=>{const c={};Hu.forEach(g=>{c[g.id]=Gu([...g.keys])}),n(c),typeof navigator<"u"&&navigator.storage?.estimate&&navigator.storage.estimate().then(g=>{d({usage:g.usage??0,quota:g.quota??0})}).catch(()=>{})},[]);i.useEffect(()=>{m()},[m]);const C=i.useCallback(async c=>{l(c);try{c==="wordData"?(localStorage.removeItem("word_data_cache"),localStorage.removeItem("word_data_version")):c==="pairIndex"?rn():c==="imageCache"&&cn(),m(),e?.(u("settings.cache.cleared","\uCE90\uC2DC\uAC00 \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4."))}finally{l(null)}},[m,e,u]);return{cacheSizes:t,clearingId:o,confirmCacheId:r,setConfirmCacheId:a,storageEstimate:s,refreshCacheSizes:m,handleClearCache:C}}function fn(e){const[u,t]=i.useState(null),[n,o]=i.useState(null),l=i.useCallback(()=>{const r=De();if(r){const s=Object.values(r),d=s.filter(m=>m.cho.length+m.jung.length+m.jong.length>0).length;t({matched:d,total:s.length})}else t(null);const a=$u();o(a?{exists:a.exists,total:a.total}:null)},[]);return i.useEffect(()=>{l();const r=setTimeout(l,1e3);return()=>clearTimeout(r)},[e?.length,l]),{pairStats:u,imgStats:n,setPairStats:t,setImgStats:o,refreshStats:l}}function Yu(e,u=[]){const[t,n]=i.useState(u),[o,l]=i.useState(null),[r,a]=i.useState(!1),[s,d]=i.useState(e),m=i.useRef(r);i.useEffect(()=>{m.current=r});const C=i.useRef(null);i.useEffect(()=>{if(m.current)return;const h=C.current;h!==null&&h.length===u.length&&h.every((y,w)=>y===u[w])||(C.current=u,n(u))},[u]);const c=i.useCallback(h=>{l(h),a(!1),d({...h})},[]),g=i.useCallback(()=>a(!0),[]),f=i.useCallback(()=>a(!1),[]),E=i.useCallback((h,y)=>{n(h),l(y),a(!1)},[]),p=i.useCallback(h=>{n(y=>y.filter(w=>w!==h)),l(null)},[]);return{list:t,setList:n,selected:o,setSelected:l,isEditing:r,setIsEditing:a,editForm:s,setEditForm:d,openDetail:c,startEditing:g,cancelEditing:f,commitEdit:E,remove:p}}const Oe=()=>{const e=new Date;return{year:String(e.getFullYear()),month:String(e.getMonth()+1).padStart(2,"0"),day:String(e.getDate()).padStart(2,"0")}},gn={year:"",month:"",day:"",hour:"09",minute:"00",memo:""};function hn(e=[]){const{list:u,setList:t,selected:n,setSelected:o,isEditing:l,setIsEditing:r,editForm:a,setEditForm:s,openDetail:d,commitEdit:m}=Yu(gn,e),{year:C,month:c,day:g}=Oe(),[f,E]=i.useState({year:C,month:c,day:g,hour:"09",minute:"00",memo:""});return{visitHistory:u,visitForm:f,setVisitForm:E,setVisit:p=>h=>E(y=>({...y,[p]:h})),selectedVisit:n,setSelectedVisit:o,isEditingVisit:l,setIsEditingVisit:r,editVisitForm:a,setEditVisitForm:s,openVisitDetail:d,handleVisitSave:p=>{t(A=>[f,...A]);const{year:h,month:y,day:w}=Oe();E({year:h,month:y,day:w,hour:"09",minute:"00",memo:""}),p?.()},handleVisitEditSave:()=>{m(p=>p.map(h=>h===n?a:h),a)},addVisit:p=>{t(h=>[p,...h])},removeVisit:p=>{t(h=>h.filter(y=>y!==p))},revertVisitEdit:(p,h)=>{t(y=>y.map(w=>w===h?p:w)),o(y=>y===h?p:y)}}}const Uu=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")}`,Ge=e=>[...e].sort((u,t)=>{const n=Uu(u),o=Uu(t);return n<o?-1:n>o?1:0}),mn={year:"",month:"",day:"",hour:"09",minute:"00",memo:""};function pn(e,u=[]){const t=i.useMemo(()=>Ge(u),[u]),{list:n,setList:o,selected:l,setSelected:r,isEditing:a,setIsEditing:s,editForm:d,setEditForm:m,openDetail:C,commitEdit:c,remove:g}=Yu(mn,t),[f,E]=i.useState([]),{year:p,month:h,day:y}=Oe(),[w,A]=i.useState({year:p,month:h,day:y,hour:"09",minute:"00",memo:""}),D=j=>v=>A(V=>({...V,[j]:v})),b=j=>{o(te=>Ge([...te,w]));const{year:v,month:V,day:U}=Oe();A({year:v,month:V,day:U,hour:"09",minute:"00",memo:""}),j?.()},I=()=>{c(j=>Ge(j.map(v=>v===l?d:v)),d)},k=i.useCallback(j=>{g(j)},[g]),M=i.useCallback(j=>{e({year:j.year,month:j.month,day:j.day,hour:j.hour,minute:j.minute,memo:j.memo}),g(j)},[e,g]),O=i.useCallback(j=>{o(v=>v.filter(V=>V!==j)),E(v=>[j,...v]),r(null)},[o,r]),F=i.useCallback(j=>{o(v=>Ge([...v,j]))},[o]),$=i.useCallback(j=>{o(v=>v.filter(V=>V!==j))},[o]),Y=i.useCallback((j,v)=>{o(V=>V.map(U=>U===v?j:U)),r(V=>V===v?j:V)},[o,r]);return{scheduleList:n,noShowList:f,addSchedule:F,removeSchedule:$,revertScheduleEdit:Y,scheduleForm:w,setScheduleForm:A,setSchedule:D,selectedSchedule:l,setSelectedSchedule:r,isEditingSchedule:a,setIsEditingSchedule:s,editScheduleForm:d,setEditScheduleForm:m,openScheduleDetail:C,handleScheduleSave:b,handleScheduleEditSave:I,handleScheduleDelete:k,handleScheduleToVisit:M,handleScheduleNoVisit:O}}const Ye=[{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 Sn(e){const{t:u}=ce.useTranslation(),[t,n]=i.useState(""),[o,l]=i.useState("25"),[r,a]=i.useState("all"),[s,d]=i.useState(1),m=i.useMemo(()=>e.filter(({item:E,status:p})=>!(t&&!E.memo.includes(t)||r!=="all"&&p!==r)),[e,t,r]),C=Math.max(1,Math.ceil(m.length/Number(o))),c=Math.min(s,C),g=i.useMemo(()=>m.slice((c-1)*Number(o),c*Number(o)),[m,c,o]),f=i.useMemo(()=>Ye.map(E=>({...E,label:u("common.pageSizeLabel",{n:E.value,defaultValue:E.label})})),[u]);return{vapSearch:t,setVapSearch:n,vapPageSize:o,setVapPageSize:l,vapPageSizeOptions:f,vapStatus:r,setVapStatus:a,vapPage:c,setVapPage:d,vapFiltered:m,vapTotal:C,vapPageItems:g}}function yn(e,u,t){const{t:n}=ce.useTranslation(),[o,l]=i.useState(()=>{const f=t?.initialPageSize;return f&&Ye.some(E=>E.value===f)?f:"25"}),[r,a]=i.useState(1),[s,d]=i.useState(u);s!==u&&(d(u),r!==1&&a(1));const m=i.useMemo(()=>Ye.map(f=>({...f,label:n("visits.showN",{n:f.value})})),[n]),C=i.useCallback(f=>{l(f),a(1)},[]),c=Math.max(1,Math.ceil(e.length/Number(o))),g=Math.min(r,c);return{pageRows:i.useMemo(()=>e.slice((g-1)*Number(o),g*Number(o)),[e,g,o]),pageSizeProps:{options:m,value:o,onChange:C},paginationProps:{page:g,total:c,onChange:a},setPage:a}}function En(){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}}const Ku=e=>e==="\uC88C"||e==="\uC6B0"?e:null;function Bn(){const[e,u]=i.useState(!1),[t,n]=i.useState("\uC88C"),[o,l]=i.useState({\uC88C:null,\uC6B0:null}),[r,a]=i.useState({\uC88C:[],\uC6B0:[]}),[s,d]=i.useState(!1),[m,C]=i.useState("\uC88C"),c=i.useCallback(f=>{const E=Ku(f.direction);E&&(l(p=>({...p,[E]:f})),a(p=>({...p,[E]:[f,...p[E]]})),u(!1))},[]),g=i.useCallback(f=>{const E=Ku(f.direction);E&&(l(p=>({...p,[E]:f})),d(!1))},[]);return{showDevice:e,setShowDevice:u,deviceDirection:t,setDeviceDirection:n,devices:o,setDevices:l,deviceHistory:r,setDeviceHistory:a,showDeviceList:s,setShowDeviceList:d,listForSide:m,setListForSide:C,handleDeviceSubmit:c,handleSelectFromList:g}}const wn="__ihab_core_word_pool__";function Ue(){return globalThis[wn]??null}function P(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 ae(e,u,t=Math.random){return!Array.isArray(e)||e.length===0||u<=0?[]:u>=e.length?P(e,t):P(e,t).slice(0,u)}const iu={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"}},bn=z.indexOf("\u3147"),Wu={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!==bn},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}},An={\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"},_n={\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 cu(e){return An[e]??e}const Cu={cho:z,jung:ne,jong:ee},W=e=>Array.isArray(e)?e.length>0:!!e;function du(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&&z[n.cho]==="\u3147"!=(z[o.cho]==="\u3147")||n.jong!==o.jong&&n.jong===0!=(o.jong===0)))return!0}return!1}function Dn(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&&du(l,o(t.pronOf(a)))||r.push(a)));return r}function qu(e,u,t){const n=u?.[e];if(!n)return[];const o=t.kind?n[t.kind]??[]:[...n.cho??[],...n.jung??[],...n.jong??[]];return Dn(e,o,t)}function On(e,u,t,n,o,l,r){const a=["cho","jung","jong"].filter(c=>W(e[c])),s={};for(const c of a){const g=e[c];s[c]=new Set(Array.isArray(g)?g:[g])}const d=o==="pron",m=new Map;for(const c of u){const g=t(l(c));if(g.some(h=>!h))continue;let f=g;if(!d&&(f=t(c),f.length!==g.length||f.some(h=>!h)))continue;const E=g.length,p=m.get(E);p?p.push({w:c,dPron:g,dPos:f}):m.set(E,[{w:c,dPron:g,dPos:f}])}const C=new Map;for(const[c,g]of m){const f=new Map,E=(p,h)=>{const y=p.dPos[h];return y!=null&&a.every(w=>s[w].has(Cu[w][y[w]]))};for(const p of g){let h;if(r==="head")h=E(p,0)?0:-1;else if(r==="tail")h=E(p,c-1)?c-1:-1;else if(r==="mid"){h=-1;for(let w=1;w<c-1;w++)if(E(p,w)){h=w;break}}else h=p.dPos.findIndex(w=>w!=null&&a.every(A=>s[A].has(Cu[A][w[A]])));if(h<0)continue;const y=f.get(h);y?y.push(p):f.set(h,[p])}for(const[p,h]of f){const y=new Set(a.map(D=>p+":"+D)),w=D=>{let b="";for(let I=0;I<c;I++){const k=D[I];for(const M of["cho","jung","jong"])b+=(y.has(I+":"+M)?"*":k[M])+"."}return b},A=new Map;for(const D of g){const b=w(D.dPron),I=A.get(b);I?I.push(D):A.set(b,[D])}for(const D of h){const b=A.get(w(D.dPron))??[],I=[];for(const k of b){if(k.w===D.w)continue;let M=!0;for(const O of a){const F=D.dPron[p][O],$=k.dPron[p][O];if($===F){M=!1;break}if(d&&s[O].has(Cu[O][$])){M=!1;break}}M&&(n&&du(D.dPron,k.dPron)||I.push(k.w))}C.set(D.w,I)}}}return C}const Nn=e=>e==null?[]:Array.isArray(e)?e:[e];function Tn(e){if([...e].length!==1)return"";const u=x(e);if(!u)return"";const t=cu(ee[u.jong]),n=t===""?0:ee.indexOf(t);return Ce(u.cho,u.jung,n<0?0:n)}function zu(e,u){return u.get(e)||Tn(e)||e}function fu(e){return e?W(e.cho)?"cho":W(e.jung)?"jung":W(e.jong)?"jong":null:null}function Be(e,u){const t=(n,o)=>!W(n)||Nn(n).includes(o);return t(u.cho,z[e.cho])&&t(u.jung,ne[e.jung])&&t(u.jong,ee[e.jong])}function Ne(e,u,t){const n=[...e];if(t!=="pron")return n.map(l=>x(l));const o=[...u.get(e)||e];return o.length!==n.length?n.map(l=>x(l)):o.map(l=>x(l))}function Te(e,u,t,n,o){const l=u==="cho"?z:u==="jung"?ne:ee,r=e[u],a=[],s=C=>u==="jung"?In(zu(C,o)):zu(C,o),d=new Map([[s(t),-1]]),m=P(l.map((C,c)=>c).filter(C=>C!==r&&(u!=="cho"||l[C]!=="\u3147")&&(u!=="jong"||C!==0)));for(const C of m){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),g=s(c),f=d.get(g);if(f!==void 0){u==="jung"&&f>=0&&o.has(c)&&!o.has(a[f])&&(a[f]=c);continue}d.set(g,a.length),a.push(c)}return a}const jn={\u3154:"\u3150",\u3156:"\u3152",\u315A:"\u3159",\u315E:"\u3159"};function In(e){if([...e].length!==1)return e;const u=x(e);if(!u)return e;const t=jn[ne[u.jung]];return t?Ce(u.cho,ne.indexOf(t),u.jong):e}function Rn(e,u,t,n,o,l=null){const r=[...e];if(r.length!==2)return null;const a=r.map(C=>x(C));if(a.some(C=>!C))return null;const s=Ne(e,t,n);if(s.some(C=>!C))return null;const d=fu(u);let m=d&&u?s.map((C,c)=>Be(C,u)?c:-1).filter(C=>C>=0):[0,1];if(l!=null&&(m=m.filter(C=>C!==l)),!m.length)return null;for(const C of P(m)){const c=r[C];if(!o.has(c))continue;const g=Te(a[C],d??"cho",c,40,t),f=[];for(const E of g)if(E!==c&&o.has(E)&&!f.includes(E)&&f.push(E),f.length>=2)break;if(!(f.length<2))return{question:e,distractors:[c,...f]}}return null}function Mn(e,u,t,n,o,l=null){const r=[...e];if(r.length!==3)return null;const a=r.map(C=>x(C));if(a.some(C=>!C))return null;const s=Ne(e,t,n);if(s.some(C=>!C))return null;const d=fu(u),m=d&&u?s.map((C,c)=>Be(C,u)?c:-1).filter(C=>C>=0):[0,1,2];if(!m.length)return null;for(const C of P(m))for(const c of P([0,1,2].filter(g=>g!==C&&(l==null||g===l)))){const g=[0,1,2].filter(y=>y!==c),f=g.map(y=>r[y]).join("");if(!o.has(f))continue;const E=g.indexOf(C),p=Te(a[C],d??"cho",r[C],40,t),h=[];for(const y of p){const w=g.map(D=>r[D]);w[E]=y;const A=w.join("");if(A!==f&&o.has(A)&&!h.includes(A)&&h.push(A),h.length>=2)break}if(!(h.length<2))return{question:e,distractors:[f,...h]}}return null}function Ln(e,u,t,n,o,l=null){const r=[...e],a=r.length;if(a<2)return null;const s=[];for(let m=1;m<=a-1;m++)s.push({remain:r.slice(0,m).join(""),dropped:r.slice(m).join(""),droppedEnd:1}),s.push({remain:r.slice(a-m).join(""),dropped:r.slice(0,a-m).join(""),droppedEnd:0});const d=fu(u);for(const{remain:m,dropped:C,droppedEnd:c}of P(s)){if(l!=null&&c!==l||m===e||!o.has(m)||!o.has(C))continue;const g=[...m],f=g.map(h=>x(h));if(f.some(h=>!h))continue;const E=Ne(m,t,n);if(E.some(h=>!h))continue;const p=d&&u?E.map((h,y)=>Be(h,u)?y:-1).filter(h=>h>=0):g.map((h,y)=>y);if(p.length)for(const h of P(p)){const y=Te(f[h],d??"cho",g[h],40,t),w=[];for(const A of y){const D=[...g];D[h]=A;const b=D.join("");if(b!==m&&o.has(b)&&!w.includes(b)&&w.push(b),w.length>=2)break}if(w.length>=2)return{question:e,distractors:[m,...w]}}}return null}function kn(e,u,t,n,o,l=null){if([...e].length!==1)return null;const r=x(t.get(e)||e);if(!r||r.jong===0)return null;const a=Ce(r.cho,r.jung,0),s=Te({cho:r.cho,jung:r.jung,jong:0},"cho",a,2,t);return s.length<2?null:{question:e,distractors:[a,...s]}}const gu=z.indexOf("\u3147");function vn(e,u,t,n,o,l=null){if([...e].length!==1)return null;const r=x(t.get(e)||e);if(!r||r.jong!==0||r.cho===gu)return null;const a=Ce(gu,r.jung,0),s=Te({cho:gu,jung:r.jung,jong:0},"jung",a,2,t);return s.length<2?null:{question:e,distractors:[a,...s]}}function Pn(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 s=0;s<o;s++)r+=s===l?"*":n[s];const a=u.get(r);a?a.push(t):u.set(r,[t])}}return u}function xn(e,u,t,n,o,l=null,r=null,a=2){const s=[...e],d=s.length;if(d<2||d>3)return null;const m=s.map(y=>x(y));if(m.some(y=>!y))return null;const C=Ne(e,t,n);if(C.some(y=>!y))return null;const c=y=>t.get(y)??y,g=c(e),f=!!u&&(W(u.cho)||W(u.jung)||W(u.jong)),E=!!r&&(W(r.cho)||W(r.jung)||W(r.jong)),p=y=>{let w=d+"|"+y+"|";for(let A=0;A<d;A++)w+=A===y?"*":s[A];return w};let h;if(l!=null){if(l>=d||f&&!Be(C[l],u))return null;h=[l]}else f?h=C.map((y,w)=>Be(y,u)?w:-1).filter(y=>y>=0):h=Array.from({length:d},(y,w)=>w);for(const y of P(h)){const w=o.get(p(y))??[],A=[],D=[];for(const O of w){if(O===e)continue;const F=[...O].map(v=>x(v)),$=m[y],Y=F[y];if(!$||!Y)continue;let j=0;if($.cho!==Y.cho&&j++,$.jung!==Y.jung&&j++,$.jong!==Y.jong&&j++,!(j<a||c(O)===g))if(E){const v=Ne(O,t,n)[y];v&&Be(v,r)?A.push(O):D.push(O)}else A.push(O)}if(!A.length)continue;const b=P(A)[0],I=[],k=new Set([g,c(b)]),M=E?D:A.filter(O=>O!==b);for(const O of P(M)){const F=c(O);if(!k.has(F)&&(k.add(F),I.push(O),I.length>=2))break}if(!E&&I.length<2)for(const O of P(w)){if(O===e||O===b)continue;const F=c(O);if(!k.has(F)&&(k.add(F),I.push(O),I.length>=2))break}if(!(I.length<2))return{question:e,distractors:[b,...I]}}return null}let Ke=null,Ju=null,Qu=null;function Fn(){const e=Ue();if(e&&e.entries.length>0){const u=De();if(Ke&&Ju===e&&Qu===u)return Ke;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 Ke=n,Ju=e,Qu=u,Ke}return[]}const oe=new Proxy([],{get(e,u){const t=Fn(),n=t[u];return typeof n=="function"?n.bind(t):n}});function hu(e){return e.length?e[Math.floor(Math.random()*e.length)]:void 0}function ue(e,u){if(u>=e.length)return P(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 mu=null,Zu=null;function de(){const e=Ue();if(mu&&Zu===e)return mu;const u=new Map;for(const t of oe)t.w&&u.set(t.w,t.pron);return mu=u,Zu=e,u}function Q(e){return de().get(e)||e}function We(e,u,t=new Set){const n=[];for(const o of P(e)){if(n.length>=u)break;const l=Q(o);t.has(l)||(t.add(l),n.push(o))}return n}let Vn=0;function J(e){return`${e}-rt-${++Vn}`}function je(e){const u=$u();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)sn(n)===!0&&t.add(n);return t}const qe=new Map;let Xu=null,et=null;function Ie(e){return e==null?"":Array.isArray(e)?e.slice().sort().join(","):e}function ut(e){const u=Ie(e.choseong),t=e.composition,n=t?.syllable==null?"":Array.isArray(t.syllable)?t.syllable.slice().sort().join(","):String(t.syllable),o=t?`${Ie(t.cho)}/${Ie(t.jung)}/${Ie(t.jong)}/${t.jongNone?"N":""}/${n}`:"",l=Ie(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=Ue(),t=De();(u!==Xu||t!==et)&&(qe.clear(),Xu=u,et=t);const n=ut(e);return qe.has(n)||qe.set(n,$n(e)),qe.get(n)}function tt(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=>Xt(r):r=>un(r,{cho:t,jung:n,jong:l,jongNone:o}):null}function nt(e){const u=e.grade&&e.grade.length>0?new Set(e.grade):null,t=e.composition??null,n=t?.syllable!=null?new Set(Array.isArray(t.syllable)?t.syllable:[t.syllable]):null,o=t?[tt(t),n?r=>n.has(Ae(r)):null].filter(r=>r!=null):[];if(!u&&o.length===0)return null;const l=e.phonemeView==="pron";return r=>{if(u&&(!r.grade||!u.has(r.grade)))return!1;if(o.length===0)return!0;const a=l?Q(r.w):r.w;return o.every(s=>s(a))}}async function $n(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,s=e.phonemeView==="pron"?"pron":"char",d=Math.max(1,e.contrastCount??1),m=u==="cho"||u==="jung"||u==="jong",C=m&&d>=2,c=u==="count",g=t?new Set(Array.isArray(t)?t:[t]):null,f=n?.syllable!=null?new Set(Array.isArray(n.syllable)?n.syllable:[n.syllable]):null,E=n?[tt(n),f?B=>f.has(Ae(B)):null].filter(B=>B!=null):[],p=u==="random"||u===null,h=p||c,y=p||C||c;let w=oe.filter(B=>!B.w||r&&(!B.grade||!r.has(B.grade))?!1:y?!0:Array.isArray(B.p)&&B.p.length>0);g&&(w=w.filter(B=>{for(const _ of g)if(Zt(B.w,_))return!0;return!1})),E.length>0&&(w=w.filter(B=>{const _=s==="pron"?Q(B.w):B.w;return E.every(G=>G(_))})),o&&(w=w.filter(B=>B.w[0]===o));let A;if(l){const B=new Set;for(const _ of w)if(B.add(_.w),Array.isArray(_.p))for(const G of _.p)B.add(G);if(h)for(const _ of oe)_.w&&B.add(_.w);A=je(B)}else{const B=new Set;for(const _ of w)if(B.add(_.w),Array.isArray(_.p))for(const G of _.p)B.add(G);if(h)for(const _ of oe)_.w&&B.add(_.w);A=B}let D=null;if(C){const B=new Set;for(const _ of oe)_.w&&B.add(_.w);D=l?je(B):B}const b=w.filter(B=>A.has(B.w)),I=600,k=Array.from(A),M=k.length>I?ue(k,I):k,O=c&&n!=null&&(W(n.cho)||W(n.jung)||W(n.jong)),F=2500,$=new Map;if(c&&!O&&d>=2){for(const B of k){const _=Ae(B),G=$.get(_);G?G.push(B):$.set(_,[B])}for(const[B,_]of $)_.length>F&&$.set(B,ue(_,F))}const Y=Jt(),j=O?On(n,k,Y,a,s,Q):null,v=500,V=1500,U=e.fullCount?b:u==="random"?b.length>v?ue(b,v):b:b.length>V?ue(b,V):b,te=De(),me=[];for(const B of U){let _;const G=Q(B.w);if(C)_=nn(B.w,u,d,D,24).filter(H=>Q(H)!==G);else if(c)O?_=(j.get(B.w)??[]).filter(H=>Q(H)!==G):d<=1?_=qu(B.w,te,{okSet:A,pronOf:Q,decompOf:Y,sameStructureOnly:!1}):_=($.get(Ae(B.w))??[]).filter(H=>{if(H===B.w||Q(H)===G)return!1;const X=on(B.w,H);return d>=5?X>=5:X===d});else if(p)_=M.filter(H=>H!==B.w&&H.length===B.w.length&&Q(H)!==G);else{const H=u;_=qu(B.w,te,{kind:H,okSet:A,pronOf:Q,decompOf:Y,sameStructureOnly:!1}),_.length===0&&(_=(M.length>30?ue(M,30):M).filter(X=>X!==B.w&&Qt(B.w,X)===u&&Q(X)!==G))}if(a&&_.length>0&&(m||c&&!O)){const H=Y(Q(B.w));_=_.filter(X=>!du(H,Y(Q(X))))}_.length!==0&&me.push({word:B,usable:_})}return me}async function ot(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 P(l)){if(r.length>=n)break;const s=We(a.usable,o);if(s.length<o)continue;const d=P([a.word.w,...s]);r.push({id:J(e+"-item"),index:r.length+1,word:a.word.w,syllables:a.word.s,choices:d,answerIndex:d.indexOf(a.word.w)})}return r}async function Hn(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=P([...o]);for(const a of r){if(l.length>=t)break;const s=a.word.w,d=[...a.word.pron||s],m=hu(d);if(!m)continue;const C=o.filter(f=>f.word.w!==s&&f.word.s===a.word.s&&!(f.word.pron||f.word.w).includes(m)&&f.word.pron!==a.word.pron);if(C.length<n)continue;const c=We(C.map(f=>f.word.w),n);if(c.length<n)continue;const g=P([s,...c]);l.push({id:J("HPI-item"),index:l.length+1,targetSyllable:m,word:s,choices:g,answerIndex:g.indexOf(s)})}return l}async function Gn(e){const{count:u=10}=e,t=(await Z(e)).filter(l=>l.usable.length>=1);if(!t.length)return[];const n=t.length>=u?ue(t,u):P(Array.from({length:u},(l,r)=>t[r%t.length])),o=P(Array.from({length:u},(l,r)=>r<Math.ceil(u/2)));return n.map((l,r)=>{const a=o[r];let s;if(a)s=[l.word.w,l.word.w];else{const d=hu(l.usable);s=Math.random()<.5?[l.word.w,d]:[d,l.word.w]}return{id:J("SOD-item"),index:r+1,word:l.word.w,pair:s,same:a}})}async function Yn(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]??"",s={};for(const c of o){const g=a(c.word.w);g&&(s[g]||(s[g]=[]),s[g].push(c.word.w))}const d=Object.entries(s).filter(([,c])=>c.length>=2).map(([c])=>c);if(d.length===0)return[];const m=[],C=P([...d]);for(let c=0;m.length<t&&c<t*4;c++){const g=C[c%C.length],f=s[g];if(f.length<2)continue;const E=P([...f]),p=E[0],h=E[1];if(!p||!h||p===h||(r.get(p)||p)===(r.get(h)||h))continue;const y=r.get(h)||h,w=l.filter(b=>a(b)!==g&&b!==p&&b!==h&&b.length===h.length&&(r.get(b)||b)!==y);if(w.length<n)continue;const A=We(w,n);if(A.length<n)continue;const D=P([h,...A]);m.push({id:J("SWS-item"),index:m.length+1,sourceWord:p,targetSyllable:g,word:h,choices:D,answerIndex:D.indexOf(h)})}return m}function lt(e,u,t){const n=de(),o=a=>n.get(a)||a,l=(a,s)=>{const d=[...a],m=[...s];if(d.length!==m.length)return-1;let C=-1;for(let c=0;c<d.length;c++)if(d[c]!==m[c]){if(C>=0)return-1;C=c}return C},r=e.map(a=>({e:a,swaps:a.usable.filter(s=>!!s&&l(a.word.w,s)>=0&&o(s)!==o(a.word.w))})).filter(a=>a.swaps.length>0);return ue(r,u).map(({e:a,swaps:s},d)=>{const m=hu(s)??"",C=[...a.word.w],c=[...m],g=l(a.word.w,m),f=We(a.usable.filter(E=>E&&E!==m),2,new Set([o(m),o(a.word.w)]));return{id:J(t),index:d+1,word:a.word.w,original:a.word.w,changed:m,changedFrom:g>=0?C[g]:"",changedTo:g>=0?c[g]:"",distractors:f}})}async function rt(e,u,t){const{count:n=10}=u,o=de(),l=oe.filter(f=>f.w&&f.s===e),r=u.excludeNoImage?je(l.map(f=>f.w)):null,a=r?l.filter(f=>r.has(f.w)):l,s=new Set(a.map(f=>f.w)),d=Pn(s),m=u.phonemeView??"char",C=u.composition??null,c=nt({grade:u.grade}),g=[];for(const f of P(a)){if(g.length>=n)break;if(c&&!c(f))continue;const E=xn(f.w,C,o,m,d,null,null);if(!E)continue;const p=E.distractors[0],h=[...f.w],y=[...p],w=h.findIndex((A,D)=>A!==y[D]);g.push({id:J(t),index:g.length+1,word:f.w,original:f.w,changed:p,changedFrom:w>=0?h[w]:"",changedTo:w>=0?y[w]:"",distractors:E.distractors.slice(1)})}return g}async function Un(e){return rt(2,e,"CS2-item")}async function Kn(e){return rt(3,e,"CS3-item")}async function Wn(e){const u=(await Z({...e,difficulty:"count",contrastCount:1})).filter(t=>t.word.s===1&&t.usable.length>=1);return lt(u,e.count??10,"CP1-item")}async function qn(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 lt(t,e.count??10,"CP2-item")}async function zn(e){const{count:u=10}=e,t=(await Z({...e})).filter(n=>n.word.s===2);return ue(t,u).map((n,o)=>({id:J("M2S-item"),index:o+1,word:n.word.w,answer:n.word.w,parts:[...n.word.w]}))}async function Jn(e){const{count:u=10}=e,t=(await Z({...e})).filter(n=>n.word.s===3);return ue(t,u).map((n,o)=>({id:J("M3S-item"),index:o+1,word:n.word.w,answer:n.word.w,parts:[...n.word.w]}))}async function Qn(e){const{count:u=10}=e,t=(await Z({...e})).filter(a=>a.word.s===2),n=de(),o=new Set(oe.map(a=>a.w)),l=e.phonemeView??"char",r=[];for(const a of P(t)){if(r.length>=u)break;const s=Rn(a.word.w,e.composition??null,n,l,o);if(!s)continue;const[d,...m]=s.distractors,C=[...a.word.w],c=C[0]===d?C[1]:C[0];r.push({id:J("D2-item"),index:r.length+1,original:a.word.w,word:a.word.w,dropped:c,missingResult:d,distractors:m})}return r}async function Zn(e){const{count:u=10}=e,t=(await Z({...e})).filter(a=>a.word.s===3),n=de(),o=new Set(oe.map(a=>a.w)),l=e.phonemeView??"char",r=[];for(const a of P(t)){if(r.length>=u)break;const s=Mn(a.word.w,e.composition??null,n,l,o);if(!s)continue;const[d,...m]=s.distractors,C=[...a.word.w];let c="";for(let g=0;g<C.length;g++)if(C.filter((f,E)=>E!==g).join("")===d){c=C[g];break}r.push({id:J("D3-item"),index:r.length+1,original:a.word.w,word:a.word.w,dropped:c,missingResult:d,distractors:m})}return r}async function Xn(e){const{count:u=10}=e,t=(await Z({...e})).filter(a=>a.word.s>=2),n=de(),o=new Set(oe.map(a=>a.w)),l=e.phonemeView??"char",r=[];for(const a of P(t)){if(r.length>=u)break;const s=Ln(a.word.w,e.composition??null,n,l,o);if(!s)continue;const[d,...m]=s.distractors,C=a.word.w,c=C.startsWith(d)?C.slice(d.length):C.endsWith(d)?C.slice(0,C.length-d.length):"";r.push({id:J("DPC-item"),index:r.length+1,original:C,word:C,dropped:c,missingResult:d,distractors:m})}return r}async function eo(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=ue(t,3);return{id:J("LRO-item"),index:o+1,sequence:l,choices:P(l)}})}function ze(e,u,t){const n=oe.filter(a=>a.w&&a.s===e),o=u.excludeNoImage?je(n.map(a=>a.w)):null,l=nt(u),r=[];for(const a of n)if(!(o&&!o.has(a.w))&&!(l&&!l(a))){if(t){const s=x(a.w);if(!s||!t(s))continue}r.push(a)}return r}function uo(e){const u=ze(1,e,t=>t.jong===0);return ue(u,e.count??10).map((t,n)=>{const o=x(t.w);return{id:J("M2P-item"),index:n+1,parts:[z[o.cho],ne[o.jung]],answer:t.w,word:t.w}})}function to(e){const u=ze(1,e,t=>t.jong>0&&!be[t.jong]);return ue(u,e.count??10).map((t,n)=>{const o=x(t.w);return{id:J("M3P-item"),index:n+1,parts:[z[o.cho],ne[o.jung],ee[o.jong]],answer:t.w,word:t.w}})}function no(e){const u=Wu.DROP_FINAL_CONSONANT_FROM_1SYLL,t=ze(u.syllables,e,u.syllable),n=de(),o=[];for(const l of P(t)){if(o.length>=(e.count??10))break;const r=kn(l.w,null,n);if(!r)continue;const[a,...s]=r.distractors;o.push({id:J("DFC-item"),index:o.length+1,original:l.w,word:l.w,result:a,distractors:s})}return o}function oo(e){const u=Wu.REMOVE_CONSONANT_AND_IDENTIFY_PHONEME,t=ze(u.syllables,e,u.syllable),n=de(),o=[];for(const l of P(t)){if(o.length>=(e.count??10))break;const r=vn(l.w,null,n);if(!r)continue;const a=x(n.get(l.w)||l.w);if(!a)continue;const[s,...d]=r.distractors;o.push({id:J("RCP-item"),index:o.length+1,base:l.w,word:l.w,missingConsonant:z[a.cho],remaining:s,distractors:d})}return o}const Je=new Map;let at=null,st=null;async function it(e,u={}){const t=Ue(),n=De();(t!==at||n!==st)&&(Je.clear(),at=t,st=n);const o=`${e}:${ut(u)}`;if(Je.has(o))return Je.get(o);const l=await ro(e,u);return Je.set(o,l),l}const lo={SAME_SOUND_PICK:e=>ot("SSP",e),HEAR_AND_PICK_SAME:e=>ot("HPS",e),HEAR_AND_PICK_INCLUDED:e=>Hn(e),SAME_OR_DIFF:e=>Gn(e),STARTS_WITH_SAME_SOUND:e=>Yn(e),LISTEN_AND_REMEMBER_ORDER:e=>eo(e),MERGE_2_SYLLABLES:e=>zn(e),MERGE_3_SYLLABLES:e=>Jn(e),MERGE_2_PHONEMES:e=>uo(e),MERGE_3_PHONEMES:e=>to(e),DROP_1_FROM_2SYLL:e=>Qn(e),DROP_1_FROM_3SYLL:e=>Zn(e),DROP_PART_FROM_COMPOUND:e=>Xn(e),DROP_FINAL_CONSONANT_FROM_1SYLL:e=>no(e),REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:e=>oo(e),CHANGE_1_SYLL_IN_2SYLL:e=>Un(e),CHANGE_1_SYLL_IN_3SYLL:e=>Kn(e),CHANGE_1_PHONEME_IN_1SYLL:e=>Wn(e),CHANGE_1_PHONEME_IN_2SYLL:e=>qn(e)};async function ro(e,u={}){const t=lo[e];return t?await t(u):[]}async function ao(e){const u=[null,"count"],t=Object.keys(iu);let n=0;for(const o of u)for(const l of t){const r=iu[l];it(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 so(e){return(await Z({...e,fullCount:!0})).length}async function io(e={}){const u=[];for(const a of oe)a.w&&u.push(a.w);const t=e.excludeNoImage?je(u):u,n=new Set,o=new Set,l=new Set,r=new Set;for(const a of t){r.add(Ae(a));for(const s of a){const d=x(s);if(d&&(z[d.cho]!=="\u3147"&&n.add(z[d.cho]),o.add(ne[d.jung]),d.jong>0)){l.add(ee[d.jong]);const m=be[d.jong];m&&m.forEach(C=>l.add(C))}}}return{cho:n,jung:o,jong:l,syllable:r}}const he="\uC804\uCCB4";function ct(){const{t:e}=ce.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 Ct(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 dt(e){return{label:e.partOfSpeech,items:Object.keys(e.posMap),multiple:!0,allOption:!0}}function ft(e){return{label:e.wordType,items:Object.keys(e.typeMap),multiple:!0,allOption:!0}}function co(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 Co(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 fo(e,u){const{label:t,headValue:n,midValue:o,tailValue:l,includeMid:r=!0,headDisabled:a,midDisabled:s,tailDisabled:d,allOptionDisabled:m,groupLabel:C,labelAction:c}=u;return{label:t,...C?{groupLabel:C}:{},...c?{labelAction:c}:{},allOption:!0,allLabel:e("wordSearch.filter.positionAny",{defaultValue:"\uBB34\uAD00"}),...m?{allOptionDisabled:m}:{},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:s}]:[],{value:l,displayLabel:e("wordSearch.filter.positionTail",{defaultValue:"\uC5B4\uB9D0"}),disabled:d}]}}function go(e,u,t){if(u===he){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(_n).map(([e,{nucleus:u}])=>[e,u]));const ho={\uACE0\uC720\uC5B4:"\uACE0\uC720",\uD55C\uC790\uC5B4:"\uD55C\uC790",\uC678\uB798\uC5B4:"\uC678\uB798",\uD63C\uC885\uC5B4:"\uD63C\uC885"},mo={"\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"]},po={difficulty:"\uB09C\uC774\uB3C4 \uB4F1\uAE09",syllables:"\uC74C\uC808 \uC218",syllable5plus:"5\uC74C\uC808 \uC774\uC0C1",partOfSpeech:"\uD488\uC0AC",wordType:"\uC720\uD615",posMap:mo,typeMap:ho};function So(e,u,t=po){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(s=>s===t.syllable5plus?a>=5:a===parseInt(s)))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 yo={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"})},Eo={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"})},Bo={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 gt(e,u){if("place"in u)return yo[u.place](e);const t=Eo[u.vowel](e);return u.glide?`${t} \xB7 ${Bo[u.glide](e)}`:t}const wo=(e,{defaultValue:u})=>u,ht=(e,u)=>({jamos:e,phonetic:u,tooltip:gt(wo,u)}),se=(e,u)=>u.map(t=>ht([t],{place:e})),q=(e,u,t)=>ht([...e],t?{vowel:u,glide:t}:{vowel:u}),pu={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:[[q("\u3163","frontHigh"),q("\u315F","frontHigh","w"),q("\u3162","frontHigh","velar")],[q("\u3161","backHighUnrounded")],[q("\u315C","backHighRounded"),q("\u3160","backHighRounded","j")],[q("\u3154\u3150","frontMid"),q("\u3156\u3152","frontMid","j"),q("\u3159\u315A\u315E","frontMid","w")],[q("\u3153","backMidUnrounded"),q("\u3155","backMidUnrounded","j"),q("\u315D","backMidUnrounded","w")],[q("\u3157","backMidRounded"),q("\u315B","backMidRounded","j")],[q("\u314F","low"),q("\u3151","low","j"),q("\u3158","low","w")]],jong:[se("labial",["\u3142","\u3141"]),se("alveolar",["\u3137","\u3134","\u3139"]),se("velar",["\u3131","\u3147"])]},bo=[...z],Ao=[...ne],_o=ee.filter(e=>e!==""),ie=e=>e===le?[]:Array.from(e),le="__NO_CODA__",mt=[1,2,3,4],re=5,Do=12,pt="SYL_",Su=e=>`${pt}${e}`,Oo=e=>Number(e.slice(pt.length));function yu(e){return e>=re?Array.from({length:Do-re+1},(u,t)=>re+t):[e]}const St={cho:bo,jung:Ao,jong:_o},Eu=e=>e.map(u=>u.map(({jamos:t,phonetic:n,tooltip:o})=>({v:t.join(""),phonetic:n,tooltip:o}))),Bu={cho:Eu(pu.cho),jung:Eu(pu.jung),jong:Eu(pu.jong)},yt={};Bu.jung.flat().forEach(({v:e})=>{for(const u of ie(e))yt[u]=e});const No=new Set(Bu.cho.flat().map(e=>e.v));function Et(e,u){return e==="cho"?No.has(u)?u:null:e==="jung"?yt[u]??u:cu(u)}function Bt(e,u,t){if(e==="jung"){const n=ie(u);return t&&n.includes(t)?t:n[0]??u}return e==="jong"&&t&&cu(t)===u?t:u}function wt(e,u,t,n){const o=(l,r)=>r?l==="jong"&&r===le?le:u==="pron"?Et(l,r):Bt(l,r,l==="jung"?t:l==="jong"?n:null):null;return{...e,cho:o("cho",e.cho),jung:o("jung",e.jung),jong:o("jong",e.jong)}}const wu={cho:null,jung:null,jong:null,syllable:null},To="wt_filter",bt=e=>`wt_filter_${e}`;function At(e){try{const u=localStorage.getItem(bt(e))??localStorage.getItem(To);if(u)return JSON.parse(u)}catch{}return null}function _t(e){const u=e?.phonemeView;return u==="pron"?"pron":u==="direct"?"direct":"char"}function jo(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?{...wu,cho:u.choseong}:wu}function Io(e,u,t){const{t:n,i18n:o}=ce.useTranslation(),[l]=i.useState(()=>t?.resetOnMount?null:At(e)),[r,a]=i.useState(_t(l)),[s,d]=i.useState(()=>jo(l)),m=i.useCallback(()=>u.requireSyllable?{cho:"\u3131",jung:"\u314F",jong:le,syllable:u.fixedSyllable??null}:{cho:null,jung:null,jong:u.fixedNoCoda?le:null,syllable:u.fixedSyllable??null},[u.requireSyllable,u.fixedSyllable,u.fixedNoCoda]);i.useEffect(()=>{!u.requireSyllable&&u.fixedSyllable==null&&!u.fixedNoCoda||d(S=>S.cho||S.jung||S.syllable!=null||S.jong?S:m())},[]);const C=i.useMemo(()=>W(s.cho)||W(s.jung)||W(s.jong)?"count":"random",[s.cho,s.jung,s.jong]),c=i.useRef(r==="char"?s.jung:null),g=i.useRef(r==="char"?s.jong:null);i.useEffect(()=>{r==="char"&&(c.current=s.jung,g.current=s.jong)},[r,s.jung,s.jong]);const[f,E]=i.useState(t?.resetOnMount?!!t?.defaultImageOnly:l?.excludeNoImage??!0),[p,h]=i.useState(t?.resetOnMount?!1:l?.sameStructureOnly??!0),[y,w]=i.useState(Array.isArray(l?.gradeFilter)?l.gradeFilter:[]),[A,D]=i.useState(Array.isArray(l?.posFilter)?l.posFilter:[]),[b,I]=i.useState(Array.isArray(l?.wordTypeFilter)?l.wordTypeFilter:[]),k=i.useRef(t?.resetKey);i.useEffect(()=>{k.current!==t?.resetKey&&(k.current=t?.resetKey,d(m()),E(!!t?.defaultImageOnly),h(!1),w([]),D([]),I([]))},[t?.resetKey]);const M=ct(),[O,F]=i.useState({cho:new Set,jung:new Set,jong:new Set,syllable:new Set}),[$,Y]=i.useState(!1),[j,v]=i.useState(null),V=1,U=Math.max(1,[s.cho,s.jung,s.jong].filter(Boolean).length),[te,me]=i.useState(e);i.useEffect(()=>{if(te!==e){if(!t?.resetOnMount){const S=At(e);d(S?.composition??m()),E(S?.excludeNoImage??!0),h(S?.sameStructureOnly??!0),a(_t(S)),w(Array.isArray(S?.gradeFilter)?S.gradeFilter:[]),D(Array.isArray(S?.posFilter)?S.posFilter:[]),I(Array.isArray(S?.wordTypeFilter)?S.wordTypeFilter:[])}me(e)}},[e,te,t?.resetOnMount]),i.useEffect(()=>{if(!t?.resetOnMount&&te===e)try{localStorage.setItem(bt(e),JSON.stringify({contrastCount:U,composition:s,excludeNoImage:f,sameStructureOnly:p,phonemeView:r,gradeFilter:y,posFilter:A,wordTypeFilter:b}))}catch{}},[t?.resetOnMount,e,te,U,s,f,p,r,y,A,b]);const[B,_]=i.useState(0);Mu("wordpool:update",()=>_(S=>S+1));const G=i.useRef(o.language);i.useEffect(()=>{G.current!==o.language&&(G.current=o.language,_(S=>S+1))},[o.language]),i.useEffect(()=>{if(!u.choseong)return;let S=!1;return io({difficulty:C,excludeNoImage:f}).then(T=>{S||(F(T),T.cho.size+T.jung.size+T.jong.size>0&&Y(!0))}).catch(()=>{S||F({cho:new Set,jung:new Set,jong:new Set,syllable:new Set})}),()=>{S=!0}},[u.choseong,C,f,B]),i.useEffect(()=>{let S=!1;const T=s,N=T.cho?ie(T.cho):null,L=T.jung?ie(T.jung):null,K=T.jong===le,pe=K?null:T.jong?ie(T.jong):null,Se=T.syllable!=null?yu(T.syllable):null,$e=!!(N||L||pe||K||Se);return so({difficulty:u.difficulty?C:null,contrastCount:u.difficulty?U:1,composition:u.choseong&&$e?{cho:N,jung:L,jong:pe,jongNone:K,syllable:Se}:null,excludeNoImage:f,sameStructureOnly:p,phonemeView:r==="pron"?"pron":"char",grade:y.length>0?y:null}).then(He=>{S||v(He)}).catch(()=>{S||v(null)}),()=>{S=!0}},[u.choseong,u.difficulty,C,U,s,r,f,p,B,y]),i.useEffect(()=>{$&&d(S=>{const T={...S};let N=!1;return["cho","jung","jong"].forEach(L=>{const K=S[L];!K||K===le||ie(K).some(pe=>O[L].has(pe))||(T[L]=null,N=!0)}),S.syllable!=null&&u.fixedSyllable==null&&(S.syllable>=re?[...O.syllable].some(L=>L>=re)||(T.syllable=null,N=!0):(!O.syllable.has(S.syllable)||S.syllable<V)&&(T.syllable=null,N=!0)),N?T:S})},[O,$,V,u.fixedSyllable]);const H=i.useMemo(()=>{const S=T=>{const N=new Set;for(const L of St[T])O[T].has(L)&&N.add(L);return N};return{cho:S("cho"),jung:S("jung"),jong:S("jong")}},[O]),X=i.useMemo(()=>({exact:new Set(mt.filter(S=>O.syllable.has(S))),min:[...O.syllable].some(S=>S>=re)}),[O]),R=i.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]),Ou=i.useMemo(()=>({[R.trainOnset]:"cho",[R.trainVowel]:"jung",[R.trainCoda]:"jong"}),[R]),Ve=i.useCallback((S,T)=>({title:T,items:S}),[]),ou=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]),Rt=i.useMemo(()=>{const S=[];if(u.choseong){const T={value:le,displayLabel:R.codaExclude},N=u.fixedNoCoda===!0,L=(K,pe)=>{const Se=N&&K==="jong",$e={label:pe,groupLabel:R.phonemeGroup,allOption:!u.requireSyllable,allLabel:R.noLimit,allOptionDisabled:Se};if(r==="pron"){const ye=Bu[K].map(Ft=>Ft.map(({v:lu,phonetic:Vt})=>{const ru=ie(lu),Nu=gt(n,Vt),Tu=Se||!ru.some($t=>O[K].has($t));return ru.length>1?{value:lu,labels:ru,tooltip:Nu,disabled:Tu}:{value:lu,tooltip:Nu,disabled:Tu}}));return K==="jong"&&!u.requireCoda&&ye.unshift([T]),{...$e,groups:ye}}const He=St[K].map(ye=>!Se&&H[K].has(ye)?ye:{value:ye,disabled:!0});return{...$e,items:K==="jong"&&!u.requireCoda?[T,...He]:He}};S.push(L("cho",R.trainOnset)),S.push(L("jung",R.trainVowel)),S.push(L("jong",R.trainCoda))}if(S.push({...Ct(n,M,{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&&S.push(dt(M)),u.wordType&&S.push(ft(M)),u.choseong||u.fixedSyllable!=null){const T=u.fixedSyllable;S.push({label:R.syllableCount,items:[...mt.map(N=>({value:Su(N),displayLabel:n("wordPairs.syllableN",{n:N,defaultValue:"{{n}}\uC74C\uC808"}),disabled:T!=null?N!==T:!X.exact.has(N)||N<V})),{value:Su(re),displayLabel:n("wordPairs.syllableNPlus",{n:re,defaultValue:"{{n}}\uC74C\uC808 \uC774\uC0C1"}),disabled:T!=null?re!==T:!X.min}],allOption:!0,allOptionDisabled:T!=null})}return u.choseong?S.push({label:R.exclude,displayLabel:R.selectLabel,multiple:!0,items:[R.excludeImage,R.sameStructure],labelInfo:Ve(ou)}):S.push({label:R.exclude,displayLabel:R.selectLabel,multiple:!0,items:[R.excludeImage],labelInfo:Ve([ou[0]])}),S},[u.choseong,u.partOfSpeech,u.wordType,u.requireSyllable,u.fixedSyllable,u.fixedNoCoda,u.requireCoda,V,H,O,r,X,R,n,Ve,ou,M]),Mt={...(u.choseong||u.fixedSyllable!=null)&&s.syllable!=null?{[R.syllableCount]:Su(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]:[...f?[R.excludeImage]:[],...p?[R.sameStructure]:[]],[R.gradeLabel]:y.map(S=>n("wordSearch.filter.grade",{n:Number(S),defaultValue:"{{n}}\uB4F1\uAE09"})),...u.partOfSpeech?{[M.partOfSpeech]:A}:{},...u.wordType?{[M.wordType]:b}:{}},Lt=i.useCallback((S,T)=>{if(T===R.exclude)S===R.excludeImage?E(N=>!N):S===R.sameStructure&&h(N=>!N);else if(T===R.syllableCount)d(N=>{if(!S||S===he)return{...N,syllable:null};const L=Oo(S);return{...N,syllable:N.syllable===L?null:L}});else if(T===R.gradeLabel){if(!S||S===he){w([]);return}const N=S.replace(/\D/g,"");w(L=>L.includes(N)?L.filter(K=>K!==N):[...L,N])}else if(T===M.partOfSpeech){if(!S||S===he){D([]);return}D(N=>N.includes(S)?N.filter(L=>L!==S):[...N,S])}else if(T===M.wordType){if(!S||S===he){I([]);return}I(N=>N.includes(S)?N.filter(L=>L!==S):[...N,S])}else{const N=Ou[T];if(!N)return;d(L=>u.requireSyllable?S&&S!==he?{...L,[N]:S}:L:!S||S===he||L[N]===S?{...L,[N]:null}:{...L,[N]:S})}},[R,Ou,M,u.requireSyllable]),kt=i.useCallback(S=>!u.partOfSpeech&&!u.wordType?!0:So(S,{...u.partOfSpeech?{[M.partOfSpeech]:A}:{},...u.wordType?{[M.wordType]:b}:{}},M),[u.partOfSpeech,u.wordType,A,b,M]),vt=i.useCallback(S=>{S!==r&&(S!=="direct"&&r!=="direct"&&d(T=>wt(T,S,c.current,g.current)),a(S))},[r]),Pt=i.useCallback(()=>({composition:s,contrastCount:U,excludeNoImage:f,sameStructureOnly:p,phonemeView:r,gradeFilter:y,posFilter:A,wordTypeFilter:b}),[s,U,f,p,r,y,A,b]),xt=i.useCallback(S=>{d(S.composition),E(S.excludeNoImage),h(S.sameStructureOnly??!0),a(S.phonemeView),w(Array.isArray(S.gradeFilter)?S.gradeFilter:[]),Array.isArray(S.posFilter)&&D(S.posFilter),Array.isArray(S.wordTypeFilter)&&I(S.wordTypeFilter)},[]);return{difficulty:C,contrastCount:U,composition:s,choseong:s.cho,excludeNoImage:f,sameStructureOnly:p,gradeFilter:y,posFilter:A,wordTypeFilter:b,matchesWordAttributes:kt,poolVersion:B,filterSections:Rt,filterSelected:Mt,handleFilterSelect:Lt,phonemeView:r,setPhonemeView:vt,phonemeGroupLabel:R.phonemeGroup,wordCount:j,getFilterSnapshot:Pt,restoreFilterSnapshot:xt}}function Ro(e){const u=a=>a?ie(a):null,t=u(e.cho),n=u(e.jung),o=e.jong===le,l=o?null:u(e.jong),r=e.syllable!=null?yu(e.syllable):null;return!t&&!n&&!l&&!o&&!r?null:{cho:t,jung:n,jong:l,jongNone:o,syllable:r}}function Mo(e,u,t,n,o,l,r=!0,a="char",s=[]){const[d,m]=i.useState({}),[C,c]=i.useState(!1),{cho:g=null,jung:f=null,jong:E=null,syllable:p=null}=n??{},h=s.length>0?s.slice().sort().join(","):"";return i.useEffect(()=>{l>0&&ao(o).catch(()=>{})},[l,o]),i.useEffect(()=>{let y=!1;return c(!0),(async()=>{const w=Ro({cho:g,jung:f,jong:E,syllable:p}),A=`${g??""}_${f??""}_${E??""}_${p??""}_${h}`,D={};await Promise.all(e.map(async b=>{const I=iu[b.key];try{const k=await it(b.key,{difficulty:I.difficulty?u:null,contrastCount:I.difficulty?t:1,composition:I.choseong?w:null,count:5,excludeNoImage:o,sameStructureOnly:r,phonemeView:a,grade:s.length>0?s:null});k&&k.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:k,itemCount:k.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}})),y||(m(D),c(!1))})(),()=>{y=!0}},[u,t,g,f,E,p,o,r,a,l,h]),{perTypeData:d,generating:C}}function Lo(){return Qe(new Date)}function Qe(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 Re=[],Me=[],Le=[],ke=[],Ze={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},Xe={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},ko={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};let bu=null,Dt=null,fe=null;function vo({counts:e,forceRefresh:u}={}){const t=Object.assign({},ko,e||{}),n=Lo(),o=Qe(new Date(`${n}T00:00:00+09:00`).getTime()-864e5),l=JSON.stringify(t);if(!u&&Dt===n&&bu===l&&fe)return Object.assign(Ze,fe.today),Object.assign(Xe,fe.yesterday?.selection||{LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),{today:Ze,yesterday:Xe};const r={LISTEN_IN_NOISE:ae(Re,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:ae(Me,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:ae(Le,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:ae(ke,Math.max(0,Number(t.ORDERING_SENTENCE)||0))};let a=null;return fe&&bu===l&&fe.yesterday&&fe.yesterday.date===o&&(a=fe.yesterday.selection),a||(a={LISTEN_IN_NOISE:ae(Re,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:ae(Me,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:ae(Le,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:ae(ke,Math.max(0,Number(t.ORDERING_SENTENCE)||0))}),Object.assign(Ze,r),Object.assign(Xe,a),Dt=n,bu=l,fe={today:r,yesterday:{date:o,countsKey:l,selection:a}},{today:Ze,yesterday:Xe}}let Ot=!1,ve=null;async function Po(){try{const e={url:typeof document>"u"?require("url").pathToFileURL(__filename).href:au&&au.tagName.toUpperCase()==="SCRIPT"&&au.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 xo(){if(!Ot)return ve||(ve=(async()=>{const e=await Po();if(!e){ve=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||""),s=Object.assign({},o,{training_type:l,category_0:r,category_1:a});l==="LISTEN_IN_NOISE"?Re.push(s):l==="SHORT_STORY"?Me.push(s):l==="LONG_STORY"?Le.push(s):l==="ORDERING_SENTENCE"&&ke.push(s)}}}catch{ve=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}try{window.dispatchEvent(new Event("speechear.data.updated"))}catch{}try{vo()}catch{}Ot=!0})(),ve)}async function Fo(e=3e3){const u=xo();return Promise.race([u,new Promise(t=>setTimeout(t,e))])}function Vo(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 $o(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 eu=ae;function Au(e,u){const t=u?$o(Vo(u)):Math.random;return{LISTEN_IN_NOISE:eu(Re,Math.max(0,e.LISTEN_IN_NOISE||0),t),SHORT_STORY:eu(Me,Math.max(0,e.SHORT_STORY||0),t),LONG_STORY:eu(Le,Math.max(0,e.LONG_STORY||0),t),ORDERING_SENTENCE:eu(ke,Math.max(0,e.ORDERING_SENTENCE||0),t)}}function Nt(e){return e?!!(e.LISTEN_IN_NOISE?.length||e.SHORT_STORY?.length||e.LONG_STORY?.length||e.ORDERING_SENTENCE?.length):!1}const Ho={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};function Tt(e=!1,u=Ho,t){const n=Qe(Date.now()),o=Qe(Date.now()-864e5),l=`${t??""}|${n}`,r=`${t??""}|${o}`;return Re.length>0||Me.length>0||Le.length>0||ke.length>0?{today:Au(u,l),yesterday:Au(u,r)}:{today:Au(u,l),yesterday:null}}function Go(e){const u=i.useRef({LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),t=i.useRef(null),[n,o]=i.useState(!1),[l,r]=i.useState(!1),[a,s]=i.useState(0),[d,m]=i.useState(!1);i.useEffect(()=>{let c=!1,g,f=0;const E=40,p=()=>{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 y=A=>{u.current=A.today,t.current=A.yesterday,o(!0),m(!0),s(D=>D+1),c=!0,p()},w=async()=>{if(c)return;if(!h){const D=Tt(!1,void 0,e);if(Nt(D.today)){y(D);return}}try{await Fo(3e3)}catch{}if(c)return;const A=Tt(h,void 0,e);if(Nt(A.today)){y(A);return}++f>=E&&(o(!0),m(!1),c=!0,p())};return w(),g=setInterval(w,250),()=>{c=!0,p()}},[e]);const C=i.useCallback(c=>{const g=l?t.current:u.current,f=l?u.current:t.current;return g?.[c]?.length?g[c]:f?.[c]?.length?f[c]:void 0},[l,a]);return{loaded:n,hasData:d,showYesterday:l,setShowYesterday:r,getTrainingPerType:C}}const we=[];let uu=!1;function jt(e){if(e.key!=="Escape"||e.defaultPrevented)return;const u=we[we.length-1];u&&(e.stopPropagation(),u())}function It(e){return we.push(e),!uu&&typeof document<"u"&&(document.addEventListener("keydown",jt),uu=!0),()=>{const u=we.lastIndexOf(e);u>=0&&we.splice(u,1),we.length===0&&uu&&typeof document<"u"&&(document.removeEventListener("keydown",jt),uu=!1)}}function Yo(e,u=!0){const t=Ru(e);i.useEffect(()=>{if(u)return It(()=>{t.current?.()})},[u,t])}const _u=(e,u)=>`${e}:${u??1}`,Du=new Map;function Uo(e,u){const[t,n]=i.useState(0),o=e.map(l=>_u(l.word,l.homonum)).join("|");return i.useEffect(()=>{const l=(o?o.split("|"):[]).filter(s=>!Du.has(s));if(l.length===0)return;let r=!1;const a=Array.from(new Set(l.map(s=>s.slice(0,s.lastIndexOf(":")))));return u(a).then(s=>{if(!(r||s.length===0)){for(const d of s)d.Meaning&&Du.set(_u(d.Word,d.Homonum??void 0),d.Meaning);n(d=>d+1)}}).catch(()=>{}),()=>{r=!0}},[o,u]),i.useMemo(()=>{const l=o?o.split("|"):[],r=new Map;for(const a of l){const s=Du.get(a);s!=null&&r.set(a,s)}return r},[o,t])}function Ko(){const[e,u]=i.useState(null),t=i.useCallback(l=>u(l.getBoundingClientRect()),[]),n=i.useCallback(()=>u(null),[]),o=i.useCallback(l=>{const r=l.getBoundingClientRect();u(a=>a?null:r)},[]);return{anchorRect:e,isOpen:e!=null,openAt:t,close:n,toggleAt:o}}function Wo(e){const[u,t]=i.useState(null),[n,o]=i.useState(null),l=i.useRef(null);i.useEffect(()=>()=>{l.current&&clearTimeout(l.current)},[]);const r=i.useCallback((s,d)=>{l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{t(s),o(d)},e)},[e]),a=i.useCallback(()=>{l.current&&clearTimeout(l.current),t(null),o(null)},[]);return{payload:u,anchorRect:n,openAfterDelay:r,close:a}}function qo(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 zo(e="warning"){const[u,t]=i.useState(""),[n,o]=i.useState(e),[l,r]=i.useState(0),a=i.useCallback((C,c)=>{o(c),t(C),r(g=>g+1)},[]),s=i.useCallback(C=>a(C,"warning"),[a]),d=i.useCallback(C=>a(C,"normal"),[a]),m=i.useCallback(()=>t(""),[]);return{toastMessage:u,toastType:n,toastKey:l,showToast:a,showWarning:s,showNormal:d,clearToast:m}}const Jo=[{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."}],Qo={LISTEN_IN_NOISE:"listenInNoise",SHORT_STORY:"shortStory",LONG_STORY:"longStory",ORDERING_SENTENCE:"orderingSentence"};function Zo(e){return Jo.map(u=>{const t=Qo[u.key];return t?{...u,label:e(`trainingType.${t}.title`),desc:e(`trainingType.${t}.desc`)}:u})}const Pe={blue:"#60A5FA",green:"#4ADE80",amber:"#FBBF24",purple:"#A78BFA",pink:"#F472B6"},xe=Pe.blue,tu=Pe.green,Fe=Pe.amber,nu=Pe.purple,Xo=Pe.pink,el=[{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:xe,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:xe,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:xe,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:xe,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:xe,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:tu,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:tu,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:tu,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:tu,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:Fe,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:Fe,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:Fe,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:Fe,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:Fe,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:nu,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:nu,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:nu,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:nu,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:Xo,subTitle:"\uC138 \uB2E8\uC5B4\uB97C \uB4E4\uC740 \uC21C\uC11C\uB300\uB85C \uCE74\uB4DC\uB97C \uC120\uD0DD\uD558\uC138\uC694."}]}];function ul(){const{t:e}=ce.useTranslation();return i.useMemo(()=>{const u=Object.fromEntries(Zo(e).map(n=>[n.key,n.label])),t={...u};return el.flatMap(n=>n.types).forEach(n=>{t[n.key]=e(`trainingType.${n.key}.label`,{defaultValue:n.label})}),{sentence:u,all:t}},[e])}const tl="0.134.0";function nl({computeStyle:e,onScroll:u="close",onResize:t="close",ignoreOutsideClickSelector:n}){const[o,l]=i.useState(!1),[r,a]=i.useState({}),s=i.useRef(null),d=i.useRef(null),m=i.useCallback(()=>{s.current&&a(e(s.current.getBoundingClientRect()))},[e]);i.useEffect(()=>{if(!o)return;m();const g=p=>{const h=p.target;n&&h.closest?.(n)||s.current?.contains(h)||d.current?.contains(h)||l(!1)};document.addEventListener("mousedown",g);const f=p=>{d.current?.contains(p.target)||(u==="reposition"?m():u==="close"&&l(!1))};u!=="ignore"&&window.addEventListener("scroll",f,!0);const E=()=>{t==="reposition"?m():t==="close"&&l(!1)};return t!=="ignore"&&window.addEventListener("resize",E),()=>{document.removeEventListener("mousedown",g),u!=="ignore"&&window.removeEventListener("scroll",f,!0),t!=="ignore"&&window.removeEventListener("resize",E)}},[o,m,u,t,n]),i.useEffect(()=>{if(o)return It(()=>l(!1))},[o]);const C=i.useCallback(()=>l(g=>!g),[]),c=i.useCallback(()=>l(!1),[]);return{open:o,setOpen:l,toggle:C,close:c,style:r,triggerRef:s,menuRef:d}}function ol(e,{mode:u="playback",autoStart:t=!1,onPlaySpeaker:n,onComplete:o,playMs:l=1100,feedbackMs:r=1500}={}){const[a,s]=i.useState([]),[d,m]=i.useState(0),[C,c]=i.useState("idle"),[g,f]=i.useState(null),[E,p]=i.useState([]),[h,y]=i.useState(null),[w,A]=i.useState(0),D=i.useRef(0),b=i.useCallback(B=>{D.current=typeof B=="function"?B(D.current):B,A(D.current)},[]),I=i.useRef(n),k=i.useRef(o);i.useEffect(()=>{I.current=n,k.current=o},[n,o]);const M=i.useRef([]),O=()=>{M.current.forEach(clearTimeout),M.current=[]},F=(B,_)=>{M.current.push(setTimeout(_,B))};i.useEffect(()=>()=>O(),[]);const $=a[d]?.id??null,Y=i.useCallback(()=>{O(),c("playing"),p([]),y(null),b(0);let B=0;e.forEach((_,G)=>{F(B,()=>{m(G),f(_.id),I.current?.(_)}),F(B+1e3,()=>{f(null),p(H=>[...H,_.id])}),B+=1300}),F(B,()=>{c("done"),k.current?.({score:0,total:e.length})})},[e,b]),j=i.useCallback((B,_)=>{if(_>=B.length){c("done"),k.current?.({score:D.current,total:B.length});return}m(_),y(null),c("playing"),f(B[_].id),I.current?.(B[_]),F(l,()=>{f(null),c("waiting")})},[l]),v=i.useCallback(()=>{O();const B=P(e);s(B),b(0),p([]),j(B,0)},[e,j,b]),V=i.useCallback(()=>{u==="playback"?(s(e),Y()):v()},[u,e,Y,v]),U=i.useCallback(()=>{O(),c("idle"),f(null),p([]),y(null),m(0),b(0),s([])},[b]);i.useEffect(()=>{t?V():U()},[u,e.length,t]);const te=i.useCallback(B=>{C!=="waiting"||u==="playback"||(y(B),B===a[d]?.id&&b(_=>_+1),u==="exam"?(c("playing"),F(400,()=>j(a,d+1))):(c("feedback"),F(r,()=>j(a,d+1))))},[C,u,a,d,j,r,b]),me=u==="playback"?e.length:a.length;return{bind:{activeSpeakerId:g,playedIds:E,selectedId:h,answerId:$,showFeedback:C==="feedback",clickable:C==="waiting",onSelectSpeaker:te},index:d,total:me,score:w,phase:C,done:C==="done",start:V,reset:U}}exports.CACHE_GROUPS=Hu,exports.CORE_VERSION=tl,exports.DocumentTitleSuppressContext=ku,exports.EMPTY_COMPOSITION=wu,exports.MediaQueryOverrideContext=Iu,exports.NO_CODA=le,exports.SYLLABLE_MIN=re,exports.VAP_PAGE_SIZE_OPTIONS=Ye,exports.buildGradeSection=Ct,exports.buildPartOfSpeechSection=dt,exports.buildPositionSection=fo,exports.buildSelectSection=Co,exports.buildSyllableSection=co,exports.buildWordTypeSection=ft,exports.charToPronValue=Et,exports.convertComposition=wt,exports.fmtBytes=Cn,exports.lsBytes=Gu,exports.meaningKey=_u,exports.pronToCharValue=Bt,exports.syllableToFilter=yu,exports.today=Oe,exports.toggleAttributeFilter=go,exports.useAnchoredMenu=nl,exports.useCacheManagement=dn,exports.useDailyTrainingSelection=Go,exports.useDelayedHoverAnchor=Wo,exports.useDeviceManagement=Bn,exports.useDocumentTitle=Ut,exports.useEscToClose=Yo,exports.useFontScale=Ht,exports.useHoverAnchor=Ko,exports.useMediaQuery=Yt,exports.usePagedList=qo,exports.usePasswordChange=zt,exports.useRelativeDay=Kt,exports.useSoundCompassExam=ol,exports.useTablePaging=yn,exports.useTableSort=En,exports.useToastState=zo,exports.useTrainingTypeLabels=ul,exports.useVisitAllPanel=Sn,exports.useVisitHistory=hn,exports.useVisitSchedule=pn,exports.useWindowEvent=Mu,exports.useWordAttributeFilterKeys=ct,exports.useWordDataStats=fn,exports.useWordMeanings=Uo,exports.useWordTrainingDataGeneration=Mo,exports.useWordTrainingFilter=Io,exports.valueToJamos=ie;
1
+ "use strict";var i=require("react"),ce=require("react-i18next"),Ru=require("i18next"),iu=typeof document<"u"?document.currentScript:null;function Ut({storageKey:e="fontScale",baseFont:u=20,minScale:t=.8,maxScale:n=1.4,step:o=.1,lineHeightRatio:l=1.4}={}){const r=p=>Math.max(t,Math.min(n,Number(p))),[a,s]=i.useState(()=>{try{const p=localStorage.getItem(e),g=p?Number(p):1;return Number.isFinite(g)?r(g):r(1)}catch{return 1}});i.useEffect(()=>{try{localStorage.setItem(e,String(a))}catch{}},[e,a]);const c=p=>{s(typeof p=="function"?g=>r(p(g)):r(p))},h=()=>c(p=>+(p+o).toFixed(6)),C=()=>c(p=>+(p-o).toFixed(6)),d=a<n-Number.EPSILON,m=a>t+Number.EPSILON,f=Math.round(u*a),E=Math.round(f*l);return{scale:a,setScale:c,increase:h,decrease:C,canIncrease:d,canDecrease:m,fontSize:f,lineHeight:E}}const Mu=i.createContext(null);function Kt(e){return/max-width:\s*7[0-9][0-9]px/.test(e)}function Wt(e){const u=i.useContext(Mu),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),r=s=>o(s.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"&&Kt(e)?u.mobile:n}function Lu(e){const u=i.useRef(e);return i.useEffect(()=>{u.current=e}),u}function ku(e,u){const t=Lu(u);i.useEffect(()=>{const n=()=>t.current();try{window.addEventListener(e,n)}catch{}return()=>{try{window.removeEventListener(e,n)}catch{}}},[e,t])}const cu=" \xB7 ",Pu=(()=>{if(typeof document>"u")return"";const e=document.title;return e.includes(cu)?e.split(cu).pop()??e:e})(),vu=i.createContext(!1),ge=[];let xu=null;function qt(e){const u=i.useContext(vu);i.useEffect(()=>{if(u||typeof e!="string"||!e)return;ge.length===0&&(xu=document.title);const t={text:Pu?`${e}${cu}${Pu}`:e};return ge.push(t),document.title=t.text,()=>{const n=ge.lastIndexOf(t);n>=0&&ge.splice(n,1),document.title=ge.length?ge[ge.length-1].text:xu??document.title}},[e,u])}function zt(){const{t:e}=ce.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])}const Jt=()=>{const e="\uC54C \uC218 \uC5C6\uB294 \uC624\uB958",u=typeof Ru?.t=="function"?Ru.t("common.unknownError",{defaultValue:e}):void 0;return typeof u=="string"&&u?u:e};function Qt(e,u){if(u===void 0&&(u=Jt()),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 Zt(e){const{t:u}=ce.useTranslation(),[t,n]=i.useState({current:"",next:"",confirm:""}),[o,l]=i.useState(null),[r,a]=i.useState(!1),s=i.useRef(null);i.useEffect(()=>()=>{s.current!==null&&clearTimeout(s.current)},[]);const c=i.useCallback(()=>{n({current:"",next:"",confirm:""}),l(null)},[]),h=i.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(d){C=Qt(d)}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:""}),s.current!==null&&clearTimeout(s.current),s.current=setTimeout(()=>l(null),1500)},[t,e,u]);return{pw:t,setPw:n,pwMsg:o,setPwMsg:l,pwLoading:r,handleChangePw:h,reset:c}}const z=["\u3131","\u3132","\u3134","\u3137","\u3138","\u3139","\u3141","\u3142","\u3143","\u3145","\u3146","\u3147","\u3148","\u3149","\u314A","\u314B","\u314C","\u314D","\u314E"],ne=["\u314F","\u3150","\u3151","\u3152","\u3153","\u3154","\u3155","\u3156","\u3157","\u3158","\u3159","\u315A","\u315B","\u315C","\u315D","\u315E","\u315F","\u3160","\u3161","\u3162","\u3163"],ee=["","\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 x(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 Xt(){const e=new Map;return u=>{let t=e.get(u);return t||(t=[...u].map(n=>x(n)),e.set(u,t)),t}}function Ce(e,u,t=0){return String.fromCharCode(44032+(e*21+u)*28+t)}function en(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=x(e[o]),r=x(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,s=l.jung!==r.jung,c=l.jong!==r.jong;(a?1:0)+(s?1:0)+(c?1:0)>1?n="multi":a?n="cho":s?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(""),ee[Number(e)]]));function un(e,u){if(!e||!u)return!1;for(const t of e){const n=x(t);if(n){if(z[n.cho]===u)return!0;if(n.jong>0){if(ee[n.jong]===u)return!0;const o=be[n.jong];if(o&&o.includes(u))return!0}}}return!1}function Ae(e){if(!e)return 0;let u=0;for(const t of e)x(t)&&u++;return u}function tn(e){if(!e)return!1;let u=!1;for(const t of e){const n=x(t);if(n&&(u=!0,n.jong>0))return!1}return u}function nn(e,u){if(e.jong<=0)return!1;if(u.includes(ee[e.jong]))return!0;const t=be[e.jong];return!!t&&t.some(n=>u.includes(n))}function on(e,u,t){if(!e)return!1;const n=[...e],o=l=>{const r=x(n[l]);if(!r||u.cho&&!u.cho.includes(z[r.cho])||u.jung&&!u.jung.includes(ne[r.jung]))return!1;if(u.jongNone){if(r.jong>0)return!1}else if(u.jong&&!nn(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 ln={cho:z.length,jung:ne.length,jong:ee.length};function rn(e,u,t,n,o=1/0){if(!e||t<1)return[];const l=[...e].map(C=>x(C));if(l.some(C=>!C))return[];const r=l,a=r.length;if(t>a)return[];const s=ln[u],c=new Set,h=[];(function C(d,m){if(m.length===t){h.push([...m]);return}for(let f=d;f<a;f++)m.push(f),C(f+1,m),m.pop()})(0,[]);for(const C of h)if((function d(m,f){if(c.size>=o)return;if(m===C.length){const g=f.map(S=>Ce(S.cho,S.jung,S.jong)).join("");g!==e&&n.has(g)&&c.add(g);return}const E=C[m],p=r[E][u];for(let g=0;g<s;g++){if(g===p)continue;const S=f.slice();if(S[E]={...f[E],[u]:g},d(m+1,S),c.size>=o)return}})(0,r),c.size>=o)break;return[...c]}function an(e,u){if(!e||!u||e.length!==u.length)return-1;let t=0;for(let n=0;n<e.length;n++){const o=x(e[n]),l=x(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 Fu="word_pair_index_v2",Vu="word_pair_index_sig_v2";let _e=null;function sn(){try{if(typeof localStorage>"u")return null;const e=localStorage.getItem(Fu),u=localStorage.getItem(Vu);return!e||!u?null:{index:JSON.parse(e),sig:u}}catch{return null}}function De(){if(_e)return _e;const e=sn();return e?(_e=e.index,e.sig,_e):null}function cn(){_e=null;try{typeof localStorage<"u"&&(localStorage.removeItem(Fu),localStorage.removeItem(Vu))}catch{}}const $u="word_image_existence_map_v1";let Ee=null;function Hu(){if(Ee)return Ee;try{const e=typeof localStorage<"u"?localStorage.getItem($u):null;Ee=e?JSON.parse(e):{}}catch{Ee={}}return Ee}function Cn(e,u){return`${e}_${u??1}`}function dn(e,u){const t=Hu(),n=Cn(e,u);return n in t?t[n]:void 0}function Gu(){const e=Hu(),u=Object.values(e);return u.length===0?null:{total:u.length,exists:u.filter(Boolean).length}}function fn(){Ee={};try{typeof localStorage<"u"&&localStorage.removeItem($u)}catch{}}const Yu=[{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 Uu(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 gn(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 hn(e){const{t:u}=ce.useTranslation(),[t,n]=i.useState({}),[o,l]=i.useState(null),[r,a]=i.useState(null),[s,c]=i.useState(null),h=i.useCallback(()=>{const d={};Yu.forEach(m=>{d[m.id]=Uu([...m.keys])}),n(d),typeof navigator<"u"&&navigator.storage?.estimate&&navigator.storage.estimate().then(m=>{c({usage:m.usage??0,quota:m.quota??0})}).catch(()=>{})},[]);i.useEffect(()=>{h()},[h]);const C=i.useCallback(async d=>{l(d);try{d==="wordData"?(localStorage.removeItem("word_data_cache"),localStorage.removeItem("word_data_version")):d==="pairIndex"?cn():d==="imageCache"&&fn(),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:s,refreshCacheSizes:h,handleClearCache:C}}function mn(e){const[u,t]=i.useState(null),[n,o]=i.useState(null),l=i.useCallback(()=>{const r=De();if(r){const s=Object.values(r),c=s.filter(h=>h.cho.length+h.jung.length+h.jong.length>0).length;t({matched:c,total:s.length})}else t(null);const a=Gu();o(a?{exists:a.exists,total:a.total}:null)},[]);return i.useEffect(()=>{l();const r=setTimeout(l,1e3);return()=>clearTimeout(r)},[e?.length,l]),{pairStats:u,imgStats:n,setPairStats:t,setImgStats:o,refreshStats:l}}function Oe(e,u){if(e===u)return!0;const t=e?.id,n=u?.id;return t!=null&&t!==""&&t===n}function Ku(e,u=[]){const[t,n]=i.useState(u),[o,l]=i.useState(null),[r,a]=i.useState(!1),[s,c]=i.useState(e),h=i.useRef(r);i.useEffect(()=>{h.current=r});const C=i.useRef(null);i.useEffect(()=>{if(h.current)return;const g=C.current;g!==null&&g.length===u.length&&g.every((S,w)=>S===u[w])||(C.current=u,n(u),l(S=>S==null?S:u.find(w=>Oe(w,S))??S))},[u]),i.useEffect(()=>{!r&&o!=null&&c({...o})},[r,o]);const d=i.useCallback(g=>{l(g),a(!1),c({...g})},[]),m=i.useCallback(()=>a(!0),[]),f=i.useCallback(()=>a(!1),[]),E=i.useCallback((g,S)=>{n(g),l(S),a(!1)},[]),p=i.useCallback(g=>{n(S=>S.filter(w=>!Oe(w,g))),l(null)},[]);return{list:t,setList:n,selected:o,setSelected:l,isEditing:r,setIsEditing:a,editForm:s,setEditForm:c,openDetail:d,startEditing:m,cancelEditing:f,commitEdit:E,remove:p}}const Ne=()=>{const e=new Date;return{year:String(e.getFullYear()),month:String(e.getMonth()+1).padStart(2,"0"),day:String(e.getDate()).padStart(2,"0")}},pn={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:s,openDetail:c,commitEdit:h}=Ku(pn,e),{year:C,month:d,day:m}=Ne(),[f,E]=i.useState({year:C,month:d,day:m,hour:"09",minute:"00",memo:""});return{visitHistory:u,visitForm:f,setVisitForm:E,setVisit:p=>g=>E(S=>({...S,[p]:g})),selectedVisit:n,setSelectedVisit:o,isEditingVisit:l,setIsEditingVisit:r,editVisitForm:a,setEditVisitForm:s,openVisitDetail:c,handleVisitSave:p=>{t(A=>[f,...A]);const{year:g,month:S,day:w}=Ne();E({year:g,month:S,day:w,hour:"09",minute:"00",memo:""}),p?.()},handleVisitEditSave:()=>{h(p=>p.map(g=>n!=null&&Oe(g,n)?a:g),a)},addVisit:p=>{t(g=>[p,...g])},removeVisit:p=>{t(g=>g.filter(S=>S!==p))},revertVisitEdit:(p,g)=>{t(S=>S.map(w=>w===g?p:w)),o(S=>S===g?p:S)}}}const Wu=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")}`,Ye=e=>[...e].sort((u,t)=>{const n=Wu(u),o=Wu(t);return n<o?-1:n>o?1:0}),yn={year:"",month:"",day:"",hour:"09",minute:"00",memo:""};function En(e,u=[]){const t=i.useMemo(()=>Ye(u),[u]),{list:n,setList:o,selected:l,setSelected:r,isEditing:a,setIsEditing:s,editForm:c,setEditForm:h,openDetail:C,commitEdit:d,remove:m}=Ku(yn,t),[f,E]=i.useState([]),{year:p,month:g,day:S}=Ne(),[w,A]=i.useState({year:p,month:g,day:S,hour:"09",minute:"00",memo:""}),D=j=>P=>A(V=>({...V,[j]:P})),b=j=>{o(te=>Ye([...te,w]));const{year:P,month:V,day:U}=Ne();A({year:P,month:V,day:U,hour:"09",minute:"00",memo:""}),j?.()},N=()=>{d(j=>Ye(j.map(P=>l!=null&&Oe(P,l)?c:P)),c)},k=i.useCallback(j=>{m(j)},[m]),M=i.useCallback(j=>{e({year:j.year,month:j.month,day:j.day,hour:j.hour,minute:j.minute,memo:j.memo,...j.id!=null?{id:j.id}:{}}),m(j)},[e,m]),O=i.useCallback(j=>{o(P=>P.filter(V=>!Oe(V,j))),E(P=>[j,...P]),r(null)},[o,r]),F=i.useCallback(j=>{o(P=>Ye([...P,j]))},[o]),$=i.useCallback(j=>{o(P=>P.filter(V=>V!==j))},[o]),Y=i.useCallback((j,P)=>{o(V=>V.map(U=>U===P?j:U)),r(V=>V===P?j:V)},[o,r]);return{scheduleList:n,noShowList:f,addSchedule:F,removeSchedule:$,revertScheduleEdit:Y,scheduleForm:w,setScheduleForm:A,setSchedule:D,selectedSchedule:l,setSelectedSchedule:r,isEditingSchedule:a,setIsEditingSchedule:s,editScheduleForm:c,setEditScheduleForm:h,openScheduleDetail:C,handleScheduleSave:b,handleScheduleEditSave:N,handleScheduleDelete:k,handleScheduleToVisit:M,handleScheduleNoVisit:O}}const Ue=[{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 wn(e){const{t:u}=ce.useTranslation(),[t,n]=i.useState(""),[o,l]=i.useState("25"),[r,a]=i.useState("all"),[s,c]=i.useState(1),h=i.useMemo(()=>e.filter(({item:E,status:p})=>!(t&&!E.memo.includes(t)||r!=="all"&&p!==r)),[e,t,r]),C=Math.max(1,Math.ceil(h.length/Number(o))),d=Math.min(s,C),m=i.useMemo(()=>h.slice((d-1)*Number(o),d*Number(o)),[h,d,o]),f=i.useMemo(()=>Ue.map(E=>({...E,label:u("common.pageSizeLabel",{n:E.value,defaultValue:E.label})})),[u]);return{vapSearch:t,setVapSearch:n,vapPageSize:o,setVapPageSize:l,vapPageSizeOptions:f,vapStatus:r,setVapStatus:a,vapPage:d,setVapPage:c,vapFiltered:h,vapTotal:C,vapPageItems:m}}function Bn(e,u,t){const{t:n}=ce.useTranslation(),[o,l]=i.useState(()=>{const f=t?.initialPageSize;return f&&Ue.some(E=>E.value===f)?f:"25"}),[r,a]=i.useState(1),[s,c]=i.useState(u);s!==u&&(c(u),r!==1&&a(1));const h=i.useMemo(()=>Ue.map(f=>({...f,label:n("visits.showN",{n:f.value})})),[n]),C=i.useCallback(f=>{l(f),a(1)},[]),d=Math.max(1,Math.ceil(e.length/Number(o)));r>d&&a(d);const m=Math.min(r,d);return{pageRows:i.useMemo(()=>e.slice((m-1)*Number(o),m*Number(o)),[e,m,o]),pageSizeProps:{options:h,value:o,onChange:C},paginationProps:{page:m,total:d,onChange:a},setPage:a}}function bn(){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}}const qu=e=>e==="\uC88C"||e==="\uC6B0"?e:null;function An(){const[e,u]=i.useState(!1),[t,n]=i.useState("\uC88C"),[o,l]=i.useState({\uC88C:null,\uC6B0:null}),[r,a]=i.useState({\uC88C:[],\uC6B0:[]}),[s,c]=i.useState(!1),[h,C]=i.useState("\uC88C"),d=i.useCallback(f=>{const E=qu(f.direction);E&&(l(p=>({...p,[E]:f})),a(p=>({...p,[E]:[f,...p[E]]})),u(!1))},[]),m=i.useCallback(f=>{const E=qu(f.direction);E&&(l(p=>({...p,[E]:f})),c(!1))},[]);return{showDevice:e,setShowDevice:u,deviceDirection:t,setDeviceDirection:n,devices:o,setDevices:l,deviceHistory:r,setDeviceHistory:a,showDeviceList:s,setShowDeviceList:c,listForSide:h,setListForSide:C,handleDeviceSubmit:d,handleSelectFromList:m}}const _n="__ihab_core_word_pool__";function Ke(){return globalThis[_n]??null}function v(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 ae(e,u,t=Math.random){return!Array.isArray(e)||e.length===0||u<=0?[]:u>=e.length?v(e,t):v(e,t).slice(0,u)}const Cu={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"}},Dn=z.indexOf("\u3147"),zu={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!==Dn},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}},On={\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"},Nn={\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 du(e){return On[e]??e}const fu={cho:z,jung:ne,jong:ee},W=e=>Array.isArray(e)?e.length>0:!!e;function gu(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&&z[n.cho]==="\u3147"!=(z[o.cho]==="\u3147")||n.jong!==o.jong&&n.jong===0!=(o.jong===0)))return!0}return!1}function Tn(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&&gu(l,o(t.pronOf(a)))||r.push(a)));return r}function Ju(e,u,t){const n=u?.[e];if(!n)return[];const o=t.kind?n[t.kind]??[]:[...n.cho??[],...n.jung??[],...n.jong??[]];return Tn(e,o,t)}function jn(e,u,t,n,o,l,r){const a=["cho","jung","jong"].filter(d=>W(e[d])),s={};for(const d of a){const m=e[d];s[d]=new Set(Array.isArray(m)?m:[m])}const c=o==="pron",h=new Map;for(const d of u){const m=t(l(d));if(m.some(g=>!g))continue;let f=m;if(!c&&(f=t(d),f.length!==m.length||f.some(g=>!g)))continue;const E=m.length,p=h.get(E);p?p.push({w:d,dPron:m,dPos:f}):h.set(E,[{w:d,dPron:m,dPos:f}])}const C=new Map;for(const[d,m]of h){const f=new Map,E=(p,g)=>{const S=p.dPos[g];return S!=null&&a.every(w=>s[w].has(fu[w][S[w]]))};for(const p of m){let g;if(r==="head")g=E(p,0)?0:-1;else if(r==="tail")g=E(p,d-1)?d-1:-1;else if(r==="mid"){g=-1;for(let w=1;w<d-1;w++)if(E(p,w)){g=w;break}}else g=p.dPos.findIndex(w=>w!=null&&a.every(A=>s[A].has(fu[A][w[A]])));if(g<0)continue;const S=f.get(g);S?S.push(p):f.set(g,[p])}for(const[p,g]of f){const S=new Set(a.map(D=>p+":"+D)),w=D=>{let b="";for(let N=0;N<d;N++){const k=D[N];for(const M of["cho","jung","jong"])b+=(S.has(N+":"+M)?"*":k[M])+"."}return b},A=new Map;for(const D of m){const b=w(D.dPron),N=A.get(b);N?N.push(D):A.set(b,[D])}for(const D of g){const b=A.get(w(D.dPron))??[],N=[];for(const k of b){if(k.w===D.w)continue;let M=!0;for(const O of a){const F=D.dPron[p][O],$=k.dPron[p][O];if($===F){M=!1;break}if(c&&s[O].has(fu[O][$])){M=!1;break}}M&&(n&&gu(D.dPron,k.dPron)||N.push(k.w))}C.set(D.w,N)}}}return C}const In=e=>e==null?[]:Array.isArray(e)?e:[e];function Rn(e){if([...e].length!==1)return"";const u=x(e);if(!u)return"";const t=du(ee[u.jong]),n=t===""?0:ee.indexOf(t);return Ce(u.cho,u.jung,n<0?0:n)}function Qu(e,u){return u.get(e)||Rn(e)||e}function hu(e){return e?W(e.cho)?"cho":W(e.jung)?"jung":W(e.jong)?"jong":null:null}function we(e,u){const t=(n,o)=>!W(n)||In(n).includes(o);return t(u.cho,z[e.cho])&&t(u.jung,ne[e.jung])&&t(u.jong,ee[e.jong])}function Te(e,u,t){const n=[...e];if(t!=="pron")return n.map(l=>x(l));const o=[...u.get(e)||e];return o.length!==n.length?n.map(l=>x(l)):o.map(l=>x(l))}function je(e,u,t,n,o){const l=u==="cho"?z:u==="jung"?ne:ee,r=e[u],a=[],s=C=>u==="jung"?Ln(Qu(C,o)):Qu(C,o),c=new Map([[s(t),-1]]),h=v(l.map((C,d)=>d).filter(C=>C!==r&&(u!=="cho"||l[C]!=="\u3147")&&(u!=="jong"||C!==0)));for(const C of h){if(a.length>=n)break;const d=u==="cho"?Ce(C,e.jung,e.jong):u==="jung"?Ce(e.cho,C,e.jong):Ce(e.cho,e.jung,C),m=s(d),f=c.get(m);if(f!==void 0){u==="jung"&&f>=0&&o.has(d)&&!o.has(a[f])&&(a[f]=d);continue}c.set(m,a.length),a.push(d)}return a}const Mn={\u3154:"\u3150",\u3156:"\u3152",\u315A:"\u3159",\u315E:"\u3159"};function Ln(e){if([...e].length!==1)return e;const u=x(e);if(!u)return e;const t=Mn[ne[u.jung]];return t?Ce(u.cho,ne.indexOf(t),u.jong):e}function kn(e,u,t,n,o,l=null){const r=[...e];if(r.length!==2)return null;const a=r.map(C=>x(C));if(a.some(C=>!C))return null;const s=Te(e,t,n);if(s.some(C=>!C))return null;const c=hu(u);let h=c&&u?s.map((C,d)=>we(C,u)?d:-1).filter(C=>C>=0):[0,1];if(l!=null&&(h=h.filter(C=>C!==l)),!h.length)return null;for(const C of v(h)){const d=r[C];if(!o.has(d))continue;const m=je(a[C],c??"cho",d,40,t),f=[];for(const E of m)if(E!==d&&o.has(E)&&!f.includes(E)&&f.push(E),f.length>=2)break;if(!(f.length<2))return{question:e,distractors:[d,...f]}}return null}function Pn(e,u,t,n,o,l=null){const r=[...e];if(r.length!==3)return null;const a=r.map(C=>x(C));if(a.some(C=>!C))return null;const s=Te(e,t,n);if(s.some(C=>!C))return null;const c=hu(u),h=c&&u?s.map((C,d)=>we(C,u)?d:-1).filter(C=>C>=0):[0,1,2];if(!h.length)return null;for(const C of v(h))for(const d of v([0,1,2].filter(m=>m!==C&&(l==null||m===l)))){const m=[0,1,2].filter(S=>S!==d),f=m.map(S=>r[S]).join("");if(!o.has(f))continue;const E=m.indexOf(C),p=je(a[C],c??"cho",r[C],40,t),g=[];for(const S of p){const w=m.map(D=>r[D]);w[E]=S;const A=w.join("");if(A!==f&&o.has(A)&&!g.includes(A)&&g.push(A),g.length>=2)break}if(!(g.length<2))return{question:e,distractors:[f,...g]}}return null}function vn(e,u,t,n,o,l=null){const r=[...e],a=r.length;if(a<2)return null;const s=[];for(let h=1;h<=a-1;h++)s.push({remain:r.slice(0,h).join(""),dropped:r.slice(h).join(""),droppedEnd:1}),s.push({remain:r.slice(a-h).join(""),dropped:r.slice(0,a-h).join(""),droppedEnd:0});const c=hu(u);for(const{remain:h,dropped:C,droppedEnd:d}of v(s)){if(l!=null&&d!==l||h===e||!o.has(h)||!o.has(C))continue;const m=[...h],f=m.map(g=>x(g));if(f.some(g=>!g))continue;const E=Te(h,t,n);if(E.some(g=>!g))continue;const p=c&&u?E.map((g,S)=>we(g,u)?S:-1).filter(g=>g>=0):m.map((g,S)=>S);if(p.length)for(const g of v(p)){const S=je(f[g],c??"cho",m[g],40,t),w=[];for(const A of S){const D=[...m];D[g]=A;const b=D.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 xn(e,u,t,n,o,l=null){if([...e].length!==1)return null;const r=x(t.get(e)||e);if(!r||r.jong===0)return null;const a=Ce(r.cho,r.jung,0),s=je({cho:r.cho,jung:r.jung,jong:0},"cho",a,2,t);return s.length<2?null:{question:e,distractors:[a,...s]}}const mu=z.indexOf("\u3147");function Fn(e,u,t,n,o,l=null){if([...e].length!==1)return null;const r=x(t.get(e)||e);if(!r||r.jong!==0||r.cho===mu)return null;const a=Ce(mu,r.jung,0),s=je({cho:mu,jung:r.jung,jong:0},"jung",a,2,t);return s.length<2?null:{question:e,distractors:[a,...s]}}function Vn(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 s=0;s<o;s++)r+=s===l?"*":n[s];const a=u.get(r);a?a.push(t):u.set(r,[t])}}return u}function $n(e,u,t,n,o,l=null,r=null,a=2){const s=[...e],c=s.length;if(c<2||c>3)return null;const h=s.map(S=>x(S));if(h.some(S=>!S))return null;const C=Te(e,t,n);if(C.some(S=>!S))return null;const d=S=>t.get(S)??S,m=d(e),f=!!u&&(W(u.cho)||W(u.jung)||W(u.jong)),E=!!r&&(W(r.cho)||W(r.jung)||W(r.jong)),p=S=>{let w=c+"|"+S+"|";for(let A=0;A<c;A++)w+=A===S?"*":s[A];return w};let g;if(l!=null){if(l>=c||f&&!we(C[l],u))return null;g=[l]}else f?g=C.map((S,w)=>we(S,u)?w:-1).filter(S=>S>=0):g=Array.from({length:c},(S,w)=>w);for(const S of v(g)){const w=o.get(p(S))??[],A=[],D=[];for(const O of w){if(O===e)continue;const F=[...O].map(P=>x(P)),$=h[S],Y=F[S];if(!$||!Y)continue;let j=0;if($.cho!==Y.cho&&j++,$.jung!==Y.jung&&j++,$.jong!==Y.jong&&j++,!(j<a||d(O)===m))if(E){const P=Te(O,t,n)[S];P&&we(P,r)?A.push(O):D.push(O)}else A.push(O)}if(!A.length)continue;const b=v(A)[0],N=[],k=new Set([m,d(b)]),M=E?D:A.filter(O=>O!==b);for(const O of v(M)){const F=d(O);if(!k.has(F)&&(k.add(F),N.push(O),N.length>=2))break}if(!E&&N.length<2)for(const O of v(w)){if(O===e||O===b)continue;const F=d(O);if(!k.has(F)&&(k.add(F),N.push(O),N.length>=2))break}if(!(N.length<2))return{question:e,distractors:[b,...N]}}return null}let We=null,Zu=null,Xu=null;function Hn(){const e=Ke();if(e&&e.entries.length>0){const u=De();if(We&&Zu===e&&Xu===u)return We;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 We=n,Zu=e,Xu=u,We}return[]}const oe=new Proxy([],{get(e,u){const t=Hn(),n=t[u];return typeof n=="function"?n.bind(t):n}});function pu(e){return e.length?e[Math.floor(Math.random()*e.length)]:void 0}function ue(e,u){if(u>=e.length)return v(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 Su=null,et=null;function de(){const e=Ke();if(Su&&et===e)return Su;const u=new Map;for(const t of oe)t.w&&u.set(t.w,t.pron);return Su=u,et=e,u}function Q(e){return de().get(e)||e}function qe(e,u,t=new Set){const n=[];for(const o of v(e)){if(n.length>=u)break;const l=Q(o);t.has(l)||(t.add(l),n.push(o))}return n}let Gn=0;function J(e){return`${e}-rt-${++Gn}`}function Ie(e){const u=Gu();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)dn(n)===!0&&t.add(n);return t}const ze=new Map;let ut=null,tt=null;function Re(e){return e==null?"":Array.isArray(e)?e.slice().sort().join(","):e}function nt(e){const u=Re(e.choseong),t=e.composition,n=t?.syllable==null?"":Array.isArray(t.syllable)?t.syllable.slice().sort().join(","):String(t.syllable),o=t?`${Re(t.cho)}/${Re(t.jung)}/${Re(t.jong)}/${t.jongNone?"N":""}/${n}`:"",l=Re(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=Ke(),t=De();(u!==ut||t!==tt)&&(ze.clear(),ut=u,tt=t);const n=nt(e);return ze.has(n)||ze.set(n,Yn(e)),ze.get(n)}function ot(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=>tn(r):r=>on(r,{cho:t,jung:n,jong:l,jongNone:o}):null}function lt(e){const u=e.grade&&e.grade.length>0?new Set(e.grade):null,t=e.composition??null,n=t?.syllable!=null?new Set(Array.isArray(t.syllable)?t.syllable:[t.syllable]):null,o=t?[ot(t),n?r=>n.has(Ae(r)):null].filter(r=>r!=null):[];if(!u&&o.length===0)return null;const l=e.phonemeView==="pron";return r=>{if(u&&(!r.grade||!u.has(r.grade)))return!1;if(o.length===0)return!0;const a=l?Q(r.w):r.w;return o.every(s=>s(a))}}async function Yn(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,s=e.phonemeView==="pron"?"pron":"char",c=Math.max(1,e.contrastCount??1),h=u==="cho"||u==="jung"||u==="jong",C=h&&c>=2,d=u==="count",m=t?new Set(Array.isArray(t)?t:[t]):null,f=n?.syllable!=null?new Set(Array.isArray(n.syllable)?n.syllable:[n.syllable]):null,E=n?[ot(n),f?B=>f.has(Ae(B)):null].filter(B=>B!=null):[],p=u==="random"||u===null,g=p||d,S=p||C||d;let w=oe.filter(B=>!B.w||r&&(!B.grade||!r.has(B.grade))?!1:S?!0:Array.isArray(B.p)&&B.p.length>0);m&&(w=w.filter(B=>{for(const _ of m)if(un(B.w,_))return!0;return!1})),E.length>0&&(w=w.filter(B=>{const _=s==="pron"?Q(B.w):B.w;return E.every(G=>G(_))})),o&&(w=w.filter(B=>B.w[0]===o));let A;if(l){const B=new Set;for(const _ of w)if(B.add(_.w),Array.isArray(_.p))for(const G of _.p)B.add(G);if(g)for(const _ of oe)_.w&&B.add(_.w);A=Ie(B)}else{const B=new Set;for(const _ of w)if(B.add(_.w),Array.isArray(_.p))for(const G of _.p)B.add(G);if(g)for(const _ of oe)_.w&&B.add(_.w);A=B}let D=null;if(C){const B=new Set;for(const _ of oe)_.w&&B.add(_.w);D=l?Ie(B):B}const b=w.filter(B=>A.has(B.w)),N=600,k=Array.from(A),M=k.length>N?ue(k,N):k,O=d&&n!=null&&(W(n.cho)||W(n.jung)||W(n.jong)),F=2500,$=new Map;if(d&&!O&&c>=2){for(const B of k){const _=Ae(B),G=$.get(_);G?G.push(B):$.set(_,[B])}for(const[B,_]of $)_.length>F&&$.set(B,ue(_,F))}const Y=Xt(),j=O?jn(n,k,Y,a,s,Q):null,P=500,V=1500,U=e.fullCount?b:u==="random"?b.length>P?ue(b,P):b:b.length>V?ue(b,V):b,te=De(),me=[];for(const B of U){let _;const G=Q(B.w);if(C)_=rn(B.w,u,c,D,24).filter(H=>Q(H)!==G);else if(d)O?_=(j.get(B.w)??[]).filter(H=>Q(H)!==G):c<=1?_=Ju(B.w,te,{okSet:A,pronOf:Q,decompOf:Y,sameStructureOnly:!1}):_=($.get(Ae(B.w))??[]).filter(H=>{if(H===B.w||Q(H)===G)return!1;const X=an(B.w,H);return c>=5?X>=5:X===c});else if(p)_=M.filter(H=>H!==B.w&&H.length===B.w.length&&Q(H)!==G);else{const H=u;_=Ju(B.w,te,{kind:H,okSet:A,pronOf:Q,decompOf:Y,sameStructureOnly:!1}),_.length===0&&(_=(M.length>30?ue(M,30):M).filter(X=>X!==B.w&&en(B.w,X)===u&&Q(X)!==G))}if(a&&_.length>0&&(h||d&&!O)){const H=Y(Q(B.w));_=_.filter(X=>!gu(H,Y(Q(X))))}_.length!==0&&me.push({word:B,usable:_})}return me}async function rt(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 v(l)){if(r.length>=n)break;const s=qe(a.usable,o);if(s.length<o)continue;const c=v([a.word.w,...s]);r.push({id:J(e+"-item"),index:r.length+1,word:a.word.w,syllables:a.word.s,choices:c,answerIndex:c.indexOf(a.word.w)})}return r}async function Un(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=v([...o]);for(const a of r){if(l.length>=t)break;const s=a.word.w,c=[...a.word.pron||s],h=pu(c);if(!h)continue;const C=o.filter(f=>f.word.w!==s&&f.word.s===a.word.s&&!(f.word.pron||f.word.w).includes(h)&&f.word.pron!==a.word.pron);if(C.length<n)continue;const d=qe(C.map(f=>f.word.w),n);if(d.length<n)continue;const m=v([s,...d]);l.push({id:J("HPI-item"),index:l.length+1,targetSyllable:h,word:s,choices:m,answerIndex:m.indexOf(s)})}return l}async function Kn(e){const{count:u=10}=e,t=(await Z(e)).filter(l=>l.usable.length>=1);if(!t.length)return[];const n=t.length>=u?ue(t,u):v(Array.from({length:u},(l,r)=>t[r%t.length])),o=v(Array.from({length:u},(l,r)=>r<Math.ceil(u/2)));return n.map((l,r)=>{const a=o[r];let s;if(a)s=[l.word.w,l.word.w];else{const c=pu(l.usable);s=Math.random()<.5?[l.word.w,c]:[c,l.word.w]}return{id:J("SOD-item"),index:r+1,word:l.word.w,pair:s,same:a}})}async function Wn(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(d=>d.word.w),r=new Map(o.map(d=>[d.word.w,d.word.pron])),a=d=>(r.get(d)||d)[0]??"",s={};for(const d of o){const m=a(d.word.w);m&&(s[m]||(s[m]=[]),s[m].push(d.word.w))}const c=Object.entries(s).filter(([,d])=>d.length>=2).map(([d])=>d);if(c.length===0)return[];const h=[],C=v([...c]);for(let d=0;h.length<t&&d<t*4;d++){const m=C[d%C.length],f=s[m];if(f.length<2)continue;const E=v([...f]),p=E[0],g=E[1];if(!p||!g||p===g||(r.get(p)||p)===(r.get(g)||g))continue;const S=r.get(g)||g,w=l.filter(b=>a(b)!==m&&b!==p&&b!==g&&b.length===g.length&&(r.get(b)||b)!==S);if(w.length<n)continue;const A=qe(w,n);if(A.length<n)continue;const D=v([g,...A]);h.push({id:J("SWS-item"),index:h.length+1,sourceWord:p,targetSyllable:m,word:g,choices:D,answerIndex:D.indexOf(g)})}return h}function at(e,u,t){const n=de(),o=a=>n.get(a)||a,l=(a,s)=>{const c=[...a],h=[...s];if(c.length!==h.length)return-1;let C=-1;for(let d=0;d<c.length;d++)if(c[d]!==h[d]){if(C>=0)return-1;C=d}return C},r=e.map(a=>({e:a,swaps:a.usable.filter(s=>!!s&&l(a.word.w,s)>=0&&o(s)!==o(a.word.w))})).filter(a=>a.swaps.length>0);return ue(r,u).map(({e:a,swaps:s},c)=>{const h=pu(s)??"",C=[...a.word.w],d=[...h],m=l(a.word.w,h),f=qe(a.usable.filter(E=>E&&E!==h),2,new Set([o(h),o(a.word.w)]));return{id:J(t),index:c+1,word:a.word.w,original:a.word.w,changed:h,changedFrom:m>=0?C[m]:"",changedTo:m>=0?d[m]:"",distractors:f}})}async function st(e,u,t){const{count:n=10}=u,o=de(),l=oe.filter(f=>f.w&&f.s===e),r=u.excludeNoImage?Ie(l.map(f=>f.w)):null,a=r?l.filter(f=>r.has(f.w)):l,s=new Set(a.map(f=>f.w)),c=Vn(s),h=u.phonemeView??"char",C=u.composition??null,d=lt({grade:u.grade}),m=[];for(const f of v(a)){if(m.length>=n)break;if(d&&!d(f))continue;const E=$n(f.w,C,o,h,c,null,null);if(!E)continue;const p=E.distractors[0],g=[...f.w],S=[...p],w=g.findIndex((A,D)=>A!==S[D]);m.push({id:J(t),index:m.length+1,word:f.w,original:f.w,changed:p,changedFrom:w>=0?g[w]:"",changedTo:w>=0?S[w]:"",distractors:E.distractors.slice(1)})}return m}async function qn(e){return st(2,e,"CS2-item")}async function zn(e){return st(3,e,"CS3-item")}async function Jn(e){const u=(await Z({...e,difficulty:"count",contrastCount:1})).filter(t=>t.word.s===1&&t.usable.length>=1);return at(u,e.count??10,"CP1-item")}async function Qn(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 at(t,e.count??10,"CP2-item")}async function Zn(e){const{count:u=10}=e,t=(await Z({...e})).filter(n=>n.word.s===2);return ue(t,u).map((n,o)=>({id:J("M2S-item"),index:o+1,word:n.word.w,answer:n.word.w,parts:[...n.word.w]}))}async function Xn(e){const{count:u=10}=e,t=(await Z({...e})).filter(n=>n.word.s===3);return ue(t,u).map((n,o)=>({id:J("M3S-item"),index:o+1,word:n.word.w,answer:n.word.w,parts:[...n.word.w]}))}async function eo(e){const{count:u=10}=e,t=(await Z({...e})).filter(a=>a.word.s===2),n=de(),o=new Set(oe.map(a=>a.w)),l=e.phonemeView??"char",r=[];for(const a of v(t)){if(r.length>=u)break;const s=kn(a.word.w,e.composition??null,n,l,o);if(!s)continue;const[c,...h]=s.distractors,C=[...a.word.w],d=C[0]===c?C[1]:C[0];r.push({id:J("D2-item"),index:r.length+1,original:a.word.w,word:a.word.w,dropped:d,missingResult:c,distractors:h})}return r}async function uo(e){const{count:u=10}=e,t=(await Z({...e})).filter(a=>a.word.s===3),n=de(),o=new Set(oe.map(a=>a.w)),l=e.phonemeView??"char",r=[];for(const a of v(t)){if(r.length>=u)break;const s=Pn(a.word.w,e.composition??null,n,l,o);if(!s)continue;const[c,...h]=s.distractors,C=[...a.word.w];let d="";for(let m=0;m<C.length;m++)if(C.filter((f,E)=>E!==m).join("")===c){d=C[m];break}r.push({id:J("D3-item"),index:r.length+1,original:a.word.w,word:a.word.w,dropped:d,missingResult:c,distractors:h})}return r}async function to(e){const{count:u=10}=e,t=(await Z({...e})).filter(a=>a.word.s>=2),n=de(),o=new Set(oe.map(a=>a.w)),l=e.phonemeView??"char",r=[];for(const a of v(t)){if(r.length>=u)break;const s=vn(a.word.w,e.composition??null,n,l,o);if(!s)continue;const[c,...h]=s.distractors,C=a.word.w,d=C.startsWith(c)?C.slice(c.length):C.endsWith(c)?C.slice(0,C.length-c.length):"";r.push({id:J("DPC-item"),index:r.length+1,original:C,word:C,dropped:d,missingResult:c,distractors:h})}return r}async function no(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=ue(t,3);return{id:J("LRO-item"),index:o+1,sequence:l,choices:v(l)}})}function Je(e,u,t){const n=oe.filter(a=>a.w&&a.s===e),o=u.excludeNoImage?Ie(n.map(a=>a.w)):null,l=lt(u),r=[];for(const a of n)if(!(o&&!o.has(a.w))&&!(l&&!l(a))){if(t){const s=x(a.w);if(!s||!t(s))continue}r.push(a)}return r}function oo(e){const u=Je(1,e,t=>t.jong===0);return ue(u,e.count??10).map((t,n)=>{const o=x(t.w);return{id:J("M2P-item"),index:n+1,parts:[z[o.cho],ne[o.jung]],answer:t.w,word:t.w}})}function lo(e){const u=Je(1,e,t=>t.jong>0&&!be[t.jong]);return ue(u,e.count??10).map((t,n)=>{const o=x(t.w);return{id:J("M3P-item"),index:n+1,parts:[z[o.cho],ne[o.jung],ee[o.jong]],answer:t.w,word:t.w}})}function ro(e){const u=zu.DROP_FINAL_CONSONANT_FROM_1SYLL,t=Je(u.syllables,e,u.syllable),n=de(),o=[];for(const l of v(t)){if(o.length>=(e.count??10))break;const r=xn(l.w,null,n);if(!r)continue;const[a,...s]=r.distractors;o.push({id:J("DFC-item"),index:o.length+1,original:l.w,word:l.w,result:a,distractors:s})}return o}function ao(e){const u=zu.REMOVE_CONSONANT_AND_IDENTIFY_PHONEME,t=Je(u.syllables,e,u.syllable),n=de(),o=[];for(const l of v(t)){if(o.length>=(e.count??10))break;const r=Fn(l.w,null,n);if(!r)continue;const a=x(n.get(l.w)||l.w);if(!a)continue;const[s,...c]=r.distractors;o.push({id:J("RCP-item"),index:o.length+1,base:l.w,word:l.w,missingConsonant:z[a.cho],remaining:s,distractors:c})}return o}const Qe=new Map;let it=null,ct=null;async function Ct(e,u={}){const t=Ke(),n=De();(t!==it||n!==ct)&&(Qe.clear(),it=t,ct=n);const o=`${e}:${nt(u)}`;if(Qe.has(o))return Qe.get(o);const l=await io(e,u);return Qe.set(o,l),l}const so={SAME_SOUND_PICK:e=>rt("SSP",e),HEAR_AND_PICK_SAME:e=>rt("HPS",e),HEAR_AND_PICK_INCLUDED:e=>Un(e),SAME_OR_DIFF:e=>Kn(e),STARTS_WITH_SAME_SOUND:e=>Wn(e),LISTEN_AND_REMEMBER_ORDER:e=>no(e),MERGE_2_SYLLABLES:e=>Zn(e),MERGE_3_SYLLABLES:e=>Xn(e),MERGE_2_PHONEMES:e=>oo(e),MERGE_3_PHONEMES:e=>lo(e),DROP_1_FROM_2SYLL:e=>eo(e),DROP_1_FROM_3SYLL:e=>uo(e),DROP_PART_FROM_COMPOUND:e=>to(e),DROP_FINAL_CONSONANT_FROM_1SYLL:e=>ro(e),REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:e=>ao(e),CHANGE_1_SYLL_IN_2SYLL:e=>qn(e),CHANGE_1_SYLL_IN_3SYLL:e=>zn(e),CHANGE_1_PHONEME_IN_1SYLL:e=>Jn(e),CHANGE_1_PHONEME_IN_2SYLL:e=>Qn(e)};async function io(e,u={}){const t=so[e];return t?await t(u):[]}async function co(e){const u=["random","count"],t=Object.keys(Cu);let n=0;for(const o of u)for(const l of t){const r=Cu[l];Ct(l,{difficulty:r.difficulty?o:null,contrastCount:1,composition:null,count:5,excludeNoImage:e,sameStructureOnly:!0,phonemeView:"char",grade:null}).catch(()=>{}),++n%6===0&&await new Promise(a=>setTimeout(a,0))}}async function Co(e){return(await Z({...e,fullCount:!0})).length}async function fo(e={}){const u=[];for(const a of oe)a.w&&u.push(a.w);const t=e.excludeNoImage?Ie(u):u,n=new Set,o=new Set,l=new Set,r=new Set;for(const a of t){r.add(Ae(a));for(const s of a){const c=x(s);if(c&&(z[c.cho]!=="\u3147"&&n.add(z[c.cho]),o.add(ne[c.jung]),c.jong>0)){l.add(ee[c.jong]);const h=be[c.jong];h&&h.forEach(C=>l.add(C))}}}return{cho:n,jung:o,jong:l,syllable:r}}const he="\uC804\uCCB4";function dt(){const{t:e}=ce.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 ft(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 gt(e){return{label:e.partOfSpeech,items:Object.keys(e.posMap),multiple:!0,allOption:!0}}function ht(e){return{label:e.wordType,items:Object.keys(e.typeMap),multiple:!0,allOption:!0}}function go(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 ho(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 mo(e,u){const{label:t,headValue:n,midValue:o,tailValue:l,includeMid:r=!0,headDisabled:a,midDisabled:s,tailDisabled:c,allOptionDisabled:h,groupLabel:C,labelAction:d}=u;return{label:t,...C?{groupLabel:C}:{},...d?{labelAction:d}:{},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:s}]:[],{value:l,displayLabel:e("wordSearch.filter.positionTail",{defaultValue:"\uC5B4\uB9D0"}),disabled:c}]}}function po(e,u,t){if(u===he){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(Nn).map(([e,{nucleus:u}])=>[e,u]));const So={\uACE0\uC720\uC5B4:"\uACE0\uC720",\uD55C\uC790\uC5B4:"\uD55C\uC790",\uC678\uB798\uC5B4:"\uC678\uB798",\uD63C\uC885\uC5B4:"\uD63C\uC885"},yo={"\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"]},Eo={difficulty:"\uB09C\uC774\uB3C4 \uB4F1\uAE09",syllables:"\uC74C\uC808 \uC218",syllable5plus:"5\uC74C\uC808 \uC774\uC0C1",partOfSpeech:"\uD488\uC0AC",wordType:"\uC720\uD615",posMap:yo,typeMap:So};function wo(e,u,t=Eo){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(s=>s===t.syllable5plus?a>=5:a===parseInt(s)))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 Bo={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"})},bo={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"})},Ao={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 mt(e,u){if("place"in u)return Bo[u.place](e);const t=bo[u.vowel](e);return u.glide?`${t} \xB7 ${Ao[u.glide](e)}`:t}const _o=(e,{defaultValue:u})=>u,pt=(e,u)=>({jamos:e,phonetic:u,tooltip:mt(_o,u)}),se=(e,u)=>u.map(t=>pt([t],{place:e})),q=(e,u,t)=>pt([...e],t?{vowel:u,glide:t}:{vowel:u}),yu={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:[[q("\u3163","frontHigh"),q("\u315F","frontHigh","w"),q("\u3162","frontHigh","velar")],[q("\u3161","backHighUnrounded")],[q("\u315C","backHighRounded"),q("\u3160","backHighRounded","j")],[q("\u3154\u3150","frontMid"),q("\u3156\u3152","frontMid","j"),q("\u3159\u315A\u315E","frontMid","w")],[q("\u3153","backMidUnrounded"),q("\u3155","backMidUnrounded","j"),q("\u315D","backMidUnrounded","w")],[q("\u3157","backMidRounded"),q("\u315B","backMidRounded","j")],[q("\u314F","low"),q("\u3151","low","j"),q("\u3158","low","w")]],jong:[se("labial",["\u3142","\u3141"]),se("alveolar",["\u3137","\u3134","\u3139"]),se("velar",["\u3131","\u3147"])]},Do=[...z],Oo=[...ne],No=ee.filter(e=>e!==""),ie=e=>e===le?[]:Array.from(e),le="__NO_CODA__",St=[1,2,3,4],re=5,To=12,yt="SYL_",Eu=e=>`${yt}${e}`,jo=e=>Number(e.slice(yt.length));function wu(e){return e>=re?Array.from({length:To-re+1},(u,t)=>re+t):[e]}const Et={cho:Do,jung:Oo,jong:No},Bu=e=>e.map(u=>u.map(({jamos:t,phonetic:n,tooltip:o})=>({v:t.join(""),phonetic:n,tooltip:o}))),bu={cho:Bu(yu.cho),jung:Bu(yu.jung),jong:Bu(yu.jong)},wt={};bu.jung.flat().forEach(({v:e})=>{for(const u of ie(e))wt[u]=e});const Io=new Set(bu.cho.flat().map(e=>e.v));function Bt(e,u){return e==="cho"?Io.has(u)?u:null:e==="jung"?wt[u]??u:du(u)}function bt(e,u,t){if(e==="jung"){const n=ie(u);return t&&n.includes(t)?t:n[0]??u}return e==="jong"&&t&&du(t)===u?t:u}function At(e,u,t,n){const o=(l,r)=>r?l==="jong"&&r===le?le:u==="pron"?Bt(l,r):bt(l,r,l==="jung"?t:l==="jong"?n:null):null;return{...e,cho:o("cho",e.cho),jung:o("jung",e.jung),jong:o("jong",e.jong)}}const Au={cho:null,jung:null,jong:null,syllable:null},Ro="wt_filter",_t=e=>`wt_filter_${e}`;function Dt(e){try{const u=localStorage.getItem(_t(e))??localStorage.getItem(Ro);if(u)return JSON.parse(u)}catch{}return null}function Ot(e){const u=e?.phonemeView;return u==="pron"?"pron":u==="direct"?"direct":"char"}function Mo(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?{...Au,cho:u.choseong}:Au}function Lo(e,u,t){const{t:n,i18n:o}=ce.useTranslation(),[l]=i.useState(()=>t?.resetOnMount?null:Dt(e)),[r,a]=i.useState(Ot(l)),[s,c]=i.useState(()=>Mo(l)),h=i.useCallback(()=>u.requireSyllable?{cho:"\u3131",jung:"\u314F",jong:le,syllable:u.fixedSyllable??null}:{cho:null,jung:null,jong:u.fixedNoCoda?le:null,syllable:u.fixedSyllable??null},[u.requireSyllable,u.fixedSyllable,u.fixedNoCoda]);i.useEffect(()=>{!u.requireSyllable&&u.fixedSyllable==null&&!u.fixedNoCoda||c(y=>y.cho||y.jung||y.syllable!=null||y.jong?y:h())},[]);const C=i.useMemo(()=>W(s.cho)||W(s.jung)||W(s.jong)?"count":"random",[s.cho,s.jung,s.jong]),d=i.useRef(r==="char"?s.jung:null),m=i.useRef(r==="char"?s.jong:null);i.useEffect(()=>{r==="char"&&(d.current=s.jung,m.current=s.jong)},[r,s.jung,s.jong]);const[f,E]=i.useState(t?.resetOnMount?!!t?.defaultImageOnly:l?.excludeNoImage??!0),[p,g]=i.useState(t?.resetOnMount?!1:l?.sameStructureOnly??!0),[S,w]=i.useState(Array.isArray(l?.gradeFilter)?l.gradeFilter:[]),[A,D]=i.useState(Array.isArray(l?.posFilter)?l.posFilter:[]),[b,N]=i.useState(Array.isArray(l?.wordTypeFilter)?l.wordTypeFilter:[]),k=i.useRef(t?.resetKey);i.useEffect(()=>{k.current!==t?.resetKey&&(k.current=t?.resetKey,c(h()),E(!!t?.defaultImageOnly),g(!1),w([]),D([]),N([]))},[t?.resetKey]);const M=dt(),[O,F]=i.useState({cho:new Set,jung:new Set,jong:new Set,syllable:new Set}),[$,Y]=i.useState(!1),[j,P]=i.useState(null),V=1,U=Math.max(1,[s.cho,s.jung,s.jong].filter(Boolean).length),[te,me]=i.useState(e);i.useEffect(()=>{if(te!==e){if(!t?.resetOnMount){const y=Dt(e);c(y?.composition??h()),E(y?.excludeNoImage??!0),g(y?.sameStructureOnly??!0),a(Ot(y)),w(Array.isArray(y?.gradeFilter)?y.gradeFilter:[]),D(Array.isArray(y?.posFilter)?y.posFilter:[]),N(Array.isArray(y?.wordTypeFilter)?y.wordTypeFilter:[])}me(e)}},[e,te,t?.resetOnMount]),i.useEffect(()=>{if(!t?.resetOnMount&&te===e)try{localStorage.setItem(_t(e),JSON.stringify({contrastCount:U,composition:s,excludeNoImage:f,sameStructureOnly:p,phonemeView:r,gradeFilter:S,posFilter:A,wordTypeFilter:b}))}catch{}},[t?.resetOnMount,e,te,U,s,f,p,r,S,A,b]);const[B,_]=i.useState(0);ku("wordpool:update",()=>_(y=>y+1));const G=i.useRef(o.language);i.useEffect(()=>{G.current!==o.language&&(G.current=o.language,_(y=>y+1))},[o.language]),i.useEffect(()=>{if(!u.choseong)return;let y=!1;return fo({difficulty:C,excludeNoImage:f}).then(I=>{y||(F(I),I.cho.size+I.jung.size+I.jong.size>0&&Y(!0))}).catch(()=>{y||F({cho:new Set,jung:new Set,jong:new Set,syllable:new Set})}),()=>{y=!0}},[u.choseong,C,f,B]),i.useEffect(()=>{let y=!1;const I=s,T=I.cho?ie(I.cho):null,L=I.jung?ie(I.jung):null,K=I.jong===le,pe=K?null:I.jong?ie(I.jong):null,Se=I.syllable!=null?wu(I.syllable):null,He=!!(T||L||pe||K||Se);return Co({difficulty:u.difficulty?C:null,contrastCount:u.difficulty?U:1,composition:u.choseong&&He?{cho:T,jung:L,jong:pe,jongNone:K,syllable:Se}:null,excludeNoImage:f,sameStructureOnly:p,phonemeView:r==="pron"?"pron":"char",grade:S.length>0?S:null}).then(Ge=>{y||P(Ge)}).catch(()=>{y||P(null)}),()=>{y=!0}},[u.choseong,u.difficulty,C,U,s,r,f,p,B,S]),i.useEffect(()=>{$&&c(y=>{const I={...y};let T=!1;return["cho","jung","jong"].forEach(L=>{const K=y[L];!K||K===le||ie(K).some(pe=>O[L].has(pe))||(I[L]=null,T=!0)}),y.syllable!=null&&u.fixedSyllable==null&&(y.syllable>=re?[...O.syllable].some(L=>L>=re)||(I.syllable=null,T=!0):(!O.syllable.has(y.syllable)||y.syllable<V)&&(I.syllable=null,T=!0)),T?I:y})},[O,$,V,u.fixedSyllable]);const H=i.useMemo(()=>{const y=I=>{const T=new Set;for(const L of Et[I])O[I].has(L)&&T.add(L);return T};return{cho:y("cho"),jung:y("jung"),jong:y("jong")}},[O]),X=i.useMemo(()=>({exact:new Set(St.filter(y=>O.syllable.has(y))),min:[...O.syllable].some(y=>y>=re)}),[O]),R=i.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]),Tu=i.useMemo(()=>({[R.trainOnset]:"cho",[R.trainVowel]:"jung",[R.trainCoda]:"jong"}),[R]),$e=i.useCallback((y,I)=>({title:I,items:y}),[]),ru=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]),kt=i.useMemo(()=>{const y=[];if(u.choseong){const I={value:le,displayLabel:R.codaExclude},T=u.fixedNoCoda===!0,L=(K,pe)=>{const Se=T&&K==="jong",He={label:pe,groupLabel:R.phonemeGroup,allOption:!u.requireSyllable,allLabel:R.noLimit,allOptionDisabled:Se};if(r==="pron"){const ye=bu[K].map(Ht=>Ht.map(({v:au,phonetic:Gt})=>{const su=ie(au),ju=mt(n,Gt),Iu=Se||!su.some(Yt=>O[K].has(Yt));return su.length>1?{value:au,labels:su,tooltip:ju,disabled:Iu}:{value:au,tooltip:ju,disabled:Iu}}));return K==="jong"&&!u.requireCoda&&ye.unshift([I]),{...He,groups:ye}}const Ge=Et[K].map(ye=>!Se&&H[K].has(ye)?ye:{value:ye,disabled:!0});return{...He,items:K==="jong"&&!u.requireCoda?[I,...Ge]:Ge}};y.push(L("cho",R.trainOnset)),y.push(L("jung",R.trainVowel)),y.push(L("jong",R.trainCoda))}if(y.push({...ft(n,M,{labelInfo:$e([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&&y.push(gt(M)),u.wordType&&y.push(ht(M)),u.choseong||u.fixedSyllable!=null){const I=u.fixedSyllable;y.push({label:R.syllableCount,items:[...St.map(T=>({value:Eu(T),displayLabel:n("wordPairs.syllableN",{n:T,defaultValue:"{{n}}\uC74C\uC808"}),disabled:I!=null?T!==I:!X.exact.has(T)||T<V})),{value:Eu(re),displayLabel:n("wordPairs.syllableNPlus",{n:re,defaultValue:"{{n}}\uC74C\uC808 \uC774\uC0C1"}),disabled:I!=null?re!==I:!X.min}],allOption:!0,allOptionDisabled:I!=null})}return u.choseong?y.push({label:R.exclude,displayLabel:R.selectLabel,multiple:!0,items:[R.excludeImage,R.sameStructure],labelInfo:$e(ru)}):y.push({label:R.exclude,displayLabel:R.selectLabel,multiple:!0,items:[R.excludeImage],labelInfo:$e([ru[0]])}),y},[u.choseong,u.partOfSpeech,u.wordType,u.requireSyllable,u.fixedSyllable,u.fixedNoCoda,u.requireCoda,V,H,O,r,X,R,n,$e,ru,M]),Pt={...(u.choseong||u.fixedSyllable!=null)&&s.syllable!=null?{[R.syllableCount]:Eu(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]:[...f?[R.excludeImage]:[],...p?[R.sameStructure]:[]],[R.gradeLabel]:S.map(y=>n("wordSearch.filter.grade",{n:Number(y),defaultValue:"{{n}}\uB4F1\uAE09"})),...u.partOfSpeech?{[M.partOfSpeech]:A}:{},...u.wordType?{[M.wordType]:b}:{}},vt=i.useCallback((y,I)=>{if(I===R.exclude)y===R.excludeImage?E(T=>!T):y===R.sameStructure&&g(T=>!T);else if(I===R.syllableCount)c(T=>{if(!y||y===he)return{...T,syllable:null};const L=jo(y);return{...T,syllable:T.syllable===L?null:L}});else if(I===R.gradeLabel){if(!y||y===he){w([]);return}const T=y.replace(/\D/g,"");w(L=>L.includes(T)?L.filter(K=>K!==T):[...L,T])}else if(I===M.partOfSpeech){if(!y||y===he){D([]);return}D(T=>T.includes(y)?T.filter(L=>L!==y):[...T,y])}else if(I===M.wordType){if(!y||y===he){N([]);return}N(T=>T.includes(y)?T.filter(L=>L!==y):[...T,y])}else{const T=Tu[I];if(!T)return;c(L=>u.requireSyllable?y&&y!==he?{...L,[T]:y}:L:!y||y===he||L[T]===y?{...L,[T]:null}:{...L,[T]:y})}},[R,Tu,M,u.requireSyllable]),xt=i.useCallback(y=>!u.partOfSpeech&&!u.wordType?!0:wo(y,{...u.partOfSpeech?{[M.partOfSpeech]:A}:{},...u.wordType?{[M.wordType]:b}:{}},M),[u.partOfSpeech,u.wordType,A,b,M]),Ft=i.useCallback(y=>{y!==r&&(y!=="direct"&&r!=="direct"&&c(I=>At(I,y,d.current,m.current)),a(y))},[r]),Vt=i.useCallback(()=>({composition:s,contrastCount:U,excludeNoImage:f,sameStructureOnly:p,phonemeView:r,gradeFilter:S,posFilter:A,wordTypeFilter:b}),[s,U,f,p,r,S,A,b]),$t=i.useCallback(y=>{c(y.composition),E(y.excludeNoImage),g(y.sameStructureOnly??!0),a(y.phonemeView),w(Array.isArray(y.gradeFilter)?y.gradeFilter:[]),Array.isArray(y.posFilter)&&D(y.posFilter),Array.isArray(y.wordTypeFilter)&&N(y.wordTypeFilter)},[]);return{difficulty:C,contrastCount:U,composition:s,choseong:s.cho,excludeNoImage:f,sameStructureOnly:p,gradeFilter:S,posFilter:A,wordTypeFilter:b,matchesWordAttributes:xt,poolVersion:B,filterSections:kt,filterSelected:Pt,handleFilterSelect:vt,phonemeView:r,setPhonemeView:Ft,phonemeGroupLabel:R.phonemeGroup,wordCount:j,getFilterSnapshot:Vt,restoreFilterSnapshot:$t}}function ko(e){const u=a=>a?ie(a):null,t=u(e.cho),n=u(e.jung),o=e.jong===le,l=o?null:u(e.jong),r=e.syllable!=null?wu(e.syllable):null;return!t&&!n&&!l&&!o&&!r?null:{cho:t,jung:n,jong:l,jongNone:o,syllable:r}}function Po(e,u,t,n,o,l,r=!0,a="char",s=[]){const[c,h]=i.useState({}),[C,d]=i.useState(!1),{cho:m=null,jung:f=null,jong:E=null,syllable:p=null}=n??{},g=s.length>0?s.slice().sort().join(","):"";return i.useEffect(()=>{l>0&&co(o).catch(()=>{})},[l,o]),i.useEffect(()=>{let S=!1;return d(!0),(async()=>{const w=ko({cho:m,jung:f,jong:E,syllable:p}),A=`${m??""}_${f??""}_${E??""}_${p??""}_${g}`,D={};await Promise.all(e.map(async b=>{const N=Cu[b.key];try{const k=await Ct(b.key,{difficulty:N.difficulty?u:null,contrastCount:N.difficulty?t:1,composition:N.choseong?w:null,count:5,excludeNoImage:o,sameStructureOnly:r,phonemeView:a,grade:s.length>0?s:null});k&&k.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:k,itemCount:k.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||(h(D),d(!1))})(),()=>{S=!0}},[u,t,m,f,E,p,o,r,a,l,g]),{perTypeData:c,generating:C}}function _u(){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 Me=[],Le=[],ke=[],Pe=[],Xe={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},eu={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},vo={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};let Du=null,Nt=null,fe=null;function xo({counts:e,forceRefresh:u}={}){const t=Object.assign({},vo,e||{}),n=_u(),o=Ze(new Date(`${n}T00:00:00+09:00`).getTime()-864e5),l=JSON.stringify(t);if(!u&&Nt===n&&Du===l&&fe)return Object.assign(Xe,fe.today),Object.assign(eu,fe.yesterday?.selection||{LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),{today:Xe,yesterday:eu};const r={LISTEN_IN_NOISE:ae(Me,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:ae(Le,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:ae(ke,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:ae(Pe,Math.max(0,Number(t.ORDERING_SENTENCE)||0))};let a=null;return fe&&Du===l&&fe.yesterday&&fe.yesterday.date===o&&(a=fe.yesterday.selection),a||(a={LISTEN_IN_NOISE:ae(Me,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:ae(Le,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:ae(ke,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:ae(Pe,Math.max(0,Number(t.ORDERING_SENTENCE)||0))}),Object.assign(Xe,r),Object.assign(eu,a),Nt=n,Du=l,fe={today:r,yesterday:{date:o,countsKey:l,selection:a}},{today:Xe,yesterday:eu}}let Tt=!1,ve=null;async function Fo(){try{const e={url:typeof document>"u"?require("url").pathToFileURL(__filename).href:iu&&iu.tagName.toUpperCase()==="SCRIPT"&&iu.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 Vo(){if(!Tt)return ve||(ve=(async()=>{const e=await Fo();if(!e){ve=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}const u={noise:[],short:[],long:[],order:[]};try{for(const t of Object.keys(e||{})){const n=e[t]||[];for(const o of n){const l=o,r=String(l.training_type||t),a=String(l.category_main_code||l.category_main||l.category_0||""),s=String(l.category_sub_code||l.category_sub||l.category_1||""),c=Object.assign({},l,{training_type:r,category_0:a,category_1:s});r==="LISTEN_IN_NOISE"?u.noise.push(c):r==="SHORT_STORY"?u.short.push(c):r==="LONG_STORY"?u.long.push(c):r==="ORDERING_SENTENCE"&&u.order.push(c)}}}catch{ve=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}Me.push(...u.noise),Le.push(...u.short),ke.push(...u.long),Pe.push(...u.order);try{window.dispatchEvent(new Event("speechear.data.updated"))}catch{}try{xo()}catch{}Tt=!0})(),ve)}async function $o(e=3e3){const u=Vo();return Promise.race([u,new Promise(t=>setTimeout(t,e))])}function Ho(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 Go(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 uu=ae;function Ou(e,u){const t=u?Go(Ho(u)):Math.random;return{LISTEN_IN_NOISE:uu(Me,Math.max(0,e.LISTEN_IN_NOISE||0),t),SHORT_STORY:uu(Le,Math.max(0,e.SHORT_STORY||0),t),LONG_STORY:uu(ke,Math.max(0,e.LONG_STORY||0),t),ORDERING_SENTENCE:uu(Pe,Math.max(0,e.ORDERING_SENTENCE||0),t)}}function jt(e){return e?!!(e.LISTEN_IN_NOISE?.length||e.SHORT_STORY?.length||e.LONG_STORY?.length||e.ORDERING_SENTENCE?.length):!1}const Yo={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};function It(e=!1,u=Yo,t){const n=Ze(Date.now()),o=Ze(Date.now()-864e5),l=`${t??""}|${n}`,r=`${t??""}|${o}`;return Me.length>0||Le.length>0||ke.length>0||Pe.length>0?{today:Ou(u,l),yesterday:Ou(u,r)}:{today:Ou(u,l),yesterday:null}}function Uo(e){const u=i.useRef({LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),t=i.useRef(null),[n,o]=i.useState(!1),[l,r]=i.useState(!1),[a,s]=i.useState(0),[c,h]=i.useState(!1),[C,d]=i.useState(()=>_u());i.useEffect(()=>{const f=()=>{const p=Date.now(),g=new Date(p+9*36e5),S=Date.UTC(g.getUTCFullYear(),g.getUTCMonth(),g.getUTCDate()+1)-9*36e5;return Math.max(1e3,S-p+1e3)};let E=setTimeout(function p(){d(_u()),E=setTimeout(p,f())},f());return()=>clearTimeout(E)},[]),i.useEffect(()=>{let f=!1,E,p=0;const g=40,S=()=>{E!==void 0&&(clearInterval(E),E=void 0)};let w=!1;try{const b=new URLSearchParams(window.location.search),N=b.get("forceRefresh")||b.get("force");w=N==="1"||N==="true"}catch{}const A=b=>{u.current=b.today,t.current=b.yesterday,o(!0),h(!0),s(N=>N+1),f=!0,S()},D=async()=>{if(f)return;if(!w){const N=It(!1,void 0,e);if(jt(N.today)){A(N);return}}try{await $o(3e3)}catch{}if(f)return;const b=It(w,void 0,e);if(jt(b.today)){A(b);return}++p>=g&&(o(!0),h(!1),f=!0,S())};return D(),E=setInterval(D,250),()=>{f=!0,S()}},[e,C]);const m=i.useCallback(f=>{const E=l?t.current:u.current,p=l?u.current:t.current;return E?.[f]?.length?E[f]:p?.[f]?.length?p[f]:void 0},[l,a]);return{loaded:n,hasData:c,showYesterday:l,setShowYesterday:r,getTrainingPerType:m}}const Be=[];let tu=!1;function Rt(e){if(e.key!=="Escape"||e.defaultPrevented)return;const u=Be[Be.length-1];u&&(e.stopPropagation(),u())}function Mt(e){return Be.push(e),!tu&&typeof document<"u"&&(document.addEventListener("keydown",Rt),tu=!0),()=>{const u=Be.lastIndexOf(e);u>=0&&Be.splice(u,1),Be.length===0&&tu&&typeof document<"u"&&(document.removeEventListener("keydown",Rt),tu=!1)}}function Ko(e,u=!0){const t=Lu(e);i.useEffect(()=>{if(u)return Mt(()=>{t.current?.()})},[u,t])}const Nu=(e,u)=>`${e}:${u??1}`,nu=new Map,Lt=new Set;function Wo(e,u){const[t,n]=i.useState(0),o=Array.from(new Set(e.map(l=>Nu(l.word,l.homonum)))).sort().join("|");return i.useEffect(()=>{const l=(o?o.split("|"):[]).filter(s=>!nu.has(s)&&!Lt.has(s));if(l.length===0)return;let r=!1;const a=Array.from(new Set(l.map(s=>s.slice(0,s.lastIndexOf(":")))));return u(a).then(s=>{for(const c of s)c.Meaning&&nu.set(Nu(c.Word,c.Homonum??void 0),c.Meaning);for(const c of l)nu.has(c)||Lt.add(c);r||s.length===0||n(c=>c+1)}).catch(()=>{}),()=>{r=!0}},[o,u]),i.useMemo(()=>{const l=o?o.split("|"):[],r=new Map;for(const a of l){const s=nu.get(a);s!=null&&r.set(a,s)}return r},[o,t])}function qo(){const[e,u]=i.useState(null),t=i.useCallback(l=>u(l.getBoundingClientRect()),[]),n=i.useCallback(()=>u(null),[]),o=i.useCallback(l=>{const r=l.getBoundingClientRect();u(a=>a?null:r)},[]);return{anchorRect:e,isOpen:e!=null,openAt:t,close:n,toggleAt:o}}function zo(e){const[u,t]=i.useState(null),[n,o]=i.useState(null),l=i.useRef(null);i.useEffect(()=>()=>{l.current&&clearTimeout(l.current)},[]);const r=i.useCallback((s,c)=>{l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{t(s),o(c)},e)},[e]),a=i.useCallback(()=>{l.current&&clearTimeout(l.current),t(null),o(null)},[]);return{payload:u,anchorRect:n,openAfterDelay:r,close:a}}function Jo(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 Qo(e="warning"){const[u,t]=i.useState(""),[n,o]=i.useState(e),[l,r]=i.useState(0),a=i.useCallback((C,d)=>{o(d),t(C),r(m=>m+1)},[]),s=i.useCallback(C=>a(C,"warning"),[a]),c=i.useCallback(C=>a(C,"normal"),[a]),h=i.useCallback(()=>t(""),[]);return{toastMessage:u,toastType:n,toastKey:l,showToast:a,showWarning:s,showNormal:c,clearToast:h}}const Zo=[{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."}],Xo={LISTEN_IN_NOISE:"listenInNoise",SHORT_STORY:"shortStory",LONG_STORY:"longStory",ORDERING_SENTENCE:"orderingSentence"};function el(e){return Zo.map(u=>{const t=Xo[u.key];return t?{...u,label:e(`trainingType.${t}.title`),desc:e(`trainingType.${t}.desc`)}:u})}const xe={blue:"#60A5FA",green:"#4ADE80",amber:"#FBBF24",purple:"#A78BFA",pink:"#F472B6"},Fe=xe.blue,ou=xe.green,Ve=xe.amber,lu=xe.purple,ul=xe.pink,tl=[{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:Fe,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:Fe,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:Fe,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:Fe,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:Fe,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:ou,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:ou,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:ou,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:ou,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:lu,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:lu,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:lu,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:lu,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:ul,subTitle:"\uC138 \uB2E8\uC5B4\uB97C \uB4E4\uC740 \uC21C\uC11C\uB300\uB85C \uCE74\uB4DC\uB97C \uC120\uD0DD\uD558\uC138\uC694."}]}];function nl(){const{t:e}=ce.useTranslation();return i.useMemo(()=>{const u=Object.fromEntries(el(e).map(n=>[n.key,n.label])),t={...u};return tl.flatMap(n=>n.types).forEach(n=>{t[n.key]=e(`trainingType.${n.key}.label`,{defaultValue:n.label})}),{sentence:u,all:t}},[e])}const ol="0.135.0";function ll({computeStyle:e,onScroll:u="close",onResize:t="close",ignoreOutsideClickSelector:n}){const[o,l]=i.useState(!1),[r,a]=i.useState({}),s=i.useRef(null),c=i.useRef(null),h=i.useCallback(()=>{s.current&&a(e(s.current.getBoundingClientRect()))},[e]);i.useEffect(()=>{if(!o)return;h();const m=p=>{const g=p.target;n&&g.closest?.(n)||s.current?.contains(g)||c.current?.contains(g)||l(!1)};document.addEventListener("mousedown",m);const f=p=>{c.current?.contains(p.target)||(u==="reposition"?h():u==="close"&&l(!1))};u!=="ignore"&&window.addEventListener("scroll",f,!0);const E=()=>{t==="reposition"?h():t==="close"&&l(!1)};return t!=="ignore"&&window.addEventListener("resize",E),()=>{document.removeEventListener("mousedown",m),u!=="ignore"&&window.removeEventListener("scroll",f,!0),t!=="ignore"&&window.removeEventListener("resize",E)}},[o,h,u,t,n]),i.useEffect(()=>{if(o)return Mt(()=>l(!1))},[o]);const C=i.useCallback(()=>l(m=>!m),[]),d=i.useCallback(()=>l(!1),[]);return{open:o,setOpen:l,toggle:C,close:d,style:r,triggerRef:s,menuRef:c}}function rl(e,{mode:u="playback",autoStart:t=!1,onPlaySpeaker:n,onComplete:o,playMs:l=1100,feedbackMs:r=1500}={}){const[a,s]=i.useState([]),[c,h]=i.useState(0),[C,d]=i.useState("idle"),[m,f]=i.useState(null),[E,p]=i.useState([]),[g,S]=i.useState(null),[w,A]=i.useState(0),D=i.useRef(0),b=i.useCallback(B=>{D.current=typeof B=="function"?B(D.current):B,A(D.current)},[]),N=i.useRef(n),k=i.useRef(o);i.useEffect(()=>{N.current=n,k.current=o},[n,o]);const M=i.useRef([]),O=()=>{M.current.forEach(clearTimeout),M.current=[]},F=(B,_)=>{M.current.push(setTimeout(_,B))};i.useEffect(()=>()=>O(),[]);const $=a[c]?.id??null,Y=i.useCallback(()=>{O(),d("playing"),p([]),S(null),b(0);let B=0;e.forEach((_,G)=>{F(B,()=>{h(G),f(_.id),N.current?.(_)}),F(B+1e3,()=>{f(null),p(H=>[...H,_.id])}),B+=1300}),F(B,()=>{d("done"),k.current?.({score:0,total:e.length})})},[e,b]),j=i.useCallback((B,_)=>{if(_>=B.length){d("done"),k.current?.({score:D.current,total:B.length});return}h(_),S(null),d("playing"),f(B[_].id),N.current?.(B[_]),F(l,()=>{f(null),d("waiting")})},[l]),P=i.useCallback(()=>{O();const B=v(e);s(B),b(0),p([]),j(B,0)},[e,j,b]),V=i.useCallback(()=>{u==="playback"?(s(e),Y()):P()},[u,e,Y,P]),U=i.useCallback(()=>{O(),d("idle"),f(null),p([]),S(null),h(0),b(0),s([])},[b]);i.useEffect(()=>{t?V():U()},[u,e.length,t]);const te=i.useCallback(B=>{C!=="waiting"||u==="playback"||(S(B),B===a[c]?.id&&b(_=>_+1),u==="exam"?(d("playing"),F(400,()=>j(a,c+1))):(d("feedback"),F(r,()=>j(a,c+1))))},[C,u,a,c,j,r,b]),me=u==="playback"?e.length:a.length;return{bind:{activeSpeakerId:m,playedIds:E,selectedId:g,answerId:$,showFeedback:C==="feedback",clickable:C==="waiting",onSelectSpeaker:te},index:c,total:me,score:w,phase:C,done:C==="done",start:V,reset:U}}exports.CACHE_GROUPS=Yu,exports.CORE_VERSION=ol,exports.DocumentTitleSuppressContext=vu,exports.EMPTY_COMPOSITION=Au,exports.MediaQueryOverrideContext=Mu,exports.NO_CODA=le,exports.SYLLABLE_MIN=re,exports.VAP_PAGE_SIZE_OPTIONS=Ue,exports.buildGradeSection=ft,exports.buildPartOfSpeechSection=gt,exports.buildPositionSection=mo,exports.buildSelectSection=ho,exports.buildSyllableSection=go,exports.buildWordTypeSection=ht,exports.charToPronValue=Bt,exports.convertComposition=At,exports.fmtBytes=gn,exports.lsBytes=Uu,exports.meaningKey=Nu,exports.pronToCharValue=bt,exports.syllableToFilter=wu,exports.today=Ne,exports.toggleAttributeFilter=po,exports.useAnchoredMenu=ll,exports.useCacheManagement=hn,exports.useDailyTrainingSelection=Uo,exports.useDelayedHoverAnchor=zo,exports.useDeviceManagement=An,exports.useDocumentTitle=qt,exports.useEscToClose=Ko,exports.useFontScale=Ut,exports.useHoverAnchor=qo,exports.useMediaQuery=Wt,exports.usePagedList=Jo,exports.usePasswordChange=Zt,exports.useRelativeDay=zt,exports.useSoundCompassExam=rl,exports.useTablePaging=Bn,exports.useTableSort=bn,exports.useToastState=Qo,exports.useTrainingTypeLabels=nl,exports.useVisitAllPanel=wn,exports.useVisitHistory=Sn,exports.useVisitSchedule=En,exports.useWindowEvent=ku,exports.useWordAttributeFilterKeys=dt,exports.useWordDataStats=mn,exports.useWordMeanings=Wo,exports.useWordTrainingDataGeneration=Po,exports.useWordTrainingFilter=Lo,exports.valueToJamos=ie;