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