@ihabdevteam/core 0.142.0 → 0.144.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.
- package/CHANGELOG.md +79 -0
- package/dist/components.cjs.js +185 -180
- package/dist/hooks.cjs.js +1 -1
- package/dist/i18n.cjs.js +1 -1
- package/dist/ihabdevteam-core.cjs.js +191 -186
- package/dist/ihabdevteam-core.d.ts +66 -22
- package/dist/packages/core/src/components/Badge.js +3 -1
- package/dist/packages/core/src/components/BarChart.d.ts +1 -1
- package/dist/packages/core/src/components/BarChart.js +4 -3
- package/dist/packages/core/src/components/BottomNav.js +4 -0
- package/dist/packages/core/src/components/BulkBar.js +1 -1
- package/dist/packages/core/src/components/Button.js +12 -5
- package/dist/packages/core/src/components/Calendar.js +9 -6
- package/dist/packages/core/src/components/DatePicker.js +9 -4
- package/dist/packages/core/src/components/Dialog.js +3 -1
- package/dist/packages/core/src/components/Dropdown.d.ts +3 -1
- package/dist/packages/core/src/components/Dropdown.js +10 -5
- package/dist/packages/core/src/components/FileUpload.js +3 -1
- package/dist/packages/core/src/components/FilterPanel.js +3 -2
- package/dist/packages/core/src/components/Loader.js +6 -1
- package/dist/packages/core/src/components/Pagination.js +1 -1
- package/dist/packages/core/src/components/PanelRow.js +13 -4
- package/dist/packages/core/src/components/Popup/DeviceSideTable.js +3 -1
- package/dist/packages/core/src/components/Popup/LoadTablePopup.js +5 -2
- package/dist/packages/core/src/components/Popup/Popup.d.ts +1 -1
- package/dist/packages/core/src/components/Popup/Popup.js +26 -6
- package/dist/packages/core/src/components/ProgressBar.js +1 -1
- package/dist/packages/core/src/components/SideNav.js +1 -1
- package/dist/packages/core/src/components/Slider.js +10 -1
- package/dist/packages/core/src/components/Table.js +2 -0
- package/dist/packages/core/src/components/TextField.js +3 -1
- package/dist/packages/core/src/components/Toolbar.js +3 -1
- package/dist/packages/core/src/components/Tooltip/Tooltip.js +7 -2
- package/dist/packages/core/src/components/Training/TrainingPagePopup.d.ts +1 -1
- package/dist/packages/core/src/components/Training/TrainingPagePopup.js +3 -1
- package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.js +49 -2
- package/dist/packages/core/src/components/Training/WordTablePopup.js +9 -1
- package/dist/packages/core/src/components/Training/useAudioPreview.js +28 -3
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +19 -5
- package/dist/packages/core/src/components/Word/WordTableBlock.js +5 -2
- package/dist/packages/core/src/components/Word/WordTableButton.d.ts +3 -3
- package/dist/packages/core/src/components/Word/WordTableButton.js +1 -1
- package/dist/packages/core/src/components/Word/useWordTableDisplaySettings.js +1 -1
- package/dist/packages/core/src/components/Word/wordTableBlockTypes.d.ts +2 -2
- package/dist/packages/core/src/components/Word/wordTablePrint.js +27 -8
- package/dist/packages/core/src/components/barChartData.d.ts +3 -5
- package/dist/packages/core/src/components/barChartData.js +7 -3
- package/dist/packages/core/src/components/barChartTypes.d.ts +16 -3
- package/dist/packages/core/src/components/barChartTypes.js +27 -13
- package/dist/packages/core/src/components/useCalendarMonth.js +3 -2
- package/dist/packages/core/src/components/useToastLifecycle.js +5 -0
- package/dist/packages/core/src/components.d.ts +1 -0
- package/dist/packages/core/src/hooks/focusReturn.d.ts +4 -0
- package/dist/packages/core/src/hooks/focusReturn.js +27 -0
- package/dist/packages/core/src/hooks/useVisitHistory.d.ts +2 -0
- package/dist/packages/core/src/hooks/useVisitHistory.js +5 -6
- package/dist/packages/core/src/hooks/useWordMeanings.js +6 -3
- package/dist/packages/core/src/hooks/useWordTrainingFilter.d.ts +2 -2
- package/dist/packages/core/src/hooks/useWordTrainingFilter.js +57 -17
- package/dist/packages/core/src/utils/date.d.ts +18 -0
- package/dist/packages/core/src/utils/date.js +23 -0
- package/dist/packages/core/src/utils/format.js +2 -1
- package/dist/packages/core/src/utils/imageConfig.d.ts +2 -0
- package/dist/packages/core/src/utils/imageConfig.js +34 -5
- package/dist/packages/core/src/utils/josa.js +2 -0
- package/dist/packages/core/src/utils/koreanSyllable.d.ts +5 -0
- package/dist/packages/core/src/utils/koreanSyllable.js +69 -43
- package/dist/packages/core/src/utils/phonemePairSearch.js +17 -0
- package/dist/packages/core/src/utils/timeoutSignal.d.ts +5 -0
- package/dist/packages/core/src/utils/timeoutSignal.js +12 -0
- package/dist/packages/core/src/utils/ttsConfig.js +2 -1
- package/dist/packages/core/src/utils/wordContrast.js +6 -4
- package/dist/packages/core/src/utils/wordTrainingPool.js +14 -5
- package/dist/packages/core/src/utils.d.ts +1 -1
- package/dist/packages/core/src/utils.js +1 -1
- package/dist/packages/core/src/version.d.ts +1 -1
- package/dist/packages/core/src/version.js +1 -1
- package/dist/utils.cjs.js +2 -2
- package/package.json +1 -1
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* 재료 고르기는 성능이 전부고(캐시·부분 셔플·병렬 이미지 확인), 문제 만들기는 훈련 타입마다
|
|
10
10
|
* 규칙이 다르다. 한쪽을 볼 때 다른 쪽이 끼어들지 않게 갈라 둔다.
|
|
11
11
|
*/
|
|
12
|
-
import {
|
|
12
|
+
import { getImageExistenceStats, getImageOkWordSet } from './imageConfig';
|
|
13
13
|
import { getWordPool } from './wordPool';
|
|
14
14
|
import { shuffle } from './array';
|
|
15
15
|
import { getPairIndex } from './wordPairIndex';
|
|
@@ -143,11 +143,12 @@ export function filterByCachedImage(words) {
|
|
|
143
143
|
return all;
|
|
144
144
|
}
|
|
145
145
|
// prewarm 완료 → 이미지 확인된 단어만 허용
|
|
146
|
+
// 낱말마다 '${w}_1' 열쇠를 만들어 찾던 것을 캐시 판마다 한 번 만든 집합으로(칩 한 번에 유형 수만큼 돌았다)
|
|
147
|
+
const ok = getImageOkWordSet();
|
|
146
148
|
const result = new Set();
|
|
147
|
-
for (const w of words)
|
|
148
|
-
if (
|
|
149
|
+
for (const w of words)
|
|
150
|
+
if (ok.has(w))
|
|
149
151
|
result.add(w);
|
|
150
|
-
}
|
|
151
152
|
return result;
|
|
152
153
|
}
|
|
153
154
|
// ─── buildUsablePool 캐시 ──────────────────────────────────────────────────
|
|
@@ -440,7 +441,15 @@ async function _buildUsablePool(opts) {
|
|
|
440
441
|
else if (useRandomPool) {
|
|
441
442
|
// 'random' 또는 null(difficulty:false 타입): 음운론적 제약은 없지만,
|
|
442
443
|
// 정답과 오답의 음절수는 같아야 한다(단어 길이만으로 정답을 짐작하지 못하도록) — 본 단어와 다른 단어 + 음절수(글자수) 동일
|
|
443
|
-
|
|
444
|
+
const 쓸수있음 = (other) => other !== w.w && other.length === w.w.length && pronOfWord(other) !== wPron;
|
|
445
|
+
/* 셈(fullCount — 가능 단어 수 안내)은 '오답이 하나라도 있나' 만 본다. 2.2만 후보마다 600개를 끝까지 걸러 칩 한 번에
|
|
446
|
+
300ms 넘게 멈췄다. 셈은 결과 개수만 쓰고(countUsableWords → pool.length) 오답 목록은 쓰지 않는다. */
|
|
447
|
+
if (opts.fullCount) {
|
|
448
|
+
const one = distractorPool.find(쓸수있음);
|
|
449
|
+
usable = one === undefined ? [] : [one];
|
|
450
|
+
}
|
|
451
|
+
else
|
|
452
|
+
usable = distractorPool.filter(쓸수있음);
|
|
444
453
|
}
|
|
445
454
|
else {
|
|
446
455
|
// cho/jung/jong: 발음 기반 pairIndex에서 해당 종류 대립쌍 조회(공용 엔진). 구조 필터는 후처리에서 일괄.
|
|
@@ -39,7 +39,7 @@ export { copyText } from './utils/clipboard';
|
|
|
39
39
|
export { formatPhone, normalizeDate, dateToDb, formatTimeHM, formatCount } from './utils/format';
|
|
40
40
|
export { configureTrainingCategories, getTopicTypes, getTrainingTypes } from './utils/categories';
|
|
41
41
|
export type { TopicType, TopicSubType, TrainingType, TrainingCategoryConfig } from './utils/categories';
|
|
42
|
-
export { formatYmd, formatRelativeTime, getTodayKst, toKstYmd, toKstHm, formatDateKo, formatDateLongKo, formatDatetimeKo, formatDateLocale, formatDateLongLocale } from './utils/date';
|
|
42
|
+
export { formatYmd, formatRelativeTime, getTodayKst, getTodayKstDate, kstStartOfDay, parseLocalYmd, toKstYmd, toKstHm, formatDateKo, formatDateLongKo, formatDatetimeKo, formatDateLocale, formatDateLongLocale } from './utils/date';
|
|
43
43
|
export type { FormatYmdOptions } from './utils/date';
|
|
44
44
|
export { getSavedTheme, applyTheme, initTheme } from './utils/theme';
|
|
45
45
|
export type { ThemeMode } from './utils/theme';
|
|
@@ -27,7 +27,7 @@ export { toStorageName, toBase64UrlSafe, officialSoundPath } from './utils/encod
|
|
|
27
27
|
export { copyText } from './utils/clipboard';
|
|
28
28
|
export { formatPhone, normalizeDate, dateToDb, formatTimeHM, formatCount } from './utils/format';
|
|
29
29
|
export { configureTrainingCategories, getTopicTypes, getTrainingTypes } from './utils/categories';
|
|
30
|
-
export { formatYmd, formatRelativeTime, getTodayKst, toKstYmd, toKstHm, formatDateKo, formatDateLongKo, formatDatetimeKo, formatDateLocale, formatDateLongLocale } from './utils/date';
|
|
30
|
+
export { formatYmd, formatRelativeTime, getTodayKst, getTodayKstDate, kstStartOfDay, parseLocalYmd, toKstYmd, toKstHm, formatDateKo, formatDateLongKo, formatDatetimeKo, formatDateLocale, formatDateLongLocale } from './utils/date';
|
|
31
31
|
export { getSavedTheme, applyTheme, initTheme } from './utils/theme';
|
|
32
32
|
export { getSavedFontScale, applyFontScale, initFontScale } from './utils/fontScale';
|
|
33
33
|
export { classifyPairDifficulty, firstChoseongOf, toChoseong, isAllChoseong, matchesChoseongSearch } from './utils/koreanSyllable';
|
package/dist/utils.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var Be=require("i18next"),xe=typeof document<"u"?document.currentScript:null;let We=null;const jt=1500;function Ye(){We?.\uCE58\uC6B0\uAE30(),We=null}function Ot(e,{onEnd:n,rate:t=.9}={}){if(typeof window>"u"||typeof SpeechSynthesisUtterance>"u"||!("speechSynthesis"in window)){n?.();return}const o=window.speechSynthesis;Ye();const r=()=>{Ye(),o.cancel();const u=new SpeechSynthesisUtterance(e),a=o.getVoices().find(s=>s.lang.startsWith("ko"));a&&(u.voice=a),u.rate=t,u.onend=n?function(s){try{n()}catch{}}:null,u.onerror=n?function(){try{n()}catch{}}:null,o.speak(u)};if(o.getVoices().length>0){r();return}const i=setTimeout(r,jt);o.addEventListener("voiceschanged",r,{once:!0}),We={\uCE58\uC6B0\uAE30:()=>{clearTimeout(i),o.removeEventListener("voiceschanged",r)}}}function kt(){Ye(),typeof window<"u"&&"speechSynthesis"in window&&window.speechSynthesis.cancel()}const It=/^(?:[a-z]+:)?\/\//i,En="__ihab_core_asset_base_url__";function $t(e){const n=String(e||"").trim();return n?n.replace(/\/+$/,""):""}function Pt(e){globalThis[En]=$t(e)}function Tn(){return globalThis[En]??""}function Mt(e){const n=String(e||"").trim();if(!n)return"";if(It.test(n)||n.startsWith("data:")||n.startsWith("blob:"))return n;const t=n.startsWith("/")?n:`/${n}`,o=Tn();return o?`${o}${t}`:t}const An="__ihab_core_storage_resolvers__";function Z(){return globalThis[An]??null}function vt(e){globalThis[An]=e}let He=class extends Error{constructor(n){super(`
|
|
2
2
|
[ihabdevteam-core] ${n}() \uD638\uCD9C \uC2E4\uD328 \u2014 configureStorage()\uAC00 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
|
|
3
3
|
|
|
4
4
|
\uC571 \uCD08\uAE30\uD654 \uC2DC\uC810(main.tsx \uB4F1)\uC5D0 \uC544\uB798\uC640 \uAC19\uC774 \uD55C \uBC88 \uD638\uCD9C\uD558\uC138\uC694:
|
|
@@ -17,4 +17,4 @@
|
|
|
17
17
|
\uC124\uCE58 \uBA85\uB839\uC5B4 (\uC2A4\uD1A0\uB9AC\uC9C0 SDK \uBBF8\uC124\uCE58 \uC2DC):
|
|
18
18
|
npm install @supabase/supabase-js
|
|
19
19
|
pnpm add @supabase/supabase-js
|
|
20
|
-
`),this.name="StorageNotConfiguredError"}};function $t(e){It(e)}function Mt(e,n){if(!e)return null;const t=Q();return t?.resolvePath?t.resolvePath(e,n):n?`${n}/${e}.mp3`:null}async function Tn(e){if(!e)return!1;const n=Q();if(!n)throw new He("fileExists");if(n.exists)return n.exists(e);try{return await n.resolveUrl(e)!==null}catch{return!1}}async function An(e){if(!e)return null;const n=Q();if(!n)throw new He("getSignedOrPublicUrl");try{return await n.resolveUrl(e)}catch{return null}}async function Pt(e){const n=Q();if(!n)throw new He("downloadSound");return n.download(e)}function vt(){return Q()?.noiseBaseUrl??"/sounds/noise"}function Gt(){const e=Number(Q()?.noiseFileGain);return Number.isFinite(e)&&e>0?e:1}const Ye="__ihab_core_tts_config__";function Ft(e){globalThis[Ye]=e}function xt(){return globalThis[Ye]?.urlResolver??null}function Wt(){return globalThis[Ye]?.fallbackUrlResolver??null}const Ht=new Map;function Yt(){Ht.clear()}const pn="__ihab_core_pronunciation_resolver__";function Kt(e){globalThis[pn]=e}function Ut(){return globalThis[pn]??null}let Y=null;const ue=new WeakMap,Ke=new WeakMap,Ue=new WeakMap;let wn=!1;const bn=e=>Math.max(0,Math.min(1,Number.isFinite(e)?e:0));function Vt(){if(wn||typeof document>"u")return;wn=!0;const e=()=>{try{Y&&Y.state!=="running"&&Y.resume()}catch{}};for(const n of["pointerdown","touchend","keydown"])document.addEventListener(n,e,{capture:!0,passive:!0})}function _n(){if(Y)return Y;try{const e=window.AudioContext||window.webkitAudioContext;return e?(Y=new e,Vt(),Y):null}catch{return null}}function Jt(){try{Y?.resume()}catch{}}function Ve(e,n){const t=ue.get(n);if(t)return t;try{const o=e.createMediaElementSource(n),r=e.createGain(),i=e.createAnalyser();i.fftSize=1024,i.smoothingTimeConstant=.6,r.gain.value=bn(Ke.get(n)??n.volume),o.connect(r),r.connect(i),r.connect(e.destination);try{n.volume=1}catch{}const u={gain:r,analyser:i};return ue.set(n,u),u}catch{return null}}function Bn(e){if(!e)return Promise.resolve(null);const n=ue.get(e);if(n)return Promise.resolve(n.analyser);const t=_n();if(!t)return Promise.resolve(null);if(t.state==="running")return Promise.resolve(Ve(t,e)?.analyser??null);const o=Ue.get(e);if(o)return o;const r=Promise.resolve().then(()=>t.resume()).then(()=>t.state==="running"?Ve(t,e)?.analyser??null:null).catch(()=>null).finally(()=>{Ue.delete(e)});return Ue.set(e,r),r}function qt(e){if(!e)return null;const n=ue.get(e);if(n)return n.analyser;const t=_n();return t?t.state==="running"?Ve(t,e)?.analyser??null:(Bn(e),null):null}function Qt(e,n){const t=bn(n);Ke.set(e,t);const o=ue.get(e);if(o){try{e.volume!==1&&(e.volume=1)}catch{}const r=o.gain.gain;try{const i=o.gain.context.currentTime;r.cancelScheduledValues(i),r.setTargetAtTime(t,i,.01)}catch{try{r.value=t}catch{}}return"gain"}try{e.volume=t}catch{}return"element"}function zt(e){return Ke.get(e)??e.volume}function Zt(e,n){e.getFloatTimeDomainData(n);let t=0;for(let o=0;o<n.length;o++){const r=n[o];t+=r*r}return Math.sqrt(t/n.length)}const Nn="__ihab_core_image_config__";function Xt(e){globalThis[Nn]=e}function Ln(){return globalThis[Nn]??null}const re="word_image_existence_map_v1";let $=null;const _e=new Map;function ie(){if($)return $;try{const e=typeof localStorage<"u"?localStorage.getItem(re):null;$=e?JSON.parse(e):{}}catch{$={}}return $}let Je=null;function eo(){Je||(Je=setTimeout(()=>{Je=null;try{typeof localStorage<"u"&&$&&localStorage.setItem(re,JSON.stringify($))}catch{}},200))}function Be(e,n){return`${e}_${n??1}`}async function Rn(e,n){const t=ie(),o=Be(e,n);if(o in t)return t[o];if(_e.has(o))return _e.get(o);const r=Ln();if(!r)return!1;const i=r(e,n);if(!i)return!1;const u=fetch(i,{method:"HEAD",signal:AbortSignal.timeout(8e3)}).then(a=>a.status>=500?null:a.ok,()=>null).then(a=>(_e.delete(o),a===null?!1:(t[o]=a,eo(),a)));return _e.set(o,u),u}function no(e,n){const t=ie(),o=Be(e,n);return o in t?t[o]:void 0}async function to(e,n={}){const{force:t=!1,concurrency:o=16,onProgress:r}=n,i=ie(),u=t?Array.from(new Set(e)):Array.from(new Set(e)).filter(c=>!(Be(c)in i));let a=0;if(u.length>0){let c=0;const s=Array.from({length:Math.min(o,u.length)},async()=>{for(;c<u.length;){const g=c++,l=u[g],C=Be(l);if(!t&&C in i){a++,r?.(a,u.length);continue}try{await Rn(l)}catch{}a++,r?.(a,u.length)}});await Promise.all(s)}try{typeof localStorage<"u"&&$&&localStorage.setItem(re,JSON.stringify($))}catch{}return{checked:u.length,cached:Object.keys(i).length,total:e.length}}function oo(){const e=ie(),n=Object.values(e);return n.length===0?null:{total:n.length,exists:n.filter(Boolean).length}}function uo(e){const n=ie();Object.assign(n,e);try{typeof localStorage<"u"&&localStorage.setItem(re,JSON.stringify(n))}catch{}}function ro(){$={};try{typeof localStorage<"u"&&localStorage.removeItem(re)}catch{}}const p=["\u3131","\u3132","\u3134","\u3137","\u3138","\u3139","\u3141","\u3142","\u3143","\u3145","\u3146","\u3147","\u3148","\u3149","\u314A","\u314B","\u314C","\u314D","\u314E"],_=["\u314F","\u3150","\u3151","\u3152","\u3153","\u3154","\u3155","\u3156","\u3157","\u3158","\u3159","\u315A","\u315B","\u315C","\u315D","\u315E","\u315F","\u3160","\u3161","\u3162","\u3163"],L=["","\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 m(e){if(!e)return null;const n=e.charCodeAt(0)-44032;return n<0||n>=11172?null:{cho:Math.floor(n/588),jung:Math.floor(n%588/28),jong:n%28}}function io(){const e=new Map;return n=>{let t=e.get(n);return t||(t=[...n].map(o=>m(o)),e.set(n,t)),t}}function G(e,n,t=0){return String.fromCharCode(44032+(e*21+n)*28+t)}function ao(e,n){if(!e||!n||e===n||e.length!==n.length)return"random";let t=0,o=null;for(let r=0;r<e.length;r++){const i=m(e[r]),u=m(n[r]);if(!i||!u)return"random";if(i.cho===u.cho&&i.jung===u.jung&&i.jong===u.jong)continue;t++;const a=i.cho!==u.cho,c=i.jung!==u.jung,s=i.jong!==u.jong;(a?1:0)+(c?1:0)+(s?1:0)>1?o="multi":a?o="cho":c?o="jung":o="jong"}return t!==1?"random":o==="cho"?"cho":o==="jung"?"jung":o==="jong"?"jong":"random"}function jn(e){const n=m(e[0]||"");return n?p[n.cho]:""}function On(e){return[...e].map(n=>{const t=m(n);return t?p[t.cho]:n}).join("")}function kn(e){return!!e&&[...e].every(n=>p.includes(n))}function so(e,n){return n?kn(n)?On(e).includes(n):e.toLowerCase().includes(n.toLowerCase()):!0}function Ne(e,n){if(!n)return!0;const t=[...n],o=a=>p.includes(a),r=a=>_.includes(a),i=t.map(a=>o(a)?"cho":r(a)?"jung":m(a)?"syl":"other");if(i.includes("other"))return e.toLowerCase().includes(n.toLowerCase());const u=[...e];for(let a=0;a+t.length<=u.length;a++){let c=!0;for(let s=0;s<t.length;s++){const g=u[a+s],l=i[s];if(l==="cho"){if(jn(g)!==t[s]){c=!1;break}}else if(l==="jung"){const C=m(g);if(!C||_[C.jung]!==t[s]){c=!1;break}}else{const C=m(t[s]);if(C&&C.jong===0){const h=m(g);if(!h||h.cho!==C.cho||h.jung!==C.jung){c=!1;break}}else if(g!==t[s]){c=!1;break}}}if(c)return!0}return!1}const qe={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"]},In=Object.fromEntries(Object.entries(qe).map(([e,n])=>[n.join(""),L[Number(e)]]));function lo(e,n){if(!e||!n)return!1;for(const t of e){const o=m(t);if(o&&p[o.cho]===n)return!0}return!1}function co(e,n){if(!e||!n)return!1;for(const t of e){const o=m(t);if(o&&_[o.jung]===n)return!0}return!1}function Co(e,n){if(!e||!n)return!1;for(const t of e){const o=m(t);if(!o||o.jong<=0)continue;if(L[o.jong]===n)return!0;const r=qe[o.jong];if(r&&r.includes(n))return!0}return!1}function go(e){if(!e)return 0;let n=0;for(const t of e)m(t)&&n++;return n}function fo(e){if(!e)return!1;let n=!1;for(const t of e){const o=m(t);if(o&&(n=!0,o.jong>0))return!1}return n}function ho(e,n){if(e.jong<=0)return!1;if(n.includes(L[e.jong]))return!0;const t=qe[e.jong];return!!t&&t.some(o=>n.includes(o))}function mo(e,n,t){if(!e)return!1;const o=[...e],r=i=>{const u=m(o[i]);if(!u||n.cho&&!n.cho.includes(p[u.cho])||n.jung&&!n.jung.includes(_[u.jung]))return!1;if(n.jongNone){if(u.jong>0)return!1}else if(n.jong&&!ho(u,n.jong))return!1;return!0};if(t==="head")return r(0);if(t==="tail")return r(o.length-1);if(t==="mid"){for(let i=1;i<o.length-1;i++)if(r(i))return!0;return!1}for(let i=0;i<o.length;i++)if(r(i))return!0;return!1}function $n(e){return e.includes(",")||e.includes("_")}function Mn(e){if(e==="")return[{kind:"any"}];if(e.includes("_")){const n=[...e];if(n.length>4)return[{kind:"invalid"}];const t=n[0]??"_",o=n[1]??"_";let r=n.slice(2).join("");if(r.length===2){const i=In[r];if(!i)return[{kind:"invalid"}];r=i}return[{kind:"template",cho:t,jung:o,jong:r||"_"}]}return[...e].map(n=>m(n)?{kind:"syllable",ch:n}:p.includes(n)?{kind:"cho",jamo:n}:_.includes(n)?{kind:"jung",jamo:n}:{kind:"invalid"})}function So(e,n){switch(n.kind){case"any":return!0;case"syllable":{const t=m(n.ch);if(!t)return e===n.ch;if(t.jong===0){const o=m(e);return!!o&&o.cho===t.cho&&o.jung===t.jung}return e===n.ch}case"cho":{const t=m(e);return!!t&&p[t.cho]===n.jamo}case"jung":{const t=m(e);return!!t&&_[t.jung]===n.jamo}case"template":{const t=m(e);return!(!t||n.cho!=="_"&&p[t.cho]!==n.cho||n.jung!=="_"&&_[t.jung]!==n.jung||n.jong!=="_"&&L[t.jong]!==n.jong)}case"invalid":return!1}}function Pn(e,n){const t=n.split(",").flatMap(r=>Mn(r.trim()));if(t.length===0)return!0;const o=[...e];if(o.length<t.length)return!1;for(let r=0;r+t.length<=o.length;r++)if(t.every((i,u)=>So(o[r+u],i)))return!0;return!1}function yo(e){const n=e.split(",").flatMap(i=>Mn(i.trim())),t=new Set,o=new Set,r=new Set;for(const i of n)switch(i.kind){case"cho":t.add(i.jamo);break;case"jung":o.add(i.jamo);break;case"template":i.cho!=="_"&&t.add(i.cho),i.jung!=="_"&&o.add(i.jung),i.jong!=="_"&&r.add(i.jong);break;case"syllable":{const u=m(i.ch);u&&(t.add(p[u.cho]),o.add(_[u.jung]),u.jong!==0&&r.add(L[u.jong]));break}}return t.size===0&&o.size===0&&r.size===0?null:{cho:t.size?[...t]:null,jung:o.size?[...o]:null,jong:r.size?[...r]:null}}function Eo(e){return!!m(e)||p.includes(e)||_.includes(e)}function Do(e){const n=e.trim();if(!n)return{ok:!0};for(const t of n.split(",")){const o=t.trim();if(o!==""){if(o.includes("_")){const r=[...o];if(r.length>4)return{ok:!1};const i=r[0],u=r[1],a=r.slice(2).join(""),c=i===void 0||i==="_"||p.includes(i),s=u===void 0||u==="_"||_.includes(u),g=a===""||a==="_"||L.filter(Boolean).includes(a)||!!In[a];if(c&&s&&g)continue;return{ok:!1}}if(![...o].every(Eo))return{ok:!1}}}return{ok:!0}}p.length,_.length,L.length;function To(e,n){const t=n.trim();if(!t||!/[^\s,_]/.test(t))return e;if($n(t))return e.filter(u=>Pn(u.word,t));const o=e.filter(u=>Ne(u.word,t)||Ne(u.pronunciation??"",t)),r=[...t].length,i=u=>!!u&&Ne(u.slice(0,r),t);return o.map(u=>({w:u,rank:i(u.word)||i(u.pronunciation??"")?0:1})).sort((u,a)=>u.rank-a.rank).map(u=>u.w)}const Qe="word_pair_index_v2",ze="word_pair_index_sig_v2";let M=null,ae=null;function vn(){try{if(typeof localStorage>"u")return null;const e=localStorage.getItem(Qe),n=localStorage.getItem(ze);return!e||!n?null:{index:JSON.parse(e),sig:n}}catch{return null}}function Ao(e,n){try{if(typeof localStorage>"u")return;localStorage.setItem(Qe,JSON.stringify(e)),localStorage.setItem(ze,n)}catch{}}function po(e){const n=e.map(o=>`${o.word}|${o.pron??""}`).sort();let t=0;for(const o of n)for(let r=0;r<o.length;r++)t=(t<<5)-t+o.charCodeAt(r)|0;return`${n.length}-${t}`}async function wo(e,n){const t=new Set,o=[];for(const s of e){if(!s.word||t.has(s.word))continue;const g=s.pron||s.word,l=Array.from(g).map(m);l.some(C=>C===null)||l.length===Array.from(s.word).length&&(t.add(s.word),o.push({word:s.word,syls:l}))}const r={},i=o.length,u=new Map;for(const s of o){const g=s.syls.length;u.has(g)||u.set(g,[]),u.get(g).push(s)}let a=0;const c=["cho","jung","jong"];for(const s of u.values()){const g=s[0].syls.length;for(let l=0;l<g;l++)for(const C of c){const h=new Map;for(const S of s){let y="";for(let f=0;f<g;f++){f>0&&(y+="~");const d=S.syls[f];f===l?C==="cho"?y+=`*:${d.jung}:${d.jong}`:C==="jung"?y+=`${d.cho}:*:${d.jong}`:y+=`${d.cho}:${d.jung}:*`:y+=`${d.cho}:${d.jung}:${d.jong}`}let E=h.get(y);E||(E=[],h.set(y,E)),E.push(S)}for(const S of h.values())if(!(S.length<2))for(let y=0;y<S.length;y++){const E=S[y];for(let f=y+1;f<S.length;f++){const d=S[f];E.syls[l][C]!==d.syls[l][C]&&(r[E.word]||(r[E.word]={cho:[],jung:[],jong:[]}),r[d.word]||(r[d.word]={cho:[],jung:[],jong:[]}),r[E.word][C].push(d.word),r[d.word][C].push(E.word))}}}a+=s.length,n?.(a,i),await new Promise(l=>setTimeout(l,0))}return i>0&&n?.(i,i),r}let Ze=0;async function bo(e,n={}){const t=po(e);if(!n.force){if(M&&ae===t)return M;const i=vn();if(i&&i.sig===t)return M=i.index,ae=t,M}const o=++Ze,r=await wo(e,n.onProgress);return o===Ze&&(M=r,ae=t,Ao(r,t)),r}function Gn(){if(M)return M;const e=vn();return e?(M=e.index,ae=e.sig,M):null}function _o(){Ze+=1,M=null,ae=null;try{typeof localStorage<"u"&&(localStorage.removeItem(Qe),localStorage.removeItem(ze))}catch{}}const Xe={cho:p,jung:_,jong:L},j=e=>Array.isArray(e)?e.length>0:!!e;function en(e,n){if(e.length!==n.length)return!1;for(let t=0;t<e.length;t++){const o=e[t],r=n[t];if(!(!o||!r)&&(o.cho!==r.cho&&p[o.cho]==="\u3147"!=(p[r.cho]==="\u3147")||o.jong!==r.jong&&o.jong===0!=(r.jong===0)))return!0}return!1}function Fn(e,n,t){const o=t.pronOf(e),r=t.decompOf,i=t.sameStructureOnly&&r?r(o):null,u=[];for(const a of n)a!==e&&(t.okSet&&!t.okSet.has(a)||t.pronOf(a)!==o&&(i&&r&&en(i,r(t.pronOf(a)))||u.push(a)));return u}function Bo(e,n,t){const o=n?.[e];if(!o)return[];const r=t.kind?o[t.kind]??[]:[...o.cho??[],...o.jung??[],...o.jong??[]];return Fn(e,r,t)}function No(e,n,t,o,r,i,u){const a=["cho","jung","jong"].filter(C=>j(e[C])),c={};for(const C of a){const h=e[C];c[C]=new Set(Array.isArray(h)?h:[h])}const s=r==="pron",g=new Map;for(const C of n){const h=t(i(C));if(h.some(f=>!f))continue;let S=h;if(!s&&(S=t(C),S.length!==h.length||S.some(f=>!f)))continue;const y=h.length,E=g.get(y);E?E.push({w:C,dPron:h,dPos:S}):g.set(y,[{w:C,dPron:h,dPos:S}])}const l=new Map;for(const[C,h]of g){const S=new Map,y=(E,f)=>{const d=E.dPos[f];return d!=null&&a.every(D=>c[D].has(Xe[D][d[D]]))};for(const E of h){let f;if(u==="head")f=y(E,0)?0:-1;else if(u==="tail")f=y(E,C-1)?C-1:-1;else if(u==="mid"){f=-1;for(let D=1;D<C-1;D++)if(y(E,D)){f=D;break}}else f=E.dPos.findIndex(D=>D!=null&&a.every(T=>c[T].has(Xe[T][D[T]])));if(f<0)continue;const d=S.get(f);d?d.push(E):S.set(f,[E])}for(const[E,f]of S){const d=new Set(a.map(w=>E+":"+w)),D=w=>{let B="";for(let b=0;b<C;b++){const O=w[b];for(const H of["cho","jung","jong"])B+=(d.has(b+":"+H)?"*":O[H])+"."}return B},T=new Map;for(const w of h){const B=D(w.dPron),b=T.get(B);b?b.push(w):T.set(B,[w])}for(const w of f){const B=T.get(D(w.dPron))??[],b=[];for(const O of B){if(O.w===w.w)continue;let H=!0;for(const A of a){const v=w.dPron[E][A],V=O.dPron[E][A];if(V===v){H=!1;break}if(s&&c[A].has(Xe[A][V])){H=!1;break}}H&&(o&&en(w.dPron,O.dPron)||b.push(O.w))}l.set(w.w,b)}}}return l}const Le=0,xn=1,J=2,nn=3,Lo=4,Re=5,tn=6,je=7,Ro=8,on=9,z=10,jo=11,se=12,Oo=13,le=14,Oe=15,ke=16,ce=17,ko=18,k=0,F=1,Io=3,K=4,un=5,Ce=6,P=7,N=8,Wn=9,Hn=10,Ie=11,Yn=12,rn=13,Z=15,$e=16,x=17,Kn=18,an=21,sn=27,$o=20,Mo={1:Le,2:xn,4:J,7:nn,8:Re,16:tn,17:je,19:on,20:z,22:se,23:le,24:Oe,25:ke,26:ce},Po={[Io]:[F,z],[un]:[K,se],[Wn]:[N,Le],[Hn]:[N,tn],[Ie]:[N,je],[Yn]:[N,z],[rn]:[N,ke],14:[N,ce],[Kn]:[x,z]},vo={[Ce]:J,[Z]:Re},ln={2:F,24:F,3:F,9:F,5:K,6:K,19:P,20:P,22:P,23:P,25:P,27:P,11:N,12:N,13:N,15:N,10:$e,14:x,18:x,26:x},Un={[Le]:Oe,[nn]:ke,[je]:ce,[se]:le},Vn={[Le]:xn,[nn]:Lo,[je]:Ro,[on]:z,[se]:Oo},Go=new Set([un,Hn,Ie,Yn,rn,Z,Kn]),Fo=new Set(["\uBC1F"]);function xo(e){const n=(e??"").trim();if(!n)return"";const t=[...n],o=t.map(m);if(o.some(i=>i===null))return n;const r=o;for(let i=0;i<r.length;i++){const u=r[i],a=r[i+1],c=u.jong;if(!a){u.jong=ln[u.jong]??u.jong;break}if(u.jong===k)continue;if(a.cho===jo){if(a.jung===$o){if(u.jong===P){u.jong=k,a.cho=se;continue}if(u.jong===25){u.jong=k,a.cho=le;continue}if(u.jong===rn){u.jong=N,a.cho=le;continue}}if(u.jong===sn){u.jong=k;continue}const g=vo[u.jong];if(g!==void 0){u.jong=k,a.cho=g;continue}const l=Po[u.jong];if(l){u.jong=l[0],a.cho=l[1];continue}const C=Mo[u.jong];C!==void 0&&(u.jong=k,a.cho=C);continue}if((u.jong===sn||u.jong===Ce||u.jong===Z)&&Un[a.cho]!==void 0){a.cho=Un[a.cho],u.jong=u.jong===Ce?K:u.jong===Z?N:k;continue}if((u.jong===sn||u.jong===Ce||u.jong===Z)&&a.cho===on){a.cho=z,u.jong=u.jong===Ce?K:u.jong===Z?N:k;continue}if(a.cho===ko){if(u.jong===un){u.jong=K,a.cho=le;continue}if(u.jong===Wn){u.jong=N,a.cho=Oe;continue}if(u.jong===Ie){u.jong=N,a.cho=ce;continue}const g=ln[u.jong]??u.jong;if(g===F){u.jong=k,a.cho=Oe;continue}if(g===P){u.jong=k,a.cho=ke;continue}if(g===x){u.jong=k,a.cho=ce;continue}}let s=ln[u.jong]??u.jong;c===Ie&&Fo.has(t[i])&&(s=x),u.jong=s,Vn[a.cho]!==void 0&&(s===F||s===P||s===x||Go.has(c))&&(a.cho=Vn[a.cho]),(a.cho===J||a.cho===tn)&&(u.jong===F?u.jong=an:u.jong===P?u.jong=K:u.jong===x&&(u.jong=$e)),a.cho===Re?u.jong===K?u.jong=N:u.jong===$e||u.jong===an?a.cho=J:u.jong===F?(u.jong=an,a.cho=J):u.jong===x&&(u.jong=$e,a.cho=J):u.jong===N&&a.cho===J&&(a.cho=Re)}return r.map(i=>G(i.cho,i.jung,i.jong)).join("")}const Wo={\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"};function Jn(e){return Wo[e]??e}const X=/[ㄱ-ㅎ]/,Ho=/[ㅏ-ㅣ]/;function ge(e){for(let n=e.length-1;n>=0;n--){const t=e[n],o=t.charCodeAt(0);if(o>=44032&&o<=55203||X.test(t)||Ho.test(t))return t}return null}function qn(e){const n=ge(e);if(!n)return"\uAC00";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC774":"\uAC00":X.test(n)?"\uC774":"\uAC00"}function Yo(e){return`${e}${qn(e)}`}function Qn(e){const n=ge(e);if(!n)return"\uB97C";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC744":"\uB97C":X.test(n)?"\uC744":"\uB97C"}function Ko(e){return`${e}${Qn(e)}`}function zn(e){const n=ge(e);if(!n)return"\uB294";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC740":"\uB294":X.test(n)?"\uC740":"\uB294"}function Uo(e){return`${e}${zn(e)}`}function Zn(e){const n=ge(e);if(!n)return"\uC640";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uACFC":"\uC640":X.test(n)?"\uACFC":"\uC640"}function Vo(e){return`${e}${Zn(e)}`}function Xn(e){const n=ge(e);if(!n)return"\uB85C";const t=n.charCodeAt(0);if(t>=44032&&t<=55203){const o=(t-44032)%28;return o===0||o===8?"\uB85C":"\uC73C\uB85C"}return n==="\u3139"?"\uB85C":X.test(n)?"\uC73C\uB85C":"\uB85C"}function Jo(e){return`${e}${Xn(e)}`}function qo(e,n,t){const o=e.slice(),[r]=o.splice(n,1);return o.splice(t,0,r),o}function R(e,n=Math.random){const t=e.slice();for(let o=t.length-1;o>0;o--){const r=Math.floor(n()*(o+1));[t[o],t[r]]=[t[r],t[o]]}return t}function W(e,n,t=Math.random){return!Array.isArray(e)||e.length===0||n<=0?[]:n>=e.length?R(e,t):R(e,t).slice(0,n)}const et={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"}};function Qo(e){const n=e?et[e]?.group:void 0;return n==="synthesis"||n==="deletion"||n==="substitution"?n:null}const zo=p.indexOf("\u3147"),nt={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!==zo},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}},Zo=new Set([]);function Xo(e){return e in nt}function eu(e,n){const t=nt[e];if(!t)return!0;const o=[...n];if(o.length!==t.syllables)return!1;const r=m(o[0]);return!!r&&t.syllable(r)}function nu(e){return Zo.has(e)}function tu(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uC640":"\uACFC"}function cn(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uB97C":"\uC744"}function tt(e){const n=e.charCodeAt((e.length||1)-1)||0;if(n<44032||n>55203)return"\uB85C";const t=(n-44032)%28;return t===0||t===8?"\uB85C":"\uC73C\uB85C"}function ot(e){const n=e.charAt((e.length||1)-1),t=n.charCodeAt(0)||0;return t>=44032&&t<=55203?(t-44032)%28===0?"\uAC00":"\uC774":/[ㄱ-ㅎ]/.test(n)?"\uC774":"\uAC00"}const ut={\u3131:"\uAE30\uC5ED",\u3132:"\uC30D\uAE30\uC5ED",\u3134:"\uB2C8\uC740",\u3137:"\uB514\uADFF",\u3138:"\uC30D\uB514\uADFF",\u3139:"\uB9AC\uC744",\u3141:"\uBBF8\uC74C",\u3142:"\uBE44\uC74D",\u3143:"\uC30D\uBE44\uC74D",\u3145:"\uC2DC\uC637",\u3146:"\uC30D\uC2DC\uC637",\u3147:"\uC774\uC751",\u3148:"\uC9C0\uC752",\u3149:"\uC30D\uC9C0\uC752",\u314A:"\uCE58\uC753",\u314B:"\uD0A4\uC754",\u314C:"\uD2F0\uC755",\u314D:"\uD53C\uC756",\u314E:"\uD788\uC757",\u3133:"\uAE30\uC5ED\uC2DC\uC637",\u3135:"\uB2C8\uC740\uC9C0\uC752",\u3136:"\uB2C8\uC740\uD788\uC757",\u313A:"\uB9AC\uC744\uAE30\uC5ED",\u313B:"\uB9AC\uC744\uBBF8\uC74C",\u313C:"\uB9AC\uC744\uBE44\uC74D",\u313D:"\uB9AC\uC744\uC2DC\uC637",\u313E:"\uB9AC\uC744\uD2F0\uC755",\u313F:"\uB9AC\uC744\uD53C\uC756",\u3140:"\uB9AC\uC744\uD788\uC757",\u3144:"\uBE44\uC74D\uC2DC\uC637",\u314F:"\uC544",\u3150:"\uC560",\u3151:"\uC57C",\u3152:"\uC598",\u3153:"\uC5B4",\u3154:"\uC5D0",\u3155:"\uC5EC",\u3156:"\uC608",\u3157:"\uC624",\u3158:"\uC640",\u3159:"\uC65C",\u315A:"\uC678",\u315B:"\uC694",\u315C:"\uC6B0",\u315D:"\uC6CC",\u315E:"\uC6E8",\u315F:"\uC704",\u3160:"\uC720",\u3161:"\uC73C",\u3162:"\uC758",\u3163:"\uC774"};function ou(e){if([...e].length!==1)return[e];const n=m(e);if(!n)return[e];const t=[p[n.cho],_[n.jung]];return n.jong!==0&&t.push(L[n.jong]),t}function rt(e,n=!1){const t=e.filter(Boolean);if(t.length<2)return"";const o=a=>ut[a]??a,r=t.slice(0,-1).map(a=>`"${a}"${tu(o(a))}`).join(" "),i=t[t.length-1],u=`"${i}"${cn(o(i))}`;return`${r} ${u} \uD569\uCE58\uBA74 \uC5B4\uB5A4 ${n?"\uC18C\uB9AC":"\uB2E8\uC5B4"}\uAC00 \uB418\uB098\uC694?`}function uu(e,n){return rt(n,e==="MERGE_2_PHONEMES"||e==="MERGE_3_PHONEMES")}function ru(e,n){const t=String(n?.word??n?.original??""),o=String(n?.changedFrom??""),r=String(n?.changedTo??"");return e==="CHANGE_1_PHONEME_IN_1SYLL"?`"${t}"${cn(t)} "${r}"${tt(r)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`:`"${t}"\uC5D0\uC11C "${o}"${cn(o)} "${r}"${tt(r)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`}function iu(e,n){const t=String(n?.word??n?.original??n?.base??""),o=String(n?.dropped??"");if(e==="DROP_FINAL_CONSONANT_FROM_1SYLL")return`"${t}"\uC5D0\uC11C \uBC1B\uCE68\uC774 \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`;if(e==="REMOVE_CONSONANT_AND_IDENTIFY_PHONEME"){const r=String(n?.missingConsonant??"");return`"${t}"\uC5D0\uC11C "${r}"${ot(r)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB418\uB098\uC694?`}return`"${t}"\uC5D0\uC11C "${o}"${ot(o)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`}function au(e,n,t){switch(Qo(e)){case"synthesis":return uu(e,t);case"substitution":return ru(e,n);case"deletion":return iu(e,n);default:return""}}function su(e){return e.replace(/"([ㄱ-ㅣ])"(으로|와|과|을|를|이|가|은|는|로)?/g,(n,t,o)=>{const r=ut[t];if(!r)return n;if(!o)return`"${r}"`;const i=(r.charCodeAt(r.length-1)-44032)%28,u=i!==0;let a=o;return o==="\uC640"||o==="\uACFC"?a=u?"\uACFC":"\uC640":o==="\uC744"||o==="\uB97C"?a=u?"\uC744":"\uB97C":o==="\uC774"||o==="\uAC00"?a=u?"\uC774":"\uAC00":o==="\uC740"||o==="\uB294"?a=u?"\uC740":"\uB294":(o==="\uC73C\uB85C"||o==="\uB85C")&&(a=i===0||i===8?"\uB85C":"\uC73C\uB85C"),`"${r}"${a}`})}const lu=e=>e==null?[]:Array.isArray(e)?e:[e];function it(e){if([...e].length!==1)return"";const n=m(e);if(!n)return"";const t=Jn(L[n.jong]),o=t===""?0:L.indexOf(t);return G(n.cho,n.jung,o<0?0:o)}function Cn(e,n){return n.get(e)||it(e)||e}function Me(e){return e?j(e.cho)?"cho":j(e.jung)?"jung":j(e.jong)?"jong":null:null}function q(e,n){const t=(o,r)=>!j(o)||lu(o).includes(r);return t(n.cho,p[e.cho])&&t(n.jung,_[e.jung])&&t(n.jong,L[e.jong])}function ee(e,n,t){const o=[...e];if(t!=="pron")return o.map(i=>m(i));const r=[...n.get(e)||e];return r.length!==o.length?o.map(i=>m(i)):r.map(i=>m(i))}function ne(e,n,t,o,r){const i=n==="cho"?p:n==="jung"?_:L,u=e[n],a=[],c=l=>n==="jung"?Cu(Cn(l,r)):Cn(l,r),s=new Map([[c(t),-1]]),g=R(i.map((l,C)=>C).filter(l=>l!==u&&(n!=="cho"||i[l]!=="\u3147")&&(n!=="jong"||l!==0)));for(const l of g){if(a.length>=o)break;const C=n==="cho"?G(l,e.jung,e.jong):n==="jung"?G(e.cho,l,e.jong):G(e.cho,e.jung,l),h=c(C),S=s.get(h);if(S!==void 0){n==="jung"&&S>=0&&r.has(C)&&!r.has(a[S])&&(a[S]=C);continue}s.set(h,a.length),a.push(C)}return a}const cu={\u3154:"\u3150",\u3156:"\u3152",\u315A:"\u3159",\u315E:"\u3159"};function Cu(e){if([...e].length!==1)return e;const n=m(e);if(!n)return e;const t=cu[_[n.jung]];return t?G(n.cho,_.indexOf(t),n.jong):e}function gu(e,n,t,o,r,i=null){const u=[...e];if(u.length!==2)return null;const a=u.map(l=>m(l));if(a.some(l=>!l))return null;const c=ee(e,t,o);if(c.some(l=>!l))return null;const s=Me(n);let g=s&&n?c.map((l,C)=>q(l,n)?C:-1).filter(l=>l>=0):[0,1];if(i!=null&&(g=g.filter(l=>l!==i)),!g.length)return null;for(const l of R(g)){const C=u[l];if(!r.has(C))continue;const h=ne(a[l],s??"cho",C,40,t),S=[];for(const y of h)if(y!==C&&r.has(y)&&!S.includes(y)&&S.push(y),S.length>=2)break;if(!(S.length<2))return{question:e,distractors:[C,...S]}}return null}function du(e,n,t,o,r,i=null){const u=[...e];if(u.length!==3)return null;const a=u.map(l=>m(l));if(a.some(l=>!l))return null;const c=ee(e,t,o);if(c.some(l=>!l))return null;const s=Me(n),g=s&&n?c.map((l,C)=>q(l,n)?C:-1).filter(l=>l>=0):[0,1,2];if(!g.length)return null;for(const l of R(g))for(const C of R([0,1,2].filter(h=>h!==l&&(i==null||h===i)))){const h=[0,1,2].filter(d=>d!==C),S=h.map(d=>u[d]).join("");if(!r.has(S))continue;const y=h.indexOf(l),E=ne(a[l],s??"cho",u[l],40,t),f=[];for(const d of E){const D=h.map(w=>u[w]);D[y]=d;const T=D.join("");if(T!==S&&r.has(T)&&!f.includes(T)&&f.push(T),f.length>=2)break}if(!(f.length<2))return{question:e,distractors:[S,...f]}}return null}function fu(e,n,t,o,r,i=null){const u=[...e],a=u.length;if(a<2)return null;const c=[];for(let g=1;g<=a-1;g++)c.push({remain:u.slice(0,g).join(""),dropped:u.slice(g).join(""),droppedEnd:1}),c.push({remain:u.slice(a-g).join(""),dropped:u.slice(0,a-g).join(""),droppedEnd:0});const s=Me(n);for(const{remain:g,dropped:l,droppedEnd:C}of R(c)){if(i!=null&&C!==i||g===e||!r.has(g)||!r.has(l))continue;const h=[...g],S=h.map(f=>m(f));if(S.some(f=>!f))continue;const y=ee(g,t,o);if(y.some(f=>!f))continue;const E=s&&n?y.map((f,d)=>q(f,n)?d:-1).filter(f=>f>=0):h.map((f,d)=>d);if(E.length)for(const f of R(E)){const d=ne(S[f],s??"cho",h[f],40,t),D=[];for(const T of d){const w=[...h];w[f]=T;const B=w.join("");if(B!==g&&r.has(B)&&!D.includes(B)&&D.push(B),D.length>=2)break}if(D.length>=2)return{question:e,distractors:[g,...D]}}}return null}function hu(e,n,t,o,r,i=null){if([...e].length!==1)return null;const u=m(t.get(e)||e);if(!u||u.jong===0)return null;const a=G(u.cho,u.jung,0),c=ne({cho:u.cho,jung:u.jung,jong:0},"cho",a,2,t);return c.length<2?null:{question:e,distractors:[a,...c]}}const gn=p.indexOf("\u3147");function mu(e,n,t,o,r,i=null){if([...e].length!==1)return null;const u=m(t.get(e)||e);if(!u||u.jong!==0||u.cho===gn)return null;const a=G(gn,u.jung,0),c=ne({cho:gn,jung:u.jung,jong:0},"jung",a,2,t);return c.length<2?null:{question:e,distractors:[a,...c]}}function Su(e){const n=new Map;for(const t of e){const o=[...t],r=o.length;if(!(r<2||r>3))for(let i=0;i<r;i++){let u=r+"|"+i+"|";for(let c=0;c<r;c++)u+=c===i?"*":o[c];const a=n.get(u);a?a.push(t):n.set(u,[t])}}return n}function yu(e,n,t,o,r,i=null,u=null,a=2){const c=[...e],s=c.length;if(s<2||s>3)return null;const g=c.map(d=>m(d));if(g.some(d=>!d))return null;const l=ee(e,t,o);if(l.some(d=>!d))return null;const C=d=>t.get(d)??d,h=C(e),S=!!n&&(j(n.cho)||j(n.jung)||j(n.jong)),y=!!u&&(j(u.cho)||j(u.jung)||j(u.jong)),E=d=>{let D=s+"|"+d+"|";for(let T=0;T<s;T++)D+=T===d?"*":c[T];return D};let f;if(i!=null){if(i>=s||S&&!q(l[i],n))return null;f=[i]}else S?f=l.map((d,D)=>q(d,n)?D:-1).filter(d=>d>=0):f=Array.from({length:s},(d,D)=>D);for(const d of R(f)){const D=r.get(E(d))??[],T=[],w=[];for(const A of D){if(A===e)continue;const v=[...A].map(we=>m(we)),V=g[d],Ae=v[d];if(!V||!Ae)continue;let pe=0;if(V.cho!==Ae.cho&&pe++,V.jung!==Ae.jung&&pe++,V.jong!==Ae.jong&&pe++,!(pe<a||C(A)===h))if(y){const we=ee(A,t,o)[d];we&&q(we,u)?T.push(A):w.push(A)}else T.push(A)}if(!T.length)continue;const B=R(T)[0],b=[],O=new Set([h,C(B)]),H=y?w:T.filter(A=>A!==B);for(const A of R(H)){const v=C(A);if(!O.has(v)&&(O.add(v),b.push(A),b.length>=2))break}if(!y&&b.length<2)for(const A of R(D)){if(A===e||A===B)continue;const v=C(A);if(!O.has(v)&&(O.add(v),b.push(A),b.length>=2))break}if(!(b.length<2))return{question:e,distractors:[B,...b]}}return null}const Eu=()=>{const e="\uC54C \uC218 \uC5C6\uB294 \uC624\uB958",n=typeof be?.t=="function"?be.t("common.unknownError",{defaultValue:e}):void 0;return typeof n=="string"&&n?n:e};function Du(e,n){if(n===void 0&&(n=Eu()),e instanceof Error)return e.message||n;if(typeof e=="string")return e||n;if(e&&typeof e=="object"){const t=e;for(const o of[t.message,t.error_description,t.error])if(typeof o=="string"&&o)return o}return n}const dn="\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC774 \uBD88\uC548\uC815\uD569\uB2C8\uB2E4. \uC5F0\uACB0 \uC0C1\uD0DC\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",Tu=()=>{const e=typeof be?.t=="function"?be.t("common.networkError",{defaultValue:dn}):void 0;return typeof e=="string"&&e?e:dn};function at(e){return e?/failed to fetch|load failed|networkerror|network request failed|fetcherror/i.test(e):!1}function Au(e){return at(e)?Tu():e}function pu(e,n){return e==="id"?void 0:`${e}|${n?"asc":"desc"}`}function wu(e){const[n,t]=e.split("|");return{key:n,asc:t==="asc"}}function bu(e){let n=e==null?"":String(e);return!(typeof e=="number"&&Number.isFinite(e))&&/^[=+\-@\t\r]/.test(n)&&(n=" "+n),/[",\n\r]/.test(n)?`"${n.replaceAll('"','""')}"`:n}function _u(e,n){const t=new Blob(["\uFEFF"+n],{type:"text/csv;charset=utf-8"}),o=URL.createObjectURL(t),r=document.createElement("a");r.href=o,r.download=e,r.click(),URL.revokeObjectURL(o)}const st="__ihab_core_word_pool__";function Bu(){typeof window<"u"&&window.dispatchEvent(new CustomEvent("wordpool:update"))}function Nu(e,n){const t=new Map;for(const r of e)t.set(r.word,r);const o={entries:e,pairIndex:n??null,byWord:t};globalThis[st]=o,Bu()}function lt(){return globalThis[st]??null}const te=globalThis;function fn(e,n){const t=o=>{};try{const o=n();o&&typeof o.catch=="function"&&o.catch(t)}catch(o){t(o)}}function Lu(e){te.__ihabTrainingTimeLogger=e}function Ru(e){fn("time",()=>te.__ihabTrainingTimeLogger?.(e))}function ju(e){te.__ihabTrainingCompletionLogger=e}function Ou(e){fn("completion",()=>te.__ihabTrainingCompletionLogger?.(e))}function ku(e){te.__ihabCrosswordLogger=e}function Iu(e){fn("crossword",()=>te.__ihabCrosswordLogger?.(e))}function I(e){return typeof e=="string"?e.trim()||null:typeof e=="number"?String(e):null}function ct(e){for(const n of["correct","isCorrect","heard","judgement"])if(typeof e[n]=="boolean")return e[n];return e.score===1?!0:e.score===0?!1:null}function $u(e){return Array.isArray(e)?e.map((n,t)=>{const o=n??{};return{index:t,itemId:I(o.contextCode)??I(o.itemId)??I(o.itemCode)??I(o.id),question:I(o.question)??I(o.sentence)??I(o.word)??I(o.targetSyllable),answer:I(o.answer),selected:I(o.selectedText)??I(o.selected),correct:ct(o)}}):[]}function Mu(e){return e.filter(n=>n.correct===!1)}let Ct=null,gt=null,dt=null;function Pu(e){Ct=e}function vu(e){gt=e}function Gu(e){dt=e}async function Fu(e,n){try{return await Ct?.(e,n)??null}catch{return null}}async function xu(){try{return await gt?.()??null}catch{return null}}async function Wu(e,n){try{return await dt?.(e,n)??null}catch{return null}}const Pe=globalThis;function Hu(e){Pe.__ihabNoiseSettingsStore=e}async function Yu(){try{return await Pe.__ihabNoiseSettingsStore?.load()??null}catch{return null}}function Ku(e){const n=t=>{};try{const t=Pe.__ihabNoiseSettingsStore?.save(e);t&&typeof t.catch=="function"&&t.catch(n)}catch(t){n(t)}}function Uu(e){try{Pe.__ihabNoiseSettingsStore?.applied?.(e)}catch{}}function ve(e){const n=new TextEncoder().encode(String(e).normalize("NFC"));let t="";return n.forEach(o=>{t+=o.toString(16).padStart(2,"0")}),t}const Vu=ve;function Ju(e,n){return`${e}/${ve(n)}.mp3`}function qu(e={}){const n=e.storagePrefix??"audio-cache",t=e.voice??"ko-f",o=typeof e.speed=="number"?e.speed:1,r=e.filenameSanitizer??ve;return async function(i){const u=String(i||"").trim();if(!u)return"";const a=`${r(u)}_${t}.mp3`,c=`${n}/${a}`;try{if(await Tn(c)){const s=await An(c);if(s)return s}}catch{}if(e.generator)try{const s=await e.generator(u,c,e);if(s)return s}catch{}try{const s=`/api/tts?word=${encodeURIComponent(u)}&voice=${encodeURIComponent(t)}&speed=${encodeURIComponent(String(o))}`;return await fetch(s,{method:"GET"}),`/audio-cache/${a}`}catch{return`/audio-cache/${a}`}}}async function Qu(e){if(typeof document<"u"){const n=document.activeElement;let t=null;try{if(t=document.createElement("textarea"),t.value=e,t.setAttribute("readonly",""),t.style.position="fixed",t.style.top="0",t.style.left="0",t.style.opacity="0",t.style.pointerEvents="none",document.body.appendChild(t),t.focus(),t.select(),t.setSelectionRange(0,e.length),document.execCommand("copy"))return!0}catch{}finally{if(t?.parentNode&&t.parentNode.removeChild(t),n&&n!==document.activeElement&&typeof n.focus=="function"&&n.isConnected)try{n.focus({preventScroll:!0})}catch{}}}try{if(typeof navigator<"u"&&navigator.clipboard&&typeof navigator.clipboard.writeText=="function")return await navigator.clipboard.writeText(e),!0}catch{}return!1}const oe="Asia/Seoul",de=e=>{const n=new Date(e);return Number.isNaN(n.getTime())?null:n};function zu(e){const n=de(e);return n?n.toLocaleDateString("ko-KR",{timeZone:oe,year:"numeric",month:"short",day:"numeric"}):""}function Zu(e){const n=de(e);return n?n.toLocaleString("ko-KR",{timeZone:oe,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function Xu(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US",o=de(e);return o?o.toLocaleDateString(t,{timeZone:oe,year:"numeric",month:"short",day:"numeric"}):""}function er(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US",o=de(e);return o?o.toLocaleString(t,{timeZone:oe,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function nr(e){const n=de(e);return n?n.toLocaleString("ko-KR",{timeZone:oe,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):""}function tr(e){if(e==null||e==="")return"";const n=e instanceof Date?e:new Date(e);return isNaN(n.getTime())?"":new Intl.DateTimeFormat("en-GB",{timeZone:oe,hour:"2-digit",minute:"2-digit",hour12:!1}).format(n)}function ft(){return fe(new Date)}function fe(e){if(e==null||e==="")return"";const n=e instanceof Date?e:new Date(e);return isNaN(n.getTime())?"":new Intl.DateTimeFormat("fr-CA",{timeZone:"Asia/Seoul"}).format(n)}function or(e,n){if(!e)return"";const t=new Date(e).getTime();if(Number.isNaN(t))return"";const o=Math.max(0,Math.floor((Date.now()-t)/1e3)),r=Math.floor(o/60),i=Math.floor(r/60),u=Math.floor(i/24),a=Math.floor(u/7),c=Math.floor(u/30),s=Math.floor(u/365);return r<1?n("store.time.justNow","\uBC29\uAE08 \uC804"):r<60?n("store.time.minutesAgo",{n:r}):i<24?n("store.time.hoursAgo",{n:i}):u<7?n("store.time.daysAgo",{n:u}):a<5?n("store.time.weeksAgo",{n:a}):u<365?n("store.time.monthsAgo",{n:Math.min(c,11)}):n("store.time.yearsAgo",{n:s})}function ur(e,n={}){const{sep:t=".",pad:o=!0,trailingDot:r=!1,fallback:i="\u2014"}=n;if(!e)return i;const u=fe(e instanceof Date?e:String(e));if(!u)return i;const[a,c,s]=u.split("-"),g=o?c:String(Number(c)),l=o?s:String(Number(s));return`${a}${t}${g}${t}${l}${r?".":""}`}function rr(e){const n=e.replace(/\D/g,"");if(/^(050\d|0303)/.test(n)){const o=n.slice(0,12);return o.length<=4?o:o.length<=8?`${o.slice(0,4)}-${o.slice(4)}`:`${o.slice(0,4)}-${o.slice(4,o.length-4)}-${o.slice(o.length-4)}`}if(/^1[5-9]\d{2}/.test(n)&&n.length<=8)return n.length<=4?n:`${n.slice(0,4)}-${n.slice(4)}`;const t=n.slice(0,11);return t.startsWith("02")?t.length<=2?t:t.length<=6?`${t.slice(0,2)}-${t.slice(2)}`:`${t.slice(0,2)}-${t.slice(2,t.length-4)}-${t.slice(t.length-4)}`:t.length<=3?t:t.length<=7?`${t.slice(0,3)}-${t.slice(3)}`:`${t.slice(0,3)}-${t.slice(3,t.length-4)}-${t.slice(t.length-4)}`}function ir(e){if(e){if(/^\d{4}\.\d{2}\.\d{2}$/.test(e))return e;if(/^\d{8}$/.test(e))return`${e.slice(0,4)}.${e.slice(4,6)}.${e.slice(6,8)}`;if(/^\d{4}-\d{2}-\d{2}$/.test(e))return e.replace(/-/g,".");if(/^\d{4}-\d{2}-\d{2}T/.test(e)){const n=new Date(e);return isNaN(n.getTime())?void 0:fe(n).replace(/-/g,".")}}}function ar(e){if(e)return/^\d{4}\.\d{2}\.\d{2}$/.test(e)?e.replace(/\./g,"-"):e}function sr(e,n){if(!e)return"-";const t=/^(\d{1,2}):(\d{2})$/.exec(e.trim());if(!t)return e;const o=Number(t[1]),r=Number(t[2]),i=t[1].padStart(2,"0");return r===0?n("date.timeH",{h:o,hh:i,mm:t[2]}):n("date.timeHM",{h:o,hh:i,m:r,mm:t[2]})}function lr(e){return(e??0).toLocaleString("ko-KR")}const cr=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],Cr=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uC18C\uC74C \uD658\uACBD \uC18D \uBB38\uC7A5 \uC774\uD574 \uD6C8\uB828"},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30 + 4\uBB38\uC81C"},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30 \uC2EC\uD654 \uD6C8\uB828"},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC21C\uC11C \uBC30\uC5F4 \uD6C8\uB828"}];let hn=null;function gr(e){hn=e}function dr(){return hn?.topicTypes??cr}function fr(){return hn?.trainingTypes??Cr}const ht="ihab_theme",mt="light";function St(){try{const e=localStorage.getItem(ht);if(e==="light"||e==="dark"||e==="auto")return e}catch{}return mt}function yt(e){const n=e==="light"||e==="dark"||e==="auto"?e:mt;try{document.documentElement.setAttribute("data-theme",n),localStorage.setItem(ht,n)}catch{}}function hr(){yt(St())}const Et="ihab_font_scale",mr="medium",Sr=["medium","large1","large2","large3"];function Dt(){try{const e=localStorage.getItem(Et);if(Sr.includes(e))return e}catch{}return mr}function Tt(e){try{document.documentElement.setAttribute("data-font-scale",e),localStorage.setItem(Et,e)}catch{}}function yr(){Tt(Dt())}const he=[],me=[],Se=[],ye=[],Ee={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},De={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},Er={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};let mn=null,At=null,U=null;function pt({counts:e,forceRefresh:n}={}){const t=Object.assign({},Er,e||{}),o=ft(),r=fe(new Date(`${o}T00:00:00+09:00`).getTime()-864e5),i=JSON.stringify(t);if(!n&&At===o&&mn===i&&U)return Object.assign(Ee,U.today),Object.assign(De,U.yesterday?.selection||{LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),{today:Ee,yesterday:De};const u={LISTEN_IN_NOISE:W(he,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:W(me,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:W(Se,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:W(ye,Math.max(0,Number(t.ORDERING_SENTENCE)||0))};let a=null;return U&&mn===i&&U.yesterday&&U.yesterday.date===r&&(a=U.yesterday.selection),a||(a={LISTEN_IN_NOISE:W(he,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:W(me,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:W(Se,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:W(ye,Math.max(0,Number(t.ORDERING_SENTENCE)||0))}),Object.assign(Ee,u),Object.assign(De,a),At=o,mn=i,U={today:u,yesterday:{date:r,countsKey:i,selection:a}},{today:Ee,yesterday:De}}function Dr(){return{today:Ee,yesterday:De}}function Tr(){return{LISTEN_IN_NOISE:he,SHORT_STORY:me,LONG_STORY:Se,ORDERING_SENTENCE:ye}}let Sn=!1,Te=null;async function Ar(){try{const e={url:typeof document>"u"?require("url").pathToFileURL(__filename).href:Fe&&Fe.tagName.toUpperCase()==="SCRIPT"&&Fe.src||new URL("utils.cjs.js",document.baseURI).href}&&void 0||"/",n=await fetch(`${e}data/allTrainingData.json`);return n.ok?await n.json():null}catch{return null}}async function wt(){if(!Sn)return Te||(Te=(async()=>{const e=await Ar();if(!e){Te=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}const n={noise:[],short:[],long:[],order:[]};try{for(const t of Object.keys(e||{})){const o=e[t]||[];for(const r of o){const i=r,u=String(i.training_type||t),a=String(i.category_main_code||i.category_main||i.category_0||""),c=String(i.category_sub_code||i.category_sub||i.category_1||""),s=Object.assign({},i,{training_type:u,category_0:a,category_1:c});u==="LISTEN_IN_NOISE"?n.noise.push(s):u==="SHORT_STORY"?n.short.push(s):u==="LONG_STORY"?n.long.push(s):u==="ORDERING_SENTENCE"&&n.order.push(s)}}}catch{Te=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}he.push(...n.noise),me.push(...n.short),Se.push(...n.long),ye.push(...n.order);try{window.dispatchEvent(new Event("speechear.data.updated"))}catch{}try{pt()}catch{}Sn=!0})(),Te)}function pr(){return Sn}async function wr(e=3e3){const n=wt();return Promise.race([n,new Promise(t=>setTimeout(t,e))])}const br=[{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."}],_r=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],Br={LISTEN_IN_NOISE:"listenInNoise",SHORT_STORY:"shortStory",LONG_STORY:"longStory",ORDERING_SENTENCE:"orderingSentence"};let Ge=null,bt=null,_t=null;function Nr(){const e=lt();if(e&&e.entries.length>0){const n=Gn();if(Ge&&bt===e&&_t===n)return Ge;const t=new Set,o=[];for(const r of e.entries)!r.word||t.has(r.word)||(t.add(r.word),o.push({w:r.word,s:r.syllables,p:n?.[r.word]?[...n[r.word].cho??[],...n[r.word].jung??[],...n[r.word].jong??[]]:[],pron:r.pronunciation||r.word,grade:r.grade}));return Ge=o,bt=e,_t=n,Ge}return[]}new Proxy([],{get(e,n){const t=Nr(),o=t[n];return typeof o=="function"?o.bind(t):o}});const Lr={free:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},personal_standard:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},mgr_free:{maxCustomers:5,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},none:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},lite_word:{maxCustomers:10,visitWord:!0,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!1},lite_sentence:{maxCustomers:10,visitWord:!1,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!0},lite:{maxCustomers:10,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},standard:{maxCustomers:30,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},pro:{maxCustomers:50,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0},enterprise:{maxCustomers:1/0,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!0,managerManagement:!0,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!0,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!0,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!0,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0}},Rr={none:0,free:1,personal_standard:3,mgr_free:4,lite_word:5,lite_sentence:5,lite:6,standard:7,pro:8,enterprise:9},jr={free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1},personal_standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null},mgr_free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1,trainingItemMax:5,customerMax:5,homeworkSendDaily:1},lite:{sentenceTrainingDaily:5,wordTrainingDaily:5,gameDaily:5,trainingItemMax:10,customerMax:10,homeworkSendDaily:10},standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:30,customerMax:30,homeworkSendDaily:30},pro:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:50,homeworkSendDaily:50},enterprise:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:null,homeworkSendDaily:null}};function Or(e){const n=e.toLowerCase();return n.startsWith("manager_enterprise")?"enterprise":n.startsWith("manager_pro")?"pro":n.startsWith("manager_standard")?"standard":n.startsWith("manager_lite_word")?"lite_word":n.startsWith("manager_lite_sentence")?"lite_sentence":n.startsWith("manager_lite")||n.startsWith("mgr_lite")?"lite":n.startsWith("mgr_standard")?"standard":n.startsWith("mgr_pro")?"pro":n.startsWith("content_")||n.startsWith("speechear_")||n.startsWith("light_")||n==="light"?"personal_standard":"none"}const kr=5,Ir=5;function $r({rank:e,voteCount:n,quota:t=5}){return e<t&&n>0}const Mr={selected:"ALREADY_SELECTED",added:"ALREADY_ADDED",rejected:"ALREADY_REJECTED"},Pr="0.142.0";exports.CAPABILITY=et,exports.CHOSEONG=p,exports.CORE_VERSION=Pr,exports.JONGSEONG=L,exports.JUNGSEONG=_,exports.LONG_STORIES=Se,exports.NETWORK_ERROR_MESSAGE=dn,exports.NOISE_DATAS=he,exports.ORDER_SETS=ye,exports.PLAN_FEATURES=Lr,exports.PLAN_LIMITS=jr,exports.SHORT_STORIES=me,exports.TIER_RANK=Rr,exports.TOPIC_TYPES=_r,exports.TRAINING_TYPES=br,exports.TRAINING_TYPE_I18N_KEY=Br,exports.WORD_SUGGESTION_ACCOUNT_LIMIT=Ir,exports.WORD_SUGGESTION_EXISTING_ERROR=Mr,exports.WORD_SUGGESTION_WEEKLY_QUOTA=kr,exports.applyFontScale=Tt,exports.applyTheme=yt,exports.buildChangeWholeSyllableProblem=yu,exports.buildDropCompoundProblem=fu,exports.buildDropContrast3Problem=du,exports.buildDropContrastProblem=gu,exports.buildDropFinalConsonantProblem=hu,exports.buildMultiPartPosContrast=No,exports.buildPairIndex=bo,exports.buildRemoveConsonantProblem=mu,exports.buildSyllableMaskIndex=Su,exports.bulkSetImageExistence=uo,exports.cardQuestionTitle=au,exports.checkImageExists=Rn,exports.classifyPairDifficulty=ao,exports.clearAudioExistsCache=Yt,exports.clearImageExistenceCache=ro,exports.clearPairIndexCache=_o,exports.composeSyllable=G,exports.computeDailySelection=pt,exports.configureImageResolver=Xt,exports.configureNoiseSettingsStore=Hu,exports.configurePronunciationResolver=Kt,exports.configureStorage=$t,exports.configureTTS=Ft,exports.configureTrainingCategories=gr,exports.copyText=Qu,exports.createDecompCache=io,exports.createTTSUrlResolver=qu,exports.dateToDb=ar,exports.downloadCsvText=_u,exports.downloadSound=Pt,exports.ensureTrainingDataLoaded=wr,exports.escapeCsvField=bu,exports.fileExists=Tn,exports.filterContrastCandidates=Fn,exports.finalToPhoneme=Jn,exports.firstChoseongOf=jn,exports.formatCount=lr,exports.formatDateKo=zu,exports.formatDateLocale=Xu,exports.formatDateLongKo=Zu,exports.formatDateLongLocale=er,exports.formatDatetimeKo=nr,exports.formatPhone=rr,exports.formatRelativeTime=or,exports.formatTimeHM=sr,exports.formatYmd=ur,exports.getAssetBaseUrl=En,exports.getDailySelection=Dr,exports.getElementAnalyser=qt,exports.getElementVolume=zt,exports.getErrorMessage=Du,exports.getImageExistenceStats=oo,exports.getImageExistsCached=no,exports.getImageResolver=Ln,exports.getNoiseBaseUrl=vt,exports.getNoiseFileGain=Gt,exports.getPairIndex=Gn,exports.getPlanTier=Or,exports.getPronunciationResolver=Ut,exports.getSavedFontScale=Dt,exports.getSavedTheme=St,exports.getSignedOrPublicUrl=An,exports.getTTSFallbackUrlResolver=Wt,exports.getTTSUrlResolver=xt,exports.getTodayKst=ft,exports.getTopicTypes=dr,exports.getTrainingPools=Tr,exports.getTrainingTypes=fr,exports.getWordPool=lt,exports.hasQuestionWordConstraint=Xo,exports.hasSel=j,exports.hasStructureContrast=en,exports.initFontScale=yr,exports.initTheme=hr,exports.isAllChoseong=kn,exports.isManualOnlyType=nu,exports.isNetworkErrorMessage=at,exports.isSyllablePattern=$n,exports.isThisWeekPick=$r,exports.isTrainingDataLoaded=pr,exports.isValidQuestionWord=eu,exports.itemCorrectness=ct,exports.jamoToNamesForSpeech=su,exports.loadGameLeaderboard=Wu,exports.loadMyGameRanks=xu,exports.loadNoiseSettings=Yu,exports.loadTrainingData=wt,exports.logCrossword=Iu,exports.logTrainingCompletion=Ou,exports.logTrainingTime=Ru,exports.matchSyllables=ee,exports.matchesChoseongSearch=so,exports.matchesSyllablePattern=Pn,exports.matchesWordQuery=Ne,exports.mergeQuestionText=rt,exports.minimalPairDistractors=Bo,exports.normalizeDate=ir,exports.officialSoundPath=Ju,exports.parseSortValue=wu,exports.parseSyllable=m,exports.patternToComposition=yo,exports.phonemePartsOf=ou,exports.pickEuRo=Xn,exports.pickEulReul=Qn,exports.pickEunNeun=zn,exports.pickIga=qn,exports.pickWaGwa=Zn,exports.prewarmImageCache=to,exports.primarySelPart=Me,exports.readLevel=Zt,exports.reorderArray=qo,exports.reportAppliedNoiseSettings=Uu,exports.resolveAssetUrl=kt,exports.resolveSoundPath=Mt,exports.resumeAudioMeter=Jt,exports.routeElementAudio=Bn,exports.sample=W,exports.saveNoiseSettings=Ku,exports.searchAndRankWords=To,exports.setAssetBaseUrl=Ot,exports.setCrosswordLogger=ku,exports.setElementVolume=Qt,exports.setGameLeaderboardLoader=Gu,exports.setGameRanksLoader=vu,exports.setGameScoreSubmitter=Pu,exports.setTrainingCompletionLogger=ju,exports.setTrainingTimeLogger=Lu,exports.setWordPool=Nu,exports.shuffle=R,exports.sortToValue=pu,exports.soundOf=Cn,exports.speak=Nt,exports.stopSpeaking=Lt,exports.submitGameScore=Fu,exports.syllMatchesComp=q,exports.syllableContrasts=ne,exports.syllableLength=go,exports.syllablePron=it,exports.toBase64UrlSafe=Vu,exports.toChoseong=On,exports.toItemResults=$u,exports.toKstHm=tr,exports.toKstYmd=fe,exports.toStandardPronunciation=xo,exports.toStorageName=ve,exports.toUserErrorMessage=Au,exports.validateSyllableSearchInput=Do,exports.withEuRo=Jo,exports.withEulReul=Ko,exports.withEunNeun=Uo,exports.withIga=Yo,exports.withWaGwa=Vo,exports.wordContainsChoseong=lo,exports.wordContainsJongseong=Co,exports.wordContainsJungseong=co,exports.wordHasNoCoda=fo,exports.wordHasSyllableMatching=mo,exports.wrongItems=Mu;
|
|
20
|
+
`),this.name="StorageNotConfiguredError"}};function Gt(e){vt(e)}function Ft(e,n){if(!e)return null;const t=Z();return t?.resolvePath?t.resolvePath(e,n):n?`${n}/${e}.mp3`:null}async function pn(e){if(!e)return!1;const n=Z();if(!n)throw new He("fileExists");if(n.exists)return n.exists(e);try{return await n.resolveUrl(e)!==null}catch{return!1}}async function wn(e){if(!e)return null;const n=Z();if(!n)throw new He("getSignedOrPublicUrl");try{return await n.resolveUrl(e)}catch{return null}}async function xt(e){const n=Z();if(!n)throw new He("downloadSound");return n.download(e)}function Wt(){return Z()?.noiseBaseUrl??"/sounds/noise"}function Yt(){const e=Number(Z()?.noiseFileGain);return Number.isFinite(e)&&e>0?e:1}function Ht(e){const n=AbortSignal.timeout;if(typeof n=="function")return n.call(AbortSignal,e);const t=new AbortController;return setTimeout(()=>t.abort(),e),t.signal}const Ke="__ihab_core_tts_config__";function Kt(e){globalThis[Ke]=e}function Ut(){return globalThis[Ke]?.urlResolver??null}function Vt(){return globalThis[Ke]?.fallbackUrlResolver??null}const zt=new Map;function Jt(){zt.clear()}const bn="__ihab_core_pronunciation_resolver__";function qt(e){globalThis[bn]=e}function Qt(){return globalThis[bn]??null}let K=null;const ie=new WeakMap,Ue=new WeakMap,Ve=new WeakMap;let _n=!1;const Bn=e=>Math.max(0,Math.min(1,Number.isFinite(e)?e:0));function Zt(){if(_n||typeof document>"u")return;_n=!0;const e=()=>{try{K&&K.state!=="running"&&K.resume()}catch{}};for(const n of["pointerdown","touchend","keydown"])document.addEventListener(n,e,{capture:!0,passive:!0})}function Nn(){if(K)return K;try{const e=window.AudioContext||window.webkitAudioContext;return e?(K=new e,Zt(),K):null}catch{return null}}function Xt(){try{K?.resume()}catch{}}function ze(e,n){const t=ie.get(n);if(t)return t;try{const o=e.createMediaElementSource(n),r=e.createGain(),i=e.createAnalyser();i.fftSize=1024,i.smoothingTimeConstant=.6,r.gain.value=Bn(Ue.get(n)??n.volume),o.connect(r),r.connect(i),r.connect(e.destination);try{n.volume=1}catch{}const u={gain:r,analyser:i};return ie.set(n,u),u}catch{return null}}function Ln(e){if(!e)return Promise.resolve(null);const n=ie.get(e);if(n)return Promise.resolve(n.analyser);const t=Nn();if(!t)return Promise.resolve(null);if(t.state==="running")return Promise.resolve(ze(t,e)?.analyser??null);const o=Ve.get(e);if(o)return o;const r=Promise.resolve().then(()=>t.resume()).then(()=>t.state==="running"?ze(t,e)?.analyser??null:null).catch(()=>null).finally(()=>{Ve.delete(e)});return Ve.set(e,r),r}function eo(e){if(!e)return null;const n=ie.get(e);if(n)return n.analyser;const t=Nn();return t?t.state==="running"?ze(t,e)?.analyser??null:(Ln(e),null):null}function no(e,n){const t=Bn(n);Ue.set(e,t);const o=ie.get(e);if(o){try{e.volume!==1&&(e.volume=1)}catch{}const r=o.gain.gain;try{const i=o.gain.context.currentTime;r.cancelScheduledValues(i),r.setTargetAtTime(t,i,.01)}catch{try{r.value=t}catch{}}return"gain"}try{e.volume=t}catch{}return"element"}function to(e){return Ue.get(e)??e.volume}function oo(e,n){e.getFloatTimeDomainData(n);let t=0;for(let o=0;o<n.length;o++){const r=n[o];t+=r*r}return Math.sqrt(t/n.length)}const Rn="__ihab_core_image_config__";function uo(e){globalThis[Rn]=e}function jn(){return globalThis[Rn]??null}const ae="word_image_existence_map_v1";let M=null,se=0,On=-1,le=null;const Ne=new Map;function ce(){if(M)return M;try{const e=typeof localStorage<"u"?localStorage.getItem(ae):null,n=e?JSON.parse(e):null;M=n&&typeof n=="object"&&!Array.isArray(n)?n:{}}catch{M={}}return M}let Je=null;function ro(){Je||(Je=setTimeout(()=>{Je=null;try{typeof localStorage<"u"&&M&&localStorage.setItem(ae,JSON.stringify(M))}catch{}},200))}function Le(e,n){return`${e}_${n??1}`}async function kn(e,n){const t=ce(),o=Le(e,n);if(o in t)return t[o];if(Ne.has(o))return Ne.get(o);const r=jn();if(!r)return!1;const i=r(e,n);if(!i)return!1;const u=fetch(i,{method:"HEAD",signal:Ht(8e3)}).then(a=>a.status>=500?null:a.ok,()=>null).then(a=>(Ne.delete(o),a===null?!1:(t[o]=a,se++,ro(),a)));return Ne.set(o,u),u}function io(e,n){const t=ce(),o=Le(e,n);return o in t?t[o]:void 0}async function ao(e,n={}){const{force:t=!1,concurrency:o=16,onProgress:r}=n,i=ce(),u=t?Array.from(new Set(e)):Array.from(new Set(e)).filter(s=>!(Le(s)in i));let a=0;if(u.length>0){let s=0;const c=Array.from({length:Math.min(o,u.length)},async()=>{for(;s<u.length;){const C=s++,l=u[C],g=Le(l);if(!t&&g in i){a++,r?.(a,u.length);continue}try{await kn(l)}catch{}a++,r?.(a,u.length)}});await Promise.all(c)}try{typeof localStorage<"u"&&M&&localStorage.setItem(ae,JSON.stringify(M))}catch{}return{checked:u.length,cached:Object.keys(i).length,total:e.length}}function so(){const e=ce();if(On===se)return le?{...le}:null;const n=Object.values(e);return le=n.length===0?null:{total:n.length,exists:n.filter(Boolean).length},On=se,le?{...le}:null}function lo(e){const n=ce();Object.assign(n,e),se++;try{typeof localStorage<"u"&&localStorage.setItem(ae,JSON.stringify(n))}catch{}}function co(){M={},se++;try{typeof localStorage<"u"&&localStorage.removeItem(ae)}catch{}}const p=["\u3131","\u3132","\u3134","\u3137","\u3138","\u3139","\u3141","\u3142","\u3143","\u3145","\u3146","\u3147","\u3148","\u3149","\u314A","\u314B","\u314C","\u314D","\u314E"],b=["\u314F","\u3150","\u3151","\u3152","\u3153","\u3154","\u3155","\u3156","\u3157","\u3158","\u3159","\u315A","\u315B","\u315C","\u315D","\u315E","\u315F","\u3160","\u3161","\u3162","\u3163"],B=["","\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 S(e){if(!e)return null;const n=e.charCodeAt(0)-44032;return n<0||n>=11172?null:{cho:Math.floor(n/588),jung:Math.floor(n%588/28),jong:n%28}}function Co(){const e=new Map;return n=>{let t=e.get(n);return t||(t=[...n].map(o=>S(o)),e.set(n,t)),t}}function x(e,n,t=0){return String.fromCharCode(44032+(e*21+n)*28+t)}function go(e,n){if(!e||!n||e===n||e.length!==n.length)return"random";let t=0,o=null;for(let r=0;r<e.length;r++){const i=S(e[r]),u=S(n[r]);if(!i||!u)return"random";if(i.cho===u.cho&&i.jung===u.jung&&i.jong===u.jong)continue;t++;const a=i.cho!==u.cho,s=i.jung!==u.jung,c=i.jong!==u.jong;(a?1:0)+(s?1:0)+(c?1:0)>1?o="multi":a?o="cho":s?o="jung":o="jong"}return t!==1?"random":o==="cho"?"cho":o==="jung"?"jung":o==="jong"?"jong":"random"}function In(e){const n=S(e[0]||"");return n?p[n.cho]:""}function $n(e){return[...e].map(n=>{const t=S(n);return t?p[t.cho]:n}).join("")}function Pn(e){return!!e&&[...e].every(n=>p.includes(n))}function fo(e,n){return n?(e=e.normalize("NFC"),n=n.normalize("NFC"),Pn(n)?$n(e).includes(n):e.toLowerCase().includes(n.toLowerCase())):!0}function ho(e,n){return Mn(n)(e)}function Mn(e){if(!e)return()=>!0;e=e.normalize("NFC");const n=[...e],t=u=>p.includes(u),o=u=>b.includes(u),r=n.map(u=>t(u)?"cho":o(u)?"jung":S(u)?"syl":"other"),i=n.map(u=>S(u));if(r.includes("other")){const u=e.toLowerCase();return a=>a.normalize("NFC").toLowerCase().includes(u)}return u=>{const a=[...u.normalize("NFC")];for(let s=0;s+n.length<=a.length;s++){let c=!0;for(let C=0;C<n.length;C++){const l=a[s+C],g=r[C];if(g==="cho"){if(In(l)!==n[C]){c=!1;break}}else if(g==="jung"){const h=S(l);if(!h||b[h.jung]!==n[C]){c=!1;break}}else{const h=i[C];if(h&&h.jong===0){const m=S(l);if(!m||m.cho!==h.cho||m.jung!==h.jung){c=!1;break}}else if(l!==n[C]){c=!1;break}}}if(c)return!0}return!1}}const qe={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"]},vn=Object.fromEntries(Object.entries(qe).map(([e,n])=>[n.join(""),B[Number(e)]]));function mo(e,n){if(!e||!n)return!1;for(const t of e){const o=S(t);if(o&&p[o.cho]===n)return!0}return!1}function So(e,n){if(!e||!n)return!1;for(const t of e){const o=S(t);if(o&&b[o.jung]===n)return!0}return!1}function yo(e,n){if(!e||!n)return!1;for(const t of e){const o=S(t);if(!o||o.jong<=0)continue;if(B[o.jong]===n)return!0;const r=qe[o.jong];if(r&&r.includes(n))return!0}return!1}function Do(e){if(!e)return 0;let n=0;for(const t of e)S(t)&&n++;return n}function Eo(e){if(!e)return!1;let n=!1;for(const t of e){const o=S(t);if(o&&(n=!0,o.jong>0))return!1}return n}function To(e,n){if(e.jong<=0)return!1;if(n.includes(B[e.jong]))return!0;const t=qe[e.jong];return!!t&&t.some(o=>n.includes(o))}function Ao(e,n,t){if(!e)return!1;const o=[...e],r=i=>{const u=S(o[i]);if(!u||n.cho&&!n.cho.includes(p[u.cho])||n.jung&&!n.jung.includes(b[u.jung]))return!1;if(n.jongNone){if(u.jong>0)return!1}else if(n.jong&&!To(u,n.jong))return!1;return!0};if(t==="head")return r(0);if(t==="tail")return r(o.length-1);if(t==="mid"){for(let i=1;i<o.length-1;i++)if(r(i))return!0;return!1}for(let i=0;i<o.length;i++)if(r(i))return!0;return!1}function Gn(e){return e.includes(",")||e.includes("_")}function Fn(e){if(e==="")return[{kind:"any"}];if(e.includes("_")){const n=[...e];if(n.length>4)return[{kind:"invalid"}];const t=n[0]??"_",o=n[1]??"_";let r=n.slice(2).join("");if(r.length===2){const i=vn[r];if(!i)return[{kind:"invalid"}];r=i}return[{kind:"template",cho:t,jung:o,jong:r||"_"}]}return[...e].map(n=>S(n)?{kind:"syllable",ch:n}:p.includes(n)?{kind:"cho",jamo:n}:b.includes(n)?{kind:"jung",jamo:n}:{kind:"invalid"})}function po(e,n){switch(n.kind){case"any":return!0;case"syllable":{const t=S(n.ch);if(!t)return e===n.ch;if(t.jong===0){const o=S(e);return!!o&&o.cho===t.cho&&o.jung===t.jung}return e===n.ch}case"cho":{const t=S(e);return!!t&&p[t.cho]===n.jamo}case"jung":{const t=S(e);return!!t&&b[t.jung]===n.jamo}case"template":{const t=S(e);return!(!t||n.cho!=="_"&&p[t.cho]!==n.cho||n.jung!=="_"&&b[t.jung]!==n.jung||n.jong!=="_"&&B[t.jong]!==n.jong)}case"invalid":return!1}}function xn(e,n){e=e.normalize("NFC"),n=n.normalize("NFC");const t=n.split(",").flatMap(r=>Fn(r.trim()));if(t.length===0)return!0;const o=[...e];if(o.length<t.length)return!1;for(let r=0;r+t.length<=o.length;r++)if(t.every((i,u)=>po(o[r+u],i)))return!0;return!1}function wo(e){const n=e.split(",").flatMap(i=>Fn(i.trim())),t=new Set,o=new Set,r=new Set;for(const i of n)switch(i.kind){case"cho":t.add(i.jamo);break;case"jung":o.add(i.jamo);break;case"template":i.cho!=="_"&&t.add(i.cho),i.jung!=="_"&&o.add(i.jung),i.jong!=="_"&&r.add(i.jong);break;case"syllable":{const u=S(i.ch);u&&(t.add(p[u.cho]),o.add(b[u.jung]),u.jong!==0&&r.add(B[u.jong]));break}}return t.size===0&&o.size===0&&r.size===0?null:{cho:t.size?[...t]:null,jung:o.size?[...o]:null,jong:r.size?[...r]:null}}function bo(e){return!!S(e)||p.includes(e)||b.includes(e)}function _o(e){const n=e.normalize("NFC").trim();if(!n)return{ok:!0};for(const t of n.split(",")){const o=t.trim();if(o!==""){if(o.includes("_")){const r=[...o];if(r.length>4)return{ok:!1};const i=r[0],u=r[1],a=r.slice(2).join(""),s=i===void 0||i==="_"||p.includes(i),c=u===void 0||u==="_"||b.includes(u),C=a===""||a==="_"||B.filter(Boolean).includes(a)||!!vn[a];if(s&&c&&C)continue;return{ok:!1}}if(![...o].every(bo))return{ok:!1}}}return{ok:!0}}p.length,b.length,B.length;function Bo(e,n){const t=n.normalize("NFC").trim();if(!t||!/[^\s,_]/.test(t))return e;if(Gn(t))return e.filter(s=>xn(s.word,t));const o=Mn(t),r=[...t].length,i=s=>!!s&&o(s.normalize("NFC").slice(0,r)),u=[],a=[];for(const s of e)(o(s.word)||o(s.pronunciation??""))&&(i(s.word)||i(s.pronunciation??"")?u:a).push(s);return u.concat(a)}const Qe="word_pair_index_v2",Ze="word_pair_index_sig_v2";let v=null,Ce=null;function Wn(){try{if(typeof localStorage>"u")return null;const e=localStorage.getItem(Qe),n=localStorage.getItem(Ze);return!e||!n?null:{index:JSON.parse(e),sig:n}}catch{return null}}function No(e,n){try{if(typeof localStorage>"u")return;localStorage.setItem(Qe,JSON.stringify(e)),localStorage.setItem(Ze,n)}catch{}}function Lo(e){const n=e.map(o=>`${o.word}|${o.pron??""}`).sort();let t=0;for(const o of n)for(let r=0;r<o.length;r++)t=(t<<5)-t+o.charCodeAt(r)|0;return`${n.length}-${t}`}async function Ro(e,n){const t=new Set,o=[];for(const c of e){if(!c.word||t.has(c.word))continue;const C=c.pron||c.word,l=Array.from(C).map(S);l.some(g=>g===null)||l.length===Array.from(c.word).length&&(t.add(c.word),o.push({word:c.word,syls:l}))}const r={},i=o.length,u=new Map;for(const c of o){const C=c.syls.length;u.has(C)||u.set(C,[]),u.get(C).push(c)}let a=0;const s=["cho","jung","jong"];for(const c of u.values()){const C=c[0].syls.length;for(let l=0;l<C;l++)for(const g of s){const h=new Map;for(const m of c){let y="";for(let f=0;f<C;f++){f>0&&(y+="~");const d=m.syls[f];f===l?g==="cho"?y+=`*:${d.jung}:${d.jong}`:g==="jung"?y+=`${d.cho}:*:${d.jong}`:y+=`${d.cho}:${d.jung}:*`:y+=`${d.cho}:${d.jung}:${d.jong}`}let D=h.get(y);D||(D=[],h.set(y,D)),D.push(m)}for(const m of h.values())if(!(m.length<2))for(let y=0;y<m.length;y++){const D=m[y];for(let f=y+1;f<m.length;f++){const d=m[f];D.syls[l][g]!==d.syls[l][g]&&(r[D.word]||(r[D.word]={cho:[],jung:[],jong:[]}),r[d.word]||(r[d.word]={cho:[],jung:[],jong:[]}),r[D.word][g].push(d.word),r[d.word][g].push(D.word))}}}a+=c.length,n?.(a,i),await new Promise(l=>setTimeout(l,0))}return i>0&&n?.(i,i),r}let Xe=0;async function jo(e,n={}){const t=Lo(e);if(!n.force){if(v&&Ce===t)return v;const i=Wn();if(i&&i.sig===t)return v=i.index,Ce=t,v}const o=++Xe,r=await Ro(e,n.onProgress);return o===Xe&&(v=r,Ce=t,No(r,t)),r}function Yn(){if(v)return v;const e=Wn();return e?(v=e.index,Ce=e.sig,v):null}function Oo(){Xe+=1,v=null,Ce=null;try{typeof localStorage<"u"&&(localStorage.removeItem(Qe),localStorage.removeItem(Ze))}catch{}}const en={cho:p,jung:b,jong:B},O=e=>Array.isArray(e)?e.length>0:!!e;function nn(e,n){if(e.length!==n.length)return!1;for(let t=0;t<e.length;t++){const o=e[t],r=n[t];if(!(!o||!r)&&(o.cho!==r.cho&&p[o.cho]==="\u3147"!=(p[r.cho]==="\u3147")||o.jong!==r.jong&&o.jong===0!=(r.jong===0)))return!0}return!1}function Hn(e,n,t){const o=t.pronOf(e),r=t.decompOf,i=t.sameStructureOnly&&r?r(o):null,u=[];for(const a of n)a!==e&&(t.okSet&&!t.okSet.has(a)||t.pronOf(a)!==o&&(i&&r&&nn(i,r(t.pronOf(a)))||u.push(a)));return u}function ko(e,n,t){const o=n?.[e];if(!o)return[];const r=t.kind?o[t.kind]??[]:[...o.cho??[],...o.jung??[],...o.jong??[]];return Hn(e,r,t)}function Io(e,n,t,o,r,i,u){const a=["cho","jung","jong"].filter(g=>O(e[g])),s={};for(const g of a){const h=e[g];s[g]=new Set(Array.isArray(h)?h:[h])}const c=r==="pron",C=new Map;for(const g of n){const h=t(i(g));if(h.some(f=>!f))continue;let m=h;if(!c&&(m=t(g),m.length!==h.length||m.some(f=>!f)))continue;const y=h.length,D=C.get(y);D?D.push({w:g,dPron:h,dPos:m}):C.set(y,[{w:g,dPron:h,dPos:m}])}const l=new Map;for(const[g,h]of C){const m=new Map,y=(D,f)=>{const d=D.dPos[f];return d!=null&&a.every(E=>s[E].has(en[E][d[E]]))};for(const D of h){let f;if(u==="head")f=y(D,0)?0:-1;else if(u==="tail")f=y(D,g-1)?g-1:-1;else if(u==="mid"){f=-1;for(let E=1;E<g-1;E++)if(y(D,E)){f=E;break}}else f=D.dPos.findIndex(E=>E!=null&&a.every(A=>s[A].has(en[A][E[A]])));if(f<0)continue;const d=m.get(f);d?d.push(D):m.set(f,[D])}for(const[D,f]of m){const d=a.includes("cho"),E=a.includes("jung"),A=a.includes("jong"),P=w=>{let L="";for(let j=0;j<g;j++){const T=w[j];j===D?L+=(d?"*":T.cho)+"."+(E?"*":T.jung)+"."+(A?"*":T.jong)+".":L+=T.cho+"."+T.jung+"."+T.jong+"."}return L},N=new Map;for(const w of h){const L=P(w.dPron),j=N.get(L);j?j.push(w):N.set(L,[w])}for(const w of f){const L=N.get(P(w.dPron))??[],j=[];for(const T of L){if(T.w===w.w)continue;let k=!0;for(const F of a){const Q=w.dPron[D][F],z=T.dPron[D][F];if(z===Q){k=!1;break}if(c&&s[F].has(en[F][z])){k=!1;break}}k&&(o&&nn(w.dPron,T.dPron)||j.push(T.w))}l.set(w.w,j)}}}return l}const Re=0,Kn=1,J=2,tn=3,$o=4,je=5,on=6,Oe=7,Po=8,un=9,X=10,Mo=11,ge=12,vo=13,de=14,ke=15,Ie=16,fe=17,Go=18,I=0,W=1,Fo=3,U=4,rn=5,he=6,G=7,_=8,Un=9,Vn=10,$e=11,zn=12,an=13,ee=15,Pe=16,Y=17,Jn=18,sn=21,ln=27,xo=20,Wo={1:Re,2:Kn,4:J,7:tn,8:je,16:on,17:Oe,19:un,20:X,22:ge,23:de,24:ke,25:Ie,26:fe},Yo={[Fo]:[W,X],[rn]:[U,ge],[Un]:[_,Re],[Vn]:[_,on],[$e]:[_,Oe],[zn]:[_,X],[an]:[_,Ie],14:[_,fe],[Jn]:[Y,X]},Ho={[he]:J,[ee]:je},cn={2:W,24:W,3:W,9:W,5:U,6:U,19:G,20:G,22:G,23:G,25:G,27:G,11:_,12:_,13:_,15:_,10:Pe,14:Y,18:Y,26:Y},qn={[Re]:ke,[tn]:Ie,[Oe]:fe,[ge]:de},Qn={[Re]:Kn,[tn]:$o,[Oe]:Po,[un]:X,[ge]:vo},Ko=new Set([rn,Vn,$e,zn,an,ee,Jn]),Uo=new Set(["\uBC1F"]);function Vo(e){const n=(e??"").trim();if(!n)return"";const t=[...n],o=t.map(S);if(o.some(i=>i===null))return n;const r=o;for(let i=0;i<r.length;i++){const u=r[i],a=r[i+1],s=u.jong;if(!a){u.jong=cn[u.jong]??u.jong;break}if(u.jong===I)continue;if(a.cho===Mo){if(a.jung===xo){if(u.jong===G){u.jong=I,a.cho=ge;continue}if(u.jong===25){u.jong=I,a.cho=de;continue}if(u.jong===an){u.jong=_,a.cho=de;continue}}if(u.jong===ln){u.jong=I;continue}const C=Ho[u.jong];if(C!==void 0){u.jong=I,a.cho=C;continue}const l=Yo[u.jong];if(l){u.jong=l[0],a.cho=l[1];continue}const g=Wo[u.jong];g!==void 0&&(u.jong=I,a.cho=g);continue}if((u.jong===ln||u.jong===he||u.jong===ee)&&qn[a.cho]!==void 0){a.cho=qn[a.cho],u.jong=u.jong===he?U:u.jong===ee?_:I;continue}if((u.jong===ln||u.jong===he||u.jong===ee)&&a.cho===un){a.cho=X,u.jong=u.jong===he?U:u.jong===ee?_:I;continue}if(a.cho===Go){if(u.jong===rn){u.jong=U,a.cho=de;continue}if(u.jong===Un){u.jong=_,a.cho=ke;continue}if(u.jong===$e){u.jong=_,a.cho=fe;continue}const C=cn[u.jong]??u.jong;if(C===W){u.jong=I,a.cho=ke;continue}if(C===G){u.jong=I,a.cho=Ie;continue}if(C===Y){u.jong=I,a.cho=fe;continue}}let c=cn[u.jong]??u.jong;s===$e&&Uo.has(t[i])&&(c=Y),u.jong=c,Qn[a.cho]!==void 0&&(c===W||c===G||c===Y||Ko.has(s))&&(a.cho=Qn[a.cho]),(a.cho===J||a.cho===on)&&(u.jong===W?u.jong=sn:u.jong===G?u.jong=U:u.jong===Y&&(u.jong=Pe)),a.cho===je?u.jong===U?u.jong=_:u.jong===Pe||u.jong===sn?a.cho=J:u.jong===W?(u.jong=sn,a.cho=J):u.jong===Y&&(u.jong=Pe,a.cho=J):u.jong===_&&a.cho===J&&(a.cho=je)}return r.map(i=>x(i.cho,i.jung,i.jong)).join("")}const zo={\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"};function Zn(e){return zo[e]??e}const ne=/[ㄱ-ㅎ]/,Jo=/[ㅏ-ㅣ]/;function me(e){e=e.normalize("NFC");for(let n=e.length-1;n>=0;n--){const t=e[n],o=t.charCodeAt(0);if(o>=44032&&o<=55203||ne.test(t)||Jo.test(t))return t}return null}function Xn(e){const n=me(e);if(!n)return"\uAC00";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC774":"\uAC00":ne.test(n)?"\uC774":"\uAC00"}function qo(e){return`${e}${Xn(e)}`}function et(e){const n=me(e);if(!n)return"\uB97C";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC744":"\uB97C":ne.test(n)?"\uC744":"\uB97C"}function Qo(e){return`${e}${et(e)}`}function nt(e){const n=me(e);if(!n)return"\uB294";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC740":"\uB294":ne.test(n)?"\uC740":"\uB294"}function Zo(e){return`${e}${nt(e)}`}function tt(e){const n=me(e);if(!n)return"\uC640";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uACFC":"\uC640":ne.test(n)?"\uACFC":"\uC640"}function Xo(e){return`${e}${tt(e)}`}function ot(e){const n=me(e);if(!n)return"\uB85C";const t=n.charCodeAt(0);if(t>=44032&&t<=55203){const o=(t-44032)%28;return o===0||o===8?"\uB85C":"\uC73C\uB85C"}return n==="\u3139"?"\uB85C":ne.test(n)?"\uC73C\uB85C":"\uB85C"}function eu(e){return`${e}${ot(e)}`}function nu(e,n,t){const o=e.slice(),[r]=o.splice(n,1);return o.splice(t,0,r),o}function R(e,n=Math.random){const t=e.slice();for(let o=t.length-1;o>0;o--){const r=Math.floor(n()*(o+1));[t[o],t[r]]=[t[r],t[o]]}return t}function H(e,n,t=Math.random){return!Array.isArray(e)||e.length===0||n<=0?[]:n>=e.length?R(e,t):R(e,t).slice(0,n)}const ut={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"}};function tu(e){const n=e?ut[e]?.group:void 0;return n==="synthesis"||n==="deletion"||n==="substitution"?n:null}const ou=p.indexOf("\u3147"),rt={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!==ou},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}},uu=new Set([]);function ru(e){return e in rt}function iu(e,n){const t=rt[e];if(!t)return!0;const o=[...n];if(o.length!==t.syllables)return!1;const r=S(o[0]);return!!r&&t.syllable(r)}function au(e){return uu.has(e)}function su(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uC640":"\uACFC"}function Cn(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uB97C":"\uC744"}function it(e){const n=e.charCodeAt((e.length||1)-1)||0;if(n<44032||n>55203)return"\uB85C";const t=(n-44032)%28;return t===0||t===8?"\uB85C":"\uC73C\uB85C"}function at(e){const n=e.charAt((e.length||1)-1),t=n.charCodeAt(0)||0;return t>=44032&&t<=55203?(t-44032)%28===0?"\uAC00":"\uC774":/[ㄱ-ㅎ]/.test(n)?"\uC774":"\uAC00"}const st={\u3131:"\uAE30\uC5ED",\u3132:"\uC30D\uAE30\uC5ED",\u3134:"\uB2C8\uC740",\u3137:"\uB514\uADFF",\u3138:"\uC30D\uB514\uADFF",\u3139:"\uB9AC\uC744",\u3141:"\uBBF8\uC74C",\u3142:"\uBE44\uC74D",\u3143:"\uC30D\uBE44\uC74D",\u3145:"\uC2DC\uC637",\u3146:"\uC30D\uC2DC\uC637",\u3147:"\uC774\uC751",\u3148:"\uC9C0\uC752",\u3149:"\uC30D\uC9C0\uC752",\u314A:"\uCE58\uC753",\u314B:"\uD0A4\uC754",\u314C:"\uD2F0\uC755",\u314D:"\uD53C\uC756",\u314E:"\uD788\uC757",\u3133:"\uAE30\uC5ED\uC2DC\uC637",\u3135:"\uB2C8\uC740\uC9C0\uC752",\u3136:"\uB2C8\uC740\uD788\uC757",\u313A:"\uB9AC\uC744\uAE30\uC5ED",\u313B:"\uB9AC\uC744\uBBF8\uC74C",\u313C:"\uB9AC\uC744\uBE44\uC74D",\u313D:"\uB9AC\uC744\uC2DC\uC637",\u313E:"\uB9AC\uC744\uD2F0\uC755",\u313F:"\uB9AC\uC744\uD53C\uC756",\u3140:"\uB9AC\uC744\uD788\uC757",\u3144:"\uBE44\uC74D\uC2DC\uC637",\u314F:"\uC544",\u3150:"\uC560",\u3151:"\uC57C",\u3152:"\uC598",\u3153:"\uC5B4",\u3154:"\uC5D0",\u3155:"\uC5EC",\u3156:"\uC608",\u3157:"\uC624",\u3158:"\uC640",\u3159:"\uC65C",\u315A:"\uC678",\u315B:"\uC694",\u315C:"\uC6B0",\u315D:"\uC6CC",\u315E:"\uC6E8",\u315F:"\uC704",\u3160:"\uC720",\u3161:"\uC73C",\u3162:"\uC758",\u3163:"\uC774"};function lu(e){if([...e].length!==1)return[e];const n=S(e);if(!n)return[e];const t=[p[n.cho],b[n.jung]];return n.jong!==0&&t.push(B[n.jong]),t}function lt(e,n=!1){const t=e.filter(Boolean);if(t.length<2)return"";const o=a=>st[a]??a,r=t.slice(0,-1).map(a=>`"${a}"${su(o(a))}`).join(" "),i=t[t.length-1],u=`"${i}"${Cn(o(i))}`;return`${r} ${u} \uD569\uCE58\uBA74 \uC5B4\uB5A4 ${n?"\uC18C\uB9AC":"\uB2E8\uC5B4"}\uAC00 \uB418\uB098\uC694?`}function cu(e,n){return lt(n,e==="MERGE_2_PHONEMES"||e==="MERGE_3_PHONEMES")}function Cu(e,n){const t=String(n?.word??n?.original??""),o=String(n?.changedFrom??""),r=String(n?.changedTo??"");return e==="CHANGE_1_PHONEME_IN_1SYLL"?`"${t}"${Cn(t)} "${r}"${it(r)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`:`"${t}"\uC5D0\uC11C "${o}"${Cn(o)} "${r}"${it(r)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`}function gu(e,n){const t=String(n?.word??n?.original??n?.base??""),o=String(n?.dropped??"");if(e==="DROP_FINAL_CONSONANT_FROM_1SYLL")return`"${t}"\uC5D0\uC11C \uBC1B\uCE68\uC774 \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`;if(e==="REMOVE_CONSONANT_AND_IDENTIFY_PHONEME"){const r=String(n?.missingConsonant??"");return`"${t}"\uC5D0\uC11C "${r}"${at(r)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB418\uB098\uC694?`}return`"${t}"\uC5D0\uC11C "${o}"${at(o)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`}function du(e,n,t){switch(tu(e)){case"synthesis":return cu(e,t);case"substitution":return Cu(e,n);case"deletion":return gu(e,n);default:return""}}function fu(e){return e.replace(/"([ㄱ-ㅣ])"(으로|와|과|을|를|이|가|은|는|로)?/g,(n,t,o)=>{const r=st[t];if(!r)return n;if(!o)return`"${r}"`;const i=(r.charCodeAt(r.length-1)-44032)%28,u=i!==0;let a=o;return o==="\uC640"||o==="\uACFC"?a=u?"\uACFC":"\uC640":o==="\uC744"||o==="\uB97C"?a=u?"\uC744":"\uB97C":o==="\uC774"||o==="\uAC00"?a=u?"\uC774":"\uAC00":o==="\uC740"||o==="\uB294"?a=u?"\uC740":"\uB294":(o==="\uC73C\uB85C"||o==="\uB85C")&&(a=i===0||i===8?"\uB85C":"\uC73C\uB85C"),`"${r}"${a}`})}const hu=e=>e==null?[]:Array.isArray(e)?e:[e];function ct(e){if([...e].length!==1)return"";const n=S(e);if(!n)return"";const t=Zn(B[n.jong]),o=t===""?0:B.indexOf(t);return x(n.cho,n.jung,o<0?0:o)}function gn(e,n){return n.get(e)||ct(e)||e}function Me(e){return e?O(e.cho)?"cho":O(e.jung)?"jung":O(e.jong)?"jong":null:null}function q(e,n){const t=(o,r)=>!O(o)||hu(o).includes(r);return t(n.cho,p[e.cho])&&t(n.jung,b[e.jung])&&t(n.jong,B[e.jong])}function te(e,n,t){const o=[...e];if(t!=="pron")return o.map(i=>S(i));const r=[...n.get(e)||e];return r.length!==o.length?o.map(i=>S(i)):r.map(i=>S(i))}function oe(e,n,t,o,r){const i=n==="cho"?p:n==="jung"?b:B,u=e[n],a=[],s=l=>n==="jung"?Su(gn(l,r)):gn(l,r),c=new Map([[s(t),-1]]),C=R(i.map((l,g)=>g).filter(l=>l!==u&&(n!=="cho"||i[l]!=="\u3147")&&(n!=="jong"||l!==0)));for(const l of C){if(a.length>=o)break;const g=n==="cho"?x(l,e.jung,e.jong):n==="jung"?x(e.cho,l,e.jong):x(e.cho,e.jung,l),h=s(g),m=c.get(h);if(m!==void 0){n==="jung"&&m>=0&&r.has(g)&&!r.has(a[m])&&(a[m]=g);continue}c.set(h,a.length),a.push(g)}return a}const mu={\u3154:"\u3150",\u3156:"\u3152",\u315A:"\u3159",\u315E:"\u3159"};function Su(e){if([...e].length!==1)return e;const n=S(e);if(!n)return e;const t=mu[b[n.jung]];return t?x(n.cho,b.indexOf(t),n.jong):e}function yu(e,n,t,o,r,i=null){const u=[...e];if(u.length!==2)return null;const a=u.map(l=>S(l));if(a.some(l=>!l))return null;const s=te(e,t,o);if(s.some(l=>!l))return null;const c=Me(n);let C=c&&n?s.map((l,g)=>q(l,n)?g:-1).filter(l=>l>=0):[0,1];if(i!=null&&(C=C.filter(l=>l!==i)),!C.length)return null;for(const l of R(C)){const g=u[l];if(!r.has(g))continue;const h=oe(a[l],c??"cho",g,40,t),m=[];for(const y of h)if(y!==g&&r.has(y)&&!m.includes(y)&&m.push(y),m.length>=2)break;if(!(m.length<2))return{question:e,distractors:[g,...m]}}return null}function Du(e,n,t,o,r,i=null){const u=[...e];if(u.length!==3)return null;const a=u.map(l=>S(l));if(a.some(l=>!l))return null;const s=te(e,t,o);if(s.some(l=>!l))return null;const c=Me(n),C=c&&n?s.map((l,g)=>q(l,n)?g:-1).filter(l=>l>=0):[0,1,2];if(!C.length)return null;for(const l of R(C))for(const g of R([0,1,2].filter(h=>h!==l&&(i==null||h===i)))){const h=[0,1,2].filter(d=>d!==g),m=h.map(d=>u[d]).join("");if(!r.has(m))continue;const y=h.indexOf(l),D=oe(a[l],c??"cho",u[l],40,t),f=[];for(const d of D){const E=h.map(P=>u[P]);E[y]=d;const A=E.join("");if(A!==m&&r.has(A)&&!f.includes(A)&&f.push(A),f.length>=2)break}if(!(f.length<2))return{question:e,distractors:[m,...f]}}return null}function Eu(e,n,t,o,r,i=null){const u=[...e],a=u.length;if(a<2)return null;const s=[];for(let C=1;C<=a-1;C++)s.push({remain:u.slice(0,C).join(""),dropped:u.slice(C).join(""),droppedEnd:1}),s.push({remain:u.slice(a-C).join(""),dropped:u.slice(0,a-C).join(""),droppedEnd:0});const c=Me(n);for(const{remain:C,dropped:l,droppedEnd:g}of R(s)){if(i!=null&&g!==i||C===e||!r.has(C)||!r.has(l))continue;const h=[...C],m=h.map(f=>S(f));if(m.some(f=>!f))continue;const y=te(C,t,o);if(y.some(f=>!f))continue;const D=c&&n?y.map((f,d)=>q(f,n)?d:-1).filter(f=>f>=0):h.map((f,d)=>d);if(D.length)for(const f of R(D)){const d=oe(m[f],c??"cho",h[f],40,t),E=[];for(const A of d){const P=[...h];P[f]=A;const N=P.join("");if(N!==C&&r.has(N)&&!E.includes(N)&&E.push(N),E.length>=2)break}if(E.length>=2)return{question:e,distractors:[C,...E]}}}return null}function Tu(e,n,t,o,r,i=null){if([...e].length!==1)return null;const u=S(t.get(e)||e);if(!u||u.jong===0)return null;const a=x(u.cho,u.jung,0),s=oe({cho:u.cho,jung:u.jung,jong:0},"cho",a,2,t);return s.length<2?null:{question:e,distractors:[a,...s]}}const dn=p.indexOf("\u3147");function Au(e,n,t,o,r,i=null){if([...e].length!==1)return null;const u=S(t.get(e)||e);if(!u||u.jong!==0||u.cho===dn)return null;const a=x(dn,u.jung,0),s=oe({cho:dn,jung:u.jung,jong:0},"jung",a,2,t);return s.length<2?null:{question:e,distractors:[a,...s]}}function pu(e){const n=new Map;for(const t of e){const o=[...t],r=o.length;if(!(r<2||r>3))for(let i=0;i<r;i++){let u=r+"|"+i+"|";for(let s=0;s<r;s++)u+=s===i?"*":o[s];const a=n.get(u);a?a.push(t):n.set(u,[t])}}return n}function wu(e,n,t,o,r,i=null,u=null,a=2){const s=[...e],c=s.length;if(c<2||c>3)return null;const C=s.map(d=>S(d));if(C.some(d=>!d))return null;const l=te(e,t,o);if(l.some(d=>!d))return null;const g=d=>t.get(d)??d,h=g(e),m=!!n&&(O(n.cho)||O(n.jung)||O(n.jong)),y=!!u&&(O(u.cho)||O(u.jung)||O(u.jong)),D=d=>{let E=c+"|"+d+"|";for(let A=0;A<c;A++)E+=A===d?"*":s[A];return E};let f;if(i!=null){if(i>=c||m&&!q(l[i],n))return null;f=[i]}else m?f=l.map((d,E)=>q(d,n)?E:-1).filter(d=>d>=0):f=Array.from({length:c},(d,E)=>E);for(const d of R(f)){const E=r.get(D(d))??[],A=[],P=[];for(const T of E){if(T===e)continue;const k=[...T].map(_e=>S(_e)),F=C[d],Q=k[d];if(!F||!Q)continue;let z=0;if(F.cho!==Q.cho&&z++,F.jung!==Q.jung&&z++,F.jong!==Q.jong&&z++,!(z<a||g(T)===h))if(y){const _e=te(T,t,o)[d];_e&&q(_e,u)?A.push(T):P.push(T)}else A.push(T)}if(!A.length)continue;const N=R(A)[0],w=[],L=new Set([h,g(N)]),j=y?P:A.filter(T=>T!==N);for(const T of R(j)){const k=g(T);if(!L.has(k)&&(L.add(k),w.push(T),w.length>=2))break}if(!y&&w.length<2)for(const T of R(E)){if(T===e||T===N)continue;const k=g(T);if(!L.has(k)&&(L.add(k),w.push(T),w.length>=2))break}if(!(w.length<2))return{question:e,distractors:[N,...w]}}return null}const bu=()=>{const e="\uC54C \uC218 \uC5C6\uB294 \uC624\uB958",n=typeof Be?.t=="function"?Be.t("common.unknownError",{defaultValue:e}):void 0;return typeof n=="string"&&n?n:e};function _u(e,n){if(n===void 0&&(n=bu()),e instanceof Error)return e.message||n;if(typeof e=="string")return e||n;if(e&&typeof e=="object"){const t=e;for(const o of[t.message,t.error_description,t.error])if(typeof o=="string"&&o)return o}return n}const fn="\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC774 \uBD88\uC548\uC815\uD569\uB2C8\uB2E4. \uC5F0\uACB0 \uC0C1\uD0DC\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",Bu=()=>{const e=typeof Be?.t=="function"?Be.t("common.networkError",{defaultValue:fn}):void 0;return typeof e=="string"&&e?e:fn};function Ct(e){return e?/failed to fetch|load failed|networkerror|network request failed|fetcherror/i.test(e):!1}function Nu(e){return Ct(e)?Bu():e}function Lu(e,n){return e==="id"?void 0:`${e}|${n?"asc":"desc"}`}function Ru(e){const[n,t]=e.split("|");return{key:n,asc:t==="asc"}}function ju(e){let n=e==null?"":String(e);return!(typeof e=="number"&&Number.isFinite(e))&&/^[=+\-@\t\r]/.test(n)&&(n=" "+n),/[",\n\r]/.test(n)?`"${n.replaceAll('"','""')}"`:n}function Ou(e,n){const t=new Blob(["\uFEFF"+n],{type:"text/csv;charset=utf-8"}),o=URL.createObjectURL(t),r=document.createElement("a");r.href=o,r.download=e,r.click(),URL.revokeObjectURL(o)}const gt="__ihab_core_word_pool__";function ku(){typeof window<"u"&&window.dispatchEvent(new CustomEvent("wordpool:update"))}function Iu(e,n){const t=new Map;for(const r of e)t.set(r.word,r);const o={entries:e,pairIndex:n??null,byWord:t};globalThis[gt]=o,ku()}function dt(){return globalThis[gt]??null}const ue=globalThis;function hn(e,n){const t=o=>{};try{const o=n();o&&typeof o.catch=="function"&&o.catch(t)}catch(o){t(o)}}function $u(e){ue.__ihabTrainingTimeLogger=e}function Pu(e){hn("time",()=>ue.__ihabTrainingTimeLogger?.(e))}function Mu(e){ue.__ihabTrainingCompletionLogger=e}function vu(e){hn("completion",()=>ue.__ihabTrainingCompletionLogger?.(e))}function Gu(e){ue.__ihabCrosswordLogger=e}function Fu(e){hn("crossword",()=>ue.__ihabCrosswordLogger?.(e))}function $(e){return typeof e=="string"?e.trim()||null:typeof e=="number"?String(e):null}function ft(e){for(const n of["correct","isCorrect","heard","judgement"])if(typeof e[n]=="boolean")return e[n];return e.score===1?!0:e.score===0?!1:null}function xu(e){return Array.isArray(e)?e.map((n,t)=>{const o=n??{};return{index:t,itemId:$(o.contextCode)??$(o.itemId)??$(o.itemCode)??$(o.id),question:$(o.question)??$(o.sentence)??$(o.word)??$(o.targetSyllable),answer:$(o.answer),selected:$(o.selectedText)??$(o.selected),correct:ft(o)}}):[]}function Wu(e){return e.filter(n=>n.correct===!1)}let ht=null,mt=null,St=null;function Yu(e){ht=e}function Hu(e){mt=e}function Ku(e){St=e}async function Uu(e,n){try{return await ht?.(e,n)??null}catch{return null}}async function Vu(){try{return await mt?.()??null}catch{return null}}async function zu(e,n){try{return await St?.(e,n)??null}catch{return null}}const ve=globalThis;function Ju(e){ve.__ihabNoiseSettingsStore=e}async function qu(){try{return await ve.__ihabNoiseSettingsStore?.load()??null}catch{return null}}function Qu(e){const n=t=>{};try{const t=ve.__ihabNoiseSettingsStore?.save(e);t&&typeof t.catch=="function"&&t.catch(n)}catch(t){n(t)}}function Zu(e){try{ve.__ihabNoiseSettingsStore?.applied?.(e)}catch{}}function Ge(e){const n=new TextEncoder().encode(String(e).normalize("NFC"));let t="";return n.forEach(o=>{t+=o.toString(16).padStart(2,"0")}),t}const Xu=Ge;function er(e,n){return`${e}/${Ge(n)}.mp3`}function nr(e={}){const n=e.storagePrefix??"audio-cache",t=e.voice??"ko-f",o=typeof e.speed=="number"?e.speed:1,r=e.filenameSanitizer??Ge;return async function(i){const u=String(i||"").trim();if(!u)return"";const a=`${r(u)}_${t}.mp3`,s=`${n}/${a}`;try{if(await pn(s)){const c=await wn(s);if(c)return c}}catch{}if(e.generator)try{const c=await e.generator(u,s,e);if(c)return c}catch{}try{const c=`/api/tts?word=${encodeURIComponent(u)}&voice=${encodeURIComponent(t)}&speed=${encodeURIComponent(String(o))}`;return await fetch(c,{method:"GET"}),`/audio-cache/${a}`}catch{return`/audio-cache/${a}`}}}async function tr(e){if(typeof document<"u"){const n=document.activeElement;let t=null;try{if(t=document.createElement("textarea"),t.value=e,t.setAttribute("readonly",""),t.style.position="fixed",t.style.top="0",t.style.left="0",t.style.opacity="0",t.style.pointerEvents="none",document.body.appendChild(t),t.focus(),t.select(),t.setSelectionRange(0,e.length),document.execCommand("copy"))return!0}catch{}finally{if(t?.parentNode&&t.parentNode.removeChild(t),n&&n!==document.activeElement&&typeof n.focus=="function"&&n.isConnected)try{n.focus({preventScroll:!0})}catch{}}}try{if(typeof navigator<"u"&&navigator.clipboard&&typeof navigator.clipboard.writeText=="function")return await navigator.clipboard.writeText(e),!0}catch{}return!1}const re="Asia/Seoul",Se=e=>{const n=new Date(e);return Number.isNaN(n.getTime())?null:n};function or(e){const n=Se(e);return n?n.toLocaleDateString("ko-KR",{timeZone:re,year:"numeric",month:"short",day:"numeric"}):""}function ur(e){const n=Se(e);return n?n.toLocaleString("ko-KR",{timeZone:re,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function rr(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US",o=Se(e);return o?o.toLocaleDateString(t,{timeZone:re,year:"numeric",month:"short",day:"numeric"}):""}function ir(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US",o=Se(e);return o?o.toLocaleString(t,{timeZone:re,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function ar(e){const n=Se(e);return n?n.toLocaleString("ko-KR",{timeZone:re,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):""}function sr(e){if(e==null||e==="")return"";const n=e instanceof Date?e:new Date(e);return isNaN(n.getTime())?"":new Intl.DateTimeFormat("en-GB",{timeZone:re,hour:"2-digit",minute:"2-digit",hour12:!1}).format(n)}function mn(){return ye(new Date)}function lr(){return yt(mn())}const cr=540*60*1e3;function Cr(e,n,t){return new Date(Date.UTC(e,n,t)-cr)}function yt(e){const[n,t,o]=e.split("-").map(Number);return new Date(n,(t||1)-1,o||1)}function ye(e){if(e==null||e==="")return"";const n=e instanceof Date?e:new Date(e);return isNaN(n.getTime())?"":new Intl.DateTimeFormat("fr-CA",{timeZone:"Asia/Seoul"}).format(n)}function gr(e,n){if(!e)return"";const t=new Date(e).getTime();if(Number.isNaN(t))return"";const o=Math.max(0,Math.floor((Date.now()-t)/1e3)),r=Math.floor(o/60),i=Math.floor(r/60),u=Math.floor(i/24),a=Math.floor(u/7),s=Math.floor(u/30),c=Math.floor(u/365);return r<1?n("store.time.justNow","\uBC29\uAE08 \uC804"):r<60?n("store.time.minutesAgo",{n:r}):i<24?n("store.time.hoursAgo",{n:i}):u<7?n("store.time.daysAgo",{n:u}):a<5?n("store.time.weeksAgo",{n:a}):u<365?n("store.time.monthsAgo",{n:Math.min(s,11)}):n("store.time.yearsAgo",{n:c})}function dr(e,n={}){const{sep:t=".",pad:o=!0,trailingDot:r=!1,fallback:i="\u2014"}=n;if(!e)return i;const u=ye(e instanceof Date?e:String(e));if(!u)return i;const[a,s,c]=u.split("-"),C=o?s:String(Number(s)),l=o?c:String(Number(c));return`${a}${t}${C}${t}${l}${r?".":""}`}function fr(e){const n=e.normalize("NFKC").replace(/\D/g,"");if(/^(050\d|0303)/.test(n)){const o=n.slice(0,12);return o.length<=4?o:o.length<=8?`${o.slice(0,4)}-${o.slice(4)}`:`${o.slice(0,4)}-${o.slice(4,o.length-4)}-${o.slice(o.length-4)}`}if(/^1[5-9]\d{2}/.test(n)&&n.length<=8)return n.length<=4?n:`${n.slice(0,4)}-${n.slice(4)}`;const t=n.slice(0,11);return t.startsWith("02")?t.length<=2?t:t.length<=6?`${t.slice(0,2)}-${t.slice(2)}`:`${t.slice(0,2)}-${t.slice(2,t.length-4)}-${t.slice(t.length-4)}`:t.length<=3?t:t.length<=7?`${t.slice(0,3)}-${t.slice(3)}`:`${t.slice(0,3)}-${t.slice(3,t.length-4)}-${t.slice(t.length-4)}`}function hr(e){if(e){if(/^\d{4}\.\d{2}\.\d{2}$/.test(e))return e;if(/^\d{8}$/.test(e))return`${e.slice(0,4)}.${e.slice(4,6)}.${e.slice(6,8)}`;if(/^\d{4}-\d{2}-\d{2}$/.test(e))return e.replace(/-/g,".");if(/^\d{4}-\d{2}-\d{2}T/.test(e)){const n=new Date(e);return isNaN(n.getTime())?void 0:ye(n).replace(/-/g,".")}}}function mr(e){if(e)return/^\d{4}\.\d{2}\.\d{2}$/.test(e)?e.replace(/\./g,"-"):e}function Sr(e,n){if(!e)return"-";const t=/^(\d{1,2}):(\d{2})$/.exec(e.trim());if(!t)return e;const o=Number(t[1]),r=Number(t[2]),i=t[1].padStart(2,"0");return r===0?n("date.timeH",{h:o,hh:i,mm:t[2]}):n("date.timeHM",{h:o,hh:i,m:r,mm:t[2]})}function yr(e){return(e??0).toLocaleString("ko-KR")}const Dr=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],Er=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uC18C\uC74C \uD658\uACBD \uC18D \uBB38\uC7A5 \uC774\uD574 \uD6C8\uB828"},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30 + 4\uBB38\uC81C"},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30 \uC2EC\uD654 \uD6C8\uB828"},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC21C\uC11C \uBC30\uC5F4 \uD6C8\uB828"}];let Sn=null;function Tr(e){Sn=e}function Ar(){return Sn?.topicTypes??Dr}function pr(){return Sn?.trainingTypes??Er}const Dt="ihab_theme",Et="light";function Tt(){try{const e=localStorage.getItem(Dt);if(e==="light"||e==="dark"||e==="auto")return e}catch{}return Et}function At(e){const n=e==="light"||e==="dark"||e==="auto"?e:Et;try{document.documentElement.setAttribute("data-theme",n),localStorage.setItem(Dt,n)}catch{}}function wr(){At(Tt())}const pt="ihab_font_scale",br="medium",_r=["medium","large1","large2","large3"];function wt(){try{const e=localStorage.getItem(pt);if(_r.includes(e))return e}catch{}return br}function bt(e){try{document.documentElement.setAttribute("data-font-scale",e),localStorage.setItem(pt,e)}catch{}}function Br(){bt(wt())}const De=[],Ee=[],Te=[],Ae=[],pe={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},we={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},Nr={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};let yn=null,_t=null,V=null;function Bt({counts:e,forceRefresh:n}={}){const t=Object.assign({},Nr,e||{}),o=mn(),r=ye(new Date(`${o}T00:00:00+09:00`).getTime()-864e5),i=JSON.stringify(t);if(!n&&_t===o&&yn===i&&V)return Object.assign(pe,V.today),Object.assign(we,V.yesterday?.selection||{LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),{today:pe,yesterday:we};const u={LISTEN_IN_NOISE:H(De,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:H(Ee,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:H(Te,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:H(Ae,Math.max(0,Number(t.ORDERING_SENTENCE)||0))};let a=null;return V&&yn===i&&V.yesterday&&V.yesterday.date===r&&(a=V.yesterday.selection),a||(a={LISTEN_IN_NOISE:H(De,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:H(Ee,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:H(Te,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:H(Ae,Math.max(0,Number(t.ORDERING_SENTENCE)||0))}),Object.assign(pe,u),Object.assign(we,a),_t=o,yn=i,V={today:u,yesterday:{date:r,countsKey:i,selection:a}},{today:pe,yesterday:we}}function Lr(){return{today:pe,yesterday:we}}function Rr(){return{LISTEN_IN_NOISE:De,SHORT_STORY:Ee,LONG_STORY:Te,ORDERING_SENTENCE:Ae}}let Dn=!1,be=null;async function jr(){try{const e={url:typeof document>"u"?require("url").pathToFileURL(__filename).href:xe&&xe.tagName.toUpperCase()==="SCRIPT"&&xe.src||new URL("utils.cjs.js",document.baseURI).href}&&void 0||"/",n=await fetch(`${e}data/allTrainingData.json`);return n.ok?await n.json():null}catch{return null}}async function Nt(){if(!Dn)return be||(be=(async()=>{const e=await jr();if(!e){be=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}const n={noise:[],short:[],long:[],order:[]};try{for(const t of Object.keys(e||{})){const o=e[t]||[];for(const r of o){const i=r,u=String(i.training_type||t),a=String(i.category_main_code||i.category_main||i.category_0||""),s=String(i.category_sub_code||i.category_sub||i.category_1||""),c=Object.assign({},i,{training_type:u,category_0:a,category_1:s});u==="LISTEN_IN_NOISE"?n.noise.push(c):u==="SHORT_STORY"?n.short.push(c):u==="LONG_STORY"?n.long.push(c):u==="ORDERING_SENTENCE"&&n.order.push(c)}}}catch{be=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}De.push(...n.noise),Ee.push(...n.short),Te.push(...n.long),Ae.push(...n.order);try{window.dispatchEvent(new Event("speechear.data.updated"))}catch{}try{Bt()}catch{}Dn=!0})(),be)}function Or(){return Dn}async function kr(e=3e3){const n=Nt();return Promise.race([n,new Promise(t=>setTimeout(t,e))])}const Ir=[{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."}],$r=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],Pr={LISTEN_IN_NOISE:"listenInNoise",SHORT_STORY:"shortStory",LONG_STORY:"longStory",ORDERING_SENTENCE:"orderingSentence"};let Fe=null,Lt=null,Rt=null;function Mr(){const e=dt();if(e&&e.entries.length>0){const n=Yn();if(Fe&&Lt===e&&Rt===n)return Fe;const t=new Set,o=[];for(const r of e.entries)!r.word||t.has(r.word)||(t.add(r.word),o.push({w:r.word,s:r.syllables,p:n?.[r.word]?[...n[r.word].cho??[],...n[r.word].jung??[],...n[r.word].jong??[]]:[],pron:r.pronunciation||r.word,grade:r.grade}));return Fe=o,Lt=e,Rt=n,Fe}return[]}new Proxy([],{get(e,n){const t=Mr(),o=t[n];return typeof o=="function"?o.bind(t):o}});const vr={free:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},personal_standard:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},mgr_free:{maxCustomers:5,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},none:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},lite_word:{maxCustomers:10,visitWord:!0,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!1},lite_sentence:{maxCustomers:10,visitWord:!1,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!0},lite:{maxCustomers:10,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},standard:{maxCustomers:30,visitWord:!0,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},pro:{maxCustomers:50,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0},enterprise:{maxCustomers:1/0,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!0,managerManagement:!0,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!0,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!0,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!0,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0}},Gr={none:0,free:1,personal_standard:3,mgr_free:4,lite_word:5,lite_sentence:5,lite:6,standard:7,pro:8,enterprise:9},Fr={free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1},personal_standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null},mgr_free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1,trainingItemMax:5,customerMax:5,homeworkSendDaily:1},lite:{sentenceTrainingDaily:5,wordTrainingDaily:5,gameDaily:5,trainingItemMax:10,customerMax:10,homeworkSendDaily:10},standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:30,customerMax:30,homeworkSendDaily:30},pro:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:50,homeworkSendDaily:50},enterprise:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:null,homeworkSendDaily:null}};function xr(e){const n=e.toLowerCase();return n.startsWith("manager_enterprise")?"enterprise":n.startsWith("manager_pro")?"pro":n.startsWith("manager_standard")?"standard":n.startsWith("manager_lite_word")?"lite_word":n.startsWith("manager_lite_sentence")?"lite_sentence":n.startsWith("manager_lite")||n.startsWith("mgr_lite")?"lite":n.startsWith("mgr_standard")?"standard":n.startsWith("mgr_pro")?"pro":n.startsWith("content_")||n.startsWith("speechear_")||n.startsWith("light_")||n==="light"?"personal_standard":"none"}const Wr=5,Yr=5;function Hr({rank:e,voteCount:n,quota:t=5}){return e<t&&n>0}const Kr={selected:"ALREADY_SELECTED",added:"ALREADY_ADDED",rejected:"ALREADY_REJECTED"},Ur="0.144.0";exports.CAPABILITY=ut,exports.CHOSEONG=p,exports.CORE_VERSION=Ur,exports.JONGSEONG=B,exports.JUNGSEONG=b,exports.LONG_STORIES=Te,exports.NETWORK_ERROR_MESSAGE=fn,exports.NOISE_DATAS=De,exports.ORDER_SETS=Ae,exports.PLAN_FEATURES=vr,exports.PLAN_LIMITS=Fr,exports.SHORT_STORIES=Ee,exports.TIER_RANK=Gr,exports.TOPIC_TYPES=$r,exports.TRAINING_TYPES=Ir,exports.TRAINING_TYPE_I18N_KEY=Pr,exports.WORD_SUGGESTION_ACCOUNT_LIMIT=Yr,exports.WORD_SUGGESTION_EXISTING_ERROR=Kr,exports.WORD_SUGGESTION_WEEKLY_QUOTA=Wr,exports.applyFontScale=bt,exports.applyTheme=At,exports.buildChangeWholeSyllableProblem=wu,exports.buildDropCompoundProblem=Eu,exports.buildDropContrast3Problem=Du,exports.buildDropContrastProblem=yu,exports.buildDropFinalConsonantProblem=Tu,exports.buildMultiPartPosContrast=Io,exports.buildPairIndex=jo,exports.buildRemoveConsonantProblem=Au,exports.buildSyllableMaskIndex=pu,exports.bulkSetImageExistence=lo,exports.cardQuestionTitle=du,exports.checkImageExists=kn,exports.classifyPairDifficulty=go,exports.clearAudioExistsCache=Jt,exports.clearImageExistenceCache=co,exports.clearPairIndexCache=Oo,exports.composeSyllable=x,exports.computeDailySelection=Bt,exports.configureImageResolver=uo,exports.configureNoiseSettingsStore=Ju,exports.configurePronunciationResolver=qt,exports.configureStorage=Gt,exports.configureTTS=Kt,exports.configureTrainingCategories=Tr,exports.copyText=tr,exports.createDecompCache=Co,exports.createTTSUrlResolver=nr,exports.dateToDb=mr,exports.downloadCsvText=Ou,exports.downloadSound=xt,exports.ensureTrainingDataLoaded=kr,exports.escapeCsvField=ju,exports.fileExists=pn,exports.filterContrastCandidates=Hn,exports.finalToPhoneme=Zn,exports.firstChoseongOf=In,exports.formatCount=yr,exports.formatDateKo=or,exports.formatDateLocale=rr,exports.formatDateLongKo=ur,exports.formatDateLongLocale=ir,exports.formatDatetimeKo=ar,exports.formatPhone=fr,exports.formatRelativeTime=gr,exports.formatTimeHM=Sr,exports.formatYmd=dr,exports.getAssetBaseUrl=Tn,exports.getDailySelection=Lr,exports.getElementAnalyser=eo,exports.getElementVolume=to,exports.getErrorMessage=_u,exports.getImageExistenceStats=so,exports.getImageExistsCached=io,exports.getImageResolver=jn,exports.getNoiseBaseUrl=Wt,exports.getNoiseFileGain=Yt,exports.getPairIndex=Yn,exports.getPlanTier=xr,exports.getPronunciationResolver=Qt,exports.getSavedFontScale=wt,exports.getSavedTheme=Tt,exports.getSignedOrPublicUrl=wn,exports.getTTSFallbackUrlResolver=Vt,exports.getTTSUrlResolver=Ut,exports.getTodayKst=mn,exports.getTodayKstDate=lr,exports.getTopicTypes=Ar,exports.getTrainingPools=Rr,exports.getTrainingTypes=pr,exports.getWordPool=dt,exports.hasQuestionWordConstraint=ru,exports.hasSel=O,exports.hasStructureContrast=nn,exports.initFontScale=Br,exports.initTheme=wr,exports.isAllChoseong=Pn,exports.isManualOnlyType=au,exports.isNetworkErrorMessage=Ct,exports.isSyllablePattern=Gn,exports.isThisWeekPick=Hr,exports.isTrainingDataLoaded=Or,exports.isValidQuestionWord=iu,exports.itemCorrectness=ft,exports.jamoToNamesForSpeech=fu,exports.kstStartOfDay=Cr,exports.loadGameLeaderboard=zu,exports.loadMyGameRanks=Vu,exports.loadNoiseSettings=qu,exports.loadTrainingData=Nt,exports.logCrossword=Fu,exports.logTrainingCompletion=vu,exports.logTrainingTime=Pu,exports.matchSyllables=te,exports.matchesChoseongSearch=fo,exports.matchesSyllablePattern=xn,exports.matchesWordQuery=ho,exports.mergeQuestionText=lt,exports.minimalPairDistractors=ko,exports.normalizeDate=hr,exports.officialSoundPath=er,exports.parseLocalYmd=yt,exports.parseSortValue=Ru,exports.parseSyllable=S,exports.patternToComposition=wo,exports.phonemePartsOf=lu,exports.pickEuRo=ot,exports.pickEulReul=et,exports.pickEunNeun=nt,exports.pickIga=Xn,exports.pickWaGwa=tt,exports.prewarmImageCache=ao,exports.primarySelPart=Me,exports.readLevel=oo,exports.reorderArray=nu,exports.reportAppliedNoiseSettings=Zu,exports.resolveAssetUrl=Mt,exports.resolveSoundPath=Ft,exports.resumeAudioMeter=Xt,exports.routeElementAudio=Ln,exports.sample=H,exports.saveNoiseSettings=Qu,exports.searchAndRankWords=Bo,exports.setAssetBaseUrl=Pt,exports.setCrosswordLogger=Gu,exports.setElementVolume=no,exports.setGameLeaderboardLoader=Ku,exports.setGameRanksLoader=Hu,exports.setGameScoreSubmitter=Yu,exports.setTrainingCompletionLogger=Mu,exports.setTrainingTimeLogger=$u,exports.setWordPool=Iu,exports.shuffle=R,exports.sortToValue=Lu,exports.soundOf=gn,exports.speak=Ot,exports.stopSpeaking=kt,exports.submitGameScore=Uu,exports.syllMatchesComp=q,exports.syllableContrasts=oe,exports.syllableLength=Do,exports.syllablePron=ct,exports.toBase64UrlSafe=Xu,exports.toChoseong=$n,exports.toItemResults=xu,exports.toKstHm=sr,exports.toKstYmd=ye,exports.toStandardPronunciation=Vo,exports.toStorageName=Ge,exports.toUserErrorMessage=Nu,exports.validateSyllableSearchInput=_o,exports.withEuRo=eu,exports.withEulReul=Qo,exports.withEunNeun=Zo,exports.withIga=qo,exports.withWaGwa=Xo,exports.wordContainsChoseong=mo,exports.wordContainsJongseong=yo,exports.wordContainsJungseong=So,exports.wordHasNoCoda=Eo,exports.wordHasSyllableMatching=Ao,exports.wrongItems=Wu;
|