@novely/core 0.53.0 → 0.54.0-next.1

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/dist/index.d.ts CHANGED
@@ -856,11 +856,37 @@ type CustomHandlerCalling = {
856
856
  */
857
857
  skipOnRestore?: (nextActions: Exclude<ValidAction, ValidAction[]>[]) => boolean;
858
858
  };
859
+ /**
860
+ * Array of URL or NovelyAsset
861
+ */
862
+ type ResolvedAssets = (NovelyAsset | string)[];
863
+ type AssetsResolverArgs = {
864
+ /**
865
+ * Fetching function
866
+ */
867
+ request: typeof fetch;
868
+ };
869
+ /**
870
+ * Function to get assets
871
+ */
872
+ type AssetsResolver = (args: AssetsResolverArgs) => Thenable<ResolvedAssets>;
859
873
  type CustomHandlerInfo = CustomHandlerCalling & {
860
874
  /**
861
- * Assets (pictures, audio files) used by action
875
+ * Assets used by action. When preload is "automatic", will be preloaded before action runs.
876
+ *
877
+ * In case function is provided, execution time is limited to 250ms,
878
+ * then returned assets or empty array (when limited)
879
+ * will always be used with that action
880
+ *
881
+ * @example
882
+ * ```ts
883
+ * handler.assets = [url]
884
+ * handler.assets = async ({ request }) => {
885
+ * return [url]
886
+ * }
887
+ * ```
862
888
  */
863
- assets?: (NovelyAsset | string)[];
889
+ assets?: ResolvedAssets | AssetsResolver;
864
890
  /**
865
891
  * When true interacting with it will be saved in history
866
892
  */
package/dist/index.js CHANGED
@@ -145,10 +145,6 @@ var isPromise = (val) => {
145
145
  var isEmpty = (val) => {
146
146
  return typeof val === "object" && !isNull(val) && Object.keys(val).length === 0;
147
147
  };
148
- var isCSSImageURL = (url) => {
149
- const startsWith = String.prototype.startsWith.bind(url);
150
- return startsWith("http") || startsWith("/") || startsWith(".") || startsWith("data");
151
- };
152
148
  var isUserRequiredAction = ([action, ...meta]) => {
153
149
  return Boolean(action === "custom" && meta[0] && meta[0].requireUserAction);
154
150
  };
@@ -167,9 +163,6 @@ var isAudioAction = (action) => {
167
163
  var isAction = (element) => {
168
164
  return Array.isArray(element) && isString(element[0]);
169
165
  };
170
- var isImageAsset = (asset2) => {
171
- return isString(asset2) && isCSSImageURL(asset2);
172
- };
173
166
  var isBlockingAction = (action) => {
174
167
  return isUserRequiredAction(action) || isSkippedDuringRestore(action[0]) && action[0] !== "vibrate";
175
168
  };
@@ -815,9 +808,6 @@ var fetchContentType = async (url, request) => {
815
808
  };
816
809
  var getResourseType = memoize2(
817
810
  async ({ url, request }) => {
818
- if (!isCSSImageURL(url)) {
819
- return "other";
820
- }
821
811
  const extension = getUrlFileExtension(url);
822
812
  if (HOWLER_SUPPORTED_FILE_FORMATS.has(extension)) {
823
813
  return "audio";
@@ -1153,20 +1143,18 @@ var handleAssetsPreloading = async ({
1153
1143
  await Promise.allSettled(list);
1154
1144
  ASSETS_TO_PRELOAD.clear();
1155
1145
  };
1156
- var huntAssets = ({ volume, lang, characters, action, props, handle }) => {
1146
+ var huntAssets = async ({ volume, lang, characters, action, props, handle, request }) => {
1157
1147
  if (action === "showBackground") {
1158
1148
  if (isString(props[0])) {
1159
- handle(unwrapAudioAsset(props[0]));
1149
+ handle(unwrapImageAsset(props[0]));
1150
+ return;
1160
1151
  }
1161
1152
  if (props[0] && typeof props[0] === "object") {
1162
1153
  for (const value of Object.values(props[0])) {
1163
- if (isImageAsset(value)) {
1154
+ if (isAsset(value)) {
1155
+ handle(unwrapImageAsset(value));
1156
+ } else {
1164
1157
  handle(value);
1165
- } else if (isAsset(value)) {
1166
- const unwrapped = unwrapImageAsset(value);
1167
- if (isImageAsset(unwrapped)) {
1168
- handle(unwrapped);
1169
- }
1170
1158
  }
1171
1159
  }
1172
1160
  }
@@ -1203,7 +1191,21 @@ var huntAssets = ({ volume, lang, characters, action, props, handle }) => {
1203
1191
  return;
1204
1192
  }
1205
1193
  if (action === "custom" && props[0].assets) {
1206
- for (const asset2 of props[0].assets) {
1194
+ const assets = props[0].assets;
1195
+ let resolved = [];
1196
+ if (typeof assets === "function") {
1197
+ resolved = await Promise.race([
1198
+ assets({ request }),
1199
+ new Promise((resolve) => setTimeout(resolve, 250, []))
1200
+ ]);
1201
+ Object.defineProperty(props[0], "assets", {
1202
+ value: async () => resolved,
1203
+ writable: false
1204
+ });
1205
+ } else {
1206
+ resolved = assets;
1207
+ }
1208
+ for (const asset2 of resolved) {
1207
1209
  isAsset(asset2) ? handle(asset2.source) : handle(asset2);
1208
1210
  }
1209
1211
  return;
@@ -1212,7 +1214,9 @@ var huntAssets = ({ volume, lang, characters, action, props, handle }) => {
1212
1214
  for (let i = 1; i < props.length; i++) {
1213
1215
  const data = props[i];
1214
1216
  if (Array.isArray(data)) {
1215
- handle(unwrapImageAsset(data[5]));
1217
+ if (data[5]) {
1218
+ handle(unwrapImageAsset(data[5]));
1219
+ }
1216
1220
  }
1217
1221
  }
1218
1222
  }
@@ -1888,23 +1892,27 @@ var novely = ({
1888
1892
  });
1889
1893
  useStack(ctx).push(clone(save2));
1890
1894
  const assets = [];
1895
+ const huntPromises = [];
1891
1896
  await processor.run(([action2, ...props]) => {
1892
1897
  if (isAudioAction(action2)) return;
1893
1898
  if (action2 === "vibrate") return;
1894
1899
  if (action2 === "end") return;
1895
- huntAssets({
1900
+ const huntPromise = huntAssets({
1896
1901
  action: action2,
1897
1902
  props,
1898
1903
  characters,
1899
1904
  lang: getLanguageFromStore(storageData),
1900
1905
  volume: getVolumeFromStore(storageData),
1901
- handle: assets.push.bind(assets)
1906
+ handle: assets.push.bind(assets),
1907
+ request
1902
1908
  });
1909
+ huntPromises.push(huntPromise);
1903
1910
  return match(action2, props, {
1904
1911
  ctx,
1905
1912
  data: data2
1906
1913
  });
1907
1914
  });
1915
+ await Promise.all(huntPromises);
1908
1916
  return {
1909
1917
  assets
1910
1918
  };
@@ -2057,16 +2065,18 @@ var novely = ({
2057
2065
  refer: referGuarded,
2058
2066
  clone
2059
2067
  });
2060
- for (const [action3, ...props2] of collection) {
2061
- huntAssets({
2068
+ const queue = collection.map(([action3, ...props2]) => {
2069
+ return huntAssets({
2062
2070
  action: action3,
2063
2071
  props: props2,
2064
2072
  characters,
2065
2073
  lang: getLanguageFromStore(storageData),
2066
2074
  volume: getVolumeFromStore(storageData),
2067
- handle: enqueueAssetForPreloading
2075
+ handle: enqueueAssetForPreloading,
2076
+ request
2068
2077
  });
2069
- }
2078
+ });
2079
+ await Promise.all(queue);
2070
2080
  handleAssetsPreloading({
2071
2081
  ...renderer.misc,
2072
2082
  request,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/lite/index.mjs","../src/novely.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/full/index.mjs","../src/constants.ts","../src/shared.ts","../src/utilities/assertions.ts","../src/utilities/match-action.ts","../src/asset.ts","../src/audio-codecs.ts","../src/image-formats.ts","../src/utilities/actions-processing.ts","../src/utilities/controlled-promise.ts","../src/utilities/resources.ts","../src/utilities/stack.ts","../src/utilities/story.ts","../src/utilities/internationalization.ts","../src/utilities/noop.ts","../src/utilities/store.ts","../src/utilities/array.ts","../src/utilities/else.ts","../src/store.ts","../src/custom-action.ts","../src/preloading.ts","../src/storage.ts","../src/translation.ts","../src/utilities/actions.ts","../src/utilities/dialog-overview.ts","../src/utilities/document.ts","../src/ticker.ts","../src/extend-actions.ts","../src/translations.ts","../src/browser-events.ts"],"sourcesContent":["var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { dequal } from 'dequal/lite';\nimport { memoize, throttle } from 'es-toolkit/function';\nimport { merge as deepmerge } from 'es-toolkit/object';\nimport { DEV } from 'esm-env';\nimport { klona } from 'klona/full';\nimport pLimit from 'p-limit';\nimport type {\n\tActionChoiceChoice,\n\tActionProxy,\n\tChoiceCheckFunction,\n\tCustomHandler,\n\tStory,\n\tTextContent,\n\tValidAction,\n\tVirtualActions,\n} from './action';\nimport type { Character } from './character';\nimport type { CleanupFn } from './custom-action';\nimport { DEFAULT_TYPEWRITER_SPEED, EMPTY_SET, MAIN_CONTEXT_KEY } from './constants';\nimport { cleanCleanupSource, getCustomActionCleanupHolder, handleCustomAction } from './custom-action';\nimport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets } from './preloading';\nimport type { Context, RendererInitPreviewReturn } from './renderer';\nimport { PRELOADED_ASSETS, STACK_MAP } from './shared';\nimport { storageAdapterLocal } from './storage';\nimport type { Stored } from './store';\nimport { derive, store } from './store';\nimport { flattenAllowedContent, replace as replaceTranslation } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport type {\n\tCoreData,\n\tData,\n\tEngineTypes,\n\tLang,\n\tNovelyInit,\n\tSave,\n\tState,\n\tStateFunction,\n\tStorageData,\n} from './types';\nimport type { ControlledPromise } from './utilities';\nimport {\n\tisAction,\n\tisAudioAction,\n\tisBlockingAction,\n\tisEmpty,\n\tisFunction,\n\tisPromise,\n\tisString,\n\tisAsset,\n\tmatchAction,\n\tcreateQueueProcessor,\n\tgetActionsFromPath,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tcreateControlledPromise,\n\tgetResourseType,\n\tcreateUseStackFunction,\n\tflatStory,\n\tcapitalize,\n\tgetLanguage as defaultGetLanguage,\n\tgetCharactersData,\n\tgetIntlLanguageDisplayName,\n\tgetLanguageFromStore,\n\tgetVolumeFromStore,\n\tnoop,\n\ttoArray,\n} from './utilities';\nimport type { MatchActionHandlers } from './utilities';\nimport { buildActionObject } from './utilities/actions';\nimport { unwrapAsset, unwrapAudioAsset, unwrapImageAsset } from './asset';\nimport { getDialogOverview } from './utilities/dialog-overview';\nimport { setDocumentLanguage } from './utilities/document';\nimport { TickerFactory } from './ticker';\n\nconst novely = <\n\t$Language extends string,\n\t$Characters extends Record<string, Character<$Language>>,\n\t$State extends State,\n\t$Data extends Data,\n\t$Actions extends Record<string, (...args: any[]) => ValidAction>,\n>({\n\tcharacters,\n\tcharacterAssetSizes = {},\n\tdefaultEmotions = {},\n\tstorage = storageAdapterLocal({ key: 'novely-game-storage' }),\n\tstorageDelay = Promise.resolve(),\n\trenderer: createRenderer,\n\tinitialScreen = 'mainmenu',\n\ttranslation,\n\tstate: defaultState = {} as $State,\n\tdata: defaultData = {} as $Data,\n\tautosaves = true,\n\tmigrations = [],\n\tthrottleTimeout = 850,\n\tgetLanguage = defaultGetLanguage,\n\toverrideLanguage = false,\n\taskBeforeExit = true,\n\tpreloadAssets = 'automatic',\n\tparallelAssetsDownloadLimit = 15,\n\tfetch: request = fetch,\n\tcloneFunction: clone = klona,\n\tsaveOnUnload = true,\n\tstartKey = 'start',\n\tdefaultTypewriterSpeed = DEFAULT_TYPEWRITER_SPEED,\n\tstoryOptions = { mode: 'static' },\n\tonLanguageChange,\n}: NovelyInit<$Language, $Characters, $State, $Data, $Actions>) => {\n\ttype $ActionProxy = ActionProxy<$Characters, $Language, $State>;\n\ttype $VirtualActions = VirtualActions<$Characters, $Language, $State>;\n\n\t// All action functions\n\ttype Actions = $Actions & $ActionProxy & $VirtualActions;\n\n\tconst languages = Object.keys(translation) as $Language[];\n\n\tconst limitScript = pLimit(1);\n\tconst limitAssetsDownload = pLimit(parallelAssetsDownloadLimit);\n\n\tconst story: Story = {};\n\n\tconst times = new Set<number>();\n\n\tconst dataLoaded = createControlledPromise();\n\n\tlet initialScreenWasShown = false;\n\tlet destroyed = false;\n\n\tif (storyOptions.mode === 'dynamic') {\n\t\tstoryOptions.preloadSaves ??= 4;\n\t}\n\n\tconst storyLoad = storyOptions.mode === 'static' ? noop : storyOptions.load;\n\tconst onUnknownSceneHit = memoize(async (scene: string) => {\n\t\tconst part = await storyLoad(scene);\n\n\t\tif (part) {\n\t\t\tawait script(part);\n\t\t}\n\t});\n\n\t/**\n\t * Saves timestamps created in this session\n\t */\n\tconst intime = (value: number) => {\n\t\treturn times.add(value), value;\n\t};\n\n\tconst scriptBase = async (part: Story) => {\n\t\t// In case script was called after destroy\n\t\tif (destroyed) return;\n\n\t\tObject.assign(story, flatStory(part));\n\n\t\t// This is the first `script` call, likely data did not loaded yet\n\t\tif (!initialScreenWasShown) {\n\t\t\trenderer.ui.showLoading();\n\t\t}\n\n\t\tawait dataLoaded.promise;\n\n\t\trenderer.ui.hideLoading();\n\n\t\tif (!initialScreenWasShown) {\n\t\t\tinitialScreenWasShown = true;\n\n\t\t\tif (initialScreen === 'game') {\n\t\t\t\trestore(undefined);\n\t\t\t} else {\n\t\t\t\trenderer.ui.showScreen(initialScreen);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Setup your story here\n\t *\n\t * Call more than once to merge different story parts\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * engine.script({\n\t * start: [action.jump('another-part')]\n\t * })\n\t *\n\t * engine.script({\n\t * 'another-part': []\n\t * })\n\t * ```\n\t */\n\tconst script = (part: Story) => {\n\t\treturn limitScript(() => scriptBase(part));\n\t};\n\n\tconst getDefaultSave = (state: $State) => {\n\t\treturn [\n\t\t\t[\n\t\t\t\t['jump', startKey],\n\t\t\t\t[null, 0],\n\t\t\t],\n\t\t\tstate,\n\t\t\t[intime(Date.now()), 'auto'],\n\t\t\t[],\n\t\t] as Save<$State>;\n\t};\n\n\t/**\n\t * Calls `getLanguage`, passes needed arguments\n\t * @returns language\n\t */\n\tconst getLanguageWithoutParameters = () => {\n\t\tconst language = getLanguage(languages, defaultGetLanguage);\n\n\t\t// This is valid language\n\t\tif (languages.includes(language as $Language)) {\n\t\t\tsetDocumentLanguage(language);\n\n\t\t\treturn language as $Language;\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\tthrow 0;\n\t};\n\n\t/**\n\t * 1) Novely rendered using the `initialData`, but you can't start new game or `load` an empty one - this is scary, imagine losing your progress\n\t * 2) Actual stored data is loaded, language and etc is changed\n\t */\n\tconst initialData: StorageData<$Language, $Data> = {\n\t\tsaves: [],\n\t\tdata: clone(defaultData),\n\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t};\n\n\tconst storageData = store(initialData);\n\tconst coreData = store<CoreData>({\n\t\tdataLoaded: false,\n\t\tpaused: false,\n\t\tfocused: document.visibilityState === 'visible',\n\t});\n\n\tconst paused = derive(coreData, (s) => s.paused || !s.focused);\n\n\tconst onDataLoadedPromise = async ({ cancelled }: Awaited<ControlledPromise<void>>) => {\n\t\t/**\n\t\t * Promise cancelled? Re-subscribe\n\t\t */\n\t\tif (cancelled) {\n\t\t\tdataLoaded.promise.then(onDataLoadedPromise);\n\t\t\treturn;\n\t\t}\n\n\t\tconst preload = () => {\n\t\t\tconst saves = [...storageData.get().saves].reverse();\n\t\t\tconst sliced = saves.slice(0, storyOptions.mode === 'dynamic' ? storyOptions.preloadSaves : 0);\n\n\t\t\tfor (const [path] of sliced) {\n\t\t\t\treferGuarded(path);\n\t\t\t}\n\t\t};\n\n\t\tpreload();\n\n\t\t/**\n\t\t * When promise is resolved data is marked loaded\n\t\t */\n\t\tcoreData.update((data) => {\n\t\t\tdata.dataLoaded = true;\n\n\t\t\treturn data;\n\t\t});\n\t};\n\n\tdataLoaded.promise.then(onDataLoadedPromise);\n\n\tconst onStorageDataChange = (value: StorageData) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst data = clone(value);\n\n\t\t/**\n\t\t * Empty out data snapshots\n\t\t */\n\t\tfor (const save of data.saves) {\n\t\t\tsave[3] = [];\n\t\t}\n\n\t\tstorage.set(data);\n\t};\n\n\t/**\n\t * Short one is used in conditions like `beforeunload` when waiting for too long is not a case\n\t * Another one relies on short one to prevent double saving\n\t */\n\tconst throttledShortOnStorageDataChange = throttle(() => onStorageDataChange(storageData.get()), 10);\n\tconst throttledOnStorageDataChange = throttle(throttledShortOnStorageDataChange, throttleTimeout);\n\n\tstorageData.subscribe(throttledOnStorageDataChange);\n\n\tif (saveOnUnload === true || (saveOnUnload === 'prod' && !DEV)) {\n\t\taddEventListener('beforeunload', throttledShortOnStorageDataChange);\n\t}\n\n\tconst getStoredData = async () => {\n\t\tlet stored = await storage.get();\n\n\t\tfor (const migration of migrations) {\n\t\t\tstored = migration(stored) as StorageData;\n\n\t\t\tif (DEV && !stored) {\n\t\t\t\tthrow new Error('Migrations should return a value.');\n\t\t\t}\n\t\t}\n\n\t\tif (overrideLanguage || !stored.meta[0]) {\n\t\t\tstored.meta[0] = getLanguageWithoutParameters();\n\t\t}\n\n\t\t/**\n\t\t * Default `localStorageStorage` returns empty array\n\t\t */\n\t\tstored.meta[1] ||= defaultTypewriterSpeed;\n\n\t\t/**\n\t\t * Sound Volumes\n\t\t */\n\t\tstored.meta[2] ??= 1;\n\t\tstored.meta[3] ??= 1;\n\t\tstored.meta[4] ??= 1;\n\n\t\t/**\n\t\t * When data is empty replace it with `defaultData`\n\t\t * It also might be empty (default to empty)\n\t\t */\n\t\tif (isEmpty(stored.data)) {\n\t\t\tstored.data = defaultData as Data;\n\t\t}\n\n\t\t/**\n\t\t * Now the next store updates will entail saving via storage.set\n\t\t */\n\t\tdataLoaded.resolve();\n\n\t\tstorageData.set(stored as StorageData<$Language, $Data>);\n\t};\n\n\t/**\n\t * By default this is resolved immediately, but also can be delayed.\n\t * I.e. storage has not loaded yet\n\t */\n\tstorageDelay.then(getStoredData);\n\n\tconst initial = getDefaultSave(clone(defaultState));\n\n\t// #region Save Function\n\tconst save = (type: Save[2][1]) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\t/**\n\t\t * When autosaves diabled just return\n\t\t */\n\t\tif (!autosaves && type === 'auto') return;\n\n\t\t/**\n\t\t * Saves only possible in main context, so there is no reason for context to be used here\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\t\tconst current = clone(stack.value);\n\n\t\tstorageData.update((prev) => {\n\t\t\tconst replace = () => {\n\t\t\t\tprev.saves[prev.saves.length - 1] = current;\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\tconst add = () => {\n\t\t\t\tprev.saves.push(current);\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Get latest\n\t\t\t */\n\t\t\tconst last = prev.saves.at(-1);\n\n\t\t\t/**\n\t\t\t * We cannot compare anything here, thus just reutrn\n\t\t\t */\n\t\t\tif (!last) return add();\n\n\t\t\t/**\n\t\t\t * Update type and time information\n\t\t\t */\n\t\t\tcurrent[2][0] = intime(Date.now());\n\t\t\tcurrent[2][1] = type;\n\n\t\t\t/**\n\t\t\t * Empty out state snapshots\n\t\t\t */\n\t\t\tcurrent[3] = [];\n\n\t\t\tconst isIdentical = dequal(last[0], current[0]) && dequal(last[1], current[1]);\n\t\t\tconst isLastMadeInCurrentSession = times.has(last[2][0]);\n\n\t\t\t/**\n\t\t\t * Even if override is false, we will replace auto save with manual, because they are the same thing basically\n\t\t\t */\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'manual') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Player has made a manual save, novely decided to make an auto save\n\t\t\t * But it is identical to previously created manual save so completely not wanted\n\t\t\t */\n\t\t\tif (last[2][1] === 'manual' && type === 'auto' && isIdentical) {\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'auto') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\treturn add();\n\t\t});\n\t};\n\t// #endregion\n\n\t// #region New Game\n\tconst newGame = () => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst save = getDefaultSave(clone(defaultState));\n\n\t\t/**\n\t\t * Initial save is automatic, and should be ignored when autosaves is turned off\n\t\t */\n\t\tif (autosaves) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\treturn prev.saves.push(save), prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tstack.value = save;\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\n\t\trenderer.ui.showScreen('game');\n\n\t\trender(context);\n\t};\n\t// #endregion\n\n\t/**\n\t * Set's the save and restores onto it\n\t */\n\tconst set = (save: Save, ctx?: Context) => {\n\t\tconst stack = useStack(ctx || MAIN_CONTEXT_KEY);\n\n\t\tstack.value = save;\n\n\t\treturn restore(save);\n\t};\n\n\tlet interacted = 0;\n\n\t// #region Restore Function\n\t/**\n\t * Restore save or if none is passed then look for latest save, if there is no saves will create a new save\n\t */\n\tconst restore = async (save: Save | undefined) => {\n\t\tif (isEmpty(story)) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Story is empty. You should call an `enine.script` function [https://novely.pages.dev/guide/story.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tlet latest = save || storageData.get().saves.at(-1);\n\n\t\t/**\n\t\t * When there is no save, make a new save\n\t\t */\n\t\tif (!latest) {\n\t\t\tlatest = clone(initial);\n\n\t\t\tstorageData.update((prev) => {\n\t\t\t\tprev.saves.push(latest!);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tcontext.meta.restoring = true;\n\n\t\tconst previous = stack.previous;\n\n\t\tconst [path] = (stack.value = latest);\n\n\t\trenderer.ui.showScreen('game');\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) context.loading(true);\n\n\t\tconst { queue, skip, skipPreserve } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: false,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tconst cleanupHolder = getCustomActionCleanupHolder(context);\n\n\t\tif (previous) {\n\t\t\tconst { queue: prevQueue } = await getActionsFromPath({\n\t\t\t\tstory,\n\t\t\t\tpath: previous[0],\n\t\t\t\tfilter: false,\n\t\t\t\treferGuarded,\n\t\t\t});\n\n\t\t\tconst futures: CustomHandler[] = [];\n\n\t\t\tconst isFromDifferentBranches = previous[0][0][1] !== path[0][1];\n\t\t\tconst end = isFromDifferentBranches ? 0 : queue.length - 1;\n\n\t\t\tfor (let i = prevQueue.length - 1; i >= end; i--) {\n\t\t\t\tconst [action, fn] = prevQueue[i];\n\n\t\t\t\tif (action === 'custom') {\n\t\t\t\t\tfutures.push(fn);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfutures.reverse();\n\n\t\t\tconst nodeCleanup = new Set<CleanupFn>();\n\n\t\t\tfor (const future of futures) {\n\t\t\t\tinner: for (let i = cleanupHolder.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst item = cleanupHolder[i];\n\n\t\t\t\t\tif (future === item.fn) {\n\t\t\t\t\t\tcleanCleanupSource(item);\n\t\t\t\t\t\tnodeCleanup.add(item.node);\n\n\t\t\t\t\t\tcleanupHolder.splice(i, 1);\n\n\t\t\t\t\t\tbreak inner;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnodeCleanup.forEach((f) => f());\n\t\t}\n\n\t\tconst {\n\t\t\trun,\n\t\t\tkeep: { keep, characters, audio },\n\t\t} = createQueueProcessor(queue, {\n\t\t\tskip,\n\t\t\tskipPreserve,\n\t\t});\n\n\t\tif (context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * Context is cleared at exit, so it is dirty only when goingBack\n\t\t\t */\n\t\t\tmatch('clear', [keep, characters, audio], {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t}\n\n\t\tcontext.loading(false);\n\n\t\tconst lastQueueItem = queue.at(-1);\n\t\tconst lastQueueItemRequiresUserAction = lastQueueItem && isBlockingAction(lastQueueItem);\n\n\t\tawait run((item) => {\n\t\t\tif (!latest) return;\n\n\t\t\t/**\n\t\t\t * Skip because last item will be ran again by `render(context)` call\n\t\t\t */\n\t\t\tif (lastQueueItem === item && lastQueueItemRequiresUserAction) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [action, ...props] = item;\n\n\t\t\tif (action === 'custom') {\n\t\t\t\t/**\n\t\t\t\t * We check if there's an existing cleanup function for this action.\n\t\t\t\t * If found, it means the previous run hasn't been cleaned up yet.\n\t\t\t\t * In that case, we avoid re-running.\n\t\t\t\t */\n\t\t\t\tif (cleanupHolder.some((holder) => holder.fn === props[0])) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t});\n\n\t\tif (!context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * When not goingBack setting restoring to false is required to go forward\n\t\t\t * Because when restoring action do not call the resolve function which goes to next action but are controlled\n\t\t\t */\n\t\t\tcontext.meta.restoring = false;\n\t\t}\n\n\t\tawait render(context);\n\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\t};\n\t// #endregion\n\n\tconst { refer, referGuarded } = createReferFunction({\n\t\tstory,\n\t\tonUnknownSceneHit,\n\t});\n\n\t// #region Exit Function\n\t/**\n\t * @param force Force exit\n\t */\n\tconst exit = (force = false, saving = true) => {\n\t\t/**\n\t\t * Exit only possible in main context\n\t\t */\n\t\tconst ctx = renderer.getContext(MAIN_CONTEXT_KEY);\n\n\t\tconst stack = useStack(ctx);\n\t\tconst current = stack.value;\n\n\t\tconst isSaved = () => {\n\t\t\tconst { saves } = storageData.get();\n\t\t\tconst [currentPath, currentData] = stack.value;\n\n\t\t\treturn saves.some(\n\t\t\t\t([path, data, [date, type]]) =>\n\t\t\t\t\ttype === 'manual' && times.has(date) && dequal(path, currentPath) && dequal(data, currentData),\n\t\t\t);\n\t\t};\n\n\t\tif (interacted > 1 && !force && askBeforeExit && !isSaved()) {\n\t\t\trenderer.ui.showExitPrompt();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Imagine list of actions like\n\t\t *\n\t\t * [\n\t\t * ['input', ...args]\n\t\t * ['dialog', ...args]\n\t\t * ]\n\t\t *\n\t\t * When you have done with input, you will go to the dialog\n\t\t * And at that moment you exit the game\n\t\t *\n\t\t * What happens? Input was \"enmemoried\", but dialog not. So when you will open saves, you'll see input action.\n\t\t * We cannot \"enmemory\" dialog when it's just started, because goingBack is going to last enmemoried item, which will be that dialog, so impossible to go back.\n\t\t *\n\t\t * What we do is enmemory on exit.\n\t\t */\n\t\tif (interacted > 0 && saving) {\n\t\t\tsave('auto');\n\t\t}\n\n\t\tstack.clear();\n\t\tclearCustomActionsAtContext(ctx);\n\t\tctx.clear(EMPTY_SET, EMPTY_SET, { music: EMPTY_SET, sounds: EMPTY_SET }, noop);\n\t\trenderer.ui.showScreen('mainmenu');\n\t\tctx.audio.destroy();\n\n\t\tconst [time, type] = current[2];\n\n\t\t/**\n\t\t * This is auto save and belongs to the current session\n\t\t * Player did not interacted or did it once, so this is probably not-needed save\n\t\t */\n\t\tif (type === 'auto' && interacted <= 1 && times.has(time)) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\tprev.saves = prev.saves.filter((save) => save !== current);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Reset interactive value\n\t\t */\n\t\tinteractivity(false);\n\t\t/**\n\t\t * Reset session times\n\t\t */\n\t\ttimes.clear();\n\t};\n\t// #endregion\n\n\tconst back = async () => {\n\t\t/**\n\t\t * Back also happens in main context only\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\n\t\tconst valueBeforeBack = stack.value;\n\n\t\tstack.back();\n\n\t\t/**\n\t\t * There was only one item in the stack so there is no `stack.previous`, also `ctx.meta.goingBack` did not changed\n\t\t */\n\t\tif (dequal(valueBeforeBack, stack.value) && !stack.previous) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait restore(stack.value);\n\t};\n\n\tconst t = (key: BaseTranslationStrings, lang: string | $Language) => {\n\t\treturn translation[lang as $Language].internal[key];\n\t};\n\n\t// #region Preview Function\n\t/**\n\t * Execute save in context named `name`\n\t * @param save Save\n\t * @param name Context name\n\t */\n\tconst preview = async (save: Save, name: string): Promise<RendererInitPreviewReturn> => {\n\t\tif (isEmpty(story)) {\n\t\t\treturn Promise.resolve({\n\t\t\t\tassets: [],\n\t\t\t});\n\t\t}\n\n\t\tconst [path, data] = save;\n\n\t\tconst ctx = renderer.getContext(name);\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) ctx.loading(true);\n\n\t\tconst { queue } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: true,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tctx.loading(false);\n\n\t\t// Enter restoring mode in action\n\t\tctx.meta.restoring = true;\n\t\tctx.meta.preview = true;\n\n\t\tconst processor = createQueueProcessor(queue, {\n\t\t\tskip: EMPTY_SET,\n\t\t});\n\n\t\tuseStack(ctx).push(clone(save));\n\n\t\tconst assets: string[] = [];\n\n\t\tawait processor.run(([action, ...props]) => {\n\t\t\tif (isAudioAction(action)) return;\n\t\t\tif (action === 'vibrate') return;\n\t\t\tif (action === 'end') return;\n\n\t\t\thuntAssets({\n\t\t\t\taction,\n\t\t\t\tprops: props as any,\n\n\t\t\t\tcharacters,\n\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\thandle: assets.push.bind(assets),\n\t\t\t});\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t});\n\n\t\treturn {\n\t\t\tassets,\n\t\t};\n\t};\n\t// #endregion\n\n\tconst removeContext = (name: string) => {\n\t\tSTACK_MAP.delete(name);\n\t};\n\n\tconst getStateAtCtx = (context: string | Context) => {\n\t\treturn useStack(context).value[1];\n\t};\n\n\tconst getStateFunction = (context: string | Context) => {\n\t\tconst stack = useStack(context);\n\n\t\tconst state = ((value) => {\n\t\t\tconst _state = getStateAtCtx(context);\n\n\t\t\tif (!value) {\n\t\t\t\treturn _state;\n\t\t\t}\n\n\t\t\tconst prev = _state;\n\t\t\tconst val = isFunction(value) ? value(prev) : deepmerge(prev, value);\n\n\t\t\tstack.value[1] = val;\n\n\t\t\treturn undefined;\n\t\t}) as StateFunction<State>;\n\n\t\treturn state;\n\t};\n\n\tconst getLanguageDisplayName = (lang: Lang) => {\n\t\tconst language = translation[lang as $Language];\n\n\t\tif (DEV && !language) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\treturn capitalize(language.nameOverride || getIntlLanguageDisplayName(lang));\n\t};\n\n\tconst clearCustomActionsAtContext = (ctx: Context) => {\n\t\tconst cleanupHolder = getCustomActionCleanupHolder(ctx);\n\t\tconst nodeCleanup = new Set<CleanupFn>();\n\n\t\tfor (const item of cleanupHolder) {\n\t\t\tcleanCleanupSource(item);\n\t\t\tnodeCleanup.add(item.node);\n\t\t}\n\n\t\tcleanupHolder.length = 0;\n\t\tnodeCleanup.forEach((fn) => fn());\n\t};\n\n\tconst getResourseTypeWrapper = (url: string) => {\n\t\treturn getResourseType({\n\t\t\turl,\n\t\t\trequest,\n\t\t});\n\t};\n\n\tconst getCharacterColor = (c: keyof $Characters) => {\n\t\treturn c in characters ? characters[c].color : '#000000';\n\t};\n\n\tconst getCharacterAssets = (character: string, emotion: string) => {\n\t\treturn toArray(characters[character].emotions[emotion]).map(unwrapImageAsset);\n\t};\n\n\tconst getCharacterName = (character: keyof $Characters): string => {\n\t\tconst c = character;\n\t\tconst cs = characters;\n\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\tif (c && c in cs) {\n\t\t\tconst block = cs[c].name;\n\n\t\t\tif (typeof block === 'string') {\n\t\t\t\treturn block;\n\t\t\t}\n\n\t\t\tif (lang in block) {\n\t\t\t\treturn block[lang];\n\t\t\t}\n\t\t}\n\n\t\treturn String(c);\n\t};\n\n\tconst setLanguage = (lang: string) => {\n\t\tstorageData.update((prev) => {\n\t\t\tif (languages.includes(lang as $Language)) {\n\t\t\t\tprev.meta[0] = lang as $Language;\n\t\t\t}\n\n\t\t\tif (lang === prev.meta[0]) {\n\t\t\t\tsetDocumentLanguage(lang);\n\t\t\t\tonLanguageChange?.(lang as $Language);\n\t\t\t}\n\n\t\t\treturn prev;\n\t\t});\n\t};\n\n\t// #region Renderer Creation\n\tconst renderer = createRenderer({\n\t\tmainContextKey: MAIN_CONTEXT_KEY,\n\n\t\tcharacters: getCharactersData(characters),\n\t\tcharacterAssetSizes,\n\t\tset,\n\t\trestore,\n\t\tsave,\n\t\tnewGame,\n\t\texit,\n\t\tback,\n\t\tt,\n\t\tpreview,\n\t\tremoveContext,\n\t\tgetStateFunction,\n\t\tclearCustomActionsAtContext,\n\t\tlanguages,\n\t\tstorageData: storageData as unknown as Stored<StorageData<string, Data>>,\n\t\tcoreData,\n\n\t\tgetLanguageDisplayName,\n\t\tgetCharacterColor,\n\t\tgetCharacterAssets,\n\t\tgetDialogOverview: getDialogOverview.bind({\n\t\t\treferGuarded,\n\t\t\tstory,\n\t\t\tgetCharacterName,\n\t\t\tgetLanguage: () => getLanguageFromStore(storageData),\n\t\t\tgetStack: () => useStack(MAIN_CONTEXT_KEY),\n\t\t\ttemplateReplace: (...args) => templateReplace(...args),\n\t\t}),\n\n\t\tgetResourseType: getResourseTypeWrapper,\n\n\t\tsetLanguage,\n\t});\n\t// #endregion\n\n\tconst useStack = createUseStackFunction(renderer);\n\n\t/**\n\t * Initiate\n\t */\n\tuseStack(MAIN_CONTEXT_KEY).push(initial);\n\n\tconst UIInstance = renderer.ui.start();\n\n\tconst enmemory = (ctx: Context) => {\n\t\tif (ctx.meta.restoring) return;\n\n\t\tconst stack = useStack(ctx);\n\n\t\tconst current = clone(stack.value);\n\n\t\tcurrent[2][1] = 'auto';\n\n\t\tstack.push(current);\n\n\t\tsave('auto');\n\t};\n\n\tconst next = (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst path = stack.value[0];\n\n\t\tnextPath(path);\n\t};\n\n\tconst matchActionOptions: MatchActionHandlers = {\n\t\tgetContext: renderer.getContext,\n\t\tpush(ctx) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tnext(ctx);\n\t\t\trender(ctx);\n\t\t},\n\t\tforward(ctx) {\n\t\t\tif (!ctx.meta.preview) enmemory(ctx);\n\n\t\t\tmatchActionOptions.push(ctx);\n\n\t\t\tif (!ctx.meta.preview) interactivity(true);\n\t\t},\n\t\tasync onBeforeActionCall({ action, props, ctx }) {\n\t\t\tif (preloadAssets !== 'automatic') return;\n\t\t\tif (ctx.meta.preview || ctx.meta.restoring) return;\n\t\t\tif (!isBlockingAction([action, ...props] as unknown as Exclude<ValidAction, ValidAction[]>)) return;\n\n\t\t\ttry {\n\t\t\t\tconst collection = await collectActionsBeforeBlockingAction({\n\t\t\t\t\tpath: nextPath(clone(useStack(ctx).value[0])),\n\t\t\t\t\trefer: referGuarded,\n\t\t\t\t\tclone,\n\t\t\t\t});\n\n\t\t\t\tfor (const [action, ...props] of collection) {\n\t\t\t\t\thuntAssets({\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tprops: props as any,\n\n\t\t\t\t\t\tcharacters,\n\n\t\t\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\t\t\thandle: enqueueAssetForPreloading,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\thandleAssetsPreloading({\n\t\t\t\t\t...renderer.misc,\n\t\t\t\t\trequest,\n\t\t\t\t\tlimiter: limitAssetsDownload,\n\t\t\t\t});\n\t\t\t} catch (cause) {\n\t\t\t\tconsole.error(cause);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst ticker = new TickerFactory(paused);\n\n\t// #region Match Action\n\tconst { match, nativeActions } = matchAction(matchActionOptions, {\n\t\twait({ ctx, data, push }, [time]) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tsetTimeout(push, isFunction(time) ? time(data) : time);\n\t\t},\n\t\tshowBackground({ ctx, push }, [background]) {\n\t\t\tif (isString(background) || isAsset(background)) {\n\t\t\t\tctx.background({\n\t\t\t\t\tall: unwrapImageAsset(background),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.background(\n\t\t\t\t\tObject.fromEntries(Object.entries(background).map(([media, asset]) => [media, unwrapImageAsset(asset)])),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tplayMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').play(true);\n\t\t\tpush();\n\t\t},\n\t\tpauseMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound({ ctx, push }, [source, loop]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').play(loop || false);\n\t\t\tpush();\n\t\t},\n\t\tpauseSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice({ ctx, push }, [source]) {\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\t\t\tconst audioSource = isString(source) ? source : isAsset(source) ? source : source[lang];\n\n\t\t\t/**\n\t\t\t * We allow ignoring voice because it is okay to not have voiceover for certain languages\n\t\t\t */\n\t\t\tif (!audioSource) {\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.audio.voice(unwrapAudioAsset(audioSource), paused);\n\t\t\tpush();\n\t\t},\n\t\tstopVoice({ ctx, push }) {\n\t\t\tctx.audio.voiceStop();\n\t\t\tpush();\n\t\t},\n\t\tshowCharacter({ ctx, push }, [character, emotion, className, style]) {\n\t\t\temotion ??= defaultEmotions[character];\n\n\t\t\tif (DEV && !emotion) {\n\t\t\t\tthrow new Error(`Attemp to show character \"${character}\" without emotion provided.`);\n\t\t\t}\n\n\t\t\tif (!emotion) return;\n\n\t\t\tif (DEV && !characters[character].emotions[emotion]) {\n\t\t\t\tthrow new Error(`Attempt to show character \"${character}\" with unknown emotion \"${emotion}\"`);\n\t\t\t}\n\n\t\t\tconst handle = ctx.character(character);\n\n\t\t\thandle.append(className, style, ctx.meta.restoring);\n\t\t\thandle.emotion(emotion, true);\n\n\t\t\tpush();\n\t\t},\n\t\thideCharacter({ ctx, push }, [character, className, style, duration]) {\n\t\t\tctx.character(character).remove(className, style, duration, ctx.meta.restoring).then(push);\n\t\t},\n\t\tdialog({ ctx, data, forward }, [character, content, emotion]) {\n\t\t\tconst name = getCharacterName(character);\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * For each \"dialog\" we save copy of current game state\n\t\t\t * It's used for dialog overview\n\t\t\t */\n\t\t\tif (!ctx.meta.restoring && !ctx.meta.goingBack) {\n\t\t\t\tstack.value[3].push(clone(data));\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('dialog');\n\n\t\t\tctx.dialog(templateReplace(content, data), templateReplace(name, data), character, emotion, forward);\n\t\t},\n\t\tfunction({ ctx, push }, [fn]) {\n\t\t\tconst { restoring, goingBack, preview } = ctx.meta;\n\n\t\t\tconst result = fn({\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tgoingBack,\n\t\t\t\trestoring,\n\t\t\t\tpreview,\n\t\t\t\tstate: getStateFunction(ctx),\n\t\t\t});\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tresult ? result.then(push) : push();\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tchoice({ ctx, data }, [question, ...choices]) {\n\t\t\tconst isWithoutQuestion = Array.isArray(question);\n\n\t\t\tif (isWithoutQuestion) {\n\t\t\t\t/**\n\t\t\t\t * Can be string or a choice\n\t\t\t\t */\n\t\t\t\tchoices.unshift(question as unknown as ActionChoiceChoice<string, State>);\n\n\t\t\t\t/**\n\t\t\t\t * Omitted then\n\t\t\t\t */\n\t\t\t\tquestion = '';\n\t\t\t}\n\n\t\t\tconst transformedChoices = choices.map(([content, _children, active, visible, onSelect, image]) => {\n\t\t\t\tconst active$ = store(false);\n\t\t\t\tconst visible$ = store(false);\n\n\t\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\t\tconst getCheckValue = (fn: ChoiceCheckFunction<string, State> | undefined) => {\n\t\t\t\t\t// If there is no explicit \"no\" choice will be active or visible, etc...\n\t\t\t\t\tif (!fn) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Here we need to use \"fresh\" state instead of \"data\" parameter\n\t\t\t\t\treturn fn({\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\tstate: getStateAtCtx(ctx),\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst update = () => {\n\t\t\t\t\tactive$.set(getCheckValue(active));\n\t\t\t\t\tvisible$.set(getCheckValue(visible));\n\t\t\t\t};\n\n\t\t\t\tupdate();\n\n\t\t\t\tconst onSelectGuarded = onSelect || noop;\n\t\t\t\tconst onSelectWrapped = () => {\n\t\t\t\t\tonSelectGuarded({\n\t\t\t\t\t\trecompute: update,\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst imageValue = image ? unwrapImageAsset(image) : '';\n\n\t\t\t\treturn [templateReplace(content, data), active$, visible$, onSelectWrapped, imageValue] as [\n\t\t\t\t\tstring,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\t() => void,\n\t\t\t\t\tstring,\n\t\t\t\t];\n\t\t\t});\n\n\t\t\tif (DEV && transformedChoices.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Running choice without variants to choose from, look at how to use Choice action properly [https://novely.pages.dev/guide/actions/choice#usage]`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('choice');\n\n\t\t\tctx.choices(templateReplace(question, data), transformedChoices, (selected) => {\n\t\t\t\tif (!ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\t/**\n\t\t\t\t * If there is a question, then `index` should be shifted by `1`\n\t\t\t\t */\n\t\t\t\tconst offset = isWithoutQuestion ? 0 : 1;\n\n\t\t\t\tif (DEV && !transformedChoices[selected]) {\n\t\t\t\t\tthrow new Error('Choice children is empty, either add content there or make item not selectable');\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['choice', selected + offset], [null, 0]);\n\t\t\t\trender(ctx);\n\t\t\t\tinteractivity(true);\n\t\t\t});\n\t\t},\n\t\tjump({ ctx, data }, [scene]) {\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * `-1` index is used here because `clear` will run `next` that will increase index to `0`\n\t\t\t */\n\t\t\tstack.value[0] = [\n\t\t\t\t['jump', scene],\n\t\t\t\t[null, -1],\n\t\t\t];\n\n\t\t\tstack.value[3] = [];\n\n\t\t\tmatch('clear', [], {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t},\n\t\tclear({ ctx, push }, [keep, characters, audio]) {\n\t\t\t/**\n\t\t\t * Remove vibration\n\t\t\t */\n\t\t\tctx.vibrate(0);\n\n\t\t\t/**\n\t\t\t * Call the actual `clear`\n\t\t\t */\n\t\t\tctx.clear(\n\t\t\t\tkeep || EMPTY_SET,\n\t\t\t\tcharacters || EMPTY_SET,\n\t\t\t\taudio || { music: EMPTY_SET, sounds: EMPTY_SET },\n\t\t\t\tpush,\n\t\t\t);\n\t\t},\n\t\tcondition({ ctx, data }, [condition, variants]) {\n\t\t\tif (DEV && Object.values(variants).length === 0) {\n\t\t\t\tthrow new Error(`Attempt to use Condition action with empty variants object`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst val = String(condition(data));\n\n\t\t\t\tif (DEV && !variants[val]) {\n\t\t\t\t\tthrow new Error(`Attempt to go to unknown variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tif (DEV && variants[val].length === 0) {\n\t\t\t\t\tthrow new Error(`Attempt to go to empty variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['condition', val], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t\tend({ ctx }) {\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\texit(true, false);\n\t\t},\n\t\tinput({ ctx, data, forward }, [question, onInput, setup]) {\n\t\t\tctx.clearBlockingActions('input');\n\n\t\t\tctx.input(templateReplace(question, data), onInput, setup || noop, forward);\n\t\t},\n\t\tcustom({ ctx, push }, [fn]) {\n\t\t\tif (fn.requireUserAction) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t}\n\n\t\t\tconst state = getStateFunction(ctx);\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\tconst result = handleCustomAction(ctx, fn, {\n\t\t\t\t...ctx.custom(fn),\n\t\t\t\tstate,\n\t\t\t\tlang,\n\t\t\t\tgetStack: useStack,\n\t\t\t\tpaused,\n\t\t\t\tticker: ticker.fork(),\n\t\t\t\ttemplateReplace,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tconst next = () => {\n\t\t\t\tif (fn.requireUserAction && !ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t\tinteractivity(true);\n\t\t\t\t}\n\n\t\t\t\tpush();\n\t\t\t};\n\n\t\t\tif (!ctx.meta.restoring || ctx.meta.goingBack) {\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\tresult.then(next);\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tvibrate({ ctx, push }, pattern) {\n\t\t\tctx.vibrate(pattern);\n\t\t\tpush();\n\t\t},\n\t\tnext({ push }) {\n\t\t\tpush();\n\t\t},\n\t\tanimateCharacter({ ctx, push }, [character, className]) {\n\t\t\tconst classes = className.split(' ');\n\n\t\t\tif (DEV && classes.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\tctx.character(character).animate(classes);\n\n\t\t\tpush();\n\t\t},\n\t\ttext({ ctx, data, forward }, text) {\n\t\t\tconst string = text.map((content) => templateReplace(content, data)).join(' ');\n\n\t\t\tif (DEV && string.length === 0) {\n\t\t\t\tthrow new Error(`Action Text was called with empty string or array`);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('text');\n\n\t\t\tctx.text(string, forward);\n\t\t},\n\t\tasync exit({ ctx, data }) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath: useStack(ctx).value[0],\n\t\t\t\trefer: referGuarded,\n\t\t\t\tonExitImpossible: () => {\n\t\t\t\t\tmatch('end', [], {\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trender(ctx);\n\t\t},\n\t\tpreload({ ctx, push }, [source]) {\n\t\t\tif (DEV && preloadAssets !== 'lazy') {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`You do not need a preload action because \"preloadAssets\" strategy was set to \"${preloadAssets}\"`,\n\t\t\t\t);\n\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst src = unwrapAsset(source);\n\n\t\t\tif (!ctx.meta.goingBack && !ctx.meta.restoring && !PRELOADED_ASSETS.has(src)) {\n\t\t\t\tconst process = async () => {\n\t\t\t\t\tconst type = isAsset(source) ? source.type : await getResourseTypeWrapper(src);\n\n\t\t\t\t\tif (type === 'image') {\n\t\t\t\t\t\trenderer.misc.preloadAudioBlocking(src);\n\t\t\t\t\t} else if (type === 'audio') {\n\t\t\t\t\t\trenderer.misc.preloadImage(src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\t\tconsole.error(`Preload error: Unknown type of the following resource: `, source);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add to preloaded before it was loaded to prevent downloading multiple times\n\t\t\t\t\tPRELOADED_ASSETS.add(src);\n\t\t\t\t};\n\n\t\t\t\tprocess();\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tblock({ ctx }, [scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with unknown scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with empty scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['block', scene], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t});\n\t// #endregion\n\n\t// #region Action\n\tconst action = buildActionObject({\n\t\trendererActions: renderer.actions,\n\t\tnativeActions,\n\t\tcharacters,\n\t});\n\t// #endregion\n\n\t// #region Render Function\n\tconst render = async (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst [path, state] = stack.value;\n\n\t\tconst { found, value } = await refer(path);\n\n\t\tif (found) {\n\t\t\tctx.loading(true);\n\t\t}\n\n\t\tconst referred = await value;\n\n\t\tif (found) {\n\t\t\tctx.loading(false);\n\t\t}\n\n\t\tif (isAction(referred)) {\n\t\t\tconst [action, ...props] = referred;\n\n\t\t\tmatch(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else if (Object.values(story).some((branch) => branch === referred)) {\n\t\t\t/**\n\t\t\t * Developer might not write the end action on their own, so we will catch situation when there are no other options than end the game.\n\t\t\t *\n\t\t\t * There are three options right now.\n\t\t\t * - We've got to the action — gonna render it\n\t\t\t * - We've got `undefined`. This means we are tried to go forward, but story array ended already, so we are gonna run exit\n\t\t\t * - We've got branch of story object. This means we exitied from where it's possible to exit and now we can only end the game\n\t\t\t */\n\t\t\tmatch('end', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else {\n\t\t\tmatch('exit', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t}\n\t};\n\t// #endregion\n\n\tconst interactivity = (value = false) => {\n\t\tinteracted = value ? interacted + 1 : 0;\n\t};\n\n\t/**\n\t * Replaces content inside of {{braces}}.\n\t */\n\tconst templateReplace = (content: TextContent<$Language, Data>, values?: Data) => {\n\t\tconst {\n\t\t\tdata,\n\t\t\tmeta: [lang],\n\t\t} = storageData.get();\n\n\t\t// Object to take values from\n\t\tconst obj = values || data;\n\n\t\t// String\n\t\tconst str = flattenAllowedContent(!isFunction(content) && !isString(content) ? content[lang] : content, obj);\n\n\t\tconst t = translation[lang];\n\t\tconst pluralRules = (t.plural || t.actions) && new Intl.PluralRules(t.tag || lang);\n\n\t\treturn replaceTranslation(str, obj, t.plural, t.actions, pluralRules);\n\t};\n\n\tconst data = ((value) => {\n\t\tconst _data = storageData.get().data;\n\n\t\tif (!value) return _data;\n\n\t\tconst val = isFunction(value) ? value(_data) : deepmerge(_data, value as $Data);\n\n\t\tstorageData.update((prev) => {\n\t\t\tprev.data = val;\n\n\t\t\treturn prev;\n\t\t});\n\n\t\treturn undefined;\n\t}) as StateFunction<$Data>;\n\n\tconst getCurrentStorageData = () => {\n\t\treturn coreData.get().dataLoaded ? clone(storageData.get()) : null;\n\t};\n\n\tconst setStorageData = (data: StorageData<$Language, $Data>) => {\n\t\tif (destroyed) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`function \\`setStorageData\\` was called after novely instance was destroyed. Data is not updater nor synced after destroy.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tstorageData.set(data);\n\t};\n\n\t// #region Function Return\n\treturn {\n\t\t/**\n\t\t * Function to set game script\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tscript,\n\t\t/**\n\t\t * Get actions\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\taction: action as Actions,\n\t\t/**\n\t\t * State bound to `$MAIN` game context\n\t\t * @deprecated Use `state` function provided from action arguments\n\t\t */\n\t\tstate: getStateFunction(MAIN_CONTEXT_KEY),\n\t\t/**\n\t\t * Store data between games\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {\n\t\t * // Paid content should be purchased only once\n\t\t * // So it will be available in any save\n\t\t * data({ paid_content_purchased: true })\n\t\t * })\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tdata,\n\t\t/**\n\t\t * Used in combination with type utilities\n\t\t * @example\n\t\t * ```ts\n\t\t * import type { TypesFromEngine, ConditionParams, StateFunction } from '@novely/core';\n\t\t *\n\t\t * type Types = TypesFromEngine<typeof engine>;\n\t\t *\n\t\t * const conditionCheck = (state: StateFunction<ConditionParams<Types>>) => {\n\t\t * return state.age >= 18;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttypes: null as EngineTypes<$Language, $State, $Data, $Characters> | null,\n\t\t/**\n\t\t * Replaces content inside {{braces}} using global data\n\t\t * @example\n\t\t * ```ts\n\t\t * data({ name: 'Alexei' })\n\t\t *\n\t\t * templateReplace('{{name}} is our hero')\n\t\t * templateReplace({\n\t\t * en: (data) => 'Hello, ' + data.name\n\t\t * })\n\t\t * ```\n\t\t */\n\t\ttemplateReplace(content: TextContent<$Language, $Data>) {\n\t\t\treturn templateReplace(content as TextContent<$Language, Data>);\n\t\t},\n\t\t/**\n\t\t * Same as `templateReplace` but uses state and requires explicitly providing it\n\t\t */\n\t\ttemplateReplaceState(content: TextContent<$Language, $State>, state: State) {\n\t\t\treturn templateReplace(content as TextContent<$Language, State>, state);\n\t\t},\n\t\t/**\n\t\t * Cancel data loading, hide UI, ignore page change events\n\t\t * Data updates still will work in case Novely already was loaded\n\t\t */\n\t\tdestroy() {\n\t\t\tif (destroyed) return;\n\n\t\t\tdataLoaded.cancel();\n\n\t\t\tUIInstance.unmount();\n\n\t\t\tticker.destroy();\n\n\t\t\tremoveEventListener('beforeunload', throttledShortOnStorageDataChange);\n\n\t\t\tdestroyed = true;\n\t\t},\n\t\t/**\n\t\t * Funtion to get current storage data\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t * ```\n\t\t */\n\t\tgetCurrentStorageData,\n\t\t/**\n\t\t * Function to set storage data. Using this function is not recommended.\n\t\t *\n\t\t * @deprecated\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t *\n\t\t * if (currentStorageData) {\n\t\t * // update music volume\n\t\t * currentStorageData.meta[2] = 1;\n\t\t *\n\t\t * setStorageData(currentStorageData)\n\t\t * }\n\t\t * ```\n\t\t */\n\t\tsetStorageData,\n\t\t/**\n\t\t * Function to control paused state. Custom Actions are provided with `paused` store they can subscribe to.\n\t\t * This function will notify Custom Actions. Pause state can be used when showing ads.\n\t\t * @example\n\t\t * ```ts\n\t\t * sdk.on('pause' () => engine.setPaused(true));\n\t\t * sdk.on('resume', () => engine.setPaused(false));\n\t\t * ```\n\t\t */\n\t\tsetPaused: (paused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.paused = paused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Function to control focused state. It will affect `paused` store passed to Custom Actions.\n\t\t * This function can be used to pause game when it's not focused.\n\t\t * @example\n\t\t * ```ts\n\t\t * import { pauseOnBlur } from '@novely/core';\n\t\t *\n\t\t * // Will subscribe to blur/focus events and call `setFocused`\n\t\t * pauseOnBlur(engine);\n\t\t *\n\t\t * // OR\n\t\t *\n\t\t * sdk.on('focus' () => engine.setFocused(true));\n\t\t * sdk.on('blur', () => engine.setFocused(false));\n\t\t * ```\n\t\t */\n\t\tsetFocused: (focused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.focused = focused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t};\n\t// #endregion\n};\n\nexport { novely };\n","function set(obj, key, val) {\n\tif (typeof val.value === 'object') val.value = klona(val.value);\n\tif (!val.enumerable || val.get || val.set || !val.configurable || !val.writable || key === '__proto__') {\n\t\tObject.defineProperty(obj, key, val);\n\t} else obj[key] = val.value;\n}\n\nexport function klona(x) {\n\tif (typeof x !== 'object') return x;\n\n\tvar i=0, k, list, tmp, str=Object.prototype.toString.call(x);\n\n\tif (str === '[object Object]') {\n\t\ttmp = Object.create(x.__proto__ || null);\n\t} else if (str === '[object Array]') {\n\t\ttmp = Array(x.length);\n\t} else if (str === '[object Set]') {\n\t\ttmp = new Set;\n\t\tx.forEach(function (val) {\n\t\t\ttmp.add(klona(val));\n\t\t});\n\t} else if (str === '[object Map]') {\n\t\ttmp = new Map;\n\t\tx.forEach(function (val, key) {\n\t\t\ttmp.set(klona(key), klona(val));\n\t\t});\n\t} else if (str === '[object Date]') {\n\t\ttmp = new Date(+x);\n\t} else if (str === '[object RegExp]') {\n\t\ttmp = new RegExp(x.source, x.flags);\n\t} else if (str === '[object DataView]') {\n\t\ttmp = new x.constructor( klona(x.buffer) );\n\t} else if (str === '[object ArrayBuffer]') {\n\t\ttmp = x.slice(0);\n\t} else if (str.slice(-6) === 'Array]') {\n\t\t// ArrayBuffer.isView(x)\n\t\t// ~> `new` bcuz `Buffer.slice` => ref\n\t\ttmp = new x.constructor(x);\n\t}\n\n\tif (tmp) {\n\t\tfor (list=Object.getOwnPropertySymbols(x); i < list.length; i++) {\n\t\t\tset(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i]));\n\t\t}\n\n\t\tfor (i=0, list=Object.getOwnPropertyNames(x); i < list.length; i++) {\n\t\t\tif (Object.hasOwnProperty.call(tmp, k=list[i]) && tmp[k] === x[k]) continue;\n\t\t\tset(tmp, k, Object.getOwnPropertyDescriptor(x, k));\n\t\t}\n\t}\n\n\treturn tmp || x;\n}\n","import type { TypewriterSpeed } from './types';\n\nconst SKIPPED_DURING_RESTORE = new Set(['dialog', 'choice', 'input', 'vibrate', 'text'] as const);\n\nconst BLOCK_EXIT_STATEMENTS = new Set(['choice:exit', 'condition:exit', 'block:exit'] as const);\n\nconst BLOCK_STATEMENTS = new Set(['choice', 'condition', 'block'] as const);\n\nconst AUDIO_ACTIONS = new Set(['playMusic', 'stopMusic', 'playSound', 'stopSound', 'voice', 'stopVoice'] as const);\n\nconst EMPTY_SET = new Set<any>();\n\nconst DEFAULT_TYPEWRITER_SPEED: TypewriterSpeed = 'Medium';\n\nconst HOWLER_SUPPORTED_FILE_FORMATS = new Set([\n\t'mp3',\n\t'mpeg',\n\t'opus',\n\t'ogg',\n\t'oga',\n\t'wav',\n\t'aac',\n\t'caf',\n\t'm4a',\n\t'm4b',\n\t'mp4',\n\t'weba',\n\t'webm',\n\t'dolby',\n\t'flac',\n] as const);\n\nconst SUPPORTED_IMAGE_FILE_FORMATS = new Set([\n\t'apng',\n\t'avif',\n\t'gif',\n\t'jpg',\n\t'jpeg',\n\t'jfif',\n\t'pjpeg',\n\t'pjp',\n\t'png',\n\t'svg',\n\t'webp',\n\t'bmp',\n] as const);\n\n/**\n * @internal\n */\nconst MAIN_CONTEXT_KEY = '$MAIN';\n\nexport {\n\tSKIPPED_DURING_RESTORE,\n\tEMPTY_SET,\n\tDEFAULT_TYPEWRITER_SPEED,\n\tBLOCK_EXIT_STATEMENTS,\n\tBLOCK_STATEMENTS,\n\tMAIN_CONTEXT_KEY,\n\tAUDIO_ACTIONS,\n\tHOWLER_SUPPORTED_FILE_FORMATS,\n\tSUPPORTED_IMAGE_FILE_FORMATS,\n};\n","import type { CustomActionHolder, CustomActionCleanupHolder } from './custom-action';\nimport type { StackHolder } from './types';\n\n/**\n * @internal\n */\nconst STACK_MAP = new Map<string, StackHolder>();\n\n/**\n * @internal\n */\nconst CUSTOM_ACTION_MAP = new Map<string, CustomActionHolder>();\n\n/**\n * @internal\n */\nconst CUSTOM_ACTION_CLEANUP_MAP = new Map<string, CustomActionCleanupHolder>();\n\nconst PRELOADED_ASSETS = new Set<string>();\nconst ASSETS_TO_PRELOAD = new Set<string>();\n\nexport { PRELOADED_ASSETS, ASSETS_TO_PRELOAD, STACK_MAP, CUSTOM_ACTION_MAP, CUSTOM_ACTION_CLEANUP_MAP };\n","import type { ValidAction, CustomHandler } from '../action';\nimport type { NovelyAsset } from '../types';\nimport { AUDIO_ACTIONS, BLOCK_EXIT_STATEMENTS, BLOCK_STATEMENTS, SKIPPED_DURING_RESTORE } from '../constants';\n\nconst isNumber = (val: unknown): val is number => {\n\treturn typeof val === 'number';\n};\n\nconst isNull = (val: unknown): val is null => {\n\treturn val === null;\n};\n\nconst isString = (val: unknown): val is string => {\n\treturn typeof val === 'string';\n};\n\nconst isFunction = (val: unknown): val is (...parameters: any[]) => any => {\n\treturn typeof val === 'function';\n};\n\nconst isPromise = (val: unknown): val is Promise<any> => {\n\treturn Boolean(val) && (typeof val === 'object' || isFunction(val)) && isFunction((val as any).then);\n};\n\nconst isEmpty = (val: unknown): val is Record<PropertyKey, never> => {\n\treturn typeof val === 'object' && !isNull(val) && Object.keys(val).length === 0;\n};\n\n/**\n * Checks if a given string starts with 'http', '/', '.', or 'data'\n */\nconst isCSSImageURL = (url: string): boolean => {\n\tconst startsWith = String.prototype.startsWith.bind(url);\n\n\treturn startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data');\n};\n\n/**\n * Determines if a given action requires user interaction based on its type and metadata.\n */\nconst isUserRequiredAction = ([action, ...meta]: ValidAction) => {\n\treturn Boolean(action === 'custom' && meta[0] && (meta[0] as unknown as CustomHandler).requireUserAction);\n};\n\nconst isBlockStatement = (statement: unknown): statement is 'choice' | 'condition' | 'block' => {\n\treturn BLOCK_STATEMENTS.has(statement as any);\n};\n\nconst isBlockExitStatement = (\n\tstatement: unknown,\n): statement is 'choice:exit' | 'condition:exit' | 'block:exit' => {\n\treturn BLOCK_EXIT_STATEMENTS.has(statement as any);\n};\n\nconst isSkippedDuringRestore = (item: unknown): item is 'vibrate' | 'dialog' | 'input' | 'choice' | 'text' => {\n\treturn SKIPPED_DURING_RESTORE.has(item as any);\n};\n\ntype AudioActionName = 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice';\n\nconst isAudioAction = (action: unknown): action is AudioActionName => {\n\treturn AUDIO_ACTIONS.has(action as any);\n};\n\nconst isAction = (element: unknown): element is Exclude<ValidAction, ValidAction[]> => {\n\treturn Array.isArray(element) && isString(element[0]);\n};\n\nconst isImageAsset = (asset: unknown): asset is string => {\n\treturn isString(asset) && isCSSImageURL(asset);\n};\n\n/**\n * Is custom and requires user action or skipped during restoring\n */\nconst isBlockingAction = (action: Exclude<ValidAction, ValidAction[]>) => {\n\treturn isUserRequiredAction(action) || (isSkippedDuringRestore(action[0]) && action[0] !== 'vibrate');\n};\n\nconst isAsset = (suspect: unknown): suspect is NovelyAsset => {\n\treturn suspect !== null && typeof suspect === 'object' && 'source' in suspect && 'type' in suspect;\n};\n\nexport {\n\tisNumber,\n\tisNull,\n\tisString,\n\tisFunction,\n\tisPromise,\n\tisEmpty,\n\tisCSSImageURL,\n\tisUserRequiredAction,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tisAudioAction,\n\tisAction,\n\tisImageAsset,\n\tisBlockingAction,\n\tisAsset,\n};\n\nexport type { AudioActionName };\n","import type { CustomHandler, DefaultActionProxy } from '../action';\nimport type { Thenable, State } from '../types';\nimport type { Context } from '../renderer';\n\ntype MatchActionParams = {\n\tdata: State;\n\tctx: Context;\n\n\tpush: () => void;\n\tforward: () => void;\n};\n\ntype MatchActionMap = {\n\t[Key in keyof DefaultActionProxy]: (\n\t\tparams: MatchActionParams,\n\t\tdata: Parameters<DefaultActionProxy[Key]>,\n\t) => void;\n};\n\ntype MatchActionMapComplete = Omit<MatchActionMap, 'custom'> & {\n\tcustom: (params: MatchActionParams, value: [handler: CustomHandler]) => Thenable<void>;\n};\n\ntype MatchActionParameters = {\n\t/**\n\t * Name of context or context\n\t */\n\tctx: string | Context;\n\t/**\n\t * Data from the save\n\t */\n\tdata: State;\n};\n\ntype OnBeforeActionCallPayload = {\n\taction: keyof MatchActionMapComplete;\n\tprops: Parameters<DefaultActionProxy[keyof MatchActionMapComplete]>;\n\tctx: Context;\n};\n\ntype MatchActionHandlers = {\n\tpush: (ctx: Context) => void;\n\tforward: (ctx: Context) => void;\n\n\tgetContext: (name: string) => Context;\n\n\tonBeforeActionCall: (payload: OnBeforeActionCallPayload) => void;\n};\n\nconst matchAction = (callbacks: MatchActionHandlers, values: MatchActionMapComplete) => {\n\tconst { getContext, onBeforeActionCall, push, forward } = callbacks;\n\n\tconst match = (action: keyof MatchActionMapComplete, props: any, { ctx, data }: MatchActionParameters) => {\n\t\tconst context = typeof ctx === 'string' ? getContext(ctx) : ctx;\n\n\t\tonBeforeActionCall({\n\t\t\taction,\n\t\t\tprops,\n\t\t\tctx: context,\n\t\t});\n\n\t\treturn values[action](\n\t\t\t{\n\t\t\t\tctx: context,\n\t\t\t\tdata,\n\n\t\t\t\tpush() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tpush(context);\n\t\t\t\t},\n\t\t\t\tforward() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tforward(context);\n\t\t\t\t},\n\t\t\t},\n\t\t\tprops,\n\t\t);\n\t};\n\n\treturn {\n\t\tmatch,\n\t\tnativeActions: Object.keys(values),\n\t};\n};\n\nexport { matchAction };\nexport type { MatchActionHandlers, MatchActionMapComplete };\n","import { memoize, once } from 'es-toolkit/function';\nimport { DEV } from 'esm-env';\nimport { supportsMap as audioSupport } from './audio-codecs';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from './constants';\nimport { supportsMap as imageSupport } from './image-formats';\nimport type { NovelyAsset } from './types';\nimport { getUrlFileExtension, isAsset } from './utilities';\n\nconst generateRandomId = () => Math.random().toString(36);\n\n/**\n * Function to get assets type. All assets must be of the same type. Only works with supported types.\n */\nconst getType = memoize(\n\t(extensions: string[]) => {\n\t\tif (extensions.every((extension) => HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (extensions.every((extension) => SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(`Unsupported file extensions: ${JSON.stringify(extensions)}`);\n\t\t}\n\n\t\tthrow extensions;\n\t},\n\t{\n\t\tgetCacheKey: (extensions) => extensions.join('~'),\n\t},\n);\n\nconst SUPPORT_MAPS = {\n\timage: imageSupport,\n\taudio: audioSupport,\n} as const;\n\n/**\n * This function uses array instead of spread because memoize only works with first argument\n */\nconst assetPrivate = memoize(\n\t(variants: string[]): NovelyAsset => {\n\t\tif (DEV && variants.length === 0) {\n\t\t\tthrow new Error(`Attempt to use \"asset\" function without arguments`);\n\t\t}\n\n\t\tconst map: Record<string, string> = {};\n\t\tconst extensions: string[] = [];\n\n\t\tfor (const v of variants) {\n\t\t\tconst e = getUrlFileExtension(v);\n\n\t\t\tmap[e] = v;\n\t\t\textensions.push(e);\n\t\t}\n\n\t\tconst type = getType(extensions);\n\n\t\tconst getSource = once(() => {\n\t\t\tconst support = SUPPORT_MAPS[type];\n\n\t\t\tfor (const extension of extensions) {\n\t\t\t\tif (extension in support) {\n\t\t\t\t\tif (support[extension as keyof typeof support]) {\n\t\t\t\t\t\treturn map[extension];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn map[extension];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(`No matching asset was found for ${variants.map((v) => `\"${v}\"`).join(', ')}`);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t});\n\n\t\treturn {\n\t\t\tget source() {\n\t\t\t\treturn getSource();\n\t\t\t},\n\t\t\tget type() {\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tid: generateRandomId(),\n\t\t};\n\t},\n\t{\n\t\tgetCacheKey: (variants) => variants.join('~'),\n\t},\n);\n\n/**\n * Memoizes and returns an asset selection object based on provided file variants.\n * The selected asset depends on the client's support for various formats.\n *\n * @param {...string} variants - A variable number of strings, each representing a potential asset file URL.\n * @returns {NovelyAsset} An object representing the selected asset with `source` and `type` properties.\n *\n * @throws {Error} If in DEV mode and no arguments are provided.\n * @example\n * ```\n * import { asset } from 'novely';\n *\n * // Passed first have higher priority\n * const classroom = asset(\n * 'classroom.avif',\n * 'classroom.webp',\n * 'classroom.jpeg'\n * );\n *\n * setTimeout(() => {\n * console.log(classroom.source);\n * }, 100);\n * ```\n */\nconst asset = (...variants: string[]) => {\n\treturn assetPrivate(variants);\n};\n\nasset.image = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'image',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nasset.audio = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'audio',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nconst unwrapAsset = (asset: string | NovelyAsset) => {\n\treturn isAsset(asset) ? asset.source : asset;\n};\n\nconst unwrapAudioAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'audio') {\n\t\tthrow new Error('Attempt to use non-audio asset in audio action', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nconst unwrapImageAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'image') {\n\t\tthrow new Error('Attempt to use non-image asset in action that requires image assets', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nexport { asset, unwrapAsset, unwrapAudioAsset, unwrapImageAsset };\n","/**\n * This code is adapted from the Howler.js source code.\n * Howler.js: https://github.com/goldfire/howler.js\n */\n\n/**\n * I guess some browsers will return \"no\". So it's better to be safe\n */\nconst cut = (str: CanPlayTypeResult | 'no') => str.replace(/^no$/, '');\n\nconst audio = new Audio();\n\nconst canPlay = (type: string) => !!cut(audio.canPlayType(type));\nconst canPlayMultiple = (...types: string[]) => types.some((type) => canPlay(type));\n\nconst supportsMap = {\n\tmp3: canPlayMultiple('audio/mpeg;', 'audio/mp3;'),\n\tmpeg: canPlay('audio/mpeg;'),\n\topus: canPlay('audio/ogg; codecs=\"opus\"'),\n\togg: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\toga: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\twav: canPlayMultiple('audio/wav; codecs=\"1\"', 'audio/wav;'),\n\taac: canPlay('audio/aac;'),\n\tcaf: canPlay('audio/x-caf;'),\n\tm4a: canPlayMultiple('audio/x-m4a;', 'audio/m4a;', 'audio/aac;'),\n\tm4b: canPlayMultiple('audio/x-m4b;', 'audio/m4b;', 'audio/aac;'),\n\tmp4: canPlayMultiple('audio/x-mp4;', 'audio/mp4;', 'audio/aac;'),\n\tweba: canPlay('audio/webm; codecs=\"vorbis\"'),\n\twebm: canPlay('audio/webm; codecs=\"vorbis\"'),\n\tdolby: canPlay('audio/mp4; codecs=\"ec-3\"'),\n\tflac: canPlayMultiple('audio/x-flac;', 'audio/flac;'),\n};\n\nexport { supportsMap };\n","const avif =\n\t'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=';\nconst jxl =\n\t'data:image/jxl;base64,/woIAAAMABKIAgC4AF3lEgAAFSqjjBu8nOv58kOHxbSN6wxttW1hSaLIODZJJ3BIEkkaoCUzGM6qJAE=';\nconst webp =\n\t'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n\nconst supportsFormat = (source: string) => {\n\tconst { promise, resolve } = Promise.withResolvers<boolean>();\n\n\tconst img = Object.assign(document.createElement('img'), {\n\t\tsrc: source,\n\t});\n\n\timg.onload = img.onerror = () => {\n\t\tresolve(img.height === 2);\n\t};\n\n\treturn promise;\n};\n\nconst supportsMap = {\n\tavif: false,\n\tjxl: false,\n\twebp: false,\n};\n\nconst formatsMap = {\n\tavif,\n\tjxl,\n\twebp,\n} as const;\n\nconst loadImageFormatsSupport = async () => {\n\tconst promises = [];\n\n\tfor (const [format, source] of Object.entries(formatsMap)) {\n\t\tconst promise = supportsFormat(source).then((supported) => {\n\t\t\tsupportsMap[format as keyof typeof supportsMap] = supported;\n\t\t});\n\n\t\tpromises.push(promise);\n\t}\n\n\tawait Promise.all(promises);\n};\n\nloadImageFormatsSupport();\n\nexport { supportsMap };\n","import type { Story, ValidAction, CustomHandler, GetActionParameters } from '../action';\nimport type { CloneFN, Path, PathItem, Thenable } from '../types';\nimport type { NovelyAsset } from '../types';\nimport {\n\tisNull,\n\tisNumber,\n\tisAction,\n\tisSkippedDuringRestore,\n\tisUserRequiredAction,\n\tisPromise,\n\tisBlockExitStatement,\n\tisBlockStatement,\n\tisBlockingAction,\n} from './assertions';\nimport { unwrapAsset } from '../asset';\nimport { DEV } from 'esm-env';\n\n// #region Is Exit Impossible\nconst isExitImpossible = (path: Path) => {\n\tconst blockStatements = path.filter(([item]) => isBlockStatement(item));\n\tconst blockExitStatements = path.filter(([item]) => isBlockExitStatement(item));\n\n\t/**\n\t * There were no blocks nor exits from blocks\n\t */\n\tif (blockStatements.length === 0 && blockExitStatements.length === 0) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * There is block that can be exited\n\t */\n\tif (blockStatements.length > blockExitStatements.length) {\n\t\treturn false;\n\t}\n\n\treturn !blockExitStatements.every(([name], i) => name && name.startsWith(blockStatements[i][0]!));\n};\n// #endregion\n\n// #region Refer\ntype CreateReferFunctionParams = {\n\tstory: Story;\n\tonUnknownSceneHit: (scene: string) => Thenable<void>;\n};\n\nconst createReferFunction = ({ story, onUnknownSceneHit }: CreateReferFunctionParams) => {\n\tconst refer = async (path: Path) => {\n\t\t/**\n\t\t * Are we ready to return a value.\n\t\t * We need to know are there any \"unknown\" scenes or not\n\t\t */\n\t\tconst { promise: ready, resolve: setReady } = Promise.withResolvers<boolean>();\n\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tconst refer = async () => {\n\t\t\tfor (const [type, val] of path) {\n\t\t\t\tif (type === 'jump') {\n\t\t\t\t\tif (!current[val]) {\n\t\t\t\t\t\tsetReady(true);\n\t\t\t\t\t\tawait onUnknownSceneHit(val);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && !story[val]) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to unknown scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && story[val].length === 0) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to empty scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tprecurrent = story;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === null) {\n\t\t\t\t\tprecurrent = current;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === 'choice') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t\t} else if (type === 'condition') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[2][val];\n\t\t\t\t} else if (type === 'block') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = story[val];\n\t\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\t\tcurrent = blocks.pop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetReady(false);\n\n\t\t\treturn current as Exclude<ValidAction, ValidAction[]>;\n\t\t};\n\n\t\tconst value = refer();\n\t\tconst found = await ready;\n\n\t\treturn {\n\t\t\tfound,\n\t\t\tvalue,\n\t\t};\n\t};\n\n\tconst referGuarded = async (path: Path) => {\n\t\treturn await (await refer(path)).value;\n\t};\n\n\treturn {\n\t\trefer,\n\t\treferGuarded,\n\t};\n};\n\ntype GuardedReferFunction = ReturnType<typeof createReferFunction>['referGuarded'];\n\n// #endregion\n\ntype ExitPathConfig = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\n\tonExitImpossible?: () => void;\n};\n\n// #region Exit Path\nconst exitPath = async ({ path, refer, onExitImpossible }: ExitPathConfig) => {\n\tconst last = path.at(-1);\n\tconst ignore: ('choice:exit' | 'condition:exit' | 'block:exit')[] = [];\n\n\tlet wasExitImpossible = false;\n\n\t/**\n\t * - should be an array\n\t * - first element is action name\n\t */\n\tif (!isAction(await refer(path))) {\n\t\tif (last && isNull(last[0]) && isNumber(last[1])) {\n\t\t\tlast[1]--;\n\t\t} else {\n\t\t\tpath.pop();\n\t\t}\n\t}\n\n\tif (isExitImpossible(path)) {\n\t\tconst referred = await refer(path);\n\n\t\tif (isAction(referred) && isSkippedDuringRestore(referred[0])) {\n\t\t\tonExitImpossible?.();\n\t\t}\n\n\t\twasExitImpossible = true;\n\n\t\treturn {\n\t\t\texitImpossible: wasExitImpossible,\n\t\t};\n\t}\n\n\tfor (let i = path.length - 1; i > 0; i--) {\n\t\tconst [name] = path[i];\n\n\t\t/**\n\t\t * Remember already exited paths\n\t\t */\n\t\tif (isBlockExitStatement(name)) {\n\t\t\tignore.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Ignore everything that we do not need there\n\t\t */\n\t\tif (!isBlockStatement(name)) continue;\n\n\t\t/**\n\t\t * When we found an already exited path we remove it from the list\n\t\t */\n\t\tif (ignore.at(-1)?.startsWith(name)) {\n\t\t\tignore.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\t/**\n\t\t * Exit from the path\n\t\t */\n\t\tpath.push([`${name}:exit`]);\n\n\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, i + 1), name);\n\n\t\t/**\n\t\t * When possible also go to the next action (or exit from one layer above)\n\t\t */\n\t\tif (prev) path.push([null, prev[1] + 1]);\n\n\t\t/**\n\t\t * If we added an `[null, int]` but it points not to action, then\n\t\t *\n\t\t * - remove that item\n\t\t * - close another block\n\t\t */\n\t\tif (!isAction(await refer(path))) {\n\t\t\tpath.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\tbreak;\n\t}\n\n\treturn {\n\t\texitImpossible: wasExitImpossible,\n\t};\n};\n// #endregion\n\n// #region Next Path\nconst nextPath = (path: Path) => {\n\t/**\n\t * Last path element\n\t */\n\tconst last = path.at(-1);\n\n\tif (last && (isNull(last[0]) || last[0] === 'jump') && isNumber(last[1])) {\n\t\tlast[1]++;\n\t} else {\n\t\tpath.push([null, 0]);\n\t}\n\n\treturn path;\n};\n// #endregion\n\n// #region Collect Actions Before Blocking Action\ntype CollectActionsBeforeBlockingActionOptions = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\tclone: CloneFN;\n};\n\nconst collectActionsBeforeBlockingAction = async ({\n\tpath,\n\trefer,\n\tclone,\n}: CollectActionsBeforeBlockingActionOptions) => {\n\tconst collection: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tlet action = await refer(path);\n\n\twhile (true) {\n\t\tif (action == undefined) {\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath,\n\t\t\t\trefer,\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!action) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (isBlockingAction(action)) {\n\t\t\tconst [name, ...props] = action;\n\n\t\t\tif (name === 'choice') {\n\t\t\t\tconst choiceProps = props as unknown as GetActionParameters<'Choice'>;\n\n\t\t\t\tfor (let i = 0; i < choiceProps.length; i++) {\n\t\t\t\t\tconst branchContent = choiceProps[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * This is a title\n\t\t\t\t\t */\n\t\t\t\t\tif (!Array.isArray(branchContent)) continue;\n\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['choice', i], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t} else if (name === 'condition') {\n\t\t\t\tconst conditionProps = props as unknown as GetActionParameters<'Condition'>;\n\t\t\t\tconst conditions = Object.keys(conditionProps[1]);\n\n\t\t\t\tfor (const condition of conditions) {\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['condition', condition], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcollection.push(action);\n\n\t\t/**\n\t\t * These special actions requires path change\n\t\t */\n\t\tif (action[0] === 'jump') {\n\t\t\tpath = [\n\t\t\t\t['jump', action[1]],\n\t\t\t\t[null, 0],\n\t\t\t];\n\t\t} else if (action[0] == 'block') {\n\t\t\tpath.push(['block', action[1]], [null, 0]);\n\t\t} else {\n\t\t\tnextPath(path);\n\t\t}\n\n\t\taction = await refer(path);\n\t}\n\n\treturn collection;\n};\n// #endregion\n\n// #region Find Last Path Item Before Item Of Type\nconst findLastPathItemBeforeItemOfType = (path: Path, name: PathItem[0]) => {\n\tconst item = path.findLast(([_name, _value], i, array) => {\n\t\tconst next = array[i + 1];\n\n\t\treturn isNull(_name) && isNumber(_value) && next != null && next[0] === name;\n\t});\n\n\treturn item as undefined | [null, number];\n};\n// #endregion\n\n// #region Get Opposite Action\nconst getOppositeAction = (action: 'showCharacter' | 'playSound' | 'playMusic' | 'voice' | any) => {\n\tconst MAP = {\n\t\tshowCharacter: 'hideCharacter',\n\t\tplaySound: 'stopSound',\n\t\tplayMusic: 'stopMusic',\n\t\tvoice: 'stopVoice',\n\t} as const;\n\n\treturn MAP[action as keyof typeof MAP];\n};\n// #endregion\n\n// #region Get Actions From Path\ntype GetActionsFromPathParams = {\n\t/**\n\t * A story object\n\t */\n\tstory: Story;\n\t/**\n\t * A path by that actions will be gathered\n\t */\n\tpath: Path;\n\t/**\n\t * true — actions that should be skipped would not be returned\n\t */\n\tfilter: boolean;\n\treferGuarded: GuardedReferFunction;\n};\n\nconst getActionsFromPath = async ({ story, path, filter, referGuarded }: GetActionsFromPathParams) => {\n\t/**\n\t * Current item in the story\n\t */\n\tlet current: any = story;\n\t/**\n\t * Previous `current` value\n\t */\n\tlet precurrent: any;\n\t/**\n\t * Should we ignore some actions\n\t */\n\tlet ignoreNestedBefore: null | PathItem[0] = null;\n\t/**\n\t * Current item of type `[null, int]`\n\t */\n\tlet index = 0;\n\t/**\n\t * Skipped action that should be preserved\n\t */\n\tlet skipPreserve: Exclude<ValidAction, ValidAction[]> | undefined = undefined;\n\t/**\n\t * Actions that are either considered user action or skipped during restore process\n\t */\n\tconst skip = new Set<Exclude<ValidAction, ValidAction[]>>();\n\n\t/**\n\t * Cound of items of type `[null, int]`\n\t */\n\tconst max = path.reduce((acc, [type, val]) => {\n\t\tif (isNull(type) && isNumber(val)) {\n\t\t\treturn acc + 1;\n\t\t}\n\n\t\treturn acc;\n\t}, 0);\n\n\tconst queue = [] as Exclude<ValidAction, ValidAction[]>[];\n\tconst blocks = [];\n\n\t// Will guard future usage\n\tawait referGuarded(path);\n\n\tfor (const [type, val] of path) {\n\t\tif (type === 'jump') {\n\t\t\tprecurrent = story;\n\t\t\tcurrent = current[val];\n\t\t} else if (type === null) {\n\t\t\tprecurrent = current;\n\n\t\t\tif (isNumber(val)) {\n\t\t\t\tindex++;\n\n\t\t\t\tlet startIndex = 0;\n\n\t\t\t\tif (ignoreNestedBefore) {\n\t\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, index), ignoreNestedBefore);\n\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tstartIndex = prev[1];\n\t\t\t\t\t\tignoreNestedBefore = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Запустим все экшены которые идут в `[null, int]` от `0` до `int`\n\t\t\t\t * Почему-то потребовалось изменить `<` на `<=`, чтобы последний action попадал сюда\n\t\t\t\t */\n\t\t\t\tfor (let i = startIndex; i <= val; i++) {\n\t\t\t\t\tconst item = current[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * In case of broken save at least not throw\n\t\t\t\t\t * But is should not happen\n\t\t\t\t\t */\n\t\t\t\t\tif (!isAction(item)) continue;\n\n\t\t\t\t\tconst [action] = item;\n\n\t\t\t\t\tconst last = index === max && i === val;\n\t\t\t\t\tconst shouldSkip = isSkippedDuringRestore(action) || isUserRequiredAction(item);\n\n\t\t\t\t\tif (shouldSkip) {\n\t\t\t\t\t\tskip.add(item);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSkip && last) {\n\t\t\t\t\t\tskipPreserve = item;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (filter && shouldSkip && !last) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tqueue.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrent = current[val];\n\t\t} else if (type === 'choice') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[val + 1][1];\n\t\t} else if (type === 'condition') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[2][val];\n\t\t} else if (type === 'block') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = story[val];\n\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\tcurrent = blocks.pop();\n\t\t\tignoreNestedBefore = type.slice(0, -5) as PathItem[0];\n\t\t}\n\t}\n\n\treturn {\n\t\tqueue,\n\t\tskip,\n\t\tskipPreserve,\n\t};\n};\n// #endregion\n\n// #region Queue Processor\ntype QueueProcessorOptions = {\n\tskip: Set<Exclude<ValidAction, ValidAction[]>>;\n\tskipPreserve?: Exclude<ValidAction, ValidAction[]> | undefined;\n};\n\nconst createQueueProcessor = (queue: Exclude<ValidAction, ValidAction[]>[], options: QueueProcessorOptions) => {\n\tconst processedQueue: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tconst keep = new Set();\n\tconst characters = new Set();\n\tconst audio = {\n\t\tmusic: new Set(),\n\t\tsounds: new Set(),\n\t};\n\n\t/**\n\t * Get the next actions array.\n\t */\n\tconst next = (i: number) => queue.slice(i + 1);\n\n\tfor (const [i, item] of queue.entries()) {\n\t\tconst [action, ...params] = item;\n\n\t\tif (options.skip.has(item) && item !== options.skipPreserve) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tkeep.add(action);\n\n\t\tif (action === 'function' || action === 'custom') {\n\t\t\tif (action === 'custom') {\n\t\t\t\tconst fn = params[0] as CustomHandler;\n\n\t\t\t\tif (fn.callOnlyLatest) {\n\t\t\t\t\tconst notLatest = next(i).some(([name, func]) => {\n\t\t\t\t\t\tif (name !== 'custom') return;\n\n\t\t\t\t\t\t// Checks for `undefined`. In case two id's are undefined it would not be true\n\t\t\t\t\t\tconst isIdenticalId = Boolean(func.id && fn.id && func.id === fn.id);\n\t\t\t\t\t\tconst isIdenticalByReference = func === fn;\n\t\t\t\t\t\tconst isIdenticalByCode = String(func) === String(fn);\n\n\t\t\t\t\t\treturn isIdenticalId || isIdenticalByReference || isIdenticalByCode;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (notLatest) continue;\n\t\t\t\t} else if (fn.skipOnRestore) {\n\t\t\t\t\tif (fn.skipOnRestore(next(i))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'playSound') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some((item) => {\n\t\t\t\tif (isUserRequiredAction(item) || isSkippedDuringRestore(item[0])) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst [_action, target] = item;\n\n\t\t\t\tif (target !== params[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\taudio.sounds.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showCharacter' || action === 'playMusic' || action === 'voice') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some(([_action, target]) => {\n\t\t\t\tif (target !== params[0] && action !== 'voice') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst musicWillBePaused = action === 'playMusic' && _action === 'pauseMusic';\n\n\t\t\t\t/**\n\t\t\t\t * It either will be closed OR same action will be ran again\n\t\t\t\t */\n\t\t\t\treturn musicWillBePaused || _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\t/**\n\t\t\t * Actually, we do not need check above to add there things to keep because if something was hidden already we could not keep it visible\n\t\t\t */\n\t\t\tif (action === 'showCharacter') {\n\t\t\t\tcharacters.add(params[0]);\n\t\t\t} else if (action === 'playMusic') {\n\t\t\t\taudio.music.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showBackground' || action === 'preload') {\n\t\t\tconst skip = next(i).some(([_action]) => action === _action);\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'animateCharacter') {\n\t\t\tconst skip = next(i).some(([_action, character], j, array) => {\n\t\t\t\t// Same character will be animated again.\n\t\t\t\tif (action === _action && character === params[0]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst next = array.slice(j);\n\n\t\t\t\tconst characterWillAnimate = next.some(([__action, __character]) => action === __action);\n\t\t\t\tconst hasBlockingActions = next.some((item) => options.skip.has(item));\n\n\t\t\t\tconst differentCharacterWillAnimate =\n\t\t\t\t\t!hasBlockingActions &&\n\t\t\t\t\tnext.some(([__action, __character]) => __action === action && __character !== params[0]);\n\n\t\t\t\t// todo\n\t\t\t\treturn (characterWillAnimate && hasBlockingActions) || differentCharacterWillAnimate;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else {\n\t\t\tprocessedQueue.push(item);\n\t\t}\n\t}\n\n\tconst run = async (match: (item: Exclude<ValidAction, ValidAction[]>) => Thenable<void>) => {\n\t\tfor (const item of processedQueue) {\n\t\t\tconst result = match(item);\n\n\t\t\tif (isPromise(result)) {\n\t\t\t\tawait result;\n\t\t\t}\n\t\t}\n\n\t\tprocessedQueue.length = 0;\n\t};\n\n\treturn {\n\t\trun,\n\t\tkeep: {\n\t\t\tkeep,\n\t\t\tcharacters,\n\t\t\taudio,\n\t\t},\n\t};\n};\n// #endregion\n\nexport {\n\tfindLastPathItemBeforeItemOfType,\n\tgetActionsFromPath,\n\tgetOppositeAction,\n\tcreateQueueProcessor,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tisExitImpossible,\n};\n\nexport type { GuardedReferFunction };\n","type ControlledPromise<T> = Promise<\n\t| {\n\t\t\tvalue: T;\n\t\t\tcancelled: false;\n\t }\n\t| {\n\t\t\tvalue: null;\n\t\t\tcancelled: true;\n\t }\n>;\n\ntype ControlledPromiseObj<T> = {\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\n\tpromise: ControlledPromise<T>;\n\n\tcancel: () => void;\n};\n\nconst createControlledPromise = <T = void>() => {\n\tconst object = {\n\t\tresolve: null,\n\t\treject: null,\n\n\t\tpromise: null,\n\n\t\tcancel: null,\n\t} as unknown as ControlledPromiseObj<T>;\n\n\tconst init = () => {\n\t\tconst promise = new Promise((resolve, reject) => {\n\t\t\tobject.reject = reject;\n\t\t\tobject.resolve = (value) => {\n\t\t\t\tresolve({ cancelled: false, value });\n\t\t\t};\n\n\t\t\tobject.cancel = () => {\n\t\t\t\tresolve({ cancelled: true, value: null });\n\t\t\t\tinit();\n\t\t\t};\n\t\t});\n\n\t\tobject.promise = promise as ControlledPromise<T>;\n\t};\n\n\treturn init(), object;\n};\n\nexport { createControlledPromise };\nexport type { ControlledPromise, ControlledPromiseObj };\n","import { memoize } from 'es-toolkit/function';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from '../constants';\nimport { isCSSImageURL } from './assertions';\nimport { DEV } from 'esm-env';\n\nconst getUrlFileExtension = (address: string) => {\n\ttry {\n\t\tconst { pathname } = new URL(address, location.href);\n\n\t\t/**\n\t\t * By using pathname we remove search params from URL, but some things are still preserved\n\t\t *\n\t\t * Imagine pathname like `image.png!private:1230`\n\t\t */\n\t\treturn pathname.split('.').at(-1)!.split('!')[0].split(':')[0];\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Could not construct URL \"${address}\".`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\nconst fetchContentType = async (url: string, request: typeof fetch) => {\n\ttry {\n\t\tconst response = await request(url, {\n\t\t\tmethod: 'HEAD',\n\t\t});\n\n\t\treturn response.headers.get('Content-Type') || '';\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Failed to fetch file at \"${url}\"`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\ntype GetResourceTypeParams = {\n\turl: string;\n\trequest: typeof fetch;\n};\n\nconst getResourseType = memoize(\n\tasync ({ url, request }: GetResourceTypeParams) => {\n\t\t/**\n\t\t * If url is not http we should not check\n\t\t *\n\t\t * startsWith('http') || startsWith('/') || startsWith('.') || startsWith('data')\n\t\t */\n\t\tif (!isCSSImageURL(url)) {\n\t\t\treturn 'other';\n\t\t}\n\n\t\tconst extension = getUrlFileExtension(url);\n\n\t\tif (HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\t/**\n\t\t * If checks above didn't worked we will fetch content type\n\t\t * This might not work because of CORS\n\t\t */\n\t\tconst contentType = await fetchContentType(url, request);\n\n\t\tif (contentType.includes('audio')) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (contentType.includes('image')) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\treturn 'other';\n\t},\n\t{\n\t\tgetCacheKey: ({ url }) => url,\n\t},\n);\n\nexport { getUrlFileExtension, getResourseType, fetchContentType };\n\nexport type { GetResourceTypeParams };\n","import { memoize } from 'es-toolkit/function';\nimport type { Context, Renderer } from '../renderer';\nimport type { Save, StackHolder, UseStackFunctionReturnType } from '../types';\nimport { STACK_MAP } from '../shared';\n\nconst getStack = memoize(\n\t(_: Context) => {\n\t\treturn [] as unknown as StackHolder;\n\t},\n\t{\n\t\tcache: STACK_MAP,\n\t\tgetCacheKey: (ctx) => ctx.id,\n\t},\n);\n\nconst createUseStackFunction = (renderer: Renderer) => {\n\tconst useStack = (context: Context | string): UseStackFunctionReturnType => {\n\t\tconst ctx = typeof context === 'string' ? renderer.getContext(context) : context;\n\t\tconst stack = getStack(ctx);\n\n\t\treturn {\n\t\t\tget previous() {\n\t\t\t\treturn stack.previous;\n\t\t\t},\n\t\t\tget value() {\n\t\t\t\treturn stack.at(-1)!;\n\t\t\t},\n\t\t\tset value(value) {\n\t\t\t\tstack[stack.length - 1] = value;\n\t\t\t},\n\n\t\t\tback() {\n\t\t\t\tstack.previous = stack.length > 1 ? stack.pop() : this.value;\n\t\t\t\tctx.meta.goingBack = true;\n\t\t\t},\n\t\t\tpush(value: Save) {\n\t\t\t\tstack.push(value);\n\t\t\t},\n\t\t\tclear() {\n\t\t\t\tstack.previous = undefined;\n\n\t\t\t\tstack.length = 0;\n\t\t\t\tstack.length = 1;\n\t\t\t},\n\t\t};\n\t};\n\n\treturn useStack;\n};\n\nexport { getStack, createUseStackFunction };\n","import type { Story, ValidAction } from '../action';\n\nconst flatActions = (item: (ValidAction | ValidAction[])[]): ValidAction[] => {\n\treturn item.flatMap((data) => {\n\t\tconst type = data[0];\n\n\t\t/**\n\t\t * This is not just an action like `['name', ...arguments]`, but an array of actions\n\t\t */\n\t\tif (Array.isArray(type)) return flatActions(data as ValidAction[]);\n\n\t\treturn [data as ValidAction];\n\t});\n};\n\n/**\n * Transforms `(ValidAction | ValidAction[])[]` to `ValidAction[]`. Mutates provided `Story`\n */\nconst flatStory = (story: Story) => {\n\tfor (const key in story) {\n\t\tstory[key] = flatActions(story[key]);\n\t}\n\n\treturn story;\n};\n\nexport { flatActions, flatStory };\n","import { memoize } from 'es-toolkit/function';\nimport type { Lang } from '../types';\n\nconst getLanguage = (languages: string[]) => {\n\tlet { language } = navigator;\n\n\tif (languages.includes(language)) {\n\t\treturn language;\n\t} else if (languages.includes((language = language.slice(0, 2)))) {\n\t\treturn language;\n\t} else if ((language = languages.find((value) => navigator.languages.includes(value))!)) {\n\t\treturn language;\n\t}\n\n\t/**\n\t * We'v checked the `en-GB` format, `en` format, and maybe any second languages, but there were no matches\n\t */\n\treturn languages[0];\n};\n\nconst getIntlLanguageDisplayName = memoize((lang: Lang) => {\n\t/**\n\t * When using Intl fails we just return language key.\n\t */\n\ttry {\n\t\tconst intl = new Intl.DisplayNames([lang], {\n\t\t\ttype: 'language',\n\t\t});\n\n\t\treturn intl.of(lang) || lang;\n\t} catch {\n\t\treturn lang;\n\t}\n});\n\n/**\n * Capitalizes the string\n * @param str String without emojis or complex graphemes\n */\nconst capitalize = (str: string) => {\n\treturn str[0].toUpperCase() + str.slice(1);\n};\n\nexport { getLanguage, getIntlLanguageDisplayName, capitalize };\n","const noop = () => {};\n\nexport { noop };\n","import type { Stored } from '../store';\nimport type { Lang, StorageData } from '../types';\n\nconst getLanguageFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\treturn store.get().meta[0];\n};\n\nconst getVolumeFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\tconst { meta } = store.get();\n\n\treturn {\n\t\tmusic: meta[2],\n\t\tsound: meta[3],\n\t\tvoice: meta[4],\n\t};\n};\n\nexport { getLanguageFromStore, getVolumeFromStore };\n","const mapSet = <T, K>(set: Set<T>, fn: (value: T, index: number, array: T[]) => K): K[] => {\n\treturn [...set].map(fn);\n};\n\nconst toArray = <T>(target: T | T[]) => {\n\treturn Array.isArray(target) ? target : [target];\n};\n\nexport { mapSet, toArray };\n","import type { Character } from '../character';\nimport type { CharactersData, Lang } from '../types';\n\nconst getCharactersData = <Characters extends Record<string, Character<Lang>>>(characters: Characters) => {\n\tconst entries = Object.entries(characters);\n\tconst mapped = entries.map(([key, value]) => [key, { name: value.name, emotions: Object.keys(value.emotions) }]);\n\n\treturn Object.fromEntries(mapped) as CharactersData<Characters>;\n};\n\nexport { getCharactersData };\n","import { noop } from './utilities';\n\ntype Stored<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tupdate: (fn: (prev: T) => T) => void;\n\tset: (val: T) => void;\n\tget: () => T;\n};\n\ntype Derived<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tget: () => T;\n};\n\nconst store = <T>(current: T, subscribers = new Set<(value: T) => void>()): Stored<T> => {\n\tconst subscribe = (cb: (value: T) => void) => {\n\t\tsubscribers.add(cb), cb(current);\n\n\t\treturn () => {\n\t\t\tsubscribers.delete(cb);\n\t\t};\n\t};\n\n\tconst push = (value: T) => {\n\t\tfor (const cb of subscribers) cb(value);\n\t};\n\n\tconst update = (fn: (prev: T) => T) => {\n\t\tpush((current = fn(current)));\n\t};\n\n\tconst set = (val: T) => {\n\t\tupdate(() => val);\n\t};\n\n\tconst get = () => {\n\t\treturn current;\n\t};\n\n\treturn { subscribe, update, set, get } as const;\n};\n\nconst derive = <T, K>(input: Stored<T>, map: (value: T) => K): Derived<K> => {\n\treturn {\n\t\tget: () => map(input.get()),\n\t\tsubscribe: (subscriber) => {\n\t\t\treturn input.subscribe((value) => {\n\t\t\t\treturn subscriber(map(value));\n\t\t\t});\n\t\t},\n\t};\n};\n\nconst immutable = <T>(value: T): Derived<T> => {\n\treturn {\n\t\tget: () => value,\n\t\tsubscribe: (subscriber) => {\n\t\t\tsubscriber(value);\n\n\t\t\treturn noop;\n\t\t},\n\t};\n};\n\nexport { store, derive, immutable };\nexport type { Stored, Derived };\n","import type { CustomHandler, CustomHandlerFunctionGetFn, CustomHandlerGetResult, TextContent } from './action';\nimport type { Context, CustomActionHandle } from './renderer';\nimport type { Derived } from './store';\nimport { CUSTOM_ACTION_CLEANUP_MAP, CUSTOM_ACTION_MAP } from './shared';\nimport type { Data, Lang, Stack, State, StateFunction } from './types';\nimport { noop } from './utilities';\nimport { immutable } from './store';\nimport { once } from 'es-toolkit/function';\nimport type { Ticker } from './ticker';\n\ntype CleanupFn = () => void;\n\ntype CustomActionCleanupHolderItem = {\n\tfn: CustomHandler;\n\tlist: CleanupFn[];\n\tnode: CleanupFn;\n};\n\ntype CustomActionCleanupHolder = CustomActionCleanupHolderItem[];\n\ntype CustomActionHolder = {\n\t/**\n\t * Node in which custom action is rendered\n\t */\n\tnode: null | HTMLDivElement;\n\t/**\n\t * Custom Handler function itself\n\t */\n\tfn: CustomHandler;\n\t/**\n\t * Local Data\n\t */\n\tlocalData: any;\n};\n\ntype HandleCustomActionOptions = CustomActionHandle & {\n\t/**\n\t * State Function\n\t */\n\tstate: StateFunction<State>;\n\t/**\n\t * Current Game Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Function to get Stack\n\t */\n\tgetStack: (ctx: Context) => Stack;\n\t/**\n\t * Template Replace Function\n\t */\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n\t/**\n\t * Paused Store\n\t */\n\tpaused: Derived<boolean>;\n\t/**\n\t * Ticker\n\t */\n\tticker: Ticker;\n\t/**\n\t * Fetching function\n\t */\n\trequest: typeof fetch;\n};\n\nconst createCustomActionNode = (id: string) => {\n\tconst div = document.createElement('div');\n\n\tdiv.setAttribute('data-id', id);\n\n\treturn div;\n};\n\nconst getCustomActionHolder = (ctx: Context, fn: CustomHandler) => {\n\tconst cached = CUSTOM_ACTION_MAP.get(ctx.id + fn.key);\n\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst holder = {\n\t\tnode: null,\n\t\tfn: fn,\n\t\tlocalData: {},\n\t} satisfies CustomActionHolder;\n\n\tCUSTOM_ACTION_MAP.set(ctx.id + fn.key, holder);\n\n\treturn holder;\n};\n\nconst getCustomActionCleanupHolder = (ctx: Context) => {\n\tconst existing = CUSTOM_ACTION_CLEANUP_MAP.get(ctx.id);\n\n\tif (existing) {\n\t\treturn existing;\n\t}\n\n\tconst holder: CustomActionCleanupHolder = [];\n\n\tCUSTOM_ACTION_CLEANUP_MAP.set(ctx.id, holder);\n\n\treturn holder;\n};\n\nconst cleanCleanupSource = ({ list }: CustomActionCleanupHolderItem) => {\n\twhile (list.length) {\n\t\ttry {\n\t\t\tlist.pop()!();\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n};\n\nconst handleCustomAction = (\n\tctx: Context,\n\tfn: CustomHandler,\n\t{\n\t\tlang,\n\t\tstate,\n\t\tsetMountElement,\n\t\tremove: renderersRemove,\n\t\tgetStack,\n\t\ttemplateReplace,\n\t\tpaused,\n\t\tticker,\n\t\trequest,\n\t}: HandleCustomActionOptions,\n) => {\n\tconst holder = getCustomActionHolder(ctx, fn);\n\tconst cleanupHolder = getCustomActionCleanupHolder(ctx);\n\n\tconst cleanupNode = () => {\n\t\tif (!cleanupHolder.some((item) => item.fn.id === fn.id && item.fn.key === fn.key)) {\n\t\t\tholder.node = null;\n\t\t\tsetMountElement(null);\n\t\t}\n\t};\n\n\tconst cleanupSource: CustomActionCleanupHolderItem = {\n\t\tfn,\n\t\tlist: [ticker.detach],\n\t\tnode: cleanupNode,\n\t};\n\n\tcleanupHolder.push(cleanupSource);\n\n\tconst getDomNodes = (insert = true): CustomHandlerGetResult<boolean> => {\n\t\tif (holder.node || !insert) {\n\t\t\tsetMountElement(holder.node);\n\n\t\t\treturn {\n\t\t\t\telement: holder.node,\n\t\t\t\troot: ctx.root,\n\t\t\t};\n\t\t}\n\n\t\tholder.node = insert ? createCustomActionNode(fn.key) : null;\n\n\t\tsetMountElement(holder.node);\n\n\t\treturn {\n\t\t\telement: holder.node,\n\t\t\troot: ctx.root,\n\t\t};\n\t};\n\n\tconst clear = (func: typeof noop) => {\n\t\tcleanupSource.list.push(once(func));\n\t};\n\n\tconst data = (updatedData?: any) => {\n\t\tif (updatedData) {\n\t\t\treturn (holder.localData = updatedData);\n\t\t}\n\n\t\treturn holder.localData;\n\t};\n\n\tconst remove = () => {\n\t\tcleanCleanupSource(cleanupSource);\n\n\t\t// When requested not hestitate\n\t\tholder.node = null;\n\t\tsetMountElement(null);\n\n\t\trenderersRemove();\n\t};\n\n\tconst stack = getStack(ctx);\n\n\tconst getSave = () => {\n\t\treturn stack.value;\n\t};\n\n\treturn fn({\n\t\tflags: ctx.meta,\n\n\t\tlang,\n\n\t\tstate,\n\t\tdata,\n\n\t\tdataAtKey: (key) => CUSTOM_ACTION_MAP.get(ctx.id + key)?.localData || null,\n\n\t\ttemplateReplace,\n\n\t\tclear,\n\t\tremove,\n\n\t\trendererContext: ctx,\n\n\t\tgetDomNodes: getDomNodes as CustomHandlerFunctionGetFn,\n\n\t\tgetSave,\n\n\t\tcontextKey: ctx.id,\n\n\t\tpaused: ctx.meta.preview ? immutable(false) : paused,\n\n\t\tticker,\n\n\t\trequest,\n\t});\n};\n\nexport { getCustomActionHolder, handleCustomAction, getCustomActionCleanupHolder, cleanCleanupSource };\nexport type { CustomActionHolder, CustomActionCleanupHolder, HandleCustomActionOptions, CleanupFn };\n","import type { CustomHandler, DefaultActionProxy } from './action';\nimport type { Character } from './character';\nimport { ASSETS_TO_PRELOAD, PRELOADED_ASSETS } from './shared';\nimport type { Lang } from './types';\nimport { isAudioAction, isImageAsset, isString, isAsset, getResourseType, mapSet, toArray } from './utilities';\nimport { unwrapAudioAsset, unwrapImageAsset } from './asset';\n\nconst ACTION_NAME_TO_VOLUME_MAP = {\n\tplayMusic: 'music',\n\tplaySound: 'sound',\n\tvoice: 'voice',\n} as const;\n\n/**\n * Adds asset to `ASSETS_TO_PRELOAD` firstly checking if is was already preloaded\n */\nconst enqueueAssetForPreloading = (asset: string) => {\n\tif (!PRELOADED_ASSETS.has(asset)) {\n\t\tASSETS_TO_PRELOAD.add(asset);\n\t}\n};\n\ntype HandleAssetsPreloadingOptions = {\n\trequest: typeof fetch;\n\n\tlimiter: (fn: () => void | PromiseLike<void>) => Promise<void>;\n\n\tpreloadAudioBlocking: (source: string) => Promise<void>;\n\tpreloadImageBlocking: (source: string) => Promise<void>;\n};\n\n/**\n * Preloads assets\n */\nconst handleAssetsPreloading = async ({\n\trequest,\n\tlimiter,\n\tpreloadAudioBlocking,\n\tpreloadImageBlocking,\n}: HandleAssetsPreloadingOptions) => {\n\tconst list = mapSet(ASSETS_TO_PRELOAD, (asset) => {\n\t\treturn limiter(async () => {\n\t\t\tconst type = await getResourseType({\n\t\t\t\turl: asset,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'audio': {\n\t\t\t\t\tawait preloadAudioBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'image': {\n\t\t\t\t\tawait preloadImageBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tASSETS_TO_PRELOAD.delete(asset);\n\t\t\tPRELOADED_ASSETS.add(asset);\n\t\t});\n\t});\n\n\t/**\n\t * `allSettled` is used because even if error happens game should run\n\t *\n\t * Ideally, there could be a notification for player, maybe developer could be also notified\n\t * But I don't think it's really needed\n\t */\n\tawait Promise.allSettled(list);\n\n\tASSETS_TO_PRELOAD.clear();\n};\n\ntype HuntAssetsOptions = {\n\t/**\n\t * Audio Volume\n\t */\n\tvolume: {\n\t\tmusic: number;\n\t\tsound: number;\n\t\tvoice: number;\n\t};\n\t/**\n\t * Current Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Characters object from user config\n\t */\n\tcharacters: Record<string, Character>;\n\t/**\n\t * Action name\n\t */\n\taction: keyof DefaultActionProxy;\n\t/**\n\t * Action props\n\t */\n\tprops: Parameters<DefaultActionProxy[keyof DefaultActionProxy]>;\n\t/**\n\t * Function to handle found asset\n\t */\n\thandle: (asset: string) => void;\n};\n\nconst huntAssets = ({ volume, lang, characters, action, props, handle }: HuntAssetsOptions) => {\n\tif (action === 'showBackground') {\n\t\t/**\n\t\t * There are two types of showBackground currently\n\t\t *\n\t\t * Parameter is a `string`\n\t\t * Parameter is a `Record<'CSS Media', string>`\n\t\t */\n\t\tif (isString(props[0])) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\tif (props[0] && typeof props[0] === 'object') {\n\t\t\tfor (const value of Object.values(props[0])) {\n\t\t\t\tif (isImageAsset(value)) {\n\t\t\t\t\thandle(value);\n\t\t\t\t} else if (isAsset(value)) {\n\t\t\t\t\tconst unwrapped = unwrapImageAsset(value);\n\n\t\t\t\t\tif (isImageAsset(unwrapped)) {\n\t\t\t\t\t\thandle(unwrapped);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\tconst getVolumeFor = (action: 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice') => {\n\t\tif (action in ACTION_NAME_TO_VOLUME_MAP) {\n\t\t\t// typescript don't be silly please\n\t\t\treturn volume[ACTION_NAME_TO_VOLUME_MAP[action as keyof typeof ACTION_NAME_TO_VOLUME_MAP]];\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t/**\n\t * Here \"stop\" action also matches condition, but because `ASSETS_TO_PRELOAD` is a Set, there is no problem\n\t */\n\tif (isAudioAction(action) && isString(props[0])) {\n\t\tif (getVolumeFor(action) > 0) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'voice' && typeof props[0] === 'object') {\n\t\t/**\n\t\t * Early return in case of disabled voices\n\t\t */\n\t\tif (getVolumeFor('voice') == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [language, value] of Object.entries(props[0])) {\n\t\t\tif (language === lang) {\n\t\t\t\t/**\n\t\t\t\t * todo: decide how to make language comparison (maybe use some function)\n\t\t\t\t *\n\t\t\t\t * We can use en-US for both en-US and en-GB. Same thing applies to `dialog` and `text` action.\n\t\t\t\t * Maybe voice over language can be selected separately\n\t\t\t\t */\n\t\t\t\tvalue && handle(unwrapAudioAsset(value));\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Load characters\n\t */\n\tif (action === 'showCharacter' && isString(props[0]) && isString(props[1])) {\n\t\tconst images = toArray(characters[props[0]].emotions[props[1]]);\n\n\t\tfor (const asset of images) {\n\t\t\thandle(unwrapImageAsset(asset));\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Custom action assets\n\t */\n\tif (action === 'custom' && (props[0] as CustomHandler).assets) {\n\t\tfor (const asset of (props[0] as CustomHandler).assets!) {\n\t\t\tisAsset(asset) ? handle(asset.source) : handle(asset);\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'choice') {\n\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\tconst data = props[i];\n\n\t\t\tif (Array.isArray(data)) {\n\t\t\t\thandle(unwrapImageAsset(data[5] as string));\n\t\t\t}\n\t\t}\n\t}\n};\n\nexport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets };\n","import type { StorageData } from './types';\n\ntype StorageAdapter = {\n\tget: () => Promise<StorageData>;\n\tset: (data: StorageData) => Promise<void>;\n};\n\ntype StorageAdapterLocalOptions = {\n\tkey: string;\n};\n\n/**\n * Stores data in localStorage\n */\nconst storageAdapterLocal = ({ key }: StorageAdapterLocalOptions): StorageAdapter => {\n\treturn {\n\t\tasync get() {\n\t\t\tconst fallback = { saves: [], data: {}, meta: [] };\n\n\t\t\ttry {\n\t\t\t\tconst value = localStorage.getItem(key);\n\n\t\t\t\treturn value ? JSON.parse(value) : fallback;\n\t\t\t} catch {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t},\n\t\tasync set(data) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(key, JSON.stringify(data));\n\t\t\t} catch {}\n\t\t},\n\t};\n};\n\nexport type { StorageAdapter };\nexport { storageAdapterLocal };\n","import type { Data, State } from './types';\n\ntype PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent =\n\t| string\n\t| ((state: State | Data) => string | string[])\n\t| string[]\n\t| (string | ((state: State | Data) => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n\nconst RGX = /{{(.*?)}}/g;\n\nconst split = (input: string, delimeters: string[]) => {\n\tconst output: (string | undefined)[] = [];\n\n\tfor (const delimeter of delimeters) {\n\t\tif (!input) break;\n\n\t\tconst [start, end] = input.split(delimeter, 2);\n\n\t\toutput.push(start);\n\t\tinput = end;\n\t}\n\n\toutput.push(input);\n\n\treturn output;\n};\n\n/**\n * Turns any allowed content into string\n * @param c Content\n */\nconst flattenAllowedContent = (c: AllowedContent, state: State | Data): string => {\n\tif (Array.isArray(c)) {\n\t\treturn c.map((item) => flattenAllowedContent(item, state)).join('<br>');\n\t}\n\n\tif (typeof c === 'function') {\n\t\treturn flattenAllowedContent(c(state), state);\n\t}\n\n\treturn c;\n};\n\nconst replace = (\n\tinput: string,\n\tdata: Record<string, unknown>,\n\tpluralization?: Record<string, Pluralization>,\n\tactions?: TranslationActions,\n\tpr?: Intl.PluralRules,\n) => {\n\treturn input.replaceAll(RGX, (x: any, key: string, y: any) => {\n\t\tx = 0;\n\t\ty = data;\n\n\t\tconst [pathstr, plural, action] = split(key.trim(), ['@', '%']);\n\n\t\tif (!pathstr) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst path = pathstr.split('.');\n\n\t\twhile (y && x < path.length) y = y[path[x++]];\n\n\t\tif (plural && pluralization && y && pr) {\n\t\t\ty = pluralization[plural][pr.select(y)];\n\t\t}\n\n\t\tconst actionHandler = actions && action ? actions[action] : void 0;\n\n\t\tif (actionHandler) y = actionHandler(y);\n\n\t\treturn y == null ? '' : y;\n\t});\n};\n\nexport { flattenAllowedContent, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import { DEV } from 'esm-env';\nimport type { ActionChoiceChoiceObject, DefaultActionProxy, ValidAction, VirtualActions } from '../action';\nimport { flatActions } from './story';\nimport type { Data, Lang, State } from '../types';\nimport type { Character } from '../character';\n\ntype BuildActionObjectParams<$Lang extends Lang, $Data extends Data> = {\n\trendererActions: Record<string, (...args: any[]) => ValidAction>;\n\tnativeActions: string[];\n\n\tcharacters: Record<string, Character>;\n};\n\ntype VirtualActionsGlobal = VirtualActions<Record<string, Character>, Lang, State>;\ntype ActionsGlobal = DefaultActionProxy & VirtualActionsGlobal;\n\n/**\n * In this case actions that get overwritten with another action\n */\nconst VIRTUAL_ACTIONS: (keyof VirtualActionsGlobal)[] = ['say'];\n\nconst buildActionObject = <$Lang extends Lang, $Data extends Data>({\n\trendererActions,\n\tnativeActions,\n\tcharacters,\n}: BuildActionObjectParams<$Lang, $Data>) => {\n\tconst allActions = [...nativeActions, ...VIRTUAL_ACTIONS];\n\tconst object = { ...rendererActions };\n\n\tfor (let action of allActions) {\n\t\tobject[action] = (...props: Parameters<ActionsGlobal[keyof ActionsGlobal]>) => {\n\t\t\tif (action === 'say') {\n\t\t\t\taction = 'dialog';\n\n\t\t\t\tconst [character] = props as Parameters<VirtualActionsGlobal['say']>;\n\n\t\t\t\tif (DEV && !characters[character]) {\n\t\t\t\t\tthrow new Error(`Attempt to call Say action with unknown character \"${character}\"`);\n\t\t\t\t}\n\t\t\t} else if (action === 'choice') {\n\t\t\t\tif (props.slice(1).every((choice) => !Array.isArray(choice))) {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i] as ActionChoiceChoiceObject<Lang, State>;\n\n\t\t\t\t\t\t(props as Parameters<DefaultActionProxy['choice']>)[i] = [\n\t\t\t\t\t\t\tchoice.title,\n\t\t\t\t\t\t\tflatActions(choice.children),\n\t\t\t\t\t\t\tchoice.active,\n\t\t\t\t\t\t\tchoice.visible,\n\t\t\t\t\t\t\tchoice.onSelect,\n\t\t\t\t\t\t\tchoice.image,\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i];\n\n\t\t\t\t\t\tif (Array.isArray(choice)) {\n\t\t\t\t\t\t\tchoice[1] = flatActions(choice[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (action === 'condition') {\n\t\t\t\tconst actions = (props as Parameters<ActionsGlobal['condition']>)[1];\n\n\t\t\t\tfor (const key in actions) {\n\t\t\t\t\tactions[key] = flatActions(actions[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn [action, ...props] as ValidAction;\n\t\t};\n\t}\n\n\treturn object;\n};\n\nexport { buildActionObject };\n","import type { Story, TextContent } from '../action';\nimport { unwrapAudioAsset } from '../asset';\nimport type {\n\tData,\n\tDialogOverview,\n\tDialogOverviewEntry,\n\tLang,\n\tNovelyAsset,\n\tState,\n\tUseStackFunctionReturnType,\n} from '../types';\nimport { getActionsFromPath, type GuardedReferFunction } from './actions-processing';\nimport { isAsset, isSkippedDuringRestore, isString, isUserRequiredAction } from './assertions';\n\ntype GetDialogOverviewContext = {\n\tstory: Story;\n\treferGuarded: GuardedReferFunction;\n\n\tgetCharacterName: (character: string) => string;\n\tgetLanguage: () => string;\n\tgetStack: () => UseStackFunctionReturnType;\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n};\n\nconst getDialogOverview = async function (this: GetDialogOverviewContext) {\n\t/**\n\t * Dialog Overview is possible only in main context\n\t */\n\tconst { value: save } = this.getStack();\n\tconst stateSnapshots = save[3];\n\n\t/**\n\t * Easy mode\n\t */\n\tif (stateSnapshots.length == 0) {\n\t\treturn [];\n\t}\n\n\tconst { queue } = await getActionsFromPath({\n\t\tstory: this.story,\n\t\tpath: save[0],\n\t\tfilter: false,\n\t\treferGuarded: this.referGuarded,\n\t});\n\n\tconst lang = this.getLanguage();\n\n\ttype DialogItem = {\n\t\tname: undefined | string;\n\t\ttext: TextContent<string, State>;\n\t\tvoice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset>;\n\t};\n\n\tconst dialogItems: DialogItem[] = [];\n\n\t/**\n\t * For every available state snapshot find dialog corresponding to it\n\t */\n\tfor (let p = 0, a = stateSnapshots.length, i = queue.length - 1; a > 0 && i > 0; i--) {\n\t\tconst action = queue[i];\n\n\t\tif (action[0] === 'dialog') {\n\t\t\tconst [_, name, text] = action;\n\n\t\t\tlet voice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset> = undefined;\n\n\t\t\t/**\n\t\t\t * Search for the most recent `voice` action before current dialog\n\t\t\t */\n\t\t\tfor (let j = i - 1; j > p && j > 0; j--) {\n\t\t\t\tconst action = queue[j];\n\n\t\t\t\tif (isUserRequiredAction(action) || isSkippedDuringRestore(action[0])) break;\n\t\t\t\tif (action[0] === 'stopVoice') break;\n\n\t\t\t\tif (action[0] === 'voice') {\n\t\t\t\t\tvoice = action[1];\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdialogItems.push({\n\t\t\t\tname,\n\t\t\t\ttext,\n\t\t\t\tvoice,\n\t\t\t});\n\n\t\t\tp = i;\n\t\t\ta--;\n\t\t}\n\t}\n\n\tconst entries: DialogOverview = dialogItems.reverse().map(({ name, text, voice }, i) => {\n\t\tconst state = stateSnapshots[i];\n\t\tconst audioSource = isString(voice)\n\t\t\t? voice\n\t\t\t: isAsset(voice)\n\t\t\t\t? voice\n\t\t\t\t: voice == undefined\n\t\t\t\t\t? voice\n\t\t\t\t\t: voice[lang];\n\n\t\tname = name ? this.getCharacterName(name) : '';\n\n\t\treturn {\n\t\t\tname: this.templateReplace(name, state),\n\t\t\ttext: this.templateReplace(text, state),\n\t\t\tvoice: audioSource ? unwrapAudioAsset(audioSource) : '',\n\t\t} satisfies DialogOverviewEntry;\n\t});\n\n\treturn entries;\n};\n\nexport { getDialogOverview };\n","import type { Lang } from '../types';\n\nconst setDocumentLanguage = (language: Lang) => {\n\tdocument.documentElement.lang = language;\n};\n\nexport { setDocumentLanguage };\n","import type { Derived } from './store';\n\ntype TickHandler = (ticker: Ticker) => void;\n\nclass Ticker {\n\tpublic listeners = new Set<TickHandler>();\n\tpublic running = false;\n\n\tprivate _factory: TickerFactory;\n\n\tconstructor(factory: TickerFactory) {\n\t\tthis._factory = factory;\n\t}\n\n\tget deltaTime() {\n\t\treturn this._factory.deltaTime;\n\t}\n\n\tget lastTime() {\n\t\treturn this._factory.lastTime;\n\t}\n\n\tpublic add(cb: (ticker: Ticker) => void) {\n\t\tthis.listeners.add(cb);\n\n\t\tif (this.listeners.size === 1) {\n\t\t\tthis._factory.check(true);\n\t\t}\n\n\t\treturn () => {\n\t\t\tthis.remove(cb);\n\t\t};\n\t}\n\n\tpublic remove(cb: (ticker: Ticker) => void) {\n\t\tthis.listeners.delete(cb);\n\n\t\tif (this.listeners.size === 0) {\n\t\t\tthis._factory.check(false);\n\t\t}\n\t}\n\n\tpublic start = () => {\n\t\tthis.running = true;\n\n\t\tif (this.listeners.size > 0) {\n\t\t\tthis._factory.check(true);\n\t\t}\n\t};\n\n\tpublic stop = () => {\n\t\tthis.running = false;\n\t};\n\n\tpublic detach = () => {\n\t\tthis.listeners.clear();\n\t\tthis.stop();\n\t\tthis._factory.detach(this);\n\t};\n}\n\nclass TickerFactory {\n\tprivate _children = new Set<Ticker>();\n\tprivate _raf = -1;\n\tprivate _running = false;\n\tprivate _unsubscribe: () => void;\n\n\tpublic deltaTime = 0;\n\tpublic lastTime = performance.now();\n\n\tconstructor(paused: Derived<boolean>) {\n\t\tthis._unsubscribe = paused.subscribe((paused) => {\n\t\t\tif (paused) {\n\t\t\t\tthis.stop();\n\t\t\t} else if (Array.from(this._children).some((ticker) => ticker.running && ticker.listeners.size > 0)) {\n\t\t\t\tthis.start();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic start() {\n\t\tif (this._running) {\n\t\t\treturn;\n\t\t}\n\n\t\tcancelAnimationFrame(this._raf);\n\n\t\tthis.lastTime = performance.now();\n\t\tthis._running = true;\n\t\tthis._raf = requestAnimationFrame(this.update);\n\t}\n\n\tpublic stop() {\n\t\tcancelAnimationFrame(this._raf);\n\t\tthis._running = false;\n\t\tthis._raf = -1;\n\t}\n\n\tpublic fork() {\n\t\tconst ticker = new Ticker(this);\n\n\t\tthis._children.add(ticker);\n\n\t\treturn ticker;\n\t}\n\n\tpublic check(positive: boolean) {\n\t\tif (positive) {\n\t\t\tthis.start();\n\t\t} else if (Array.from(this._children).every((ticker) => !ticker.running || ticker.listeners.size === 0)) {\n\t\t\tthis.stop();\n\t\t}\n\t}\n\n\tpublic destroy() {\n\t\tthis._unsubscribe();\n\t\tthis._children.forEach((child) => child.detach());\n\t}\n\n\tpublic detach(ticker: Ticker) {\n\t\tthis._children.delete(ticker);\n\t\tthis.check(false);\n\t}\n\n\tprivate update = (currentTime: DOMHighResTimeStamp) => {\n\t\tthis.deltaTime = currentTime - this.lastTime;\n\t\tthis._children.forEach((ticker) => {\n\t\t\tif (ticker.running) {\n\t\t\t\tticker.listeners.forEach((tick) => {\n\t\t\t\t\ttick(ticker);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif (!this._running) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.lastTime = currentTime;\n\t\tthis._raf = requestAnimationFrame(this.update);\n\t};\n}\n\nexport { TickerFactory, Ticker };\n","import type { ValidAction } from './action';\nimport type { Assign } from './types';\n\ntype Part = Record<string, (...args: any[]) => ValidAction>;\n\n/**\n * Extens core action with custom actions\n * @param base Actions object you will extend, `engine.action`\n * @param extension Actions object you will extend with\n * @example\n * ```ts\n * const action = extendAction(engine.action, {\n * particles: (options: Parameters<typeof particles>[0]) => {\n * return ['custom', particles(options)]\n * }\n * })\n * ```\n */\nconst extendAction = <Part0 extends Part, Part1 extends Part>(\n\tbase: Part0,\n\textension: Part1,\n): Readonly<Assign<Part0, Part1>> => {\n\treturn {\n\t\t...extension,\n\t\t...base,\n\t};\n};\n\nexport { extendAction };\n","const RU = {\n\tNewGame: 'Новая игра',\n\tHomeScreen: 'Главный экран',\n\tToTheGame: 'К игре',\n\tLanguage: 'Язык',\n\tNoSaves: 'Сохранений нет',\n\tLoadSave: 'Загрузить',\n\tSaves: 'Сохранения',\n\tSettings: 'Настройки',\n\tSumbit: 'Подтвердить',\n\tGoBack: 'Назад',\n\tDoSave: 'Сохранение',\n\tAuto: 'Авто',\n\tStop: 'Стоп',\n\tExit: 'Выход',\n\tAutomatic: 'Автоматическое',\n\tManual: 'Ручное',\n\tRemove: 'Удалить',\n\tLoadASaveFrom: 'Загрузить сохранение от',\n\tDeleteASaveFrom: 'Удалить сохранение от',\n\tTextSpeed: 'Скорость текста',\n\tTextSpeedSlow: 'Медленная',\n\tTextSpeedMedium: 'Средняя',\n\tTextSpeedFast: 'Быстрая',\n\tTextSpeedAuto: 'Автоматическая',\n\tCompleteText: 'Завершить текст',\n\tGoForward: 'Перейти вперёд',\n\tExitDialogWarning: 'Вы уверены, что хотите выйти? Прогресс будет сохранён.',\n\tExitDialogExit: 'Выйти',\n\tExitDialogBack: 'Вернуться в игру',\n\tOpenMenu: 'Открыть меню',\n\tCloseMenu: 'Закрыть меню',\n\tMusicVolume: 'Громкость музыки',\n\tSoundVolume: 'Громкость звуков',\n\tVoiceVolume: 'Громкость речи',\n\tClose: 'Закрыть',\n\tDialogOverview: 'Обзор диалога',\n};\n\ntype BaseTranslationStrings = keyof typeof RU;\n\nconst EN: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'New Game',\n\tHomeScreen: 'Home Screen',\n\tToTheGame: 'To the Game',\n\tLanguage: 'Language',\n\tNoSaves: 'No saves',\n\tLoadSave: 'Load',\n\tSaves: 'Saves',\n\tSettings: 'Settings',\n\tSumbit: 'Submit',\n\tGoBack: 'Go back',\n\tDoSave: 'Save',\n\tAuto: 'Auto',\n\tStop: 'Stop',\n\tExit: 'Exit',\n\tAutomatic: 'Automatic',\n\tManual: 'Manual',\n\tRemove: 'Remove',\n\tLoadASaveFrom: 'Load a save from',\n\tDeleteASaveFrom: 'Delete a save from',\n\tTextSpeed: 'Text Speed',\n\tTextSpeedSlow: 'Slow',\n\tTextSpeedMedium: 'Medium',\n\tTextSpeedFast: 'Fast',\n\tTextSpeedAuto: 'Auto',\n\tCompleteText: 'Complete text',\n\tGoForward: 'Go forward',\n\tExitDialogWarning: 'Are you sure you want to exit? Progress will be saved.',\n\tExitDialogExit: 'Exit',\n\tExitDialogBack: 'Return to game',\n\tOpenMenu: 'Open menu',\n\tCloseMenu: 'Close menu',\n\tMusicVolume: 'Music volume',\n\tSoundVolume: 'Sound volume',\n\tVoiceVolume: 'Voice volume',\n\tClose: 'Close',\n\tDialogOverview: 'Dialog Overview',\n};\n\nexport { RU, EN };\nexport type { BaseTranslationStrings };\n","type EventHandler<T> = (this: Document, event: T) => void;\n\ntype BlurEventHandler = EventHandler<Event>;\ntype FocusEventHandler = EventHandler<FocusEvent>;\n\nconst BLUR_HANDLERS = new Set<BlurEventHandler>();\nconst FOCUS_HANDLERS = new Set<FocusEventHandler>();\n\ntype EventListeners = {\n\tfocus: FocusEventHandler;\n\tblur: BlurEventHandler;\n};\n\nconst registerEventListeners = (listeners: EventListeners) => {\n\tBLUR_HANDLERS.add(listeners.blur);\n\tFOCUS_HANDLERS.add(listeners.focus);\n\n\treturn () => {\n\t\tBLUR_HANDLERS.delete(listeners.blur);\n\t\tFOCUS_HANDLERS.delete(listeners.focus);\n\t};\n};\n\naddEventListener('focus', function (event) {\n\tfor (const handler of FOCUS_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\naddEventListener('blur', function (event) {\n\tfor (const handler of BLUR_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\nconst pauseOnBlur = (engine: { setFocused: (focused: boolean) => void }) => {\n\treturn {\n\t\tunsubscribe: registerEventListeners({\n\t\t\tfocus: () => {\n\t\t\t\tengine.setFocused(true);\n\t\t\t},\n\t\t\tblur: () => {\n\t\t\t\tengine.setFocused(false);\n\t\t\t},\n\t\t}),\n\t};\n};\n\nexport { pauseOnBlur };\n"],"mappings":"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","names":["memoize","DEV","asset","supportsMap","supportsMap","asset","DEV","refer","audio","item","next","memoize","DEV","memoize","memoize","memoize","memoize","store","set","set","once","getStack","asset","action","DEV","DEV","action","paused","getLanguage","memoize","DEV","data","save","replace","set","action","characters","audio","type","props","asset","preview","next","t","paused"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/dequal@2.0.3/node_modules/dequal/lite/index.mjs","../src/novely.ts","../../../node_modules/.pnpm/klona@2.0.6/node_modules/klona/full/index.mjs","../src/constants.ts","../src/shared.ts","../src/utilities/assertions.ts","../src/utilities/match-action.ts","../src/asset.ts","../src/audio-codecs.ts","../src/image-formats.ts","../src/utilities/actions-processing.ts","../src/utilities/controlled-promise.ts","../src/utilities/resources.ts","../src/utilities/stack.ts","../src/utilities/story.ts","../src/utilities/internationalization.ts","../src/utilities/noop.ts","../src/utilities/store.ts","../src/utilities/array.ts","../src/utilities/else.ts","../src/store.ts","../src/custom-action.ts","../src/preloading.ts","../src/storage.ts","../src/translation.ts","../src/utilities/actions.ts","../src/utilities/dialog-overview.ts","../src/utilities/document.ts","../src/ticker.ts","../src/extend-actions.ts","../src/translations.ts","../src/browser-events.ts"],"sourcesContent":["var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","import { dequal } from 'dequal/lite';\nimport { memoize, throttle } from 'es-toolkit/function';\nimport { merge as deepmerge } from 'es-toolkit/object';\nimport { DEV } from 'esm-env';\nimport { klona } from 'klona/full';\nimport pLimit from 'p-limit';\nimport type {\n\tActionChoiceChoice,\n\tActionProxy,\n\tChoiceCheckFunction,\n\tCustomHandler,\n\tStory,\n\tTextContent,\n\tValidAction,\n\tVirtualActions,\n} from './action';\nimport type { Character } from './character';\nimport type { CleanupFn } from './custom-action';\nimport { DEFAULT_TYPEWRITER_SPEED, EMPTY_SET, MAIN_CONTEXT_KEY } from './constants';\nimport { cleanCleanupSource, getCustomActionCleanupHolder, handleCustomAction } from './custom-action';\nimport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets } from './preloading';\nimport type { Context, RendererInitPreviewReturn } from './renderer';\nimport { PRELOADED_ASSETS, STACK_MAP } from './shared';\nimport { storageAdapterLocal } from './storage';\nimport type { Stored } from './store';\nimport { derive, store } from './store';\nimport { flattenAllowedContent, replace as replaceTranslation } from './translation';\nimport type { BaseTranslationStrings } from './translations';\nimport type {\n\tCoreData,\n\tData,\n\tEngineTypes,\n\tLang,\n\tNovelyInit,\n\tSave,\n\tState,\n\tStateFunction,\n\tStorageData,\n} from './types';\nimport type { ControlledPromise } from './utilities';\nimport {\n\tisAction,\n\tisAudioAction,\n\tisBlockingAction,\n\tisEmpty,\n\tisFunction,\n\tisPromise,\n\tisString,\n\tisAsset,\n\tmatchAction,\n\tcreateQueueProcessor,\n\tgetActionsFromPath,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tcreateControlledPromise,\n\tgetResourseType,\n\tcreateUseStackFunction,\n\tflatStory,\n\tcapitalize,\n\tgetLanguage as defaultGetLanguage,\n\tgetCharactersData,\n\tgetIntlLanguageDisplayName,\n\tgetLanguageFromStore,\n\tgetVolumeFromStore,\n\tnoop,\n\ttoArray,\n} from './utilities';\nimport type { MatchActionHandlers } from './utilities';\nimport { buildActionObject } from './utilities/actions';\nimport { unwrapAsset, unwrapAudioAsset, unwrapImageAsset } from './asset';\nimport { getDialogOverview } from './utilities/dialog-overview';\nimport { setDocumentLanguage } from './utilities/document';\nimport { TickerFactory } from './ticker';\n\nconst novely = <\n\t$Language extends string,\n\t$Characters extends Record<string, Character<$Language>>,\n\t$State extends State,\n\t$Data extends Data,\n\t$Actions extends Record<string, (...args: any[]) => ValidAction>,\n>({\n\tcharacters,\n\tcharacterAssetSizes = {},\n\tdefaultEmotions = {},\n\tstorage = storageAdapterLocal({ key: 'novely-game-storage' }),\n\tstorageDelay = Promise.resolve(),\n\trenderer: createRenderer,\n\tinitialScreen = 'mainmenu',\n\ttranslation,\n\tstate: defaultState = {} as $State,\n\tdata: defaultData = {} as $Data,\n\tautosaves = true,\n\tmigrations = [],\n\tthrottleTimeout = 850,\n\tgetLanguage = defaultGetLanguage,\n\toverrideLanguage = false,\n\taskBeforeExit = true,\n\tpreloadAssets = 'automatic',\n\tparallelAssetsDownloadLimit = 15,\n\tfetch: request = fetch,\n\tcloneFunction: clone = klona,\n\tsaveOnUnload = true,\n\tstartKey = 'start',\n\tdefaultTypewriterSpeed = DEFAULT_TYPEWRITER_SPEED,\n\tstoryOptions = { mode: 'static' },\n\tonLanguageChange,\n}: NovelyInit<$Language, $Characters, $State, $Data, $Actions>) => {\n\ttype $ActionProxy = ActionProxy<$Characters, $Language, $State>;\n\ttype $VirtualActions = VirtualActions<$Characters, $Language, $State>;\n\n\t// All action functions\n\ttype Actions = $Actions & $ActionProxy & $VirtualActions;\n\n\tconst languages = Object.keys(translation) as $Language[];\n\n\tconst limitScript = pLimit(1);\n\tconst limitAssetsDownload = pLimit(parallelAssetsDownloadLimit);\n\n\tconst story: Story = {};\n\n\tconst times = new Set<number>();\n\n\tconst dataLoaded = createControlledPromise();\n\n\tlet initialScreenWasShown = false;\n\tlet destroyed = false;\n\n\tif (storyOptions.mode === 'dynamic') {\n\t\tstoryOptions.preloadSaves ??= 4;\n\t}\n\n\tconst storyLoad = storyOptions.mode === 'static' ? noop : storyOptions.load;\n\tconst onUnknownSceneHit = memoize(async (scene: string) => {\n\t\tconst part = await storyLoad(scene);\n\n\t\tif (part) {\n\t\t\tawait script(part);\n\t\t}\n\t});\n\n\t/**\n\t * Saves timestamps created in this session\n\t */\n\tconst intime = (value: number) => {\n\t\treturn times.add(value), value;\n\t};\n\n\tconst scriptBase = async (part: Story) => {\n\t\t// In case script was called after destroy\n\t\tif (destroyed) return;\n\n\t\tObject.assign(story, flatStory(part));\n\n\t\t// This is the first `script` call, likely data did not loaded yet\n\t\tif (!initialScreenWasShown) {\n\t\t\trenderer.ui.showLoading();\n\t\t}\n\n\t\tawait dataLoaded.promise;\n\n\t\trenderer.ui.hideLoading();\n\n\t\tif (!initialScreenWasShown) {\n\t\t\tinitialScreenWasShown = true;\n\n\t\t\tif (initialScreen === 'game') {\n\t\t\t\trestore(undefined);\n\t\t\t} else {\n\t\t\t\trenderer.ui.showScreen(initialScreen);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Setup your story here\n\t *\n\t * Call more than once to merge different story parts\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * engine.script({\n\t * start: [action.jump('another-part')]\n\t * })\n\t *\n\t * engine.script({\n\t * 'another-part': []\n\t * })\n\t * ```\n\t */\n\tconst script = (part: Story) => {\n\t\treturn limitScript(() => scriptBase(part));\n\t};\n\n\tconst getDefaultSave = (state: $State) => {\n\t\treturn [\n\t\t\t[\n\t\t\t\t['jump', startKey],\n\t\t\t\t[null, 0],\n\t\t\t],\n\t\t\tstate,\n\t\t\t[intime(Date.now()), 'auto'],\n\t\t\t[],\n\t\t] as Save<$State>;\n\t};\n\n\t/**\n\t * Calls `getLanguage`, passes needed arguments\n\t * @returns language\n\t */\n\tconst getLanguageWithoutParameters = () => {\n\t\tconst language = getLanguage(languages, defaultGetLanguage);\n\n\t\t// This is valid language\n\t\tif (languages.includes(language as $Language)) {\n\t\t\tsetDocumentLanguage(language);\n\n\t\t\treturn language as $Language;\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\tthrow 0;\n\t};\n\n\t/**\n\t * 1) Novely rendered using the `initialData`, but you can't start new game or `load` an empty one - this is scary, imagine losing your progress\n\t * 2) Actual stored data is loaded, language and etc is changed\n\t */\n\tconst initialData: StorageData<$Language, $Data> = {\n\t\tsaves: [],\n\t\tdata: clone(defaultData),\n\t\tmeta: [getLanguageWithoutParameters(), DEFAULT_TYPEWRITER_SPEED, 1, 1, 1],\n\t};\n\n\tconst storageData = store(initialData);\n\tconst coreData = store<CoreData>({\n\t\tdataLoaded: false,\n\t\tpaused: false,\n\t\tfocused: document.visibilityState === 'visible',\n\t});\n\n\tconst paused = derive(coreData, (s) => s.paused || !s.focused);\n\n\tconst onDataLoadedPromise = async ({ cancelled }: Awaited<ControlledPromise<void>>) => {\n\t\t/**\n\t\t * Promise cancelled? Re-subscribe\n\t\t */\n\t\tif (cancelled) {\n\t\t\tdataLoaded.promise.then(onDataLoadedPromise);\n\t\t\treturn;\n\t\t}\n\n\t\tconst preload = () => {\n\t\t\tconst saves = [...storageData.get().saves].reverse();\n\t\t\tconst sliced = saves.slice(0, storyOptions.mode === 'dynamic' ? storyOptions.preloadSaves : 0);\n\n\t\t\tfor (const [path] of sliced) {\n\t\t\t\treferGuarded(path);\n\t\t\t}\n\t\t};\n\n\t\tpreload();\n\n\t\t/**\n\t\t * When promise is resolved data is marked loaded\n\t\t */\n\t\tcoreData.update((data) => {\n\t\t\tdata.dataLoaded = true;\n\n\t\t\treturn data;\n\t\t});\n\t};\n\n\tdataLoaded.promise.then(onDataLoadedPromise);\n\n\tconst onStorageDataChange = (value: StorageData) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst data = clone(value);\n\n\t\t/**\n\t\t * Empty out data snapshots\n\t\t */\n\t\tfor (const save of data.saves) {\n\t\t\tsave[3] = [];\n\t\t}\n\n\t\tstorage.set(data);\n\t};\n\n\t/**\n\t * Short one is used in conditions like `beforeunload` when waiting for too long is not a case\n\t * Another one relies on short one to prevent double saving\n\t */\n\tconst throttledShortOnStorageDataChange = throttle(() => onStorageDataChange(storageData.get()), 10);\n\tconst throttledOnStorageDataChange = throttle(throttledShortOnStorageDataChange, throttleTimeout);\n\n\tstorageData.subscribe(throttledOnStorageDataChange);\n\n\tif (saveOnUnload === true || (saveOnUnload === 'prod' && !DEV)) {\n\t\taddEventListener('beforeunload', throttledShortOnStorageDataChange);\n\t}\n\n\tconst getStoredData = async () => {\n\t\tlet stored = await storage.get();\n\n\t\tfor (const migration of migrations) {\n\t\t\tstored = migration(stored) as StorageData;\n\n\t\t\tif (DEV && !stored) {\n\t\t\t\tthrow new Error('Migrations should return a value.');\n\t\t\t}\n\t\t}\n\n\t\tif (overrideLanguage || !stored.meta[0]) {\n\t\t\tstored.meta[0] = getLanguageWithoutParameters();\n\t\t}\n\n\t\t/**\n\t\t * Default `localStorageStorage` returns empty array\n\t\t */\n\t\tstored.meta[1] ||= defaultTypewriterSpeed;\n\n\t\t/**\n\t\t * Sound Volumes\n\t\t */\n\t\tstored.meta[2] ??= 1;\n\t\tstored.meta[3] ??= 1;\n\t\tstored.meta[4] ??= 1;\n\n\t\t/**\n\t\t * When data is empty replace it with `defaultData`\n\t\t * It also might be empty (default to empty)\n\t\t */\n\t\tif (isEmpty(stored.data)) {\n\t\t\tstored.data = defaultData as Data;\n\t\t}\n\n\t\t/**\n\t\t * Now the next store updates will entail saving via storage.set\n\t\t */\n\t\tdataLoaded.resolve();\n\n\t\tstorageData.set(stored as StorageData<$Language, $Data>);\n\t};\n\n\t/**\n\t * By default this is resolved immediately, but also can be delayed.\n\t * I.e. storage has not loaded yet\n\t */\n\tstorageDelay.then(getStoredData);\n\n\tconst initial = getDefaultSave(clone(defaultState));\n\n\t// #region Save Function\n\tconst save = (type: Save[2][1]) => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\t/**\n\t\t * When autosaves diabled just return\n\t\t */\n\t\tif (!autosaves && type === 'auto') return;\n\n\t\t/**\n\t\t * Saves only possible in main context, so there is no reason for context to be used here\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\t\tconst current = clone(stack.value);\n\n\t\tstorageData.update((prev) => {\n\t\t\tconst replace = () => {\n\t\t\t\tprev.saves[prev.saves.length - 1] = current;\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\tconst add = () => {\n\t\t\t\tprev.saves.push(current);\n\n\t\t\t\treturn prev;\n\t\t\t};\n\n\t\t\t/**\n\t\t\t * Get latest\n\t\t\t */\n\t\t\tconst last = prev.saves.at(-1);\n\n\t\t\t/**\n\t\t\t * We cannot compare anything here, thus just reutrn\n\t\t\t */\n\t\t\tif (!last) return add();\n\n\t\t\t/**\n\t\t\t * Update type and time information\n\t\t\t */\n\t\t\tcurrent[2][0] = intime(Date.now());\n\t\t\tcurrent[2][1] = type;\n\n\t\t\t/**\n\t\t\t * Empty out state snapshots\n\t\t\t */\n\t\t\tcurrent[3] = [];\n\n\t\t\tconst isIdentical = dequal(last[0], current[0]) && dequal(last[1], current[1]);\n\t\t\tconst isLastMadeInCurrentSession = times.has(last[2][0]);\n\n\t\t\t/**\n\t\t\t * Even if override is false, we will replace auto save with manual, because they are the same thing basically\n\t\t\t */\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'manual') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Player has made a manual save, novely decided to make an auto save\n\t\t\t * But it is identical to previously created manual save so completely not wanted\n\t\t\t */\n\t\t\tif (last[2][1] === 'manual' && type === 'auto' && isIdentical) {\n\t\t\t\treturn prev;\n\t\t\t}\n\n\t\t\tif (isLastMadeInCurrentSession && last[2][1] === 'auto' && type === 'auto') {\n\t\t\t\treturn replace();\n\t\t\t}\n\n\t\t\treturn add();\n\t\t});\n\t};\n\t// #endregion\n\n\t// #region New Game\n\tconst newGame = () => {\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tconst save = getDefaultSave(clone(defaultState));\n\n\t\t/**\n\t\t * Initial save is automatic, and should be ignored when autosaves is turned off\n\t\t */\n\t\tif (autosaves) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\treturn prev.saves.push(save), prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tstack.value = save;\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\n\t\trenderer.ui.showScreen('game');\n\n\t\trender(context);\n\t};\n\t// #endregion\n\n\t/**\n\t * Set's the save and restores onto it\n\t */\n\tconst set = (save: Save, ctx?: Context) => {\n\t\tconst stack = useStack(ctx || MAIN_CONTEXT_KEY);\n\n\t\tstack.value = save;\n\n\t\treturn restore(save);\n\t};\n\n\tlet interacted = 0;\n\n\t// #region Restore Function\n\t/**\n\t * Restore save or if none is passed then look for latest save, if there is no saves will create a new save\n\t */\n\tconst restore = async (save: Save | undefined) => {\n\t\tif (isEmpty(story)) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Story is empty. You should call an `enine.script` function [https://novely.pages.dev/guide/story.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!coreData.get().dataLoaded) return;\n\n\t\tlet latest = save || storageData.get().saves.at(-1);\n\n\t\t/**\n\t\t * When there is no save, make a new save\n\t\t */\n\t\tif (!latest) {\n\t\t\tlatest = clone(initial);\n\n\t\t\tstorageData.update((prev) => {\n\t\t\t\tprev.saves.push(latest!);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\tconst context = renderer.getContext(MAIN_CONTEXT_KEY);\n\t\tconst stack = useStack(context);\n\n\t\tcontext.meta.restoring = true;\n\n\t\tconst previous = stack.previous;\n\n\t\tconst [path] = (stack.value = latest);\n\n\t\trenderer.ui.showScreen('game');\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) context.loading(true);\n\n\t\tconst { queue, skip, skipPreserve } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: false,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tconst cleanupHolder = getCustomActionCleanupHolder(context);\n\n\t\tif (previous) {\n\t\t\tconst { queue: prevQueue } = await getActionsFromPath({\n\t\t\t\tstory,\n\t\t\t\tpath: previous[0],\n\t\t\t\tfilter: false,\n\t\t\t\treferGuarded,\n\t\t\t});\n\n\t\t\tconst futures: CustomHandler[] = [];\n\n\t\t\tconst isFromDifferentBranches = previous[0][0][1] !== path[0][1];\n\t\t\tconst end = isFromDifferentBranches ? 0 : queue.length - 1;\n\n\t\t\tfor (let i = prevQueue.length - 1; i >= end; i--) {\n\t\t\t\tconst [action, fn] = prevQueue[i];\n\n\t\t\t\tif (action === 'custom') {\n\t\t\t\t\tfutures.push(fn);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfutures.reverse();\n\n\t\t\tconst nodeCleanup = new Set<CleanupFn>();\n\n\t\t\tfor (const future of futures) {\n\t\t\t\tinner: for (let i = cleanupHolder.length - 1; i >= 0; i--) {\n\t\t\t\t\tconst item = cleanupHolder[i];\n\n\t\t\t\t\tif (future === item.fn) {\n\t\t\t\t\t\tcleanCleanupSource(item);\n\t\t\t\t\t\tnodeCleanup.add(item.node);\n\n\t\t\t\t\t\tcleanupHolder.splice(i, 1);\n\n\t\t\t\t\t\tbreak inner;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tnodeCleanup.forEach((f) => f());\n\t\t}\n\n\t\tconst {\n\t\t\trun,\n\t\t\tkeep: { keep, characters, audio },\n\t\t} = createQueueProcessor(queue, {\n\t\t\tskip,\n\t\t\tskipPreserve,\n\t\t});\n\n\t\tif (context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * Context is cleared at exit, so it is dirty only when goingBack\n\t\t\t */\n\t\t\tmatch('clear', [keep, characters, audio], {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t}\n\n\t\tcontext.loading(false);\n\n\t\tconst lastQueueItem = queue.at(-1);\n\t\tconst lastQueueItemRequiresUserAction = lastQueueItem && isBlockingAction(lastQueueItem);\n\n\t\tawait run((item) => {\n\t\t\tif (!latest) return;\n\n\t\t\t/**\n\t\t\t * Skip because last item will be ran again by `render(context)` call\n\t\t\t */\n\t\t\tif (lastQueueItem === item && lastQueueItemRequiresUserAction) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst [action, ...props] = item;\n\n\t\t\tif (action === 'custom') {\n\t\t\t\t/**\n\t\t\t\t * We check if there's an existing cleanup function for this action.\n\t\t\t\t * If found, it means the previous run hasn't been cleaned up yet.\n\t\t\t\t * In that case, we avoid re-running.\n\t\t\t\t */\n\t\t\t\tif (cleanupHolder.some((holder) => holder.fn === props[0])) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx: context,\n\t\t\t\tdata: latest[1],\n\t\t\t});\n\t\t});\n\n\t\tif (!context.meta.goingBack) {\n\t\t\t/**\n\t\t\t * When not goingBack setting restoring to false is required to go forward\n\t\t\t * Because when restoring action do not call the resolve function which goes to next action but are controlled\n\t\t\t */\n\t\t\tcontext.meta.restoring = false;\n\t\t}\n\n\t\tawait render(context);\n\n\t\tcontext.meta.restoring = context.meta.goingBack = false;\n\t};\n\t// #endregion\n\n\tconst { refer, referGuarded } = createReferFunction({\n\t\tstory,\n\t\tonUnknownSceneHit,\n\t});\n\n\t// #region Exit Function\n\t/**\n\t * @param force Force exit\n\t */\n\tconst exit = (force = false, saving = true) => {\n\t\t/**\n\t\t * Exit only possible in main context\n\t\t */\n\t\tconst ctx = renderer.getContext(MAIN_CONTEXT_KEY);\n\n\t\tconst stack = useStack(ctx);\n\t\tconst current = stack.value;\n\n\t\tconst isSaved = () => {\n\t\t\tconst { saves } = storageData.get();\n\t\t\tconst [currentPath, currentData] = stack.value;\n\n\t\t\treturn saves.some(\n\t\t\t\t([path, data, [date, type]]) =>\n\t\t\t\t\ttype === 'manual' && times.has(date) && dequal(path, currentPath) && dequal(data, currentData),\n\t\t\t);\n\t\t};\n\n\t\tif (interacted > 1 && !force && askBeforeExit && !isSaved()) {\n\t\t\trenderer.ui.showExitPrompt();\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Imagine list of actions like\n\t\t *\n\t\t * [\n\t\t * ['input', ...args]\n\t\t * ['dialog', ...args]\n\t\t * ]\n\t\t *\n\t\t * When you have done with input, you will go to the dialog\n\t\t * And at that moment you exit the game\n\t\t *\n\t\t * What happens? Input was \"enmemoried\", but dialog not. So when you will open saves, you'll see input action.\n\t\t * We cannot \"enmemory\" dialog when it's just started, because goingBack is going to last enmemoried item, which will be that dialog, so impossible to go back.\n\t\t *\n\t\t * What we do is enmemory on exit.\n\t\t */\n\t\tif (interacted > 0 && saving) {\n\t\t\tsave('auto');\n\t\t}\n\n\t\tstack.clear();\n\t\tclearCustomActionsAtContext(ctx);\n\t\tctx.clear(EMPTY_SET, EMPTY_SET, { music: EMPTY_SET, sounds: EMPTY_SET }, noop);\n\t\trenderer.ui.showScreen('mainmenu');\n\t\tctx.audio.destroy();\n\n\t\tconst [time, type] = current[2];\n\n\t\t/**\n\t\t * This is auto save and belongs to the current session\n\t\t * Player did not interacted or did it once, so this is probably not-needed save\n\t\t */\n\t\tif (type === 'auto' && interacted <= 1 && times.has(time)) {\n\t\t\tstorageData.update((prev) => {\n\t\t\t\tprev.saves = prev.saves.filter((save) => save !== current);\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Reset interactive value\n\t\t */\n\t\tinteractivity(false);\n\t\t/**\n\t\t * Reset session times\n\t\t */\n\t\ttimes.clear();\n\t};\n\t// #endregion\n\n\tconst back = async () => {\n\t\t/**\n\t\t * Back also happens in main context only\n\t\t */\n\t\tconst stack = useStack(MAIN_CONTEXT_KEY);\n\n\t\tconst valueBeforeBack = stack.value;\n\n\t\tstack.back();\n\n\t\t/**\n\t\t * There was only one item in the stack so there is no `stack.previous`, also `ctx.meta.goingBack` did not changed\n\t\t */\n\t\tif (dequal(valueBeforeBack, stack.value) && !stack.previous) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait restore(stack.value);\n\t};\n\n\tconst t = (key: BaseTranslationStrings, lang: string | $Language) => {\n\t\treturn translation[lang as $Language].internal[key];\n\t};\n\n\t// #region Preview Function\n\t/**\n\t * Execute save in context named `name`\n\t * @param save Save\n\t * @param name Context name\n\t */\n\tconst preview = async (save: Save, name: string): Promise<RendererInitPreviewReturn> => {\n\t\tif (isEmpty(story)) {\n\t\t\treturn Promise.resolve({\n\t\t\t\tassets: [],\n\t\t\t});\n\t\t}\n\n\t\tconst [path, data] = save;\n\n\t\tconst ctx = renderer.getContext(name);\n\n\t\tconst { found } = await refer(path);\n\n\t\tif (found) ctx.loading(true);\n\n\t\tconst { queue } = await getActionsFromPath({\n\t\t\tstory,\n\t\t\tpath,\n\t\t\tfilter: true,\n\t\t\treferGuarded,\n\t\t});\n\n\t\tctx.loading(false);\n\n\t\t// Enter restoring mode in action\n\t\tctx.meta.restoring = true;\n\t\tctx.meta.preview = true;\n\n\t\tconst processor = createQueueProcessor(queue, {\n\t\t\tskip: EMPTY_SET,\n\t\t});\n\n\t\tuseStack(ctx).push(clone(save));\n\n\t\tconst assets: string[] = [];\n\t\tconst huntPromises: Promise<void>[] = [];\n\n\t\tawait processor.run(([action, ...props]) => {\n\t\t\tif (isAudioAction(action)) return;\n\t\t\tif (action === 'vibrate') return;\n\t\t\tif (action === 'end') return;\n\n\t\t\tconst huntPromise = huntAssets({\n\t\t\t\taction,\n\t\t\t\tprops: props as any,\n\n\t\t\t\tcharacters,\n\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\thandle: assets.push.bind(assets),\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\thuntPromises.push(huntPromise);\n\n\t\t\treturn match(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t});\n\n\t\tawait Promise.all(huntPromises);\n\n\t\treturn {\n\t\t\tassets,\n\t\t};\n\t};\n\t// #endregion\n\n\tconst removeContext = (name: string) => {\n\t\tSTACK_MAP.delete(name);\n\t};\n\n\tconst getStateAtCtx = (context: string | Context) => {\n\t\treturn useStack(context).value[1];\n\t};\n\n\tconst getStateFunction = (context: string | Context) => {\n\t\tconst stack = useStack(context);\n\n\t\tconst state = ((value) => {\n\t\t\tconst _state = getStateAtCtx(context);\n\n\t\t\tif (!value) {\n\t\t\t\treturn _state;\n\t\t\t}\n\n\t\t\tconst prev = _state;\n\t\t\tconst val = isFunction(value) ? value(prev) : deepmerge(prev, value);\n\n\t\t\tstack.value[1] = val;\n\n\t\t\treturn undefined;\n\t\t}) as StateFunction<State>;\n\n\t\treturn state;\n\t};\n\n\tconst getLanguageDisplayName = (lang: Lang) => {\n\t\tconst language = translation[lang as $Language];\n\n\t\tif (DEV && !language) {\n\t\t\tthrow new Error(\n\t\t\t\t`Attempt to use unsupported language \"${language}\". Supported languages: ${languages.join(', ')}.`,\n\t\t\t);\n\t\t}\n\n\t\treturn capitalize(language.nameOverride || getIntlLanguageDisplayName(lang));\n\t};\n\n\tconst clearCustomActionsAtContext = (ctx: Context) => {\n\t\tconst cleanupHolder = getCustomActionCleanupHolder(ctx);\n\t\tconst nodeCleanup = new Set<CleanupFn>();\n\n\t\tfor (const item of cleanupHolder) {\n\t\t\tcleanCleanupSource(item);\n\t\t\tnodeCleanup.add(item.node);\n\t\t}\n\n\t\tcleanupHolder.length = 0;\n\t\tnodeCleanup.forEach((fn) => fn());\n\t};\n\n\tconst getResourseTypeWrapper = (url: string) => {\n\t\treturn getResourseType({\n\t\t\turl,\n\t\t\trequest,\n\t\t});\n\t};\n\n\tconst getCharacterColor = (c: keyof $Characters) => {\n\t\treturn c in characters ? characters[c].color : '#000000';\n\t};\n\n\tconst getCharacterAssets = (character: string, emotion: string) => {\n\t\treturn toArray(characters[character].emotions[emotion]).map(unwrapImageAsset);\n\t};\n\n\tconst getCharacterName = (character: keyof $Characters): string => {\n\t\tconst c = character;\n\t\tconst cs = characters;\n\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\tif (c && c in cs) {\n\t\t\tconst block = cs[c].name;\n\n\t\t\tif (typeof block === 'string') {\n\t\t\t\treturn block;\n\t\t\t}\n\n\t\t\tif (lang in block) {\n\t\t\t\treturn block[lang];\n\t\t\t}\n\t\t}\n\n\t\treturn String(c);\n\t};\n\n\tconst setLanguage = (lang: string) => {\n\t\tstorageData.update((prev) => {\n\t\t\tif (languages.includes(lang as $Language)) {\n\t\t\t\tprev.meta[0] = lang as $Language;\n\t\t\t}\n\n\t\t\tif (lang === prev.meta[0]) {\n\t\t\t\tsetDocumentLanguage(lang);\n\t\t\t\tonLanguageChange?.(lang as $Language);\n\t\t\t}\n\n\t\t\treturn prev;\n\t\t});\n\t};\n\n\t// #region Renderer Creation\n\tconst renderer = createRenderer({\n\t\tmainContextKey: MAIN_CONTEXT_KEY,\n\n\t\tcharacters: getCharactersData(characters),\n\t\tcharacterAssetSizes,\n\t\tset,\n\t\trestore,\n\t\tsave,\n\t\tnewGame,\n\t\texit,\n\t\tback,\n\t\tt,\n\t\tpreview,\n\t\tremoveContext,\n\t\tgetStateFunction,\n\t\tclearCustomActionsAtContext,\n\t\tlanguages,\n\t\tstorageData: storageData as unknown as Stored<StorageData<string, Data>>,\n\t\tcoreData,\n\n\t\tgetLanguageDisplayName,\n\t\tgetCharacterColor,\n\t\tgetCharacterAssets,\n\t\tgetDialogOverview: getDialogOverview.bind({\n\t\t\treferGuarded,\n\t\t\tstory,\n\t\t\tgetCharacterName,\n\t\t\tgetLanguage: () => getLanguageFromStore(storageData),\n\t\t\tgetStack: () => useStack(MAIN_CONTEXT_KEY),\n\t\t\ttemplateReplace: (...args) => templateReplace(...args),\n\t\t}),\n\n\t\tgetResourseType: getResourseTypeWrapper,\n\n\t\tsetLanguage,\n\t});\n\t// #endregion\n\n\tconst useStack = createUseStackFunction(renderer);\n\n\t/**\n\t * Initiate\n\t */\n\tuseStack(MAIN_CONTEXT_KEY).push(initial);\n\n\tconst UIInstance = renderer.ui.start();\n\n\tconst enmemory = (ctx: Context) => {\n\t\tif (ctx.meta.restoring) return;\n\n\t\tconst stack = useStack(ctx);\n\n\t\tconst current = clone(stack.value);\n\n\t\tcurrent[2][1] = 'auto';\n\n\t\tstack.push(current);\n\n\t\tsave('auto');\n\t};\n\n\tconst next = (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst path = stack.value[0];\n\n\t\tnextPath(path);\n\t};\n\n\tconst matchActionOptions: MatchActionHandlers = {\n\t\tgetContext: renderer.getContext,\n\t\tpush(ctx) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tnext(ctx);\n\t\t\trender(ctx);\n\t\t},\n\t\tforward(ctx) {\n\t\t\tif (!ctx.meta.preview) enmemory(ctx);\n\n\t\t\tmatchActionOptions.push(ctx);\n\n\t\t\tif (!ctx.meta.preview) interactivity(true);\n\t\t},\n\t\tasync onBeforeActionCall({ action, props, ctx }) {\n\t\t\tif (preloadAssets !== 'automatic') return;\n\t\t\tif (ctx.meta.preview || ctx.meta.restoring) return;\n\t\t\tif (!isBlockingAction([action, ...props] as unknown as Exclude<ValidAction, ValidAction[]>)) return;\n\n\t\t\ttry {\n\t\t\t\tconst collection = await collectActionsBeforeBlockingAction({\n\t\t\t\t\tpath: nextPath(clone(useStack(ctx).value[0])),\n\t\t\t\t\trefer: referGuarded,\n\t\t\t\t\tclone,\n\t\t\t\t});\n\n\t\t\t\tconst queue = collection.map(([action, ...props]) => {\n\t\t\t\t\treturn huntAssets({\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tprops: props as any,\n\n\t\t\t\t\t\tcharacters,\n\n\t\t\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\t\t\tvolume: getVolumeFromStore(storageData),\n\n\t\t\t\t\t\thandle: enqueueAssetForPreloading,\n\t\t\t\t\t\trequest,\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tawait Promise.all(queue);\n\n\t\t\t\thandleAssetsPreloading({\n\t\t\t\t\t...renderer.misc,\n\t\t\t\t\trequest,\n\t\t\t\t\tlimiter: limitAssetsDownload,\n\t\t\t\t});\n\t\t\t} catch (cause) {\n\t\t\t\tconsole.error(cause);\n\t\t\t}\n\t\t},\n\t};\n\n\tconst ticker = new TickerFactory(paused);\n\n\t// #region Match Action\n\tconst { match, nativeActions } = matchAction(matchActionOptions, {\n\t\twait({ ctx, data, push }, [time]) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tsetTimeout(push, isFunction(time) ? time(data) : time);\n\t\t},\n\t\tshowBackground({ ctx, push }, [background]) {\n\t\t\tif (isString(background) || isAsset(background)) {\n\t\t\t\tctx.background({\n\t\t\t\t\tall: unwrapImageAsset(background),\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tctx.background(\n\t\t\t\t\tObject.fromEntries(Object.entries(background).map(([media, asset]) => [media, unwrapImageAsset(asset)])),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tplayMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').play(true);\n\t\t\tpush();\n\t\t},\n\t\tpauseMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopMusic({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'music').stop();\n\t\t\tpush();\n\t\t},\n\t\tplaySound({ ctx, push }, [source, loop]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').play(loop || false);\n\t\t\tpush();\n\t\t},\n\t\tpauseSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').pause();\n\t\t\tpush();\n\t\t},\n\t\tstopSound({ ctx, push }, [source]) {\n\t\t\tctx.audio.music(unwrapAudioAsset(source), paused, 'sound').stop();\n\t\t\tpush();\n\t\t},\n\t\tvoice({ ctx, push }, [source]) {\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\t\t\tconst audioSource = isString(source) ? source : isAsset(source) ? source : source[lang];\n\n\t\t\t/**\n\t\t\t * We allow ignoring voice because it is okay to not have voiceover for certain languages\n\t\t\t */\n\t\t\tif (!audioSource) {\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.audio.voice(unwrapAudioAsset(audioSource), paused);\n\t\t\tpush();\n\t\t},\n\t\tstopVoice({ ctx, push }) {\n\t\t\tctx.audio.voiceStop();\n\t\t\tpush();\n\t\t},\n\t\tshowCharacter({ ctx, push }, [character, emotion, className, style]) {\n\t\t\temotion ??= defaultEmotions[character];\n\n\t\t\tif (DEV && !emotion) {\n\t\t\t\tthrow new Error(`Attemp to show character \"${character}\" without emotion provided.`);\n\t\t\t}\n\n\t\t\tif (!emotion) return;\n\n\t\t\tif (DEV && !characters[character].emotions[emotion]) {\n\t\t\t\tthrow new Error(`Attempt to show character \"${character}\" with unknown emotion \"${emotion}\"`);\n\t\t\t}\n\n\t\t\tconst handle = ctx.character(character);\n\n\t\t\thandle.append(className, style, ctx.meta.restoring);\n\t\t\thandle.emotion(emotion, true);\n\n\t\t\tpush();\n\t\t},\n\t\thideCharacter({ ctx, push }, [character, className, style, duration]) {\n\t\t\tctx.character(character).remove(className, style, duration, ctx.meta.restoring).then(push);\n\t\t},\n\t\tdialog({ ctx, data, forward }, [character, content, emotion]) {\n\t\t\tconst name = getCharacterName(character);\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * For each \"dialog\" we save copy of current game state\n\t\t\t * It's used for dialog overview\n\t\t\t */\n\t\t\tif (!ctx.meta.restoring && !ctx.meta.goingBack) {\n\t\t\t\tstack.value[3].push(clone(data));\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('dialog');\n\n\t\t\tctx.dialog(templateReplace(content, data), templateReplace(name, data), character, emotion, forward);\n\t\t},\n\t\tfunction({ ctx, push }, [fn]) {\n\t\t\tconst { restoring, goingBack, preview } = ctx.meta;\n\n\t\t\tconst result = fn({\n\t\t\t\tlang: getLanguageFromStore(storageData),\n\t\t\t\tgoingBack,\n\t\t\t\trestoring,\n\t\t\t\tpreview,\n\t\t\t\tstate: getStateFunction(ctx),\n\t\t\t});\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tresult ? result.then(push) : push();\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tchoice({ ctx, data }, [question, ...choices]) {\n\t\t\tconst isWithoutQuestion = Array.isArray(question);\n\n\t\t\tif (isWithoutQuestion) {\n\t\t\t\t/**\n\t\t\t\t * Can be string or a choice\n\t\t\t\t */\n\t\t\t\tchoices.unshift(question as unknown as ActionChoiceChoice<string, State>);\n\n\t\t\t\t/**\n\t\t\t\t * Omitted then\n\t\t\t\t */\n\t\t\t\tquestion = '';\n\t\t\t}\n\n\t\t\tconst transformedChoices = choices.map(([content, _children, active, visible, onSelect, image]) => {\n\t\t\t\tconst active$ = store(false);\n\t\t\t\tconst visible$ = store(false);\n\n\t\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\t\tconst getCheckValue = (fn: ChoiceCheckFunction<string, State> | undefined) => {\n\t\t\t\t\t// If there is no explicit \"no\" choice will be active or visible, etc...\n\t\t\t\t\tif (!fn) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Here we need to use \"fresh\" state instead of \"data\" parameter\n\t\t\t\t\treturn fn({\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\tstate: getStateAtCtx(ctx),\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst update = () => {\n\t\t\t\t\tactive$.set(getCheckValue(active));\n\t\t\t\t\tvisible$.set(getCheckValue(visible));\n\t\t\t\t};\n\n\t\t\t\tupdate();\n\n\t\t\t\tconst onSelectGuarded = onSelect || noop;\n\t\t\t\tconst onSelectWrapped = () => {\n\t\t\t\t\tonSelectGuarded({\n\t\t\t\t\t\trecompute: update,\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tconst imageValue = image ? unwrapImageAsset(image) : '';\n\n\t\t\t\treturn [templateReplace(content, data), active$, visible$, onSelectWrapped, imageValue] as [\n\t\t\t\t\tstring,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\tStored<boolean>,\n\t\t\t\t\t() => void,\n\t\t\t\t\tstring,\n\t\t\t\t];\n\t\t\t});\n\n\t\t\tif (DEV && transformedChoices.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Running choice without variants to choose from, look at how to use Choice action properly [https://novely.pages.dev/guide/actions/choice#usage]`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('choice');\n\n\t\t\tctx.choices(templateReplace(question, data), transformedChoices, (selected) => {\n\t\t\t\tif (!ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\t/**\n\t\t\t\t * If there is a question, then `index` should be shifted by `1`\n\t\t\t\t */\n\t\t\t\tconst offset = isWithoutQuestion ? 0 : 1;\n\n\t\t\t\tif (DEV && !transformedChoices[selected]) {\n\t\t\t\t\tthrow new Error('Choice children is empty, either add content there or make item not selectable');\n\t\t\t\t}\n\n\t\t\t\tstack.value[0].push(['choice', selected + offset], [null, 0]);\n\t\t\t\trender(ctx);\n\t\t\t\tinteractivity(true);\n\t\t\t});\n\t\t},\n\t\tjump({ ctx, data }, [scene]) {\n\t\t\tconst stack = useStack(ctx);\n\n\t\t\t/**\n\t\t\t * `-1` index is used here because `clear` will run `next` that will increase index to `0`\n\t\t\t */\n\t\t\tstack.value[0] = [\n\t\t\t\t['jump', scene],\n\t\t\t\t[null, -1],\n\t\t\t];\n\n\t\t\tstack.value[3] = [];\n\n\t\t\tmatch('clear', [], {\n\t\t\t\tctx,\n\t\t\t\tdata,\n\t\t\t});\n\t\t},\n\t\tclear({ ctx, push }, [keep, characters, audio]) {\n\t\t\t/**\n\t\t\t * Remove vibration\n\t\t\t */\n\t\t\tctx.vibrate(0);\n\n\t\t\t/**\n\t\t\t * Call the actual `clear`\n\t\t\t */\n\t\t\tctx.clear(\n\t\t\t\tkeep || EMPTY_SET,\n\t\t\t\tcharacters || EMPTY_SET,\n\t\t\t\taudio || { music: EMPTY_SET, sounds: EMPTY_SET },\n\t\t\t\tpush,\n\t\t\t);\n\t\t},\n\t\tcondition({ ctx, data }, [condition, variants]) {\n\t\t\tif (DEV && Object.values(variants).length === 0) {\n\t\t\t\tthrow new Error(`Attempt to use Condition action with empty variants object`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst val = String(condition(data));\n\n\t\t\t\tif (DEV && !variants[val]) {\n\t\t\t\t\tthrow new Error(`Attempt to go to unknown variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tif (DEV && variants[val].length === 0) {\n\t\t\t\t\tthrow new Error(`Attempt to go to empty variant \"${val}\"`);\n\t\t\t\t}\n\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['condition', val], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t\tend({ ctx }) {\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\texit(true, false);\n\t\t},\n\t\tinput({ ctx, data, forward }, [question, onInput, setup]) {\n\t\t\tctx.clearBlockingActions('input');\n\n\t\t\tctx.input(templateReplace(question, data), onInput, setup || noop, forward);\n\t\t},\n\t\tcustom({ ctx, push }, [fn]) {\n\t\t\tif (fn.requireUserAction) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t}\n\n\t\t\tconst state = getStateFunction(ctx);\n\t\t\tconst lang = getLanguageFromStore(storageData);\n\n\t\t\tconst result = handleCustomAction(ctx, fn, {\n\t\t\t\t...ctx.custom(fn),\n\t\t\t\tstate,\n\t\t\t\tlang,\n\t\t\t\tgetStack: useStack,\n\t\t\t\tpaused,\n\t\t\t\tticker: ticker.fork(),\n\t\t\t\ttemplateReplace,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tconst next = () => {\n\t\t\t\tif (fn.requireUserAction && !ctx.meta.preview) {\n\t\t\t\t\tenmemory(ctx);\n\t\t\t\t\tinteractivity(true);\n\t\t\t\t}\n\n\t\t\t\tpush();\n\t\t\t};\n\n\t\t\tif (!ctx.meta.restoring || ctx.meta.goingBack) {\n\t\t\t\tif (isPromise(result)) {\n\t\t\t\t\tresult.then(next);\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\t\tvibrate({ ctx, push }, pattern) {\n\t\t\tctx.vibrate(pattern);\n\t\t\tpush();\n\t\t},\n\t\tnext({ push }) {\n\t\t\tpush();\n\t\t},\n\t\tanimateCharacter({ ctx, push }, [character, className]) {\n\t\t\tconst classes = className.split(' ');\n\n\t\t\tif (DEV && classes.length === 0) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Attempt to use AnimateCharacter without classes. Classes should be provided [https://novely.pages.dev/guide/actions/animateCharacter.html]',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (ctx.meta.preview) return;\n\n\t\t\tctx.character(character).animate(classes);\n\n\t\t\tpush();\n\t\t},\n\t\ttext({ ctx, data, forward }, text) {\n\t\t\tconst string = text.map((content) => templateReplace(content, data)).join(' ');\n\n\t\t\tif (DEV && string.length === 0) {\n\t\t\t\tthrow new Error(`Action Text was called with empty string or array`);\n\t\t\t}\n\n\t\t\tctx.clearBlockingActions('text');\n\n\t\t\tctx.text(string, forward);\n\t\t},\n\t\tasync exit({ ctx, data }) {\n\t\t\tif (ctx.meta.restoring) return;\n\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath: useStack(ctx).value[0],\n\t\t\t\trefer: referGuarded,\n\t\t\t\tonExitImpossible: () => {\n\t\t\t\t\tmatch('end', [], {\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tctx.clearBlockingActions(undefined);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\trender(ctx);\n\t\t},\n\t\tpreload({ ctx, push }, [source]) {\n\t\t\tif (DEV && preloadAssets !== 'lazy') {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`You do not need a preload action because \"preloadAssets\" strategy was set to \"${preloadAssets}\"`,\n\t\t\t\t);\n\n\t\t\t\tpush();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst src = unwrapAsset(source);\n\n\t\t\tif (!ctx.meta.goingBack && !ctx.meta.restoring && !PRELOADED_ASSETS.has(src)) {\n\t\t\t\tconst process = async () => {\n\t\t\t\t\tconst type = isAsset(source) ? source.type : await getResourseTypeWrapper(src);\n\n\t\t\t\t\tif (type === 'image') {\n\t\t\t\t\t\trenderer.misc.preloadAudioBlocking(src);\n\t\t\t\t\t} else if (type === 'audio') {\n\t\t\t\t\t\trenderer.misc.preloadImage(src);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (DEV) {\n\t\t\t\t\t\t\tconsole.error(`Preload error: Unknown type of the following resource: `, source);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Add to preloaded before it was loaded to prevent downloading multiple times\n\t\t\t\t\tPRELOADED_ASSETS.add(src);\n\t\t\t\t};\n\n\t\t\t\tprocess();\n\t\t\t}\n\n\t\t\tpush();\n\t\t},\n\t\tblock({ ctx }, [scene]) {\n\t\t\tif (DEV && !story[scene]) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with unknown scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (DEV && story[scene].length === 0) {\n\t\t\t\tthrow new Error(`Attempt to call Block action with empty scene \"${scene}\"`);\n\t\t\t}\n\n\t\t\tif (!ctx.meta.restoring) {\n\t\t\t\tconst stack = useStack(ctx);\n\n\t\t\t\tstack.value[0].push(['block', scene], [null, 0]);\n\n\t\t\t\trender(ctx);\n\t\t\t}\n\t\t},\n\t});\n\t// #endregion\n\n\t// #region Action\n\tconst action = buildActionObject({\n\t\trendererActions: renderer.actions,\n\t\tnativeActions,\n\t\tcharacters,\n\t});\n\t// #endregion\n\n\t// #region Render Function\n\tconst render = async (ctx: Context) => {\n\t\tconst stack = useStack(ctx);\n\t\tconst [path, state] = stack.value;\n\n\t\tconst { found, value } = await refer(path);\n\n\t\tif (found) {\n\t\t\tctx.loading(true);\n\t\t}\n\n\t\tconst referred = await value;\n\n\t\tif (found) {\n\t\t\tctx.loading(false);\n\t\t}\n\n\t\tif (isAction(referred)) {\n\t\t\tconst [action, ...props] = referred;\n\n\t\t\tmatch(action, props, {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else if (Object.values(story).some((branch) => branch === referred)) {\n\t\t\t/**\n\t\t\t * Developer might not write the end action on their own, so we will catch situation when there are no other options than end the game.\n\t\t\t *\n\t\t\t * There are three options right now.\n\t\t\t * - We've got to the action — gonna render it\n\t\t\t * - We've got `undefined`. This means we are tried to go forward, but story array ended already, so we are gonna run exit\n\t\t\t * - We've got branch of story object. This means we exitied from where it's possible to exit and now we can only end the game\n\t\t\t */\n\t\t\tmatch('end', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t} else {\n\t\t\tmatch('exit', [], {\n\t\t\t\tctx,\n\t\t\t\tdata: state,\n\t\t\t});\n\t\t}\n\t};\n\t// #endregion\n\n\tconst interactivity = (value = false) => {\n\t\tinteracted = value ? interacted + 1 : 0;\n\t};\n\n\t/**\n\t * Replaces content inside of {{braces}}.\n\t */\n\tconst templateReplace = (content: TextContent<$Language, Data>, values?: Data) => {\n\t\tconst {\n\t\t\tdata,\n\t\t\tmeta: [lang],\n\t\t} = storageData.get();\n\n\t\t// Object to take values from\n\t\tconst obj = values || data;\n\n\t\t// String\n\t\tconst str = flattenAllowedContent(!isFunction(content) && !isString(content) ? content[lang] : content, obj);\n\n\t\tconst t = translation[lang];\n\t\tconst pluralRules = (t.plural || t.actions) && new Intl.PluralRules(t.tag || lang);\n\n\t\treturn replaceTranslation(str, obj, t.plural, t.actions, pluralRules);\n\t};\n\n\tconst data = ((value) => {\n\t\tconst _data = storageData.get().data;\n\n\t\tif (!value) return _data;\n\n\t\tconst val = isFunction(value) ? value(_data) : deepmerge(_data, value as $Data);\n\n\t\tstorageData.update((prev) => {\n\t\t\tprev.data = val;\n\n\t\t\treturn prev;\n\t\t});\n\n\t\treturn undefined;\n\t}) as StateFunction<$Data>;\n\n\tconst getCurrentStorageData = () => {\n\t\treturn coreData.get().dataLoaded ? clone(storageData.get()) : null;\n\t};\n\n\tconst setStorageData = (data: StorageData<$Language, $Data>) => {\n\t\tif (destroyed) {\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`function \\`setStorageData\\` was called after novely instance was destroyed. Data is not updater nor synced after destroy.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tstorageData.set(data);\n\t};\n\n\t// #region Function Return\n\treturn {\n\t\t/**\n\t\t * Function to set game script\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tscript,\n\t\t/**\n\t\t * Get actions\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {})\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\taction: action as Actions,\n\t\t/**\n\t\t * State bound to `$MAIN` game context\n\t\t * @deprecated Use `state` function provided from action arguments\n\t\t */\n\t\tstate: getStateFunction(MAIN_CONTEXT_KEY),\n\t\t/**\n\t\t * Store data between games\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * engine.script({\n\t\t * start: [\n\t\t * action.function(() => {\n\t\t * // Paid content should be purchased only once\n\t\t * // So it will be available in any save\n\t\t * data({ paid_content_purchased: true })\n\t\t * })\n\t\t * ]\n\t\t * })\n\t\t * ```\n\t\t */\n\t\tdata,\n\t\t/**\n\t\t * Used in combination with type utilities\n\t\t * @example\n\t\t * ```ts\n\t\t * import type { TypesFromEngine, ConditionParams, StateFunction } from '@novely/core';\n\t\t *\n\t\t * type Types = TypesFromEngine<typeof engine>;\n\t\t *\n\t\t * const conditionCheck = (state: StateFunction<ConditionParams<Types>>) => {\n\t\t * return state.age >= 18;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttypes: null as EngineTypes<$Language, $State, $Data, $Characters> | null,\n\t\t/**\n\t\t * Replaces content inside {{braces}} using global data\n\t\t * @example\n\t\t * ```ts\n\t\t * data({ name: 'Alexei' })\n\t\t *\n\t\t * templateReplace('{{name}} is our hero')\n\t\t * templateReplace({\n\t\t * en: (data) => 'Hello, ' + data.name\n\t\t * })\n\t\t * ```\n\t\t */\n\t\ttemplateReplace(content: TextContent<$Language, $Data>) {\n\t\t\treturn templateReplace(content as TextContent<$Language, Data>);\n\t\t},\n\t\t/**\n\t\t * Same as `templateReplace` but uses state and requires explicitly providing it\n\t\t */\n\t\ttemplateReplaceState(content: TextContent<$Language, $State>, state: State) {\n\t\t\treturn templateReplace(content as TextContent<$Language, State>, state);\n\t\t},\n\t\t/**\n\t\t * Cancel data loading, hide UI, ignore page change events\n\t\t * Data updates still will work in case Novely already was loaded\n\t\t */\n\t\tdestroy() {\n\t\t\tif (destroyed) return;\n\n\t\t\tdataLoaded.cancel();\n\n\t\t\tUIInstance.unmount();\n\n\t\t\tticker.destroy();\n\n\t\t\tremoveEventListener('beforeunload', throttledShortOnStorageDataChange);\n\n\t\t\tdestroyed = true;\n\t\t},\n\t\t/**\n\t\t * Funtion to get current storage data\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t * ```\n\t\t */\n\t\tgetCurrentStorageData,\n\t\t/**\n\t\t * Function to set storage data. Using this function is not recommended.\n\t\t *\n\t\t * @deprecated\n\t\t * @example\n\t\t * ```ts\n\t\t * const currentStorageData = engine.getCurrentStorageData();\n\t\t *\n\t\t * if (currentStorageData) {\n\t\t * // update music volume\n\t\t * currentStorageData.meta[2] = 1;\n\t\t *\n\t\t * setStorageData(currentStorageData)\n\t\t * }\n\t\t * ```\n\t\t */\n\t\tsetStorageData,\n\t\t/**\n\t\t * Function to control paused state. Custom Actions are provided with `paused` store they can subscribe to.\n\t\t * This function will notify Custom Actions. Pause state can be used when showing ads.\n\t\t * @example\n\t\t * ```ts\n\t\t * sdk.on('pause' () => engine.setPaused(true));\n\t\t * sdk.on('resume', () => engine.setPaused(false));\n\t\t * ```\n\t\t */\n\t\tsetPaused: (paused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.paused = paused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t\t/**\n\t\t * Function to control focused state. It will affect `paused` store passed to Custom Actions.\n\t\t * This function can be used to pause game when it's not focused.\n\t\t * @example\n\t\t * ```ts\n\t\t * import { pauseOnBlur } from '@novely/core';\n\t\t *\n\t\t * // Will subscribe to blur/focus events and call `setFocused`\n\t\t * pauseOnBlur(engine);\n\t\t *\n\t\t * // OR\n\t\t *\n\t\t * sdk.on('focus' () => engine.setFocused(true));\n\t\t * sdk.on('blur', () => engine.setFocused(false));\n\t\t * ```\n\t\t */\n\t\tsetFocused: (focused: boolean) => {\n\t\t\tcoreData.update((prev) => {\n\t\t\t\tprev.focused = focused;\n\n\t\t\t\treturn prev;\n\t\t\t});\n\t\t},\n\t};\n\t// #endregion\n};\n\nexport { novely };\n","function set(obj, key, val) {\n\tif (typeof val.value === 'object') val.value = klona(val.value);\n\tif (!val.enumerable || val.get || val.set || !val.configurable || !val.writable || key === '__proto__') {\n\t\tObject.defineProperty(obj, key, val);\n\t} else obj[key] = val.value;\n}\n\nexport function klona(x) {\n\tif (typeof x !== 'object') return x;\n\n\tvar i=0, k, list, tmp, str=Object.prototype.toString.call(x);\n\n\tif (str === '[object Object]') {\n\t\ttmp = Object.create(x.__proto__ || null);\n\t} else if (str === '[object Array]') {\n\t\ttmp = Array(x.length);\n\t} else if (str === '[object Set]') {\n\t\ttmp = new Set;\n\t\tx.forEach(function (val) {\n\t\t\ttmp.add(klona(val));\n\t\t});\n\t} else if (str === '[object Map]') {\n\t\ttmp = new Map;\n\t\tx.forEach(function (val, key) {\n\t\t\ttmp.set(klona(key), klona(val));\n\t\t});\n\t} else if (str === '[object Date]') {\n\t\ttmp = new Date(+x);\n\t} else if (str === '[object RegExp]') {\n\t\ttmp = new RegExp(x.source, x.flags);\n\t} else if (str === '[object DataView]') {\n\t\ttmp = new x.constructor( klona(x.buffer) );\n\t} else if (str === '[object ArrayBuffer]') {\n\t\ttmp = x.slice(0);\n\t} else if (str.slice(-6) === 'Array]') {\n\t\t// ArrayBuffer.isView(x)\n\t\t// ~> `new` bcuz `Buffer.slice` => ref\n\t\ttmp = new x.constructor(x);\n\t}\n\n\tif (tmp) {\n\t\tfor (list=Object.getOwnPropertySymbols(x); i < list.length; i++) {\n\t\t\tset(tmp, list[i], Object.getOwnPropertyDescriptor(x, list[i]));\n\t\t}\n\n\t\tfor (i=0, list=Object.getOwnPropertyNames(x); i < list.length; i++) {\n\t\t\tif (Object.hasOwnProperty.call(tmp, k=list[i]) && tmp[k] === x[k]) continue;\n\t\t\tset(tmp, k, Object.getOwnPropertyDescriptor(x, k));\n\t\t}\n\t}\n\n\treturn tmp || x;\n}\n","import type { TypewriterSpeed } from './types';\n\nconst SKIPPED_DURING_RESTORE = new Set(['dialog', 'choice', 'input', 'vibrate', 'text'] as const);\n\nconst BLOCK_EXIT_STATEMENTS = new Set(['choice:exit', 'condition:exit', 'block:exit'] as const);\n\nconst BLOCK_STATEMENTS = new Set(['choice', 'condition', 'block'] as const);\n\nconst AUDIO_ACTIONS = new Set(['playMusic', 'stopMusic', 'playSound', 'stopSound', 'voice', 'stopVoice'] as const);\n\nconst EMPTY_SET = new Set<any>();\n\nconst DEFAULT_TYPEWRITER_SPEED: TypewriterSpeed = 'Medium';\n\nconst HOWLER_SUPPORTED_FILE_FORMATS = new Set([\n\t'mp3',\n\t'mpeg',\n\t'opus',\n\t'ogg',\n\t'oga',\n\t'wav',\n\t'aac',\n\t'caf',\n\t'm4a',\n\t'm4b',\n\t'mp4',\n\t'weba',\n\t'webm',\n\t'dolby',\n\t'flac',\n] as const);\n\nconst SUPPORTED_IMAGE_FILE_FORMATS = new Set([\n\t'apng',\n\t'avif',\n\t'gif',\n\t'jpg',\n\t'jpeg',\n\t'jfif',\n\t'pjpeg',\n\t'pjp',\n\t'png',\n\t'svg',\n\t'webp',\n\t'bmp',\n] as const);\n\n/**\n * @internal\n */\nconst MAIN_CONTEXT_KEY = '$MAIN';\n\nexport {\n\tSKIPPED_DURING_RESTORE,\n\tEMPTY_SET,\n\tDEFAULT_TYPEWRITER_SPEED,\n\tBLOCK_EXIT_STATEMENTS,\n\tBLOCK_STATEMENTS,\n\tMAIN_CONTEXT_KEY,\n\tAUDIO_ACTIONS,\n\tHOWLER_SUPPORTED_FILE_FORMATS,\n\tSUPPORTED_IMAGE_FILE_FORMATS,\n};\n","import type { CustomActionHolder, CustomActionCleanupHolder } from './custom-action';\nimport type { StackHolder } from './types';\n\n/**\n * @internal\n */\nconst STACK_MAP = new Map<string, StackHolder>();\n\n/**\n * @internal\n */\nconst CUSTOM_ACTION_MAP = new Map<string, CustomActionHolder>();\n\n/**\n * @internal\n */\nconst CUSTOM_ACTION_CLEANUP_MAP = new Map<string, CustomActionCleanupHolder>();\n\nconst PRELOADED_ASSETS = new Set<string>();\nconst ASSETS_TO_PRELOAD = new Set<string>();\n\nexport { PRELOADED_ASSETS, ASSETS_TO_PRELOAD, STACK_MAP, CUSTOM_ACTION_MAP, CUSTOM_ACTION_CLEANUP_MAP };\n","import type { ValidAction, CustomHandler } from '../action';\nimport type { NovelyAsset } from '../types';\nimport { AUDIO_ACTIONS, BLOCK_EXIT_STATEMENTS, BLOCK_STATEMENTS, SKIPPED_DURING_RESTORE } from '../constants';\n\nconst isNumber = (val: unknown): val is number => {\n\treturn typeof val === 'number';\n};\n\nconst isNull = (val: unknown): val is null => {\n\treturn val === null;\n};\n\nconst isString = (val: unknown): val is string => {\n\treturn typeof val === 'string';\n};\n\nconst isFunction = (val: unknown): val is (...parameters: any[]) => any => {\n\treturn typeof val === 'function';\n};\n\nconst isPromise = (val: unknown): val is Promise<any> => {\n\treturn Boolean(val) && (typeof val === 'object' || isFunction(val)) && isFunction((val as any).then);\n};\n\nconst isEmpty = (val: unknown): val is Record<PropertyKey, never> => {\n\treturn typeof val === 'object' && !isNull(val) && Object.keys(val).length === 0;\n};\n\n/**\n * Determines if a given action requires user interaction based on its type and metadata.\n */\nconst isUserRequiredAction = ([action, ...meta]: ValidAction) => {\n\treturn Boolean(action === 'custom' && meta[0] && (meta[0] as unknown as CustomHandler).requireUserAction);\n};\n\nconst isBlockStatement = (statement: unknown): statement is 'choice' | 'condition' | 'block' => {\n\treturn BLOCK_STATEMENTS.has(statement as any);\n};\n\nconst isBlockExitStatement = (\n\tstatement: unknown,\n): statement is 'choice:exit' | 'condition:exit' | 'block:exit' => {\n\treturn BLOCK_EXIT_STATEMENTS.has(statement as any);\n};\n\nconst isSkippedDuringRestore = (item: unknown): item is 'vibrate' | 'dialog' | 'input' | 'choice' | 'text' => {\n\treturn SKIPPED_DURING_RESTORE.has(item as any);\n};\n\ntype AudioActionName = 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice';\n\nconst isAudioAction = (action: unknown): action is AudioActionName => {\n\treturn AUDIO_ACTIONS.has(action as any);\n};\n\nconst isAction = (element: unknown): element is Exclude<ValidAction, ValidAction[]> => {\n\treturn Array.isArray(element) && isString(element[0]);\n};\n\n/**\n * Is custom and requires user action or skipped during restoring\n */\nconst isBlockingAction = (action: Exclude<ValidAction, ValidAction[]>) => {\n\treturn isUserRequiredAction(action) || (isSkippedDuringRestore(action[0]) && action[0] !== 'vibrate');\n};\n\nconst isAsset = (suspect: unknown): suspect is NovelyAsset => {\n\treturn suspect !== null && typeof suspect === 'object' && 'source' in suspect && 'type' in suspect;\n};\n\nexport {\n\tisNumber,\n\tisNull,\n\tisString,\n\tisFunction,\n\tisPromise,\n\tisEmpty,\n\tisUserRequiredAction,\n\tisBlockStatement,\n\tisBlockExitStatement,\n\tisSkippedDuringRestore,\n\tisAudioAction,\n\tisAction,\n\tisBlockingAction,\n\tisAsset,\n};\n\nexport type { AudioActionName };\n","import type { CustomHandler, DefaultActionProxy } from '../action';\nimport type { Thenable, State } from '../types';\nimport type { Context } from '../renderer';\n\ntype MatchActionParams = {\n\tdata: State;\n\tctx: Context;\n\n\tpush: () => void;\n\tforward: () => void;\n};\n\ntype MatchActionMap = {\n\t[Key in keyof DefaultActionProxy]: (\n\t\tparams: MatchActionParams,\n\t\tdata: Parameters<DefaultActionProxy[Key]>,\n\t) => void;\n};\n\ntype MatchActionMapComplete = Omit<MatchActionMap, 'custom'> & {\n\tcustom: (params: MatchActionParams, value: [handler: CustomHandler]) => Thenable<void>;\n};\n\ntype MatchActionParameters = {\n\t/**\n\t * Name of context or context\n\t */\n\tctx: string | Context;\n\t/**\n\t * Data from the save\n\t */\n\tdata: State;\n};\n\ntype OnBeforeActionCallPayload = {\n\taction: keyof MatchActionMapComplete;\n\tprops: Parameters<DefaultActionProxy[keyof MatchActionMapComplete]>;\n\tctx: Context;\n};\n\ntype MatchActionHandlers = {\n\tpush: (ctx: Context) => void;\n\tforward: (ctx: Context) => void;\n\n\tgetContext: (name: string) => Context;\n\n\tonBeforeActionCall: (payload: OnBeforeActionCallPayload) => void;\n};\n\nconst matchAction = (callbacks: MatchActionHandlers, values: MatchActionMapComplete) => {\n\tconst { getContext, onBeforeActionCall, push, forward } = callbacks;\n\n\tconst match = (action: keyof MatchActionMapComplete, props: any, { ctx, data }: MatchActionParameters) => {\n\t\tconst context = typeof ctx === 'string' ? getContext(ctx) : ctx;\n\n\t\tonBeforeActionCall({\n\t\t\taction,\n\t\t\tprops,\n\t\t\tctx: context,\n\t\t});\n\n\t\treturn values[action](\n\t\t\t{\n\t\t\t\tctx: context,\n\t\t\t\tdata,\n\n\t\t\t\tpush() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tpush(context);\n\t\t\t\t},\n\t\t\t\tforward() {\n\t\t\t\t\tif (context.meta.preview) return;\n\n\t\t\t\t\tforward(context);\n\t\t\t\t},\n\t\t\t},\n\t\t\tprops,\n\t\t);\n\t};\n\n\treturn {\n\t\tmatch,\n\t\tnativeActions: Object.keys(values),\n\t};\n};\n\nexport { matchAction };\nexport type { MatchActionHandlers, MatchActionMapComplete };\n","import { memoize, once } from 'es-toolkit/function';\nimport { DEV } from 'esm-env';\nimport { supportsMap as audioSupport } from './audio-codecs';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from './constants';\nimport { supportsMap as imageSupport } from './image-formats';\nimport type { NovelyAsset } from './types';\nimport { getUrlFileExtension, isAsset } from './utilities';\n\nconst generateRandomId = () => Math.random().toString(36);\n\n/**\n * Function to get assets type. All assets must be of the same type. Only works with supported types.\n */\nconst getType = memoize(\n\t(extensions: string[]) => {\n\t\tif (extensions.every((extension) => HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (extensions.every((extension) => SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any))) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\tif (DEV) {\n\t\t\tthrow new Error(`Unsupported file extensions: ${JSON.stringify(extensions)}`);\n\t\t}\n\n\t\tthrow extensions;\n\t},\n\t{\n\t\tgetCacheKey: (extensions) => extensions.join('~'),\n\t},\n);\n\nconst SUPPORT_MAPS = {\n\timage: imageSupport,\n\taudio: audioSupport,\n} as const;\n\n/**\n * This function uses array instead of spread because memoize only works with first argument\n */\nconst assetPrivate = memoize(\n\t(variants: string[]): NovelyAsset => {\n\t\tif (DEV && variants.length === 0) {\n\t\t\tthrow new Error(`Attempt to use \"asset\" function without arguments`);\n\t\t}\n\n\t\tconst map: Record<string, string> = {};\n\t\tconst extensions: string[] = [];\n\n\t\tfor (const v of variants) {\n\t\t\tconst e = getUrlFileExtension(v);\n\n\t\t\tmap[e] = v;\n\t\t\textensions.push(e);\n\t\t}\n\n\t\tconst type = getType(extensions);\n\n\t\tconst getSource = once(() => {\n\t\t\tconst support = SUPPORT_MAPS[type];\n\n\t\t\tfor (const extension of extensions) {\n\t\t\t\tif (extension in support) {\n\t\t\t\t\tif (support[extension as keyof typeof support]) {\n\t\t\t\t\t\treturn map[extension];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\treturn map[extension];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (DEV) {\n\t\t\t\tthrow new Error(`No matching asset was found for ${variants.map((v) => `\"${v}\"`).join(', ')}`);\n\t\t\t}\n\n\t\t\treturn '';\n\t\t});\n\n\t\treturn {\n\t\t\tget source() {\n\t\t\t\treturn getSource();\n\t\t\t},\n\t\t\tget type() {\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tid: generateRandomId(),\n\t\t};\n\t},\n\t{\n\t\tgetCacheKey: (variants) => variants.join('~'),\n\t},\n);\n\n/**\n * Memoizes and returns an asset selection object based on provided file variants.\n * The selected asset depends on the client's support for various formats.\n *\n * @param {...string} variants - A variable number of strings, each representing a potential asset file URL.\n * @returns {NovelyAsset} An object representing the selected asset with `source` and `type` properties.\n *\n * @throws {Error} If in DEV mode and no arguments are provided.\n * @example\n * ```\n * import { asset } from 'novely';\n *\n * // Passed first have higher priority\n * const classroom = asset(\n * 'classroom.avif',\n * 'classroom.webp',\n * 'classroom.jpeg'\n * );\n *\n * setTimeout(() => {\n * console.log(classroom.source);\n * }, 100);\n * ```\n */\nconst asset = (...variants: string[]) => {\n\treturn assetPrivate(variants);\n};\n\nasset.image = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'image',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nasset.audio = (source: string): NovelyAsset => {\n\tif (assetPrivate.cache.has(source)) {\n\t\treturn assetPrivate.cache.get(source)!;\n\t}\n\n\tconst asset = {\n\t\ttype: 'audio',\n\t\tsource,\n\t\tid: generateRandomId(),\n\t} as NovelyAsset;\n\n\tassetPrivate.cache.set(source, asset);\n\n\treturn asset;\n};\n\nconst unwrapAsset = (asset: string | NovelyAsset) => {\n\treturn isAsset(asset) ? asset.source : asset;\n};\n\nconst unwrapAudioAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'audio') {\n\t\tthrow new Error('Attempt to use non-audio asset in audio action', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nconst unwrapImageAsset = (asset: string | NovelyAsset) => {\n\tif (DEV && isAsset(asset) && asset.type !== 'image') {\n\t\tthrow new Error('Attempt to use non-image asset in action that requires image assets', { cause: asset });\n\t}\n\n\treturn unwrapAsset(asset);\n};\n\nexport { asset, unwrapAsset, unwrapAudioAsset, unwrapImageAsset };\n","/**\n * This code is adapted from the Howler.js source code.\n * Howler.js: https://github.com/goldfire/howler.js\n */\n\n/**\n * I guess some browsers will return \"no\". So it's better to be safe\n */\nconst cut = (str: CanPlayTypeResult | 'no') => str.replace(/^no$/, '');\n\nconst audio = new Audio();\n\nconst canPlay = (type: string) => !!cut(audio.canPlayType(type));\nconst canPlayMultiple = (...types: string[]) => types.some((type) => canPlay(type));\n\nconst supportsMap = {\n\tmp3: canPlayMultiple('audio/mpeg;', 'audio/mp3;'),\n\tmpeg: canPlay('audio/mpeg;'),\n\topus: canPlay('audio/ogg; codecs=\"opus\"'),\n\togg: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\toga: canPlay('audio/ogg; codecs=\"vorbis\"'),\n\twav: canPlayMultiple('audio/wav; codecs=\"1\"', 'audio/wav;'),\n\taac: canPlay('audio/aac;'),\n\tcaf: canPlay('audio/x-caf;'),\n\tm4a: canPlayMultiple('audio/x-m4a;', 'audio/m4a;', 'audio/aac;'),\n\tm4b: canPlayMultiple('audio/x-m4b;', 'audio/m4b;', 'audio/aac;'),\n\tmp4: canPlayMultiple('audio/x-mp4;', 'audio/mp4;', 'audio/aac;'),\n\tweba: canPlay('audio/webm; codecs=\"vorbis\"'),\n\twebm: canPlay('audio/webm; codecs=\"vorbis\"'),\n\tdolby: canPlay('audio/mp4; codecs=\"ec-3\"'),\n\tflac: canPlayMultiple('audio/x-flac;', 'audio/flac;'),\n};\n\nexport { supportsMap };\n","const avif =\n\t'data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A=';\nconst jxl =\n\t'data:image/jxl;base64,/woIAAAMABKIAgC4AF3lEgAAFSqjjBu8nOv58kOHxbSN6wxttW1hSaLIODZJJ3BIEkkaoCUzGM6qJAE=';\nconst webp =\n\t'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';\n\nconst supportsFormat = (source: string) => {\n\tconst { promise, resolve } = Promise.withResolvers<boolean>();\n\n\tconst img = Object.assign(document.createElement('img'), {\n\t\tsrc: source,\n\t});\n\n\timg.onload = img.onerror = () => {\n\t\tresolve(img.height === 2);\n\t};\n\n\treturn promise;\n};\n\nconst supportsMap = {\n\tavif: false,\n\tjxl: false,\n\twebp: false,\n};\n\nconst formatsMap = {\n\tavif,\n\tjxl,\n\twebp,\n} as const;\n\nconst loadImageFormatsSupport = async () => {\n\tconst promises = [];\n\n\tfor (const [format, source] of Object.entries(formatsMap)) {\n\t\tconst promise = supportsFormat(source).then((supported) => {\n\t\t\tsupportsMap[format as keyof typeof supportsMap] = supported;\n\t\t});\n\n\t\tpromises.push(promise);\n\t}\n\n\tawait Promise.all(promises);\n};\n\nloadImageFormatsSupport();\n\nexport { supportsMap };\n","import type { Story, ValidAction, CustomHandler, GetActionParameters } from '../action';\nimport type { CloneFN, Path, PathItem, Thenable } from '../types';\nimport type { NovelyAsset } from '../types';\nimport {\n\tisNull,\n\tisNumber,\n\tisAction,\n\tisSkippedDuringRestore,\n\tisUserRequiredAction,\n\tisPromise,\n\tisBlockExitStatement,\n\tisBlockStatement,\n\tisBlockingAction,\n} from './assertions';\nimport { unwrapAsset } from '../asset';\nimport { DEV } from 'esm-env';\n\n// #region Is Exit Impossible\nconst isExitImpossible = (path: Path) => {\n\tconst blockStatements = path.filter(([item]) => isBlockStatement(item));\n\tconst blockExitStatements = path.filter(([item]) => isBlockExitStatement(item));\n\n\t/**\n\t * There were no blocks nor exits from blocks\n\t */\n\tif (blockStatements.length === 0 && blockExitStatements.length === 0) {\n\t\treturn true;\n\t}\n\n\t/**\n\t * There is block that can be exited\n\t */\n\tif (blockStatements.length > blockExitStatements.length) {\n\t\treturn false;\n\t}\n\n\treturn !blockExitStatements.every(([name], i) => name && name.startsWith(blockStatements[i][0]!));\n};\n// #endregion\n\n// #region Refer\ntype CreateReferFunctionParams = {\n\tstory: Story;\n\tonUnknownSceneHit: (scene: string) => Thenable<void>;\n};\n\nconst createReferFunction = ({ story, onUnknownSceneHit }: CreateReferFunctionParams) => {\n\tconst refer = async (path: Path) => {\n\t\t/**\n\t\t * Are we ready to return a value.\n\t\t * We need to know are there any \"unknown\" scenes or not\n\t\t */\n\t\tconst { promise: ready, resolve: setReady } = Promise.withResolvers<boolean>();\n\n\t\tlet current: any = story;\n\t\tlet precurrent: any = story;\n\n\t\tconst blocks: any[] = [];\n\n\t\tconst refer = async () => {\n\t\t\tfor (const [type, val] of path) {\n\t\t\t\tif (type === 'jump') {\n\t\t\t\t\tif (!current[val]) {\n\t\t\t\t\t\tsetReady(true);\n\t\t\t\t\t\tawait onUnknownSceneHit(val);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && !story[val]) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to unknown scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (DEV && story[val].length === 0) {\n\t\t\t\t\t\tthrow new Error(`Attempt to jump to empty scene \"${val}\"`);\n\t\t\t\t\t}\n\n\t\t\t\t\tprecurrent = story;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === null) {\n\t\t\t\t\tprecurrent = current;\n\t\t\t\t\tcurrent = current[val];\n\t\t\t\t} else if (type === 'choice') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[(val as number) + 1][1];\n\t\t\t\t} else if (type === 'condition') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = current[2][val];\n\t\t\t\t} else if (type === 'block') {\n\t\t\t\t\tblocks.push(precurrent);\n\t\t\t\t\tcurrent = story[val];\n\t\t\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\t\t\tcurrent = blocks.pop();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsetReady(false);\n\n\t\t\treturn current as Exclude<ValidAction, ValidAction[]>;\n\t\t};\n\n\t\tconst value = refer();\n\t\tconst found = await ready;\n\n\t\treturn {\n\t\t\tfound,\n\t\t\tvalue,\n\t\t};\n\t};\n\n\tconst referGuarded = async (path: Path) => {\n\t\treturn await (await refer(path)).value;\n\t};\n\n\treturn {\n\t\trefer,\n\t\treferGuarded,\n\t};\n};\n\ntype GuardedReferFunction = ReturnType<typeof createReferFunction>['referGuarded'];\n\n// #endregion\n\ntype ExitPathConfig = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\n\tonExitImpossible?: () => void;\n};\n\n// #region Exit Path\nconst exitPath = async ({ path, refer, onExitImpossible }: ExitPathConfig) => {\n\tconst last = path.at(-1);\n\tconst ignore: ('choice:exit' | 'condition:exit' | 'block:exit')[] = [];\n\n\tlet wasExitImpossible = false;\n\n\t/**\n\t * - should be an array\n\t * - first element is action name\n\t */\n\tif (!isAction(await refer(path))) {\n\t\tif (last && isNull(last[0]) && isNumber(last[1])) {\n\t\t\tlast[1]--;\n\t\t} else {\n\t\t\tpath.pop();\n\t\t}\n\t}\n\n\tif (isExitImpossible(path)) {\n\t\tconst referred = await refer(path);\n\n\t\tif (isAction(referred) && isSkippedDuringRestore(referred[0])) {\n\t\t\tonExitImpossible?.();\n\t\t}\n\n\t\twasExitImpossible = true;\n\n\t\treturn {\n\t\t\texitImpossible: wasExitImpossible,\n\t\t};\n\t}\n\n\tfor (let i = path.length - 1; i > 0; i--) {\n\t\tconst [name] = path[i];\n\n\t\t/**\n\t\t * Remember already exited paths\n\t\t */\n\t\tif (isBlockExitStatement(name)) {\n\t\t\tignore.push(name);\n\t\t}\n\n\t\t/**\n\t\t * Ignore everything that we do not need there\n\t\t */\n\t\tif (!isBlockStatement(name)) continue;\n\n\t\t/**\n\t\t * When we found an already exited path we remove it from the list\n\t\t */\n\t\tif (ignore.at(-1)?.startsWith(name)) {\n\t\t\tignore.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\t/**\n\t\t * Exit from the path\n\t\t */\n\t\tpath.push([`${name}:exit`]);\n\n\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, i + 1), name);\n\n\t\t/**\n\t\t * When possible also go to the next action (or exit from one layer above)\n\t\t */\n\t\tif (prev) path.push([null, prev[1] + 1]);\n\n\t\t/**\n\t\t * If we added an `[null, int]` but it points not to action, then\n\t\t *\n\t\t * - remove that item\n\t\t * - close another block\n\t\t */\n\t\tif (!isAction(await refer(path))) {\n\t\t\tpath.pop();\n\t\t\tcontinue;\n\t\t}\n\n\t\tbreak;\n\t}\n\n\treturn {\n\t\texitImpossible: wasExitImpossible,\n\t};\n};\n// #endregion\n\n// #region Next Path\nconst nextPath = (path: Path) => {\n\t/**\n\t * Last path element\n\t */\n\tconst last = path.at(-1);\n\n\tif (last && (isNull(last[0]) || last[0] === 'jump') && isNumber(last[1])) {\n\t\tlast[1]++;\n\t} else {\n\t\tpath.push([null, 0]);\n\t}\n\n\treturn path;\n};\n// #endregion\n\n// #region Collect Actions Before Blocking Action\ntype CollectActionsBeforeBlockingActionOptions = {\n\tpath: Path;\n\trefer: GuardedReferFunction;\n\tclone: CloneFN;\n};\n\nconst collectActionsBeforeBlockingAction = async ({\n\tpath,\n\trefer,\n\tclone,\n}: CollectActionsBeforeBlockingActionOptions) => {\n\tconst collection: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tlet action = await refer(path);\n\n\twhile (true) {\n\t\tif (action == undefined) {\n\t\t\tconst { exitImpossible } = await exitPath({\n\t\t\t\tpath,\n\t\t\t\trefer,\n\t\t\t});\n\n\t\t\tif (exitImpossible) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (!action) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (isBlockingAction(action)) {\n\t\t\tconst [name, ...props] = action;\n\n\t\t\tif (name === 'choice') {\n\t\t\t\tconst choiceProps = props as unknown as GetActionParameters<'Choice'>;\n\n\t\t\t\tfor (let i = 0; i < choiceProps.length; i++) {\n\t\t\t\t\tconst branchContent = choiceProps[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * This is a title\n\t\t\t\t\t */\n\t\t\t\t\tif (!Array.isArray(branchContent)) continue;\n\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['choice', i], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t} else if (name === 'condition') {\n\t\t\t\tconst conditionProps = props as unknown as GetActionParameters<'Condition'>;\n\t\t\t\tconst conditions = Object.keys(conditionProps[1]);\n\n\t\t\t\tfor (const condition of conditions) {\n\t\t\t\t\tconst virtualPath = clone(path);\n\n\t\t\t\t\tvirtualPath.push(['condition', condition], [null, 0]);\n\n\t\t\t\t\tconst innerActions = await collectActionsBeforeBlockingAction({\n\t\t\t\t\t\tpath: virtualPath,\n\t\t\t\t\t\trefer,\n\t\t\t\t\t\tclone,\n\t\t\t\t\t});\n\n\t\t\t\t\tcollection.push(...innerActions);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcollection.push(action);\n\n\t\t/**\n\t\t * These special actions requires path change\n\t\t */\n\t\tif (action[0] === 'jump') {\n\t\t\tpath = [\n\t\t\t\t['jump', action[1]],\n\t\t\t\t[null, 0],\n\t\t\t];\n\t\t} else if (action[0] == 'block') {\n\t\t\tpath.push(['block', action[1]], [null, 0]);\n\t\t} else {\n\t\t\tnextPath(path);\n\t\t}\n\n\t\taction = await refer(path);\n\t}\n\n\treturn collection;\n};\n// #endregion\n\n// #region Find Last Path Item Before Item Of Type\nconst findLastPathItemBeforeItemOfType = (path: Path, name: PathItem[0]) => {\n\tconst item = path.findLast(([_name, _value], i, array) => {\n\t\tconst next = array[i + 1];\n\n\t\treturn isNull(_name) && isNumber(_value) && next != null && next[0] === name;\n\t});\n\n\treturn item as undefined | [null, number];\n};\n// #endregion\n\n// #region Get Opposite Action\nconst getOppositeAction = (action: 'showCharacter' | 'playSound' | 'playMusic' | 'voice' | any) => {\n\tconst MAP = {\n\t\tshowCharacter: 'hideCharacter',\n\t\tplaySound: 'stopSound',\n\t\tplayMusic: 'stopMusic',\n\t\tvoice: 'stopVoice',\n\t} as const;\n\n\treturn MAP[action as keyof typeof MAP];\n};\n// #endregion\n\n// #region Get Actions From Path\ntype GetActionsFromPathParams = {\n\t/**\n\t * A story object\n\t */\n\tstory: Story;\n\t/**\n\t * A path by that actions will be gathered\n\t */\n\tpath: Path;\n\t/**\n\t * true — actions that should be skipped would not be returned\n\t */\n\tfilter: boolean;\n\treferGuarded: GuardedReferFunction;\n};\n\nconst getActionsFromPath = async ({ story, path, filter, referGuarded }: GetActionsFromPathParams) => {\n\t/**\n\t * Current item in the story\n\t */\n\tlet current: any = story;\n\t/**\n\t * Previous `current` value\n\t */\n\tlet precurrent: any;\n\t/**\n\t * Should we ignore some actions\n\t */\n\tlet ignoreNestedBefore: null | PathItem[0] = null;\n\t/**\n\t * Current item of type `[null, int]`\n\t */\n\tlet index = 0;\n\t/**\n\t * Skipped action that should be preserved\n\t */\n\tlet skipPreserve: Exclude<ValidAction, ValidAction[]> | undefined = undefined;\n\t/**\n\t * Actions that are either considered user action or skipped during restore process\n\t */\n\tconst skip = new Set<Exclude<ValidAction, ValidAction[]>>();\n\n\t/**\n\t * Cound of items of type `[null, int]`\n\t */\n\tconst max = path.reduce((acc, [type, val]) => {\n\t\tif (isNull(type) && isNumber(val)) {\n\t\t\treturn acc + 1;\n\t\t}\n\n\t\treturn acc;\n\t}, 0);\n\n\tconst queue = [] as Exclude<ValidAction, ValidAction[]>[];\n\tconst blocks = [];\n\n\t// Will guard future usage\n\tawait referGuarded(path);\n\n\tfor (const [type, val] of path) {\n\t\tif (type === 'jump') {\n\t\t\tprecurrent = story;\n\t\t\tcurrent = current[val];\n\t\t} else if (type === null) {\n\t\t\tprecurrent = current;\n\n\t\t\tif (isNumber(val)) {\n\t\t\t\tindex++;\n\n\t\t\t\tlet startIndex = 0;\n\n\t\t\t\tif (ignoreNestedBefore) {\n\t\t\t\t\tconst prev = findLastPathItemBeforeItemOfType(path.slice(0, index), ignoreNestedBefore);\n\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tstartIndex = prev[1];\n\t\t\t\t\t\tignoreNestedBefore = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Запустим все экшены которые идут в `[null, int]` от `0` до `int`\n\t\t\t\t * Почему-то потребовалось изменить `<` на `<=`, чтобы последний action попадал сюда\n\t\t\t\t */\n\t\t\t\tfor (let i = startIndex; i <= val; i++) {\n\t\t\t\t\tconst item = current[i];\n\n\t\t\t\t\t/**\n\t\t\t\t\t * In case of broken save at least not throw\n\t\t\t\t\t * But is should not happen\n\t\t\t\t\t */\n\t\t\t\t\tif (!isAction(item)) continue;\n\n\t\t\t\t\tconst [action] = item;\n\n\t\t\t\t\tconst last = index === max && i === val;\n\t\t\t\t\tconst shouldSkip = isSkippedDuringRestore(action) || isUserRequiredAction(item);\n\n\t\t\t\t\tif (shouldSkip) {\n\t\t\t\t\t\tskip.add(item);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (shouldSkip && last) {\n\t\t\t\t\t\tskipPreserve = item;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (filter && shouldSkip && !last) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tqueue.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrent = current[val];\n\t\t} else if (type === 'choice') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[val + 1][1];\n\t\t} else if (type === 'condition') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = current[2][val];\n\t\t} else if (type === 'block') {\n\t\t\tblocks.push(precurrent);\n\t\t\tcurrent = story[val];\n\t\t} else if (type === 'block:exit' || type === 'choice:exit' || type === 'condition:exit') {\n\t\t\tcurrent = blocks.pop();\n\t\t\tignoreNestedBefore = type.slice(0, -5) as PathItem[0];\n\t\t}\n\t}\n\n\treturn {\n\t\tqueue,\n\t\tskip,\n\t\tskipPreserve,\n\t};\n};\n// #endregion\n\n// #region Queue Processor\ntype QueueProcessorOptions = {\n\tskip: Set<Exclude<ValidAction, ValidAction[]>>;\n\tskipPreserve?: Exclude<ValidAction, ValidAction[]> | undefined;\n};\n\nconst createQueueProcessor = (queue: Exclude<ValidAction, ValidAction[]>[], options: QueueProcessorOptions) => {\n\tconst processedQueue: Exclude<ValidAction, ValidAction[]>[] = [];\n\n\tconst keep = new Set();\n\tconst characters = new Set();\n\tconst audio = {\n\t\tmusic: new Set(),\n\t\tsounds: new Set(),\n\t};\n\n\t/**\n\t * Get the next actions array.\n\t */\n\tconst next = (i: number) => queue.slice(i + 1);\n\n\tfor (const [i, item] of queue.entries()) {\n\t\tconst [action, ...params] = item;\n\n\t\tif (options.skip.has(item) && item !== options.skipPreserve) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tkeep.add(action);\n\n\t\tif (action === 'function' || action === 'custom') {\n\t\t\tif (action === 'custom') {\n\t\t\t\tconst fn = params[0] as CustomHandler;\n\n\t\t\t\tif (fn.callOnlyLatest) {\n\t\t\t\t\tconst notLatest = next(i).some(([name, func]) => {\n\t\t\t\t\t\tif (name !== 'custom') return;\n\n\t\t\t\t\t\t// Checks for `undefined`. In case two id's are undefined it would not be true\n\t\t\t\t\t\tconst isIdenticalId = Boolean(func.id && fn.id && func.id === fn.id);\n\t\t\t\t\t\tconst isIdenticalByReference = func === fn;\n\t\t\t\t\t\tconst isIdenticalByCode = String(func) === String(fn);\n\n\t\t\t\t\t\treturn isIdenticalId || isIdenticalByReference || isIdenticalByCode;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (notLatest) continue;\n\t\t\t\t} else if (fn.skipOnRestore) {\n\t\t\t\t\tif (fn.skipOnRestore(next(i))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'playSound') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some((item) => {\n\t\t\t\tif (isUserRequiredAction(item) || isSkippedDuringRestore(item[0])) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst [_action, target] = item;\n\n\t\t\t\tif (target !== params[0]) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\taudio.sounds.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showCharacter' || action === 'playMusic' || action === 'voice') {\n\t\t\tconst closing = getOppositeAction(action);\n\n\t\t\tconst skip = next(i).some(([_action, target]) => {\n\t\t\t\tif (target !== params[0] && action !== 'voice') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst musicWillBePaused = action === 'playMusic' && _action === 'pauseMusic';\n\n\t\t\t\t/**\n\t\t\t\t * It either will be closed OR same action will be ran again\n\t\t\t\t */\n\t\t\t\treturn musicWillBePaused || _action === closing || _action === action;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\t/**\n\t\t\t * Actually, we do not need check above to add there things to keep because if something was hidden already we could not keep it visible\n\t\t\t */\n\t\t\tif (action === 'showCharacter') {\n\t\t\t\tcharacters.add(params[0]);\n\t\t\t} else if (action === 'playMusic') {\n\t\t\t\taudio.music.add(unwrapAsset(params[0] as NovelyAsset));\n\t\t\t}\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'showBackground' || action === 'preload') {\n\t\t\tconst skip = next(i).some(([_action]) => action === _action);\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else if (action === 'animateCharacter') {\n\t\t\tconst skip = next(i).some(([_action, character], j, array) => {\n\t\t\t\t// Same character will be animated again.\n\t\t\t\tif (action === _action && character === params[0]) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tconst next = array.slice(j);\n\n\t\t\t\tconst characterWillAnimate = next.some(([__action, __character]) => action === __action);\n\t\t\t\tconst hasBlockingActions = next.some((item) => options.skip.has(item));\n\n\t\t\t\tconst differentCharacterWillAnimate =\n\t\t\t\t\t!hasBlockingActions &&\n\t\t\t\t\tnext.some(([__action, __character]) => __action === action && __character !== params[0]);\n\n\t\t\t\t// todo\n\t\t\t\treturn (characterWillAnimate && hasBlockingActions) || differentCharacterWillAnimate;\n\t\t\t});\n\n\t\t\tif (skip) continue;\n\n\t\t\tprocessedQueue.push(item);\n\t\t} else {\n\t\t\tprocessedQueue.push(item);\n\t\t}\n\t}\n\n\tconst run = async (match: (item: Exclude<ValidAction, ValidAction[]>) => Thenable<void>) => {\n\t\tfor (const item of processedQueue) {\n\t\t\tconst result = match(item);\n\n\t\t\tif (isPromise(result)) {\n\t\t\t\tawait result;\n\t\t\t}\n\t\t}\n\n\t\tprocessedQueue.length = 0;\n\t};\n\n\treturn {\n\t\trun,\n\t\tkeep: {\n\t\t\tkeep,\n\t\t\tcharacters,\n\t\t\taudio,\n\t\t},\n\t};\n};\n// #endregion\n\nexport {\n\tfindLastPathItemBeforeItemOfType,\n\tgetActionsFromPath,\n\tgetOppositeAction,\n\tcreateQueueProcessor,\n\tcreateReferFunction,\n\texitPath,\n\tcollectActionsBeforeBlockingAction,\n\tnextPath,\n\tisExitImpossible,\n};\n\nexport type { GuardedReferFunction };\n","type ControlledPromise<T> = Promise<\n\t| {\n\t\t\tvalue: T;\n\t\t\tcancelled: false;\n\t }\n\t| {\n\t\t\tvalue: null;\n\t\t\tcancelled: true;\n\t }\n>;\n\ntype ControlledPromiseObj<T> = {\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\n\tpromise: ControlledPromise<T>;\n\n\tcancel: () => void;\n};\n\nconst createControlledPromise = <T = void>() => {\n\tconst object = {\n\t\tresolve: null,\n\t\treject: null,\n\n\t\tpromise: null,\n\n\t\tcancel: null,\n\t} as unknown as ControlledPromiseObj<T>;\n\n\tconst init = () => {\n\t\tconst promise = new Promise((resolve, reject) => {\n\t\t\tobject.reject = reject;\n\t\t\tobject.resolve = (value) => {\n\t\t\t\tresolve({ cancelled: false, value });\n\t\t\t};\n\n\t\t\tobject.cancel = () => {\n\t\t\t\tresolve({ cancelled: true, value: null });\n\t\t\t\tinit();\n\t\t\t};\n\t\t});\n\n\t\tobject.promise = promise as ControlledPromise<T>;\n\t};\n\n\treturn init(), object;\n};\n\nexport { createControlledPromise };\nexport type { ControlledPromise, ControlledPromiseObj };\n","import { memoize } from 'es-toolkit/function';\nimport { HOWLER_SUPPORTED_FILE_FORMATS, SUPPORTED_IMAGE_FILE_FORMATS } from '../constants';\nimport { DEV } from 'esm-env';\n\nconst getUrlFileExtension = (address: string) => {\n\ttry {\n\t\tconst { pathname } = new URL(address, location.href);\n\n\t\t/**\n\t\t * By using pathname we remove search params from URL, but some things are still preserved\n\t\t *\n\t\t * Imagine pathname like `image.png!private:1230`\n\t\t */\n\t\treturn pathname.split('.').at(-1)!.split('!')[0].split(':')[0];\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Could not construct URL \"${address}\".`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\nconst fetchContentType = async (url: string, request: typeof fetch) => {\n\ttry {\n\t\tconst response = await request(url, {\n\t\t\tmethod: 'HEAD',\n\t\t});\n\n\t\treturn response.headers.get('Content-Type') || '';\n\t} catch (error) {\n\t\tif (DEV) {\n\t\t\tconsole.error(new Error(`Failed to fetch file at \"${url}\"`, { cause: error }));\n\t\t}\n\n\t\treturn '';\n\t}\n};\n\ntype GetResourceTypeParams = {\n\turl: string;\n\trequest: typeof fetch;\n};\n\nconst getResourseType = memoize(\n\tasync ({ url, request }: GetResourceTypeParams) => {\n\t\tconst extension = getUrlFileExtension(url);\n\n\t\tif (HOWLER_SUPPORTED_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (SUPPORTED_IMAGE_FILE_FORMATS.has(extension as any)) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\t/**\n\t\t * If checks above didn't worked we will fetch content type\n\t\t * This might not work because of CORS\n\t\t */\n\t\tconst contentType = await fetchContentType(url, request);\n\n\t\tif (contentType.includes('audio')) {\n\t\t\treturn 'audio';\n\t\t}\n\n\t\tif (contentType.includes('image')) {\n\t\t\treturn 'image';\n\t\t}\n\n\t\treturn 'other';\n\t},\n\t{\n\t\tgetCacheKey: ({ url }) => url,\n\t},\n);\n\nexport { getUrlFileExtension, getResourseType, fetchContentType };\n\nexport type { GetResourceTypeParams };\n","import { memoize } from 'es-toolkit/function';\nimport type { Context, Renderer } from '../renderer';\nimport type { Save, StackHolder, UseStackFunctionReturnType } from '../types';\nimport { STACK_MAP } from '../shared';\n\nconst getStack = memoize(\n\t(_: Context) => {\n\t\treturn [] as unknown as StackHolder;\n\t},\n\t{\n\t\tcache: STACK_MAP,\n\t\tgetCacheKey: (ctx) => ctx.id,\n\t},\n);\n\nconst createUseStackFunction = (renderer: Renderer) => {\n\tconst useStack = (context: Context | string): UseStackFunctionReturnType => {\n\t\tconst ctx = typeof context === 'string' ? renderer.getContext(context) : context;\n\t\tconst stack = getStack(ctx);\n\n\t\treturn {\n\t\t\tget previous() {\n\t\t\t\treturn stack.previous;\n\t\t\t},\n\t\t\tget value() {\n\t\t\t\treturn stack.at(-1)!;\n\t\t\t},\n\t\t\tset value(value) {\n\t\t\t\tstack[stack.length - 1] = value;\n\t\t\t},\n\n\t\t\tback() {\n\t\t\t\tstack.previous = stack.length > 1 ? stack.pop() : this.value;\n\t\t\t\tctx.meta.goingBack = true;\n\t\t\t},\n\t\t\tpush(value: Save) {\n\t\t\t\tstack.push(value);\n\t\t\t},\n\t\t\tclear() {\n\t\t\t\tstack.previous = undefined;\n\n\t\t\t\tstack.length = 0;\n\t\t\t\tstack.length = 1;\n\t\t\t},\n\t\t};\n\t};\n\n\treturn useStack;\n};\n\nexport { getStack, createUseStackFunction };\n","import type { Story, ValidAction } from '../action';\n\nconst flatActions = (item: (ValidAction | ValidAction[])[]): ValidAction[] => {\n\treturn item.flatMap((data) => {\n\t\tconst type = data[0];\n\n\t\t/**\n\t\t * This is not just an action like `['name', ...arguments]`, but an array of actions\n\t\t */\n\t\tif (Array.isArray(type)) return flatActions(data as ValidAction[]);\n\n\t\treturn [data as ValidAction];\n\t});\n};\n\n/**\n * Transforms `(ValidAction | ValidAction[])[]` to `ValidAction[]`. Mutates provided `Story`\n */\nconst flatStory = (story: Story) => {\n\tfor (const key in story) {\n\t\tstory[key] = flatActions(story[key]);\n\t}\n\n\treturn story;\n};\n\nexport { flatActions, flatStory };\n","import { memoize } from 'es-toolkit/function';\nimport type { Lang } from '../types';\n\nconst getLanguage = (languages: string[]) => {\n\tlet { language } = navigator;\n\n\tif (languages.includes(language)) {\n\t\treturn language;\n\t} else if (languages.includes((language = language.slice(0, 2)))) {\n\t\treturn language;\n\t} else if ((language = languages.find((value) => navigator.languages.includes(value))!)) {\n\t\treturn language;\n\t}\n\n\t/**\n\t * We'v checked the `en-GB` format, `en` format, and maybe any second languages, but there were no matches\n\t */\n\treturn languages[0];\n};\n\nconst getIntlLanguageDisplayName = memoize((lang: Lang) => {\n\t/**\n\t * When using Intl fails we just return language key.\n\t */\n\ttry {\n\t\tconst intl = new Intl.DisplayNames([lang], {\n\t\t\ttype: 'language',\n\t\t});\n\n\t\treturn intl.of(lang) || lang;\n\t} catch {\n\t\treturn lang;\n\t}\n});\n\n/**\n * Capitalizes the string\n * @param str String without emojis or complex graphemes\n */\nconst capitalize = (str: string) => {\n\treturn str[0].toUpperCase() + str.slice(1);\n};\n\nexport { getLanguage, getIntlLanguageDisplayName, capitalize };\n","const noop = () => {};\n\nexport { noop };\n","import type { Stored } from '../store';\nimport type { Lang, StorageData } from '../types';\n\nconst getLanguageFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\treturn store.get().meta[0];\n};\n\nconst getVolumeFromStore = <$Language extends Lang>(store: Stored<StorageData<$Language, any>>) => {\n\tconst { meta } = store.get();\n\n\treturn {\n\t\tmusic: meta[2],\n\t\tsound: meta[3],\n\t\tvoice: meta[4],\n\t};\n};\n\nexport { getLanguageFromStore, getVolumeFromStore };\n","const mapSet = <T, K>(set: Set<T>, fn: (value: T, index: number, array: T[]) => K): K[] => {\n\treturn [...set].map(fn);\n};\n\nconst toArray = <T>(target: T | T[]) => {\n\treturn Array.isArray(target) ? target : [target];\n};\n\nexport { mapSet, toArray };\n","import type { Character } from '../character';\nimport type { CharactersData, Lang } from '../types';\n\nconst getCharactersData = <Characters extends Record<string, Character<Lang>>>(characters: Characters) => {\n\tconst entries = Object.entries(characters);\n\tconst mapped = entries.map(([key, value]) => [key, { name: value.name, emotions: Object.keys(value.emotions) }]);\n\n\treturn Object.fromEntries(mapped) as CharactersData<Characters>;\n};\n\nexport { getCharactersData };\n","import { noop } from './utilities';\n\ntype Stored<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tupdate: (fn: (prev: T) => T) => void;\n\tset: (val: T) => void;\n\tget: () => T;\n};\n\ntype Derived<T> = {\n\tsubscribe: (cb: (value: T) => void) => () => void;\n\tget: () => T;\n};\n\nconst store = <T>(current: T, subscribers = new Set<(value: T) => void>()): Stored<T> => {\n\tconst subscribe = (cb: (value: T) => void) => {\n\t\tsubscribers.add(cb), cb(current);\n\n\t\treturn () => {\n\t\t\tsubscribers.delete(cb);\n\t\t};\n\t};\n\n\tconst push = (value: T) => {\n\t\tfor (const cb of subscribers) cb(value);\n\t};\n\n\tconst update = (fn: (prev: T) => T) => {\n\t\tpush((current = fn(current)));\n\t};\n\n\tconst set = (val: T) => {\n\t\tupdate(() => val);\n\t};\n\n\tconst get = () => {\n\t\treturn current;\n\t};\n\n\treturn { subscribe, update, set, get } as const;\n};\n\nconst derive = <T, K>(input: Stored<T>, map: (value: T) => K): Derived<K> => {\n\treturn {\n\t\tget: () => map(input.get()),\n\t\tsubscribe: (subscriber) => {\n\t\t\treturn input.subscribe((value) => {\n\t\t\t\treturn subscriber(map(value));\n\t\t\t});\n\t\t},\n\t};\n};\n\nconst immutable = <T>(value: T): Derived<T> => {\n\treturn {\n\t\tget: () => value,\n\t\tsubscribe: (subscriber) => {\n\t\t\tsubscriber(value);\n\n\t\t\treturn noop;\n\t\t},\n\t};\n};\n\nexport { store, derive, immutable };\nexport type { Stored, Derived };\n","import type { CustomHandler, CustomHandlerFunctionGetFn, CustomHandlerGetResult, TextContent } from './action';\nimport type { Context, CustomActionHandle } from './renderer';\nimport type { Derived } from './store';\nimport { CUSTOM_ACTION_CLEANUP_MAP, CUSTOM_ACTION_MAP } from './shared';\nimport type { Data, Lang, Stack, State, StateFunction } from './types';\nimport { noop } from './utilities';\nimport { immutable } from './store';\nimport { once } from 'es-toolkit/function';\nimport type { Ticker } from './ticker';\n\ntype CleanupFn = () => void;\n\ntype CustomActionCleanupHolderItem = {\n\tfn: CustomHandler;\n\tlist: CleanupFn[];\n\tnode: CleanupFn;\n};\n\ntype CustomActionCleanupHolder = CustomActionCleanupHolderItem[];\n\ntype CustomActionHolder = {\n\t/**\n\t * Node in which custom action is rendered\n\t */\n\tnode: null | HTMLDivElement;\n\t/**\n\t * Custom Handler function itself\n\t */\n\tfn: CustomHandler;\n\t/**\n\t * Local Data\n\t */\n\tlocalData: any;\n};\n\ntype HandleCustomActionOptions = CustomActionHandle & {\n\t/**\n\t * State Function\n\t */\n\tstate: StateFunction<State>;\n\t/**\n\t * Current Game Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Function to get Stack\n\t */\n\tgetStack: (ctx: Context) => Stack;\n\t/**\n\t * Template Replace Function\n\t */\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n\t/**\n\t * Paused Store\n\t */\n\tpaused: Derived<boolean>;\n\t/**\n\t * Ticker\n\t */\n\tticker: Ticker;\n\t/**\n\t * Fetching function\n\t */\n\trequest: typeof fetch;\n};\n\nconst createCustomActionNode = (id: string) => {\n\tconst div = document.createElement('div');\n\n\tdiv.setAttribute('data-id', id);\n\n\treturn div;\n};\n\nconst getCustomActionHolder = (ctx: Context, fn: CustomHandler) => {\n\tconst cached = CUSTOM_ACTION_MAP.get(ctx.id + fn.key);\n\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tconst holder = {\n\t\tnode: null,\n\t\tfn: fn,\n\t\tlocalData: {},\n\t} satisfies CustomActionHolder;\n\n\tCUSTOM_ACTION_MAP.set(ctx.id + fn.key, holder);\n\n\treturn holder;\n};\n\nconst getCustomActionCleanupHolder = (ctx: Context) => {\n\tconst existing = CUSTOM_ACTION_CLEANUP_MAP.get(ctx.id);\n\n\tif (existing) {\n\t\treturn existing;\n\t}\n\n\tconst holder: CustomActionCleanupHolder = [];\n\n\tCUSTOM_ACTION_CLEANUP_MAP.set(ctx.id, holder);\n\n\treturn holder;\n};\n\nconst cleanCleanupSource = ({ list }: CustomActionCleanupHolderItem) => {\n\twhile (list.length) {\n\t\ttry {\n\t\t\tlist.pop()!();\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t}\n};\n\nconst handleCustomAction = (\n\tctx: Context,\n\tfn: CustomHandler,\n\t{\n\t\tlang,\n\t\tstate,\n\t\tsetMountElement,\n\t\tremove: renderersRemove,\n\t\tgetStack,\n\t\ttemplateReplace,\n\t\tpaused,\n\t\tticker,\n\t\trequest,\n\t}: HandleCustomActionOptions,\n) => {\n\tconst holder = getCustomActionHolder(ctx, fn);\n\tconst cleanupHolder = getCustomActionCleanupHolder(ctx);\n\n\tconst cleanupNode = () => {\n\t\tif (!cleanupHolder.some((item) => item.fn.id === fn.id && item.fn.key === fn.key)) {\n\t\t\tholder.node = null;\n\t\t\tsetMountElement(null);\n\t\t}\n\t};\n\n\tconst cleanupSource: CustomActionCleanupHolderItem = {\n\t\tfn,\n\t\tlist: [ticker.detach],\n\t\tnode: cleanupNode,\n\t};\n\n\tcleanupHolder.push(cleanupSource);\n\n\tconst getDomNodes = (insert = true): CustomHandlerGetResult<boolean> => {\n\t\tif (holder.node || !insert) {\n\t\t\tsetMountElement(holder.node);\n\n\t\t\treturn {\n\t\t\t\telement: holder.node,\n\t\t\t\troot: ctx.root,\n\t\t\t};\n\t\t}\n\n\t\tholder.node = insert ? createCustomActionNode(fn.key) : null;\n\n\t\tsetMountElement(holder.node);\n\n\t\treturn {\n\t\t\telement: holder.node,\n\t\t\troot: ctx.root,\n\t\t};\n\t};\n\n\tconst clear = (func: typeof noop) => {\n\t\tcleanupSource.list.push(once(func));\n\t};\n\n\tconst data = (updatedData?: any) => {\n\t\tif (updatedData) {\n\t\t\treturn (holder.localData = updatedData);\n\t\t}\n\n\t\treturn holder.localData;\n\t};\n\n\tconst remove = () => {\n\t\tcleanCleanupSource(cleanupSource);\n\n\t\t// When requested not hestitate\n\t\tholder.node = null;\n\t\tsetMountElement(null);\n\n\t\trenderersRemove();\n\t};\n\n\tconst stack = getStack(ctx);\n\n\tconst getSave = () => {\n\t\treturn stack.value;\n\t};\n\n\treturn fn({\n\t\tflags: ctx.meta,\n\n\t\tlang,\n\n\t\tstate,\n\t\tdata,\n\n\t\tdataAtKey: (key) => CUSTOM_ACTION_MAP.get(ctx.id + key)?.localData || null,\n\n\t\ttemplateReplace,\n\n\t\tclear,\n\t\tremove,\n\n\t\trendererContext: ctx,\n\n\t\tgetDomNodes: getDomNodes as CustomHandlerFunctionGetFn,\n\n\t\tgetSave,\n\n\t\tcontextKey: ctx.id,\n\n\t\tpaused: ctx.meta.preview ? immutable(false) : paused,\n\n\t\tticker,\n\n\t\trequest,\n\t});\n};\n\nexport { getCustomActionHolder, handleCustomAction, getCustomActionCleanupHolder, cleanCleanupSource };\nexport type { CustomActionHolder, CustomActionCleanupHolder, HandleCustomActionOptions, CleanupFn };\n","import type { CustomHandler, DefaultActionProxy, ResolvedAssets } from './action';\nimport type { Character } from './character';\nimport { ASSETS_TO_PRELOAD, PRELOADED_ASSETS } from './shared';\nimport type { Lang } from './types';\nimport { isAudioAction, isString, isAsset, getResourseType, mapSet, toArray } from './utilities';\nimport { unwrapAudioAsset, unwrapImageAsset } from './asset';\n\nconst ACTION_NAME_TO_VOLUME_MAP = {\n\tplayMusic: 'music',\n\tplaySound: 'sound',\n\tvoice: 'voice',\n} as const;\n\n/**\n * Adds asset to `ASSETS_TO_PRELOAD` firstly checking if is was already preloaded\n */\nconst enqueueAssetForPreloading = (asset: string) => {\n\tif (!PRELOADED_ASSETS.has(asset)) {\n\t\tASSETS_TO_PRELOAD.add(asset);\n\t}\n};\n\ntype HandleAssetsPreloadingOptions = {\n\trequest: typeof fetch;\n\n\tlimiter: (fn: () => void | PromiseLike<void>) => Promise<void>;\n\n\tpreloadAudioBlocking: (source: string) => Promise<void>;\n\tpreloadImageBlocking: (source: string) => Promise<void>;\n};\n\n/**\n * Preloads assets\n */\nconst handleAssetsPreloading = async ({\n\trequest,\n\tlimiter,\n\tpreloadAudioBlocking,\n\tpreloadImageBlocking,\n}: HandleAssetsPreloadingOptions) => {\n\tconst list = mapSet(ASSETS_TO_PRELOAD, (asset) => {\n\t\treturn limiter(async () => {\n\t\t\tconst type = await getResourseType({\n\t\t\t\turl: asset,\n\t\t\t\trequest,\n\t\t\t});\n\n\t\t\tswitch (type) {\n\t\t\t\tcase 'audio': {\n\t\t\t\t\tawait preloadAudioBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcase 'image': {\n\t\t\t\t\tawait preloadImageBlocking(asset);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tASSETS_TO_PRELOAD.delete(asset);\n\t\t\tPRELOADED_ASSETS.add(asset);\n\t\t});\n\t});\n\n\t/**\n\t * `allSettled` is used because even if error happens game should run\n\t *\n\t * Ideally, there could be a notification for player, maybe developer could be also notified\n\t * But I don't think it's really needed\n\t */\n\tawait Promise.allSettled(list);\n\n\tASSETS_TO_PRELOAD.clear();\n};\n\ntype HuntAssetsOptions = {\n\t/**\n\t * Audio Volume\n\t */\n\tvolume: {\n\t\tmusic: number;\n\t\tsound: number;\n\t\tvoice: number;\n\t};\n\t/**\n\t * Current Language\n\t */\n\tlang: Lang;\n\t/**\n\t * Characters object from user config\n\t */\n\tcharacters: Record<string, Character>;\n\t/**\n\t * Action name\n\t */\n\taction: keyof DefaultActionProxy;\n\t/**\n\t * Action props\n\t */\n\tprops: Parameters<DefaultActionProxy[keyof DefaultActionProxy]>;\n\t/**\n\t * Function to handle found asset\n\t */\n\thandle: (asset: string) => void;\n\t/**\n\t * Fetching function\n\t */\n\trequest: typeof fetch;\n};\n\nconst huntAssets = async ({ volume, lang, characters, action, props, handle, request }: HuntAssetsOptions) => {\n\tif (action === 'showBackground') {\n\t\t/**\n\t\t * There are two types of showBackground currently\n\t\t *\n\t\t * Parameter is a `string`\n\t\t * Parameter is a `Record<'CSS Media', string>`\n\t\t */\n\t\tif (isString(props[0])) {\n\t\t\thandle(unwrapImageAsset(props[0]));\n\t\t\treturn;\n\t\t}\n\n\t\tif (props[0] && typeof props[0] === 'object') {\n\t\t\tfor (const value of Object.values(props[0])) {\n\t\t\t\tif (isAsset(value)) {\n\t\t\t\t\thandle(unwrapImageAsset(value));\n\t\t\t\t} else {\n\t\t\t\t\thandle(value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\tconst getVolumeFor = (action: 'playMusic' | 'stopMusic' | 'playSound' | 'stopSound' | 'voice' | 'stopVoice') => {\n\t\tif (action in ACTION_NAME_TO_VOLUME_MAP) {\n\t\t\t// typescript don't be silly please\n\t\t\treturn volume[ACTION_NAME_TO_VOLUME_MAP[action as keyof typeof ACTION_NAME_TO_VOLUME_MAP]];\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\t/**\n\t * Here \"stop\" action also matches condition, but because `ASSETS_TO_PRELOAD` is a Set, there is no problem\n\t */\n\tif (isAudioAction(action) && isString(props[0])) {\n\t\tif (getVolumeFor(action) > 0) {\n\t\t\thandle(unwrapAudioAsset(props[0]));\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'voice' && typeof props[0] === 'object') {\n\t\t/**\n\t\t * Early return in case of disabled voices\n\t\t */\n\t\tif (getVolumeFor('voice') == 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [language, value] of Object.entries(props[0])) {\n\t\t\tif (language === lang) {\n\t\t\t\t/**\n\t\t\t\t * todo: decide how to make language comparison (maybe use some function)\n\t\t\t\t *\n\t\t\t\t * We can use en-US for both en-US and en-GB. Same thing applies to `dialog` and `text` action.\n\t\t\t\t * Maybe voice over language can be selected separately\n\t\t\t\t */\n\t\t\t\tvalue && handle(unwrapAudioAsset(value));\n\t\t\t}\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Load characters\n\t */\n\tif (action === 'showCharacter' && isString(props[0]) && isString(props[1])) {\n\t\t// todo: handle default emotion\n\t\tconst images = toArray(characters[props[0]].emotions[props[1]]);\n\n\t\tfor (const asset of images) {\n\t\t\thandle(unwrapImageAsset(asset));\n\t\t}\n\n\t\treturn;\n\t}\n\n\t/**\n\t * Custom action assets\n\t */\n\tif (action === 'custom' && (props[0] as CustomHandler).assets) {\n\t\tconst assets = (props[0] as CustomHandler).assets!;\n\n\t\tlet resolved: ResolvedAssets = [];\n\n\t\tif (typeof assets === 'function') {\n\t\t\tresolved = await Promise.race([\n\t\t\t\tassets({ request }),\n\t\t\t\tnew Promise<[]>((resolve) => setTimeout(resolve, 250, [])),\n\t\t\t]);\n\n\t\t\tObject.defineProperty(props[0], 'assets', {\n\t\t\t\tvalue: async () => resolved,\n\t\t\t\twritable: false,\n\t\t\t});\n\t\t} else {\n\t\t\tresolved = assets;\n\t\t}\n\n\t\tfor (const asset of resolved) {\n\t\t\tisAsset(asset) ? handle(asset.source) : handle(asset);\n\t\t}\n\n\t\treturn;\n\t}\n\n\tif (action === 'choice') {\n\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\tconst data = props[i];\n\n\t\t\tif (Array.isArray(data)) {\n\t\t\t\tif (data[5]) {\n\t\t\t\t\thandle(unwrapImageAsset(data[5]));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\nexport { enqueueAssetForPreloading, handleAssetsPreloading, huntAssets };\n","import type { StorageData } from './types';\n\ntype StorageAdapter = {\n\tget: () => Promise<StorageData>;\n\tset: (data: StorageData) => Promise<void>;\n};\n\ntype StorageAdapterLocalOptions = {\n\tkey: string;\n};\n\n/**\n * Stores data in localStorage\n */\nconst storageAdapterLocal = ({ key }: StorageAdapterLocalOptions): StorageAdapter => {\n\treturn {\n\t\tasync get() {\n\t\t\tconst fallback = { saves: [], data: {}, meta: [] };\n\n\t\t\ttry {\n\t\t\t\tconst value = localStorage.getItem(key);\n\n\t\t\t\treturn value ? JSON.parse(value) : fallback;\n\t\t\t} catch {\n\t\t\t\treturn fallback;\n\t\t\t}\n\t\t},\n\t\tasync set(data) {\n\t\t\ttry {\n\t\t\t\tlocalStorage.setItem(key, JSON.stringify(data));\n\t\t\t} catch {}\n\t\t},\n\t};\n};\n\nexport type { StorageAdapter };\nexport { storageAdapterLocal };\n","import type { Data, State } from './types';\n\ntype PluralType = Intl.LDMLPluralRule;\ntype Pluralization = Partial<Record<PluralType, string>>;\ntype AllowedContent =\n\t| string\n\t| ((state: State | Data) => string | string[])\n\t| string[]\n\t| (string | ((state: State | Data) => string | string[]))[];\ntype TranslationActions = Partial<Record<string, (str: string) => string>>;\n\nconst RGX = /{{(.*?)}}/g;\n\nconst split = (input: string, delimeters: string[]) => {\n\tconst output: (string | undefined)[] = [];\n\n\tfor (const delimeter of delimeters) {\n\t\tif (!input) break;\n\n\t\tconst [start, end] = input.split(delimeter, 2);\n\n\t\toutput.push(start);\n\t\tinput = end;\n\t}\n\n\toutput.push(input);\n\n\treturn output;\n};\n\n/**\n * Turns any allowed content into string\n * @param c Content\n */\nconst flattenAllowedContent = (c: AllowedContent, state: State | Data): string => {\n\tif (Array.isArray(c)) {\n\t\treturn c.map((item) => flattenAllowedContent(item, state)).join('<br>');\n\t}\n\n\tif (typeof c === 'function') {\n\t\treturn flattenAllowedContent(c(state), state);\n\t}\n\n\treturn c;\n};\n\nconst replace = (\n\tinput: string,\n\tdata: Record<string, unknown>,\n\tpluralization?: Record<string, Pluralization>,\n\tactions?: TranslationActions,\n\tpr?: Intl.PluralRules,\n) => {\n\treturn input.replaceAll(RGX, (x: any, key: string, y: any) => {\n\t\tx = 0;\n\t\ty = data;\n\n\t\tconst [pathstr, plural, action] = split(key.trim(), ['@', '%']);\n\n\t\tif (!pathstr) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst path = pathstr.split('.');\n\n\t\twhile (y && x < path.length) y = y[path[x++]];\n\n\t\tif (plural && pluralization && y && pr) {\n\t\t\ty = pluralization[plural][pr.select(y)];\n\t\t}\n\n\t\tconst actionHandler = actions && action ? actions[action] : void 0;\n\n\t\tif (actionHandler) y = actionHandler(y);\n\n\t\treturn y == null ? '' : y;\n\t});\n};\n\nexport { flattenAllowedContent, replace };\nexport type { AllowedContent, PluralType, Pluralization, TranslationActions };\n","import { DEV } from 'esm-env';\nimport type { ActionChoiceChoiceObject, DefaultActionProxy, ValidAction, VirtualActions } from '../action';\nimport { flatActions } from './story';\nimport type { Data, Lang, State } from '../types';\nimport type { Character } from '../character';\n\ntype BuildActionObjectParams<$Lang extends Lang, $Data extends Data> = {\n\trendererActions: Record<string, (...args: any[]) => ValidAction>;\n\tnativeActions: string[];\n\n\tcharacters: Record<string, Character>;\n};\n\ntype VirtualActionsGlobal = VirtualActions<Record<string, Character>, Lang, State>;\ntype ActionsGlobal = DefaultActionProxy & VirtualActionsGlobal;\n\n/**\n * In this case actions that get overwritten with another action\n */\nconst VIRTUAL_ACTIONS: (keyof VirtualActionsGlobal)[] = ['say'];\n\nconst buildActionObject = <$Lang extends Lang, $Data extends Data>({\n\trendererActions,\n\tnativeActions,\n\tcharacters,\n}: BuildActionObjectParams<$Lang, $Data>) => {\n\tconst allActions = [...nativeActions, ...VIRTUAL_ACTIONS];\n\tconst object = { ...rendererActions };\n\n\tfor (let action of allActions) {\n\t\tobject[action] = (...props: Parameters<ActionsGlobal[keyof ActionsGlobal]>) => {\n\t\t\tif (action === 'say') {\n\t\t\t\taction = 'dialog';\n\n\t\t\t\tconst [character] = props as Parameters<VirtualActionsGlobal['say']>;\n\n\t\t\t\tif (DEV && !characters[character]) {\n\t\t\t\t\tthrow new Error(`Attempt to call Say action with unknown character \"${character}\"`);\n\t\t\t\t}\n\t\t\t} else if (action === 'choice') {\n\t\t\t\tif (props.slice(1).every((choice) => !Array.isArray(choice))) {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i] as ActionChoiceChoiceObject<Lang, State>;\n\n\t\t\t\t\t\t(props as Parameters<DefaultActionProxy['choice']>)[i] = [\n\t\t\t\t\t\t\tchoice.title,\n\t\t\t\t\t\t\tflatActions(choice.children),\n\t\t\t\t\t\t\tchoice.active,\n\t\t\t\t\t\t\tchoice.visible,\n\t\t\t\t\t\t\tchoice.onSelect,\n\t\t\t\t\t\t\tchoice.image,\n\t\t\t\t\t\t];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (let i = 1; i < props.length; i++) {\n\t\t\t\t\t\tconst choice = props[i];\n\n\t\t\t\t\t\tif (Array.isArray(choice)) {\n\t\t\t\t\t\t\tchoice[1] = flatActions(choice[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (action === 'condition') {\n\t\t\t\tconst actions = (props as Parameters<ActionsGlobal['condition']>)[1];\n\n\t\t\t\tfor (const key in actions) {\n\t\t\t\t\tactions[key] = flatActions(actions[key]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn [action, ...props] as ValidAction;\n\t\t};\n\t}\n\n\treturn object;\n};\n\nexport { buildActionObject };\n","import type { Story, TextContent } from '../action';\nimport { unwrapAudioAsset } from '../asset';\nimport type {\n\tData,\n\tDialogOverview,\n\tDialogOverviewEntry,\n\tLang,\n\tNovelyAsset,\n\tState,\n\tUseStackFunctionReturnType,\n} from '../types';\nimport { getActionsFromPath, type GuardedReferFunction } from './actions-processing';\nimport { isAsset, isSkippedDuringRestore, isString, isUserRequiredAction } from './assertions';\n\ntype GetDialogOverviewContext = {\n\tstory: Story;\n\treferGuarded: GuardedReferFunction;\n\n\tgetCharacterName: (character: string) => string;\n\tgetLanguage: () => string;\n\tgetStack: () => UseStackFunctionReturnType;\n\ttemplateReplace: (content: TextContent<Lang, Data>, values?: Data) => string;\n};\n\nconst getDialogOverview = async function (this: GetDialogOverviewContext) {\n\t/**\n\t * Dialog Overview is possible only in main context\n\t */\n\tconst { value: save } = this.getStack();\n\tconst stateSnapshots = save[3];\n\n\t/**\n\t * Easy mode\n\t */\n\tif (stateSnapshots.length == 0) {\n\t\treturn [];\n\t}\n\n\tconst { queue } = await getActionsFromPath({\n\t\tstory: this.story,\n\t\tpath: save[0],\n\t\tfilter: false,\n\t\treferGuarded: this.referGuarded,\n\t});\n\n\tconst lang = this.getLanguage();\n\n\ttype DialogItem = {\n\t\tname: undefined | string;\n\t\ttext: TextContent<string, State>;\n\t\tvoice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset>;\n\t};\n\n\tconst dialogItems: DialogItem[] = [];\n\n\t/**\n\t * For every available state snapshot find dialog corresponding to it\n\t */\n\tfor (let p = 0, a = stateSnapshots.length, i = queue.length - 1; a > 0 && i > 0; i--) {\n\t\tconst action = queue[i];\n\n\t\tif (action[0] === 'dialog') {\n\t\t\tconst [_, name, text] = action;\n\n\t\t\tlet voice: undefined | string | NovelyAsset | Record<string, string | NovelyAsset> = undefined;\n\n\t\t\t/**\n\t\t\t * Search for the most recent `voice` action before current dialog\n\t\t\t */\n\t\t\tfor (let j = i - 1; j > p && j > 0; j--) {\n\t\t\t\tconst action = queue[j];\n\n\t\t\t\tif (isUserRequiredAction(action) || isSkippedDuringRestore(action[0])) break;\n\t\t\t\tif (action[0] === 'stopVoice') break;\n\n\t\t\t\tif (action[0] === 'voice') {\n\t\t\t\t\tvoice = action[1];\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdialogItems.push({\n\t\t\t\tname,\n\t\t\t\ttext,\n\t\t\t\tvoice,\n\t\t\t});\n\n\t\t\tp = i;\n\t\t\ta--;\n\t\t}\n\t}\n\n\tconst entries: DialogOverview = dialogItems.reverse().map(({ name, text, voice }, i) => {\n\t\tconst state = stateSnapshots[i];\n\t\tconst audioSource = isString(voice)\n\t\t\t? voice\n\t\t\t: isAsset(voice)\n\t\t\t\t? voice\n\t\t\t\t: voice == undefined\n\t\t\t\t\t? voice\n\t\t\t\t\t: voice[lang];\n\n\t\tname = name ? this.getCharacterName(name) : '';\n\n\t\treturn {\n\t\t\tname: this.templateReplace(name, state),\n\t\t\ttext: this.templateReplace(text, state),\n\t\t\tvoice: audioSource ? unwrapAudioAsset(audioSource) : '',\n\t\t} satisfies DialogOverviewEntry;\n\t});\n\n\treturn entries;\n};\n\nexport { getDialogOverview };\n","import type { Lang } from '../types';\n\nconst setDocumentLanguage = (language: Lang) => {\n\tdocument.documentElement.lang = language;\n};\n\nexport { setDocumentLanguage };\n","import type { Derived } from './store';\n\ntype TickHandler = (ticker: Ticker) => void;\n\nclass Ticker {\n\tpublic listeners = new Set<TickHandler>();\n\tpublic running = false;\n\n\tprivate _factory: TickerFactory;\n\n\tconstructor(factory: TickerFactory) {\n\t\tthis._factory = factory;\n\t}\n\n\tget deltaTime() {\n\t\treturn this._factory.deltaTime;\n\t}\n\n\tget lastTime() {\n\t\treturn this._factory.lastTime;\n\t}\n\n\tpublic add(cb: (ticker: Ticker) => void) {\n\t\tthis.listeners.add(cb);\n\n\t\tif (this.listeners.size === 1) {\n\t\t\tthis._factory.check(true);\n\t\t}\n\n\t\treturn () => {\n\t\t\tthis.remove(cb);\n\t\t};\n\t}\n\n\tpublic remove(cb: (ticker: Ticker) => void) {\n\t\tthis.listeners.delete(cb);\n\n\t\tif (this.listeners.size === 0) {\n\t\t\tthis._factory.check(false);\n\t\t}\n\t}\n\n\tpublic start = () => {\n\t\tthis.running = true;\n\n\t\tif (this.listeners.size > 0) {\n\t\t\tthis._factory.check(true);\n\t\t}\n\t};\n\n\tpublic stop = () => {\n\t\tthis.running = false;\n\t};\n\n\tpublic detach = () => {\n\t\tthis.listeners.clear();\n\t\tthis.stop();\n\t\tthis._factory.detach(this);\n\t};\n}\n\nclass TickerFactory {\n\tprivate _children = new Set<Ticker>();\n\tprivate _raf = -1;\n\tprivate _running = false;\n\tprivate _unsubscribe: () => void;\n\n\tpublic deltaTime = 0;\n\tpublic lastTime = performance.now();\n\n\tconstructor(paused: Derived<boolean>) {\n\t\tthis._unsubscribe = paused.subscribe((paused) => {\n\t\t\tif (paused) {\n\t\t\t\tthis.stop();\n\t\t\t} else if (Array.from(this._children).some((ticker) => ticker.running && ticker.listeners.size > 0)) {\n\t\t\t\tthis.start();\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic start() {\n\t\tif (this._running) {\n\t\t\treturn;\n\t\t}\n\n\t\tcancelAnimationFrame(this._raf);\n\n\t\tthis.lastTime = performance.now();\n\t\tthis._running = true;\n\t\tthis._raf = requestAnimationFrame(this.update);\n\t}\n\n\tpublic stop() {\n\t\tcancelAnimationFrame(this._raf);\n\t\tthis._running = false;\n\t\tthis._raf = -1;\n\t}\n\n\tpublic fork() {\n\t\tconst ticker = new Ticker(this);\n\n\t\tthis._children.add(ticker);\n\n\t\treturn ticker;\n\t}\n\n\tpublic check(positive: boolean) {\n\t\tif (positive) {\n\t\t\tthis.start();\n\t\t} else if (Array.from(this._children).every((ticker) => !ticker.running || ticker.listeners.size === 0)) {\n\t\t\tthis.stop();\n\t\t}\n\t}\n\n\tpublic destroy() {\n\t\tthis._unsubscribe();\n\t\tthis._children.forEach((child) => child.detach());\n\t}\n\n\tpublic detach(ticker: Ticker) {\n\t\tthis._children.delete(ticker);\n\t\tthis.check(false);\n\t}\n\n\tprivate update = (currentTime: DOMHighResTimeStamp) => {\n\t\tthis.deltaTime = currentTime - this.lastTime;\n\t\tthis._children.forEach((ticker) => {\n\t\t\tif (ticker.running) {\n\t\t\t\tticker.listeners.forEach((tick) => {\n\t\t\t\t\ttick(ticker);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tif (!this._running) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.lastTime = currentTime;\n\t\tthis._raf = requestAnimationFrame(this.update);\n\t};\n}\n\nexport { TickerFactory, Ticker };\n","import type { ValidAction } from './action';\nimport type { Assign } from './types';\n\ntype Part = Record<string, (...args: any[]) => ValidAction>;\n\n/**\n * Extens core action with custom actions\n * @param base Actions object you will extend, `engine.action`\n * @param extension Actions object you will extend with\n * @example\n * ```ts\n * const action = extendAction(engine.action, {\n * particles: (options: Parameters<typeof particles>[0]) => {\n * return ['custom', particles(options)]\n * }\n * })\n * ```\n */\nconst extendAction = <Part0 extends Part, Part1 extends Part>(\n\tbase: Part0,\n\textension: Part1,\n): Readonly<Assign<Part0, Part1>> => {\n\treturn {\n\t\t...extension,\n\t\t...base,\n\t};\n};\n\nexport { extendAction };\n","const RU = {\n\tNewGame: 'Новая игра',\n\tHomeScreen: 'Главный экран',\n\tToTheGame: 'К игре',\n\tLanguage: 'Язык',\n\tNoSaves: 'Сохранений нет',\n\tLoadSave: 'Загрузить',\n\tSaves: 'Сохранения',\n\tSettings: 'Настройки',\n\tSumbit: 'Подтвердить',\n\tGoBack: 'Назад',\n\tDoSave: 'Сохранение',\n\tAuto: 'Авто',\n\tStop: 'Стоп',\n\tExit: 'Выход',\n\tAutomatic: 'Автоматическое',\n\tManual: 'Ручное',\n\tRemove: 'Удалить',\n\tLoadASaveFrom: 'Загрузить сохранение от',\n\tDeleteASaveFrom: 'Удалить сохранение от',\n\tTextSpeed: 'Скорость текста',\n\tTextSpeedSlow: 'Медленная',\n\tTextSpeedMedium: 'Средняя',\n\tTextSpeedFast: 'Быстрая',\n\tTextSpeedAuto: 'Автоматическая',\n\tCompleteText: 'Завершить текст',\n\tGoForward: 'Перейти вперёд',\n\tExitDialogWarning: 'Вы уверены, что хотите выйти? Прогресс будет сохранён.',\n\tExitDialogExit: 'Выйти',\n\tExitDialogBack: 'Вернуться в игру',\n\tOpenMenu: 'Открыть меню',\n\tCloseMenu: 'Закрыть меню',\n\tMusicVolume: 'Громкость музыки',\n\tSoundVolume: 'Громкость звуков',\n\tVoiceVolume: 'Громкость речи',\n\tClose: 'Закрыть',\n\tDialogOverview: 'Обзор диалога',\n};\n\ntype BaseTranslationStrings = keyof typeof RU;\n\nconst EN: Record<BaseTranslationStrings, string> = {\n\tNewGame: 'New Game',\n\tHomeScreen: 'Home Screen',\n\tToTheGame: 'To the Game',\n\tLanguage: 'Language',\n\tNoSaves: 'No saves',\n\tLoadSave: 'Load',\n\tSaves: 'Saves',\n\tSettings: 'Settings',\n\tSumbit: 'Submit',\n\tGoBack: 'Go back',\n\tDoSave: 'Save',\n\tAuto: 'Auto',\n\tStop: 'Stop',\n\tExit: 'Exit',\n\tAutomatic: 'Automatic',\n\tManual: 'Manual',\n\tRemove: 'Remove',\n\tLoadASaveFrom: 'Load a save from',\n\tDeleteASaveFrom: 'Delete a save from',\n\tTextSpeed: 'Text Speed',\n\tTextSpeedSlow: 'Slow',\n\tTextSpeedMedium: 'Medium',\n\tTextSpeedFast: 'Fast',\n\tTextSpeedAuto: 'Auto',\n\tCompleteText: 'Complete text',\n\tGoForward: 'Go forward',\n\tExitDialogWarning: 'Are you sure you want to exit? Progress will be saved.',\n\tExitDialogExit: 'Exit',\n\tExitDialogBack: 'Return to game',\n\tOpenMenu: 'Open menu',\n\tCloseMenu: 'Close menu',\n\tMusicVolume: 'Music volume',\n\tSoundVolume: 'Sound volume',\n\tVoiceVolume: 'Voice volume',\n\tClose: 'Close',\n\tDialogOverview: 'Dialog Overview',\n};\n\nexport { RU, EN };\nexport type { BaseTranslationStrings };\n","type EventHandler<T> = (this: Document, event: T) => void;\n\ntype BlurEventHandler = EventHandler<Event>;\ntype FocusEventHandler = EventHandler<FocusEvent>;\n\nconst BLUR_HANDLERS = new Set<BlurEventHandler>();\nconst FOCUS_HANDLERS = new Set<FocusEventHandler>();\n\ntype EventListeners = {\n\tfocus: FocusEventHandler;\n\tblur: BlurEventHandler;\n};\n\nconst registerEventListeners = (listeners: EventListeners) => {\n\tBLUR_HANDLERS.add(listeners.blur);\n\tFOCUS_HANDLERS.add(listeners.focus);\n\n\treturn () => {\n\t\tBLUR_HANDLERS.delete(listeners.blur);\n\t\tFOCUS_HANDLERS.delete(listeners.focus);\n\t};\n};\n\naddEventListener('focus', function (event) {\n\tfor (const handler of FOCUS_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\naddEventListener('blur', function (event) {\n\tfor (const handler of BLUR_HANDLERS) {\n\t\ttry {\n\t\t\thandler.call(this.document, event);\n\t\t} catch {}\n\t}\n});\n\nconst pauseOnBlur = (engine: { setFocused: (focused: boolean) => void }) => {\n\treturn {\n\t\tunsubscribe: registerEventListeners({\n\t\t\tfocus: () => {\n\t\t\t\tengine.setFocused(true);\n\t\t\t},\n\t\t\tblur: () => {\n\t\t\t\tengine.setFocused(false);\n\t\t\t},\n\t\t}),\n\t};\n};\n\nexport { pauseOnBlur };\n"],"mappings":";AAAA,IAAI,MAAM,OAAO,UAAU;AAEpB,SAAS,OAAO,KAAK,KAAK;AAChC,MAAI,MAAM;AACV,MAAI,QAAQ,IAAK,QAAO;AAExB,MAAI,OAAO,QAAQ,OAAK,IAAI,iBAAiB,IAAI,aAAa;AAC7D,QAAI,SAAS,KAAM,QAAO,IAAI,QAAQ,MAAM,IAAI,QAAQ;AACxD,QAAI,SAAS,OAAQ,QAAO,IAAI,SAAS,MAAM,IAAI,SAAS;AAE5D,QAAI,SAAS,OAAO;AACnB,WAAK,MAAI,IAAI,YAAY,IAAI,QAAQ;AACpC,eAAO,SAAS,OAAO,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE;AAAA,MAC5C;AACA,aAAO,QAAQ;AAAA,IAChB;AAEA,QAAI,CAAC,QAAQ,OAAO,QAAQ,UAAU;AACrC,YAAM;AACN,WAAK,QAAQ,KAAK;AACjB,YAAI,IAAI,KAAK,KAAK,IAAI,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,EAAG,QAAO;AACjE,YAAI,EAAE,QAAQ,QAAQ,CAAC,OAAO,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,EAAG,QAAO;AAAA,MAC7D;AACA,aAAO,OAAO,KAAK,GAAG,EAAE,WAAW;AAAA,IACpC;AAAA,EACD;AAEA,SAAO,QAAQ,OAAO,QAAQ;AAC/B;;;AC3BA,SAAS,WAAAA,UAAS,gBAAgB;AAClC,SAAS,SAAS,iBAAiB;AACnC,SAAS,OAAAC,YAAW;;;ACHpB,SAAS,IAAI,KAAK,KAAK,KAAK;AAC3B,MAAI,OAAO,IAAI,UAAU,SAAU,KAAI,QAAQ,MAAM,IAAI,KAAK;AAC9D,MAAI,CAAC,IAAI,cAAc,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,gBAAgB,CAAC,IAAI,YAAY,QAAQ,aAAa;AACvG,WAAO,eAAe,KAAK,KAAK,GAAG;AAAA,EACpC,MAAO,KAAI,GAAG,IAAI,IAAI;AACvB;AAEO,SAAS,MAAM,GAAG;AACxB,MAAI,OAAO,MAAM,SAAU,QAAO;AAElC,MAAI,IAAE,GAAG,GAAG,MAAM,KAAK,MAAI,OAAO,UAAU,SAAS,KAAK,CAAC;AAE3D,MAAI,QAAQ,mBAAmB;AAC9B,UAAM,OAAO,OAAO,EAAE,aAAa,IAAI;AAAA,EACxC,WAAW,QAAQ,kBAAkB;AACpC,UAAM,MAAM,EAAE,MAAM;AAAA,EACrB,WAAW,QAAQ,gBAAgB;AAClC,UAAM,oBAAI;AACV,MAAE,QAAQ,SAAU,KAAK;AACxB,UAAI,IAAI,MAAM,GAAG,CAAC;AAAA,IACnB,CAAC;AAAA,EACF,WAAW,QAAQ,gBAAgB;AAClC,UAAM,oBAAI;AACV,MAAE,QAAQ,SAAU,KAAK,KAAK;AAC7B,UAAI,IAAI,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC;AAAA,IAC/B,CAAC;AAAA,EACF,WAAW,QAAQ,iBAAiB;AACnC,UAAM,oBAAI,KAAK,CAAC,CAAC;AAAA,EAClB,WAAW,QAAQ,mBAAmB;AACrC,UAAM,IAAI,OAAO,EAAE,QAAQ,EAAE,KAAK;AAAA,EACnC,WAAW,QAAQ,qBAAqB;AACvC,UAAM,IAAI,EAAE,YAAa,MAAM,EAAE,MAAM,CAAE;AAAA,EAC1C,WAAW,QAAQ,wBAAwB;AAC1C,UAAM,EAAE,MAAM,CAAC;AAAA,EAChB,WAAW,IAAI,MAAM,EAAE,MAAM,UAAU;AAGtC,UAAM,IAAI,EAAE,YAAY,CAAC;AAAA,EAC1B;AAEA,MAAI,KAAK;AACR,SAAK,OAAK,OAAO,sBAAsB,CAAC,GAAG,IAAI,KAAK,QAAQ,KAAK;AAChE,UAAI,KAAK,KAAK,CAAC,GAAG,OAAO,yBAAyB,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,IAC9D;AAEA,SAAK,IAAE,GAAG,OAAK,OAAO,oBAAoB,CAAC,GAAG,IAAI,KAAK,QAAQ,KAAK;AACnE,UAAI,OAAO,eAAe,KAAK,KAAK,IAAE,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,EAAG;AACnE,UAAI,KAAK,GAAG,OAAO,yBAAyB,GAAG,CAAC,CAAC;AAAA,IAClD;AAAA,EACD;AAEA,SAAO,OAAO;AACf;;;AD/CA,OAAO,YAAY;;;AEHnB,IAAM,yBAAyB,oBAAI,IAAI,CAAC,UAAU,UAAU,SAAS,WAAW,MAAM,CAAU;AAEhG,IAAM,wBAAwB,oBAAI,IAAI,CAAC,eAAe,kBAAkB,YAAY,CAAU;AAE9F,IAAM,mBAAmB,oBAAI,IAAI,CAAC,UAAU,aAAa,OAAO,CAAU;AAE1E,IAAM,gBAAgB,oBAAI,IAAI,CAAC,aAAa,aAAa,aAAa,aAAa,SAAS,WAAW,CAAU;AAEjH,IAAM,YAAY,oBAAI,IAAS;AAE/B,IAAM,2BAA4C;AAElD,IAAM,gCAAgC,oBAAI,IAAI;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAU;AAEV,IAAM,+BAA+B,oBAAI,IAAI;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,CAAU;AAKV,IAAM,mBAAmB;;;AC5CzB,IAAM,YAAY,oBAAI,IAAyB;AAK/C,IAAM,oBAAoB,oBAAI,IAAgC;AAK9D,IAAM,4BAA4B,oBAAI,IAAuC;AAE7E,IAAM,mBAAmB,oBAAI,IAAY;AACzC,IAAM,oBAAoB,oBAAI,IAAY;;;ACf1C,IAAM,WAAW,CAAC,QAAgC;AACjD,SAAO,OAAO,QAAQ;AACvB;AAEA,IAAM,SAAS,CAAC,QAA8B;AAC7C,SAAO,QAAQ;AAChB;AAEA,IAAM,WAAW,CAAC,QAAgC;AACjD,SAAO,OAAO,QAAQ;AACvB;AAEA,IAAM,aAAa,CAAC,QAAuD;AAC1E,SAAO,OAAO,QAAQ;AACvB;AAEA,IAAM,YAAY,CAAC,QAAsC;AACxD,SAAO,QAAQ,GAAG,MAAM,OAAO,QAAQ,YAAY,WAAW,GAAG,MAAM,WAAY,IAAY,IAAI;AACpG;AAEA,IAAM,UAAU,CAAC,QAAoD;AACpE,SAAO,OAAO,QAAQ,YAAY,CAAC,OAAO,GAAG,KAAK,OAAO,KAAK,GAAG,EAAE,WAAW;AAC/E;AAKA,IAAM,uBAAuB,CAAC,CAAC,QAAW,OAAI,MAAmB;AAChE,SAAO,QAAQ,WAAW,YAAY,KAAK,CAAC,KAAM,KAAK,CAAC,EAA+B,iBAAiB;AACzG;AAEA,IAAM,mBAAmB,CAAC,cAAsE;AAC/F,SAAO,iBAAiB,IAAI,SAAgB;AAC7C;AAEA,IAAM,uBAAuB,CAC5B,cACkE;AAClE,SAAO,sBAAsB,IAAI,SAAgB;AAClD;AAEA,IAAM,yBAAyB,CAAC,SAA8E;AAC7G,SAAO,uBAAuB,IAAI,IAAW;AAC9C;AAIA,IAAM,gBAAgB,CAAC,WAA+C;AACrE,SAAO,cAAc,IAAI,MAAa;AACvC;AAEA,IAAM,WAAW,CAAC,YAAqE;AACtF,SAAO,MAAM,QAAQ,OAAO,KAAK,SAAS,QAAQ,CAAC,CAAC;AACrD;AAKA,IAAM,mBAAmB,CAAC,WAAgD;AACzE,SAAO,qBAAqB,MAAM,KAAM,uBAAuB,OAAO,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM;AAC5F;AAEA,IAAM,UAAU,CAAC,YAA6C;AAC7D,SAAO,YAAY,QAAQ,OAAO,YAAY,YAAY,YAAY,WAAW,UAAU;AAC5F;;;ACnBA,IAAM,cAAc,CAAC,WAAgC,WAAmC;AACvF,QAAM,EAAE,YAAY,oBAAoB,MAAM,QAAQ,IAAI;AAE1D,QAAM,QAAQ,CAAC,QAAsC,OAAY,EAAE,KAAK,KAAK,MAA6B;AACzG,UAAM,UAAU,OAAO,QAAQ,WAAW,WAAW,GAAG,IAAI;AAE5D,uBAAmB;AAAA,MAClB;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACN,CAAC;AAED,WAAO,OAAO,MAAM;AAAA,MACnB;AAAA,QACC,KAAK;AAAA,QACL;AAAA,QAEA,OAAO;AACN,cAAI,QAAQ,KAAK,QAAS;AAE1B,eAAK,OAAO;AAAA,QACb;AAAA,QACA,UAAU;AACT,cAAI,QAAQ,KAAK,QAAS;AAE1B,kBAAQ,OAAO;AAAA,QAChB;AAAA,MACD;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AAAA,IACN;AAAA,IACA,eAAe,OAAO,KAAK,MAAM;AAAA,EAClC;AACD;;;ACrFA,SAAS,SAAS,YAAY;AAC9B,SAAS,WAAW;;;ACOpB,IAAM,MAAM,CAAC,QAAkC,IAAI,QAAQ,QAAQ,EAAE;AAErE,IAAM,QAAQ,IAAI,MAAM;AAExB,IAAM,UAAU,CAAC,SAAiB,CAAC,CAAC,IAAI,MAAM,YAAY,IAAI,CAAC;AAC/D,IAAM,kBAAkB,IAAI,UAAoB,MAAM,KAAK,CAAC,SAAS,QAAQ,IAAI,CAAC;AAElF,IAAM,cAAc;AAAA,EACnB,KAAK,gBAAgB,eAAe,YAAY;AAAA,EAChD,MAAM,QAAQ,aAAa;AAAA,EAC3B,MAAM,QAAQ,0BAA0B;AAAA,EACxC,KAAK,QAAQ,4BAA4B;AAAA,EACzC,KAAK,QAAQ,4BAA4B;AAAA,EACzC,KAAK,gBAAgB,yBAAyB,YAAY;AAAA,EAC1D,KAAK,QAAQ,YAAY;AAAA,EACzB,KAAK,QAAQ,cAAc;AAAA,EAC3B,KAAK,gBAAgB,gBAAgB,cAAc,YAAY;AAAA,EAC/D,KAAK,gBAAgB,gBAAgB,cAAc,YAAY;AAAA,EAC/D,KAAK,gBAAgB,gBAAgB,cAAc,YAAY;AAAA,EAC/D,MAAM,QAAQ,6BAA6B;AAAA,EAC3C,MAAM,QAAQ,6BAA6B;AAAA,EAC3C,OAAO,QAAQ,0BAA0B;AAAA,EACzC,MAAM,gBAAgB,iBAAiB,aAAa;AACrD;;;AC/BA,IAAM,OACL;AACD,IAAM,MACL;AACD,IAAM,OACL;AAED,IAAM,iBAAiB,CAAC,WAAmB;AAC1C,QAAM,EAAE,SAAS,QAAQ,IAAI,QAAQ,cAAuB;AAE5D,QAAM,MAAM,OAAO,OAAO,SAAS,cAAc,KAAK,GAAG;AAAA,IACxD,KAAK;AAAA,EACN,CAAC;AAED,MAAI,SAAS,IAAI,UAAU,MAAM;AAChC,YAAQ,IAAI,WAAW,CAAC;AAAA,EACzB;AAEA,SAAO;AACR;AAEA,IAAMC,eAAc;AAAA,EACnB,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AACP;AAEA,IAAM,aAAa;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACD;AAEA,IAAM,0BAA0B,YAAY;AAC3C,QAAM,WAAW,CAAC;AAElB,aAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC1D,UAAM,UAAU,eAAe,MAAM,EAAE,KAAK,CAAC,cAAc;AAC1D,MAAAA,aAAY,MAAkC,IAAI;AAAA,IACnD,CAAC;AAED,aAAS,KAAK,OAAO;AAAA,EACtB;AAEA,QAAM,QAAQ,IAAI,QAAQ;AAC3B;AAEA,wBAAwB;;;AFvCxB,IAAM,mBAAmB,MAAM,KAAK,OAAO,EAAE,SAAS,EAAE;AAKxD,IAAM,UAAU;AAAA,EACf,CAAC,eAAyB;AACzB,QAAI,WAAW,MAAM,CAAC,cAAc,8BAA8B,IAAI,SAAgB,CAAC,GAAG;AACzF,aAAO;AAAA,IACR;AAEA,QAAI,WAAW,MAAM,CAAC,cAAc,6BAA6B,IAAI,SAAgB,CAAC,GAAG;AACxF,aAAO;AAAA,IACR;AAEA,QAAI,KAAK;AACR,YAAM,IAAI,MAAM,gCAAgC,KAAK,UAAU,UAAU,CAAC,EAAE;AAAA,IAC7E;AAEA,UAAM;AAAA,EACP;AAAA,EACA;AAAA,IACC,aAAa,CAAC,eAAe,WAAW,KAAK,GAAG;AAAA,EACjD;AACD;AAEA,IAAM,eAAe;AAAA,EACpB,OAAOC;AAAA,EACP,OAAO;AACR;AAKA,IAAM,eAAe;AAAA,EACpB,CAAC,aAAoC;AACpC,QAAI,OAAO,SAAS,WAAW,GAAG;AACjC,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACpE;AAEA,UAAM,MAA8B,CAAC;AACrC,UAAM,aAAuB,CAAC;AAE9B,eAAW,KAAK,UAAU;AACzB,YAAM,IAAI,oBAAoB,CAAC;AAE/B,UAAI,CAAC,IAAI;AACT,iBAAW,KAAK,CAAC;AAAA,IAClB;AAEA,UAAM,OAAO,QAAQ,UAAU;AAE/B,UAAM,YAAY,KAAK,MAAM;AAC5B,YAAM,UAAU,aAAa,IAAI;AAEjC,iBAAW,aAAa,YAAY;AACnC,YAAI,aAAa,SAAS;AACzB,cAAI,QAAQ,SAAiC,GAAG;AAC/C,mBAAO,IAAI,SAAS;AAAA,UACrB;AAAA,QACD,OAAO;AACN,iBAAO,IAAI,SAAS;AAAA,QACrB;AAAA,MACD;AAEA,UAAI,KAAK;AACR,cAAM,IAAI,MAAM,mCAAmC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MAC9F;AAEA,aAAO;AAAA,IACR,CAAC;AAED,WAAO;AAAA,MACN,IAAI,SAAS;AACZ,eAAO,UAAU;AAAA,MAClB;AAAA,MACA,IAAI,OAAO;AACV,eAAO;AAAA,MACR;AAAA,MACA,IAAI,iBAAiB;AAAA,IACtB;AAAA,EACD;AAAA,EACA;AAAA,IACC,aAAa,CAAC,aAAa,SAAS,KAAK,GAAG;AAAA,EAC7C;AACD;AA0BA,IAAM,QAAQ,IAAI,aAAuB;AACxC,SAAO,aAAa,QAAQ;AAC7B;AAEA,MAAM,QAAQ,CAAC,WAAgC;AAC9C,MAAI,aAAa,MAAM,IAAI,MAAM,GAAG;AACnC,WAAO,aAAa,MAAM,IAAI,MAAM;AAAA,EACrC;AAEA,QAAMC,SAAQ;AAAA,IACb,MAAM;AAAA,IACN;AAAA,IACA,IAAI,iBAAiB;AAAA,EACtB;AAEA,eAAa,MAAM,IAAI,QAAQA,MAAK;AAEpC,SAAOA;AACR;AAEA,MAAM,QAAQ,CAAC,WAAgC;AAC9C,MAAI,aAAa,MAAM,IAAI,MAAM,GAAG;AACnC,WAAO,aAAa,MAAM,IAAI,MAAM;AAAA,EACrC;AAEA,QAAMA,SAAQ;AAAA,IACb,MAAM;AAAA,IACN;AAAA,IACA,IAAI,iBAAiB;AAAA,EACtB;AAEA,eAAa,MAAM,IAAI,QAAQA,MAAK;AAEpC,SAAOA;AACR;AAEA,IAAM,cAAc,CAACA,WAAgC;AACpD,SAAO,QAAQA,MAAK,IAAIA,OAAM,SAASA;AACxC;AAEA,IAAM,mBAAmB,CAACA,WAAgC;AACzD,MAAI,OAAO,QAAQA,MAAK,KAAKA,OAAM,SAAS,SAAS;AACpD,UAAM,IAAI,MAAM,kDAAkD,EAAE,OAAOA,OAAM,CAAC;AAAA,EACnF;AAEA,SAAO,YAAYA,MAAK;AACzB;AAEA,IAAM,mBAAmB,CAACA,WAAgC;AACzD,MAAI,OAAO,QAAQA,MAAK,KAAKA,OAAM,SAAS,SAAS;AACpD,UAAM,IAAI,MAAM,uEAAuE,EAAE,OAAOA,OAAM,CAAC;AAAA,EACxG;AAEA,SAAO,YAAYA,MAAK;AACzB;;;AG9JA,SAAS,OAAAC,YAAW;AAGpB,IAAM,mBAAmB,CAAC,SAAe;AACxC,QAAM,kBAAkB,KAAK,OAAO,CAAC,CAAC,IAAI,MAAM,iBAAiB,IAAI,CAAC;AACtE,QAAM,sBAAsB,KAAK,OAAO,CAAC,CAAC,IAAI,MAAM,qBAAqB,IAAI,CAAC;AAK9E,MAAI,gBAAgB,WAAW,KAAK,oBAAoB,WAAW,GAAG;AACrE,WAAO;AAAA,EACR;AAKA,MAAI,gBAAgB,SAAS,oBAAoB,QAAQ;AACxD,WAAO;AAAA,EACR;AAEA,SAAO,CAAC,oBAAoB,MAAM,CAAC,CAAC,IAAI,GAAG,MAAM,QAAQ,KAAK,WAAW,gBAAgB,CAAC,EAAE,CAAC,CAAE,CAAC;AACjG;AASA,IAAM,sBAAsB,CAAC,EAAE,OAAO,kBAAkB,MAAiC;AACxF,QAAM,QAAQ,OAAO,SAAe;AAKnC,UAAM,EAAE,SAAS,OAAO,SAAS,SAAS,IAAI,QAAQ,cAAuB;AAE7E,QAAI,UAAe;AACnB,QAAI,aAAkB;AAEtB,UAAM,SAAgB,CAAC;AAEvB,UAAMC,SAAQ,YAAY;AACzB,iBAAW,CAAC,MAAM,GAAG,KAAK,MAAM;AAC/B,YAAI,SAAS,QAAQ;AACpB,cAAI,CAAC,QAAQ,GAAG,GAAG;AAClB,qBAAS,IAAI;AACb,kBAAM,kBAAkB,GAAG;AAAA,UAC5B;AAEA,cAAID,QAAO,CAAC,MAAM,GAAG,GAAG;AACvB,kBAAM,IAAI,MAAM,qCAAqC,GAAG,GAAG;AAAA,UAC5D;AAEA,cAAIA,QAAO,MAAM,GAAG,EAAE,WAAW,GAAG;AACnC,kBAAM,IAAI,MAAM,mCAAmC,GAAG,GAAG;AAAA,UAC1D;AAEA,uBAAa;AACb,oBAAU,QAAQ,GAAG;AAAA,QACtB,WAAW,SAAS,MAAM;AACzB,uBAAa;AACb,oBAAU,QAAQ,GAAG;AAAA,QACtB,WAAW,SAAS,UAAU;AAC7B,iBAAO,KAAK,UAAU;AACtB,oBAAU,QAAS,MAAiB,CAAC,EAAE,CAAC;AAAA,QACzC,WAAW,SAAS,aAAa;AAChC,iBAAO,KAAK,UAAU;AACtB,oBAAU,QAAQ,CAAC,EAAE,GAAG;AAAA,QACzB,WAAW,SAAS,SAAS;AAC5B,iBAAO,KAAK,UAAU;AACtB,oBAAU,MAAM,GAAG;AAAA,QACpB,WAAW,SAAS,gBAAgB,SAAS,iBAAiB,SAAS,kBAAkB;AACxF,oBAAU,OAAO,IAAI;AAAA,QACtB;AAAA,MACD;AAEA,eAAS,KAAK;AAEd,aAAO;AAAA,IACR;AAEA,UAAM,QAAQC,OAAM;AACpB,UAAM,QAAQ,MAAM;AAEpB,WAAO;AAAA,MACN;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,QAAM,eAAe,OAAO,SAAe;AAC1C,WAAO,OAAO,MAAM,MAAM,IAAI,GAAG;AAAA,EAClC;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,EACD;AACD;AAcA,IAAM,WAAW,OAAO,EAAE,MAAM,OAAO,iBAAiB,MAAsB;AAC7E,QAAM,OAAO,KAAK,GAAG,EAAE;AACvB,QAAM,SAA8D,CAAC;AAErE,MAAI,oBAAoB;AAMxB,MAAI,CAAC,SAAS,MAAM,MAAM,IAAI,CAAC,GAAG;AACjC,QAAI,QAAQ,OAAO,KAAK,CAAC,CAAC,KAAK,SAAS,KAAK,CAAC,CAAC,GAAG;AACjD,WAAK,CAAC;AAAA,IACP,OAAO;AACN,WAAK,IAAI;AAAA,IACV;AAAA,EACD;AAEA,MAAI,iBAAiB,IAAI,GAAG;AAC3B,UAAM,WAAW,MAAM,MAAM,IAAI;AAEjC,QAAI,SAAS,QAAQ,KAAK,uBAAuB,SAAS,CAAC,CAAC,GAAG;AAC9D,yBAAmB;AAAA,IACpB;AAEA,wBAAoB;AAEpB,WAAO;AAAA,MACN,gBAAgB;AAAA,IACjB;AAAA,EACD;AAEA,WAAS,IAAI,KAAK,SAAS,GAAG,IAAI,GAAG,KAAK;AACzC,UAAM,CAAC,IAAI,IAAI,KAAK,CAAC;AAKrB,QAAI,qBAAqB,IAAI,GAAG;AAC/B,aAAO,KAAK,IAAI;AAAA,IACjB;AAKA,QAAI,CAAC,iBAAiB,IAAI,EAAG;AAK7B,QAAI,OAAO,GAAG,EAAE,GAAG,WAAW,IAAI,GAAG;AACpC,aAAO,IAAI;AACX;AAAA,IACD;AAKA,SAAK,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC;AAE1B,UAAM,OAAO,iCAAiC,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI;AAKxE,QAAI,KAAM,MAAK,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;AAQvC,QAAI,CAAC,SAAS,MAAM,MAAM,IAAI,CAAC,GAAG;AACjC,WAAK,IAAI;AACT;AAAA,IACD;AAEA;AAAA,EACD;AAEA,SAAO;AAAA,IACN,gBAAgB;AAAA,EACjB;AACD;AAIA,IAAM,WAAW,CAAC,SAAe;AAIhC,QAAM,OAAO,KAAK,GAAG,EAAE;AAEvB,MAAI,SAAS,OAAO,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,WAAW,SAAS,KAAK,CAAC,CAAC,GAAG;AACzE,SAAK,CAAC;AAAA,EACP,OAAO;AACN,SAAK,KAAK,CAAC,MAAM,CAAC,CAAC;AAAA,EACpB;AAEA,SAAO;AACR;AAUA,IAAM,qCAAqC,OAAO;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AACD,MAAiD;AAChD,QAAM,aAAoD,CAAC;AAE3D,MAAI,SAAS,MAAM,MAAM,IAAI;AAE7B,SAAO,MAAM;AACZ,QAAI,UAAU,QAAW;AACxB,YAAM,EAAE,eAAe,IAAI,MAAM,SAAS;AAAA,QACzC;AAAA,QACA;AAAA,MACD,CAAC;AAED,UAAI,gBAAgB;AACnB;AAAA,MACD;AAAA,IACD;AAEA,QAAI,CAAC,QAAQ;AACZ;AAAA,IACD;AAEA,QAAI,iBAAiB,MAAM,GAAG;AAC7B,YAAM,CAAC,MAAM,GAAG,KAAK,IAAI;AAEzB,UAAI,SAAS,UAAU;AACtB,cAAM,cAAc;AAEpB,iBAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC5C,gBAAM,gBAAgB,YAAY,CAAC;AAKnC,cAAI,CAAC,MAAM,QAAQ,aAAa,EAAG;AAEnC,gBAAM,cAAc,MAAM,IAAI;AAE9B,sBAAY,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAEzC,gBAAM,eAAe,MAAM,mCAAmC;AAAA,YAC7D,MAAM;AAAA,YACN;AAAA,YACA;AAAA,UACD,CAAC;AAED,qBAAW,KAAK,GAAG,YAAY;AAAA,QAChC;AAAA,MACD,WAAW,SAAS,aAAa;AAChC,cAAM,iBAAiB;AACvB,cAAM,aAAa,OAAO,KAAK,eAAe,CAAC,CAAC;AAEhD,mBAAW,aAAa,YAAY;AACnC,gBAAM,cAAc,MAAM,IAAI;AAE9B,sBAAY,KAAK,CAAC,aAAa,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC;AAEpD,gBAAM,eAAe,MAAM,mCAAmC;AAAA,YAC7D,MAAM;AAAA,YACN;AAAA,YACA;AAAA,UACD,CAAC;AAED,qBAAW,KAAK,GAAG,YAAY;AAAA,QAChC;AAAA,MACD;AAEA;AAAA,IACD;AAEA,eAAW,KAAK,MAAM;AAKtB,QAAI,OAAO,CAAC,MAAM,QAAQ;AACzB,aAAO;AAAA,QACN,CAAC,QAAQ,OAAO,CAAC,CAAC;AAAA,QAClB,CAAC,MAAM,CAAC;AAAA,MACT;AAAA,IACD,WAAW,OAAO,CAAC,KAAK,SAAS;AAChC,WAAK,KAAK,CAAC,SAAS,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAAA,IAC1C,OAAO;AACN,eAAS,IAAI;AAAA,IACd;AAEA,aAAS,MAAM,MAAM,IAAI;AAAA,EAC1B;AAEA,SAAO;AACR;AAIA,IAAM,mCAAmC,CAAC,MAAY,SAAsB;AAC3E,QAAM,OAAO,KAAK,SAAS,CAAC,CAAC,OAAO,MAAM,GAAG,GAAG,UAAU;AACzD,UAAM,OAAO,MAAM,IAAI,CAAC;AAExB,WAAO,OAAO,KAAK,KAAK,SAAS,MAAM,KAAK,QAAQ,QAAQ,KAAK,CAAC,MAAM;AAAA,EACzE,CAAC;AAED,SAAO;AACR;AAIA,IAAM,oBAAoB,CAAC,WAAwE;AAClG,QAAM,MAAM;AAAA,IACX,eAAe;AAAA,IACf,WAAW;AAAA,IACX,WAAW;AAAA,IACX,OAAO;AAAA,EACR;AAEA,SAAO,IAAI,MAA0B;AACtC;AAoBA,IAAM,qBAAqB,OAAO,EAAE,OAAO,MAAM,QAAQ,aAAa,MAAgC;AAIrG,MAAI,UAAe;AAInB,MAAI;AAIJ,MAAI,qBAAyC;AAI7C,MAAI,QAAQ;AAIZ,MAAI,eAAgE;AAIpE,QAAM,OAAO,oBAAI,IAAyC;AAK1D,QAAM,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAC7C,QAAI,OAAO,IAAI,KAAK,SAAS,GAAG,GAAG;AAClC,aAAO,MAAM;AAAA,IACd;AAEA,WAAO;AAAA,EACR,GAAG,CAAC;AAEJ,QAAM,QAAQ,CAAC;AACf,QAAM,SAAS,CAAC;AAGhB,QAAM,aAAa,IAAI;AAEvB,aAAW,CAAC,MAAM,GAAG,KAAK,MAAM;AAC/B,QAAI,SAAS,QAAQ;AACpB,mBAAa;AACb,gBAAU,QAAQ,GAAG;AAAA,IACtB,WAAW,SAAS,MAAM;AACzB,mBAAa;AAEb,UAAI,SAAS,GAAG,GAAG;AAClB;AAEA,YAAI,aAAa;AAEjB,YAAI,oBAAoB;AACvB,gBAAM,OAAO,iCAAiC,KAAK,MAAM,GAAG,KAAK,GAAG,kBAAkB;AAEtF,cAAI,MAAM;AACT,yBAAa,KAAK,CAAC;AACnB,iCAAqB;AAAA,UACtB;AAAA,QACD;AAMA,iBAAS,IAAI,YAAY,KAAK,KAAK,KAAK;AACvC,gBAAM,OAAO,QAAQ,CAAC;AAMtB,cAAI,CAAC,SAAS,IAAI,EAAG;AAErB,gBAAM,CAAC,MAAM,IAAI;AAEjB,gBAAM,OAAO,UAAU,OAAO,MAAM;AACpC,gBAAM,aAAa,uBAAuB,MAAM,KAAK,qBAAqB,IAAI;AAE9E,cAAI,YAAY;AACf,iBAAK,IAAI,IAAI;AAAA,UACd;AAEA,cAAI,cAAc,MAAM;AACvB,2BAAe;AAAA,UAChB;AAEA,cAAI,UAAU,cAAc,CAAC,MAAM;AAClC;AAAA,UACD,OAAO;AACN,kBAAM,KAAK,IAAI;AAAA,UAChB;AAAA,QACD;AAAA,MACD;AAEA,gBAAU,QAAQ,GAAG;AAAA,IACtB,WAAW,SAAS,UAAU;AAC7B,aAAO,KAAK,UAAU;AACtB,gBAAU,QAAQ,MAAM,CAAC,EAAE,CAAC;AAAA,IAC7B,WAAW,SAAS,aAAa;AAChC,aAAO,KAAK,UAAU;AACtB,gBAAU,QAAQ,CAAC,EAAE,GAAG;AAAA,IACzB,WAAW,SAAS,SAAS;AAC5B,aAAO,KAAK,UAAU;AACtB,gBAAU,MAAM,GAAG;AAAA,IACpB,WAAW,SAAS,gBAAgB,SAAS,iBAAiB,SAAS,kBAAkB;AACxF,gBAAU,OAAO,IAAI;AACrB,2BAAqB,KAAK,MAAM,GAAG,EAAE;AAAA,IACtC;AAAA,EACD;AAEA,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AASA,IAAM,uBAAuB,CAAC,OAA8C,YAAmC;AAC9G,QAAM,iBAAwD,CAAC;AAE/D,QAAM,OAAO,oBAAI,IAAI;AACrB,QAAM,aAAa,oBAAI,IAAI;AAC3B,QAAMC,SAAQ;AAAA,IACb,OAAO,oBAAI,IAAI;AAAA,IACf,QAAQ,oBAAI,IAAI;AAAA,EACjB;AAKA,QAAM,OAAO,CAAC,MAAc,MAAM,MAAM,IAAI,CAAC;AAE7C,aAAW,CAAC,GAAG,IAAI,KAAK,MAAM,QAAQ,GAAG;AACxC,UAAM,CAAC,QAAQ,GAAG,MAAM,IAAI;AAE5B,QAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,SAAS,QAAQ,cAAc;AAC5D;AAAA,IACD;AAEA,SAAK,IAAI,MAAM;AAEf,QAAI,WAAW,cAAc,WAAW,UAAU;AACjD,UAAI,WAAW,UAAU;AACxB,cAAM,KAAK,OAAO,CAAC;AAEnB,YAAI,GAAG,gBAAgB;AACtB,gBAAM,YAAY,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,IAAI,MAAM;AAChD,gBAAI,SAAS,SAAU;AAGvB,kBAAM,gBAAgB,QAAQ,KAAK,MAAM,GAAG,MAAM,KAAK,OAAO,GAAG,EAAE;AACnE,kBAAM,yBAAyB,SAAS;AACxC,kBAAM,oBAAoB,OAAO,IAAI,MAAM,OAAO,EAAE;AAEpD,mBAAO,iBAAiB,0BAA0B;AAAA,UACnD,CAAC;AAED,cAAI,UAAW;AAAA,QAChB,WAAW,GAAG,eAAe;AAC5B,cAAI,GAAG,cAAc,KAAK,CAAC,CAAC,GAAG;AAC9B;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAEA,qBAAe,KAAK,IAAI;AAAA,IACzB,WAAW,WAAW,aAAa;AAClC,YAAM,UAAU,kBAAkB,MAAM;AAExC,YAAM,OAAO,KAAK,CAAC,EAAE,KAAK,CAACC,UAAS;AACnC,YAAI,qBAAqBA,KAAI,KAAK,uBAAuBA,MAAK,CAAC,CAAC,GAAG;AAClE,iBAAO;AAAA,QACR;AAEA,cAAM,CAAC,SAAS,MAAM,IAAIA;AAE1B,YAAI,WAAW,OAAO,CAAC,GAAG;AACzB,iBAAO;AAAA,QACR;AAEA,eAAO,YAAY,WAAW,YAAY;AAAA,MAC3C,CAAC;AAED,UAAI,KAAM;AAEV,MAAAD,OAAM,OAAO,IAAI,YAAY,OAAO,CAAC,CAAgB,CAAC;AACtD,qBAAe,KAAK,IAAI;AAAA,IACzB,WAAW,WAAW,mBAAmB,WAAW,eAAe,WAAW,SAAS;AACtF,YAAM,UAAU,kBAAkB,MAAM;AAExC,YAAM,OAAO,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,MAAM,MAAM;AAChD,YAAI,WAAW,OAAO,CAAC,KAAK,WAAW,SAAS;AAC/C,iBAAO;AAAA,QACR;AAEA,cAAM,oBAAoB,WAAW,eAAe,YAAY;AAKhE,eAAO,qBAAqB,YAAY,WAAW,YAAY;AAAA,MAChE,CAAC;AAED,UAAI,KAAM;AAKV,UAAI,WAAW,iBAAiB;AAC/B,mBAAW,IAAI,OAAO,CAAC,CAAC;AAAA,MACzB,WAAW,WAAW,aAAa;AAClC,QAAAA,OAAM,MAAM,IAAI,YAAY,OAAO,CAAC,CAAgB,CAAC;AAAA,MACtD;AAEA,qBAAe,KAAK,IAAI;AAAA,IACzB,WAAW,WAAW,oBAAoB,WAAW,WAAW;AAC/D,YAAM,OAAO,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,MAAM,WAAW,OAAO;AAE3D,UAAI,KAAM;AAEV,qBAAe,KAAK,IAAI;AAAA,IACzB,WAAW,WAAW,oBAAoB;AACzC,YAAM,OAAO,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,SAAS,GAAG,GAAG,UAAU;AAE7D,YAAI,WAAW,WAAW,cAAc,OAAO,CAAC,GAAG;AAClD,iBAAO;AAAA,QACR;AAEA,cAAME,QAAO,MAAM,MAAM,CAAC;AAE1B,cAAM,uBAAuBA,MAAK,KAAK,CAAC,CAAC,UAAU,WAAW,MAAM,WAAW,QAAQ;AACvF,cAAM,qBAAqBA,MAAK,KAAK,CAACD,UAAS,QAAQ,KAAK,IAAIA,KAAI,CAAC;AAErE,cAAM,gCACL,CAAC,sBACDC,MAAK,KAAK,CAAC,CAAC,UAAU,WAAW,MAAM,aAAa,UAAU,gBAAgB,OAAO,CAAC,CAAC;AAGxF,eAAQ,wBAAwB,sBAAuB;AAAA,MACxD,CAAC;AAED,UAAI,KAAM;AAEV,qBAAe,KAAK,IAAI;AAAA,IACzB,OAAO;AACN,qBAAe,KAAK,IAAI;AAAA,IACzB;AAAA,EACD;AAEA,QAAM,MAAM,OAAO,UAAyE;AAC3F,eAAW,QAAQ,gBAAgB;AAClC,YAAM,SAAS,MAAM,IAAI;AAEzB,UAAI,UAAU,MAAM,GAAG;AACtB,cAAM;AAAA,MACP;AAAA,IACD;AAEA,mBAAe,SAAS;AAAA,EACzB;AAEA,SAAO;AAAA,IACN;AAAA,IACA,MAAM;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAAF;AAAA,IACD;AAAA,EACD;AACD;;;AC/nBA,IAAM,0BAA0B,MAAgB;AAC/C,QAAM,SAAS;AAAA,IACd,SAAS;AAAA,IACT,QAAQ;AAAA,IAER,SAAS;AAAA,IAET,QAAQ;AAAA,EACT;AAEA,QAAM,OAAO,MAAM;AAClB,UAAM,UAAU,IAAI,QAAQ,CAAC,SAAS,WAAW;AAChD,aAAO,SAAS;AAChB,aAAO,UAAU,CAAC,UAAU;AAC3B,gBAAQ,EAAE,WAAW,OAAO,MAAM,CAAC;AAAA,MACpC;AAEA,aAAO,SAAS,MAAM;AACrB,gBAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACxC,aAAK;AAAA,MACN;AAAA,IACD,CAAC;AAED,WAAO,UAAU;AAAA,EAClB;AAEA,SAAO,KAAK,GAAG;AAChB;;;AC/CA,SAAS,WAAAG,gBAAe;AAExB,SAAS,OAAAC,YAAW;AAEpB,IAAM,sBAAsB,CAAC,YAAoB;AAChD,MAAI;AACH,UAAM,EAAE,SAAS,IAAI,IAAI,IAAI,SAAS,SAAS,IAAI;AAOnD,WAAO,SAAS,MAAM,GAAG,EAAE,GAAG,EAAE,EAAG,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,EAC9D,SAAS,OAAO;AACf,QAAIA,MAAK;AACR,cAAQ,MAAM,IAAI,MAAM,4BAA4B,OAAO,MAAM,EAAE,OAAO,MAAM,CAAC,CAAC;AAAA,IACnF;AAEA,WAAO;AAAA,EACR;AACD;AAEA,IAAM,mBAAmB,OAAO,KAAa,YAA0B;AACtE,MAAI;AACH,UAAM,WAAW,MAAM,QAAQ,KAAK;AAAA,MACnC,QAAQ;AAAA,IACT,CAAC;AAED,WAAO,SAAS,QAAQ,IAAI,cAAc,KAAK;AAAA,EAChD,SAAS,OAAO;AACf,QAAIA,MAAK;AACR,cAAQ,MAAM,IAAI,MAAM,4BAA4B,GAAG,KAAK,EAAE,OAAO,MAAM,CAAC,CAAC;AAAA,IAC9E;AAEA,WAAO;AAAA,EACR;AACD;AAOA,IAAM,kBAAkBC;AAAA,EACvB,OAAO,EAAE,KAAK,QAAQ,MAA6B;AAClD,UAAM,YAAY,oBAAoB,GAAG;AAEzC,QAAI,8BAA8B,IAAI,SAAgB,GAAG;AACxD,aAAO;AAAA,IACR;AAEA,QAAI,6BAA6B,IAAI,SAAgB,GAAG;AACvD,aAAO;AAAA,IACR;AAMA,UAAM,cAAc,MAAM,iBAAiB,KAAK,OAAO;AAEvD,QAAI,YAAY,SAAS,OAAO,GAAG;AAClC,aAAO;AAAA,IACR;AAEA,QAAI,YAAY,SAAS,OAAO,GAAG;AAClC,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AAAA,EACA;AAAA,IACC,aAAa,CAAC,EAAE,IAAI,MAAM;AAAA,EAC3B;AACD;;;AC3EA,SAAS,WAAAC,gBAAe;AAKxB,IAAM,WAAWC;AAAA,EAChB,CAAC,MAAe;AACf,WAAO,CAAC;AAAA,EACT;AAAA,EACA;AAAA,IACC,OAAO;AAAA,IACP,aAAa,CAAC,QAAQ,IAAI;AAAA,EAC3B;AACD;AAEA,IAAM,yBAAyB,CAAC,aAAuB;AACtD,QAAM,WAAW,CAAC,YAA0D;AAC3E,UAAM,MAAM,OAAO,YAAY,WAAW,SAAS,WAAW,OAAO,IAAI;AACzE,UAAM,QAAQ,SAAS,GAAG;AAE1B,WAAO;AAAA,MACN,IAAI,WAAW;AACd,eAAO,MAAM;AAAA,MACd;AAAA,MACA,IAAI,QAAQ;AACX,eAAO,MAAM,GAAG,EAAE;AAAA,MACnB;AAAA,MACA,IAAI,MAAM,OAAO;AAChB,cAAM,MAAM,SAAS,CAAC,IAAI;AAAA,MAC3B;AAAA,MAEA,OAAO;AACN,cAAM,WAAW,MAAM,SAAS,IAAI,MAAM,IAAI,IAAI,KAAK;AACvD,YAAI,KAAK,YAAY;AAAA,MACtB;AAAA,MACA,KAAK,OAAa;AACjB,cAAM,KAAK,KAAK;AAAA,MACjB;AAAA,MACA,QAAQ;AACP,cAAM,WAAW;AAEjB,cAAM,SAAS;AACf,cAAM,SAAS;AAAA,MAChB;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AACR;;;AC9CA,IAAM,cAAc,CAAC,SAAyD;AAC7E,SAAO,KAAK,QAAQ,CAAC,SAAS;AAC7B,UAAM,OAAO,KAAK,CAAC;AAKnB,QAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,YAAY,IAAqB;AAEjE,WAAO,CAAC,IAAmB;AAAA,EAC5B,CAAC;AACF;AAKA,IAAM,YAAY,CAAC,UAAiB;AACnC,aAAW,OAAO,OAAO;AACxB,UAAM,GAAG,IAAI,YAAY,MAAM,GAAG,CAAC;AAAA,EACpC;AAEA,SAAO;AACR;;;ACxBA,SAAS,WAAAC,gBAAe;AAGxB,IAAM,cAAc,CAAC,cAAwB;AAC5C,MAAI,EAAE,SAAS,IAAI;AAEnB,MAAI,UAAU,SAAS,QAAQ,GAAG;AACjC,WAAO;AAAA,EACR,WAAW,UAAU,SAAU,WAAW,SAAS,MAAM,GAAG,CAAC,CAAE,GAAG;AACjE,WAAO;AAAA,EACR,WAAY,WAAW,UAAU,KAAK,CAAC,UAAU,UAAU,UAAU,SAAS,KAAK,CAAC,GAAK;AACxF,WAAO;AAAA,EACR;AAKA,SAAO,UAAU,CAAC;AACnB;AAEA,IAAM,6BAA6BA,SAAQ,CAAC,SAAe;AAI1D,MAAI;AACH,UAAM,OAAO,IAAI,KAAK,aAAa,CAAC,IAAI,GAAG;AAAA,MAC1C,MAAM;AAAA,IACP,CAAC;AAED,WAAO,KAAK,GAAG,IAAI,KAAK;AAAA,EACzB,QAAQ;AACP,WAAO;AAAA,EACR;AACD,CAAC;AAMD,IAAM,aAAa,CAAC,QAAgB;AACnC,SAAO,IAAI,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAC1C;;;ACzCA,IAAM,OAAO,MAAM;AAAC;;;ACGpB,IAAM,uBAAuB,CAAyBC,WAA+C;AACpG,SAAOA,OAAM,IAAI,EAAE,KAAK,CAAC;AAC1B;AAEA,IAAM,qBAAqB,CAAyBA,WAA+C;AAClG,QAAM,EAAE,KAAK,IAAIA,OAAM,IAAI;AAE3B,SAAO;AAAA,IACN,OAAO,KAAK,CAAC;AAAA,IACb,OAAO,KAAK,CAAC;AAAA,IACb,OAAO,KAAK,CAAC;AAAA,EACd;AACD;;;ACfA,IAAM,SAAS,CAAOC,MAAa,OAAwD;AAC1F,SAAO,CAAC,GAAGA,IAAG,EAAE,IAAI,EAAE;AACvB;AAEA,IAAM,UAAU,CAAI,WAAoB;AACvC,SAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAChD;;;ACHA,IAAM,oBAAoB,CAAqD,eAA2B;AACzG,QAAM,UAAU,OAAO,QAAQ,UAAU;AACzC,QAAM,SAAS,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,MAAM,MAAM,UAAU,OAAO,KAAK,MAAM,QAAQ,EAAE,CAAC,CAAC;AAE/G,SAAO,OAAO,YAAY,MAAM;AACjC;;;ACMA,IAAM,QAAQ,CAAI,SAAY,cAAc,oBAAI,IAAwB,MAAiB;AACxF,QAAM,YAAY,CAAC,OAA2B;AAC7C,gBAAY,IAAI,EAAE,GAAG,GAAG,OAAO;AAE/B,WAAO,MAAM;AACZ,kBAAY,OAAO,EAAE;AAAA,IACtB;AAAA,EACD;AAEA,QAAM,OAAO,CAAC,UAAa;AAC1B,eAAW,MAAM,YAAa,IAAG,KAAK;AAAA,EACvC;AAEA,QAAM,SAAS,CAAC,OAAuB;AACtC,SAAM,UAAU,GAAG,OAAO,CAAE;AAAA,EAC7B;AAEA,QAAMC,OAAM,CAAC,QAAW;AACvB,WAAO,MAAM,GAAG;AAAA,EACjB;AAEA,QAAM,MAAM,MAAM;AACjB,WAAO;AAAA,EACR;AAEA,SAAO,EAAE,WAAW,QAAQ,KAAAA,MAAK,IAAI;AACtC;AAEA,IAAM,SAAS,CAAO,OAAkB,QAAqC;AAC5E,SAAO;AAAA,IACN,KAAK,MAAM,IAAI,MAAM,IAAI,CAAC;AAAA,IAC1B,WAAW,CAAC,eAAe;AAC1B,aAAO,MAAM,UAAU,CAAC,UAAU;AACjC,eAAO,WAAW,IAAI,KAAK,CAAC;AAAA,MAC7B,CAAC;AAAA,IACF;AAAA,EACD;AACD;AAEA,IAAM,YAAY,CAAI,UAAyB;AAC9C,SAAO;AAAA,IACN,KAAK,MAAM;AAAA,IACX,WAAW,CAAC,eAAe;AAC1B,iBAAW,KAAK;AAEhB,aAAO;AAAA,IACR;AAAA,EACD;AACD;;;ACvDA,SAAS,QAAAC,aAAY;AA2DrB,IAAM,yBAAyB,CAAC,OAAe;AAC9C,QAAM,MAAM,SAAS,cAAc,KAAK;AAExC,MAAI,aAAa,WAAW,EAAE;AAE9B,SAAO;AACR;AAEA,IAAM,wBAAwB,CAAC,KAAc,OAAsB;AAClE,QAAM,SAAS,kBAAkB,IAAI,IAAI,KAAK,GAAG,GAAG;AAEpD,MAAI,QAAQ;AACX,WAAO;AAAA,EACR;AAEA,QAAM,SAAS;AAAA,IACd,MAAM;AAAA,IACN;AAAA,IACA,WAAW,CAAC;AAAA,EACb;AAEA,oBAAkB,IAAI,IAAI,KAAK,GAAG,KAAK,MAAM;AAE7C,SAAO;AACR;AAEA,IAAM,+BAA+B,CAAC,QAAiB;AACtD,QAAM,WAAW,0BAA0B,IAAI,IAAI,EAAE;AAErD,MAAI,UAAU;AACb,WAAO;AAAA,EACR;AAEA,QAAM,SAAoC,CAAC;AAE3C,4BAA0B,IAAI,IAAI,IAAI,MAAM;AAE5C,SAAO;AACR;AAEA,IAAM,qBAAqB,CAAC,EAAE,KAAK,MAAqC;AACvE,SAAO,KAAK,QAAQ;AACnB,QAAI;AACH,WAAK,IAAI,EAAG;AAAA,IACb,SAAS,GAAG;AACX,cAAQ,MAAM,CAAC;AAAA,IAChB;AAAA,EACD;AACD;AAEA,IAAM,qBAAqB,CAC1B,KACA,IACA;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,UAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,MACI;AACJ,QAAM,SAAS,sBAAsB,KAAK,EAAE;AAC5C,QAAM,gBAAgB,6BAA6B,GAAG;AAEtD,QAAM,cAAc,MAAM;AACzB,QAAI,CAAC,cAAc,KAAK,CAAC,SAAS,KAAK,GAAG,OAAO,GAAG,MAAM,KAAK,GAAG,QAAQ,GAAG,GAAG,GAAG;AAClF,aAAO,OAAO;AACd,sBAAgB,IAAI;AAAA,IACrB;AAAA,EACD;AAEA,QAAM,gBAA+C;AAAA,IACpD;AAAA,IACA,MAAM,CAAC,OAAO,MAAM;AAAA,IACpB,MAAM;AAAA,EACP;AAEA,gBAAc,KAAK,aAAa;AAEhC,QAAM,cAAc,CAAC,SAAS,SAA0C;AACvE,QAAI,OAAO,QAAQ,CAAC,QAAQ;AAC3B,sBAAgB,OAAO,IAAI;AAE3B,aAAO;AAAA,QACN,SAAS,OAAO;AAAA,QAChB,MAAM,IAAI;AAAA,MACX;AAAA,IACD;AAEA,WAAO,OAAO,SAAS,uBAAuB,GAAG,GAAG,IAAI;AAExD,oBAAgB,OAAO,IAAI;AAE3B,WAAO;AAAA,MACN,SAAS,OAAO;AAAA,MAChB,MAAM,IAAI;AAAA,IACX;AAAA,EACD;AAEA,QAAM,QAAQ,CAAC,SAAsB;AACpC,kBAAc,KAAK,KAAKD,MAAK,IAAI,CAAC;AAAA,EACnC;AAEA,QAAM,OAAO,CAAC,gBAAsB;AACnC,QAAI,aAAa;AAChB,aAAQ,OAAO,YAAY;AAAA,IAC5B;AAEA,WAAO,OAAO;AAAA,EACf;AAEA,QAAM,SAAS,MAAM;AACpB,uBAAmB,aAAa;AAGhC,WAAO,OAAO;AACd,oBAAgB,IAAI;AAEpB,oBAAgB;AAAA,EACjB;AAEA,QAAM,QAAQC,UAAS,GAAG;AAE1B,QAAM,UAAU,MAAM;AACrB,WAAO,MAAM;AAAA,EACd;AAEA,SAAO,GAAG;AAAA,IACT,OAAO,IAAI;AAAA,IAEX;AAAA,IAEA;AAAA,IACA;AAAA,IAEA,WAAW,CAAC,QAAQ,kBAAkB,IAAI,IAAI,KAAK,GAAG,GAAG,aAAa;AAAA,IAEtE;AAAA,IAEA;AAAA,IACA;AAAA,IAEA,iBAAiB;AAAA,IAEjB;AAAA,IAEA;AAAA,IAEA,YAAY,IAAI;AAAA,IAEhB,QAAQ,IAAI,KAAK,UAAU,UAAU,KAAK,IAAI;AAAA,IAE9C;AAAA,IAEA;AAAA,EACD,CAAC;AACF;;;AC3NA,IAAM,4BAA4B;AAAA,EACjC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,OAAO;AACR;AAKA,IAAM,4BAA4B,CAACC,WAAkB;AACpD,MAAI,CAAC,iBAAiB,IAAIA,MAAK,GAAG;AACjC,sBAAkB,IAAIA,MAAK;AAAA,EAC5B;AACD;AAcA,IAAM,yBAAyB,OAAO;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,MAAqC;AACpC,QAAM,OAAO,OAAO,mBAAmB,CAACA,WAAU;AACjD,WAAO,QAAQ,YAAY;AAC1B,YAAM,OAAO,MAAM,gBAAgB;AAAA,QAClC,KAAKA;AAAA,QACL;AAAA,MACD,CAAC;AAED,cAAQ,MAAM;AAAA,QACb,KAAK,SAAS;AACb,gBAAM,qBAAqBA,MAAK;AAChC;AAAA,QACD;AAAA,QAEA,KAAK,SAAS;AACb,gBAAM,qBAAqBA,MAAK;AAChC;AAAA,QACD;AAAA,MACD;AAEA,wBAAkB,OAAOA,MAAK;AAC9B,uBAAiB,IAAIA,MAAK;AAAA,IAC3B,CAAC;AAAA,EACF,CAAC;AAQD,QAAM,QAAQ,WAAW,IAAI;AAE7B,oBAAkB,MAAM;AACzB;AAqCA,IAAM,aAAa,OAAO,EAAE,QAAQ,MAAM,YAAY,QAAQ,OAAO,QAAQ,QAAQ,MAAyB;AAC7G,MAAI,WAAW,kBAAkB;AAOhC,QAAI,SAAS,MAAM,CAAC,CAAC,GAAG;AACvB,aAAO,iBAAiB,MAAM,CAAC,CAAC,CAAC;AACjC;AAAA,IACD;AAEA,QAAI,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,MAAM,UAAU;AAC7C,iBAAW,SAAS,OAAO,OAAO,MAAM,CAAC,CAAC,GAAG;AAC5C,YAAI,QAAQ,KAAK,GAAG;AACnB,iBAAO,iBAAiB,KAAK,CAAC;AAAA,QAC/B,OAAO;AACN,iBAAO,KAAK;AAAA,QACb;AAAA,MACD;AAAA,IACD;AAEA;AAAA,EACD;AAEA,QAAM,eAAe,CAACC,YAA0F;AAC/G,QAAIA,WAAU,2BAA2B;AAExC,aAAO,OAAO,0BAA0BA,OAAgD,CAAC;AAAA,IAC1F;AAEA,WAAO;AAAA,EACR;AAKA,MAAI,cAAc,MAAM,KAAK,SAAS,MAAM,CAAC,CAAC,GAAG;AAChD,QAAI,aAAa,MAAM,IAAI,GAAG;AAC7B,aAAO,iBAAiB,MAAM,CAAC,CAAC,CAAC;AAAA,IAClC;AAEA;AAAA,EACD;AAEA,MAAI,WAAW,WAAW,OAAO,MAAM,CAAC,MAAM,UAAU;AAIvD,QAAI,aAAa,OAAO,KAAK,GAAG;AAC/B;AAAA,IACD;AAEA,eAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,MAAM,CAAC,CAAC,GAAG;AACzD,UAAI,aAAa,MAAM;AAOtB,iBAAS,OAAO,iBAAiB,KAAK,CAAC;AAAA,MACxC;AAAA,IACD;AAEA;AAAA,EACD;AAKA,MAAI,WAAW,mBAAmB,SAAS,MAAM,CAAC,CAAC,KAAK,SAAS,MAAM,CAAC,CAAC,GAAG;AAE3E,UAAM,SAAS,QAAQ,WAAW,MAAM,CAAC,CAAC,EAAE,SAAS,MAAM,CAAC,CAAC,CAAC;AAE9D,eAAWD,UAAS,QAAQ;AAC3B,aAAO,iBAAiBA,MAAK,CAAC;AAAA,IAC/B;AAEA;AAAA,EACD;AAKA,MAAI,WAAW,YAAa,MAAM,CAAC,EAAoB,QAAQ;AAC9D,UAAM,SAAU,MAAM,CAAC,EAAoB;AAE3C,QAAI,WAA2B,CAAC;AAEhC,QAAI,OAAO,WAAW,YAAY;AACjC,iBAAW,MAAM,QAAQ,KAAK;AAAA,QAC7B,OAAO,EAAE,QAAQ,CAAC;AAAA,QAClB,IAAI,QAAY,CAAC,YAAY,WAAW,SAAS,KAAK,CAAC,CAAC,CAAC;AAAA,MAC1D,CAAC;AAED,aAAO,eAAe,MAAM,CAAC,GAAG,UAAU;AAAA,QACzC,OAAO,YAAY;AAAA,QACnB,UAAU;AAAA,MACX,CAAC;AAAA,IACF,OAAO;AACN,iBAAW;AAAA,IACZ;AAEA,eAAWA,UAAS,UAAU;AAC7B,cAAQA,MAAK,IAAI,OAAOA,OAAM,MAAM,IAAI,OAAOA,MAAK;AAAA,IACrD;AAEA;AAAA,EACD;AAEA,MAAI,WAAW,UAAU;AACxB,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,YAAM,OAAO,MAAM,CAAC;AAEpB,UAAI,MAAM,QAAQ,IAAI,GAAG;AACxB,YAAI,KAAK,CAAC,GAAG;AACZ,iBAAO,iBAAiB,KAAK,CAAC,CAAC,CAAC;AAAA,QACjC;AAAA,MACD;AAAA,IACD;AAAA,EACD;AACD;;;AC3NA,IAAM,sBAAsB,CAAC,EAAE,IAAI,MAAkD;AACpF,SAAO;AAAA,IACN,MAAM,MAAM;AACX,YAAM,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE;AAEjD,UAAI;AACH,cAAM,QAAQ,aAAa,QAAQ,GAAG;AAEtC,eAAO,QAAQ,KAAK,MAAM,KAAK,IAAI;AAAA,MACpC,QAAQ;AACP,eAAO;AAAA,MACR;AAAA,IACD;AAAA,IACA,MAAM,IAAI,MAAM;AACf,UAAI;AACH,qBAAa,QAAQ,KAAK,KAAK,UAAU,IAAI,CAAC;AAAA,MAC/C,QAAQ;AAAA,MAAC;AAAA,IACV;AAAA,EACD;AACD;;;ACtBA,IAAM,MAAM;AAEZ,IAAM,QAAQ,CAAC,OAAe,eAAyB;AACtD,QAAM,SAAiC,CAAC;AAExC,aAAW,aAAa,YAAY;AACnC,QAAI,CAAC,MAAO;AAEZ,UAAM,CAAC,OAAO,GAAG,IAAI,MAAM,MAAM,WAAW,CAAC;AAE7C,WAAO,KAAK,KAAK;AACjB,YAAQ;AAAA,EACT;AAEA,SAAO,KAAK,KAAK;AAEjB,SAAO;AACR;AAMA,IAAM,wBAAwB,CAAC,GAAmB,UAAgC;AACjF,MAAI,MAAM,QAAQ,CAAC,GAAG;AACrB,WAAO,EAAE,IAAI,CAAC,SAAS,sBAAsB,MAAM,KAAK,CAAC,EAAE,KAAK,MAAM;AAAA,EACvE;AAEA,MAAI,OAAO,MAAM,YAAY;AAC5B,WAAO,sBAAsB,EAAE,KAAK,GAAG,KAAK;AAAA,EAC7C;AAEA,SAAO;AACR;AAEA,IAAM,UAAU,CACf,OACA,MACA,eACA,SACA,OACI;AACJ,SAAO,MAAM,WAAW,KAAK,CAAC,GAAQ,KAAa,MAAW;AAC7D,QAAI;AACJ,QAAI;AAEJ,UAAM,CAAC,SAAS,QAAQ,MAAM,IAAI,MAAM,IAAI,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC;AAE9D,QAAI,CAAC,SAAS;AACb,aAAO;AAAA,IACR;AAEA,UAAM,OAAO,QAAQ,MAAM,GAAG;AAE9B,WAAO,KAAK,IAAI,KAAK,OAAQ,KAAI,EAAE,KAAK,GAAG,CAAC;AAE5C,QAAI,UAAU,iBAAiB,KAAK,IAAI;AACvC,UAAI,cAAc,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC;AAAA,IACvC;AAEA,UAAM,gBAAgB,WAAW,SAAS,QAAQ,MAAM,IAAI;AAE5D,QAAI,cAAe,KAAI,cAAc,CAAC;AAEtC,WAAO,KAAK,OAAO,KAAK;AAAA,EACzB,CAAC;AACF;;;AC7EA,SAAS,OAAAE,YAAW;AAmBpB,IAAM,kBAAkD,CAAC,KAAK;AAE9D,IAAM,oBAAoB,CAAyC;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AACD,MAA6C;AAC5C,QAAM,aAAa,CAAC,GAAG,eAAe,GAAG,eAAe;AACxD,QAAM,SAAS,EAAE,GAAG,gBAAgB;AAEpC,WAAS,UAAU,YAAY;AAC9B,WAAO,MAAM,IAAI,IAAI,UAA0D;AAC9E,UAAI,WAAW,OAAO;AACrB,iBAAS;AAET,cAAM,CAAC,SAAS,IAAI;AAEpB,YAAIC,QAAO,CAAC,WAAW,SAAS,GAAG;AAClC,gBAAM,IAAI,MAAM,sDAAsD,SAAS,GAAG;AAAA,QACnF;AAAA,MACD,WAAW,WAAW,UAAU;AAC/B,YAAI,MAAM,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,QAAQ,MAAM,CAAC,GAAG;AAC7D,mBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,kBAAM,SAAS,MAAM,CAAC;AAEtB,YAAC,MAAmD,CAAC,IAAI;AAAA,cACxD,OAAO;AAAA,cACP,YAAY,OAAO,QAAQ;AAAA,cAC3B,OAAO;AAAA,cACP,OAAO;AAAA,cACP,OAAO;AAAA,cACP,OAAO;AAAA,YACR;AAAA,UACD;AAAA,QACD,OAAO;AACN,mBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,kBAAM,SAAS,MAAM,CAAC;AAEtB,gBAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,qBAAO,CAAC,IAAI,YAAY,OAAO,CAAC,CAAC;AAAA,YAClC;AAAA,UACD;AAAA,QACD;AAAA,MACD,WAAW,WAAW,aAAa;AAClC,cAAM,UAAW,MAAiD,CAAC;AAEnE,mBAAW,OAAO,SAAS;AAC1B,kBAAQ,GAAG,IAAI,YAAY,QAAQ,GAAG,CAAC;AAAA,QACxC;AAAA,MACD;AAEA,aAAO,CAAC,QAAQ,GAAG,KAAK;AAAA,IACzB;AAAA,EACD;AAEA,SAAO;AACR;;;ACnDA,IAAM,oBAAoB,iBAAgD;AAIzE,QAAM,EAAE,OAAO,KAAK,IAAI,KAAK,SAAS;AACtC,QAAM,iBAAiB,KAAK,CAAC;AAK7B,MAAI,eAAe,UAAU,GAAG;AAC/B,WAAO,CAAC;AAAA,EACT;AAEA,QAAM,EAAE,MAAM,IAAI,MAAM,mBAAmB;AAAA,IAC1C,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK,CAAC;AAAA,IACZ,QAAQ;AAAA,IACR,cAAc,KAAK;AAAA,EACpB,CAAC;AAED,QAAM,OAAO,KAAK,YAAY;AAQ9B,QAAM,cAA4B,CAAC;AAKnC,WAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,IAAI,MAAM,SAAS,GAAG,IAAI,KAAK,IAAI,GAAG,KAAK;AACrF,UAAM,SAAS,MAAM,CAAC;AAEtB,QAAI,OAAO,CAAC,MAAM,UAAU;AAC3B,YAAM,CAAC,GAAG,MAAM,IAAI,IAAI;AAExB,UAAI,QAAiF;AAKrF,eAAS,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,KAAK;AACxC,cAAMC,UAAS,MAAM,CAAC;AAEtB,YAAI,qBAAqBA,OAAM,KAAK,uBAAuBA,QAAO,CAAC,CAAC,EAAG;AACvE,YAAIA,QAAO,CAAC,MAAM,YAAa;AAE/B,YAAIA,QAAO,CAAC,MAAM,SAAS;AAC1B,kBAAQA,QAAO,CAAC;AAEhB;AAAA,QACD;AAAA,MACD;AAEA,kBAAY,KAAK;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AAED,UAAI;AACJ;AAAA,IACD;AAAA,EACD;AAEA,QAAM,UAA0B,YAAY,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,MAAM,MAAM,GAAG,MAAM;AACvF,UAAM,QAAQ,eAAe,CAAC;AAC9B,UAAM,cAAc,SAAS,KAAK,IAC/B,QACA,QAAQ,KAAK,IACZ,QACA,SAAS,SACR,QACA,MAAM,IAAI;AAEf,WAAO,OAAO,KAAK,iBAAiB,IAAI,IAAI;AAE5C,WAAO;AAAA,MACN,MAAM,KAAK,gBAAgB,MAAM,KAAK;AAAA,MACtC,MAAM,KAAK,gBAAgB,MAAM,KAAK;AAAA,MACtC,OAAO,cAAc,iBAAiB,WAAW,IAAI;AAAA,IACtD;AAAA,EACD,CAAC;AAED,SAAO;AACR;;;AC/GA,IAAM,sBAAsB,CAAC,aAAmB;AAC/C,WAAS,gBAAgB,OAAO;AACjC;;;ACAA,IAAM,SAAN,MAAa;AAAA,EACL,YAAY,oBAAI,IAAiB;AAAA,EACjC,UAAU;AAAA,EAET;AAAA,EAER,YAAY,SAAwB;AACnC,SAAK,WAAW;AAAA,EACjB;AAAA,EAEA,IAAI,YAAY;AACf,WAAO,KAAK,SAAS;AAAA,EACtB;AAAA,EAEA,IAAI,WAAW;AACd,WAAO,KAAK,SAAS;AAAA,EACtB;AAAA,EAEO,IAAI,IAA8B;AACxC,SAAK,UAAU,IAAI,EAAE;AAErB,QAAI,KAAK,UAAU,SAAS,GAAG;AAC9B,WAAK,SAAS,MAAM,IAAI;AAAA,IACzB;AAEA,WAAO,MAAM;AACZ,WAAK,OAAO,EAAE;AAAA,IACf;AAAA,EACD;AAAA,EAEO,OAAO,IAA8B;AAC3C,SAAK,UAAU,OAAO,EAAE;AAExB,QAAI,KAAK,UAAU,SAAS,GAAG;AAC9B,WAAK,SAAS,MAAM,KAAK;AAAA,IAC1B;AAAA,EACD;AAAA,EAEO,QAAQ,MAAM;AACpB,SAAK,UAAU;AAEf,QAAI,KAAK,UAAU,OAAO,GAAG;AAC5B,WAAK,SAAS,MAAM,IAAI;AAAA,IACzB;AAAA,EACD;AAAA,EAEO,OAAO,MAAM;AACnB,SAAK,UAAU;AAAA,EAChB;AAAA,EAEO,SAAS,MAAM;AACrB,SAAK,UAAU,MAAM;AACrB,SAAK,KAAK;AACV,SAAK,SAAS,OAAO,IAAI;AAAA,EAC1B;AACD;AAEA,IAAM,gBAAN,MAAoB;AAAA,EACX,YAAY,oBAAI,IAAY;AAAA,EAC5B,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EAED,YAAY;AAAA,EACZ,WAAW,YAAY,IAAI;AAAA,EAElC,YAAY,QAA0B;AACrC,SAAK,eAAe,OAAO,UAAU,CAACC,YAAW;AAChD,UAAIA,SAAQ;AACX,aAAK,KAAK;AAAA,MACX,WAAW,MAAM,KAAK,KAAK,SAAS,EAAE,KAAK,CAAC,WAAW,OAAO,WAAW,OAAO,UAAU,OAAO,CAAC,GAAG;AACpG,aAAK,MAAM;AAAA,MACZ;AAAA,IACD,CAAC;AAAA,EACF;AAAA,EAEO,QAAQ;AACd,QAAI,KAAK,UAAU;AAClB;AAAA,IACD;AAEA,yBAAqB,KAAK,IAAI;AAE9B,SAAK,WAAW,YAAY,IAAI;AAChC,SAAK,WAAW;AAChB,SAAK,OAAO,sBAAsB,KAAK,MAAM;AAAA,EAC9C;AAAA,EAEO,OAAO;AACb,yBAAqB,KAAK,IAAI;AAC9B,SAAK,WAAW;AAChB,SAAK,OAAO;AAAA,EACb;AAAA,EAEO,OAAO;AACb,UAAM,SAAS,IAAI,OAAO,IAAI;AAE9B,SAAK,UAAU,IAAI,MAAM;AAEzB,WAAO;AAAA,EACR;AAAA,EAEO,MAAM,UAAmB;AAC/B,QAAI,UAAU;AACb,WAAK,MAAM;AAAA,IACZ,WAAW,MAAM,KAAK,KAAK,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,WAAW,OAAO,UAAU,SAAS,CAAC,GAAG;AACxG,WAAK,KAAK;AAAA,IACX;AAAA,EACD;AAAA,EAEO,UAAU;AAChB,SAAK,aAAa;AAClB,SAAK,UAAU,QAAQ,CAAC,UAAU,MAAM,OAAO,CAAC;AAAA,EACjD;AAAA,EAEO,OAAO,QAAgB;AAC7B,SAAK,UAAU,OAAO,MAAM;AAC5B,SAAK,MAAM,KAAK;AAAA,EACjB;AAAA,EAEQ,SAAS,CAAC,gBAAqC;AACtD,SAAK,YAAY,cAAc,KAAK;AACpC,SAAK,UAAU,QAAQ,CAAC,WAAW;AAClC,UAAI,OAAO,SAAS;AACnB,eAAO,UAAU,QAAQ,CAAC,SAAS;AAClC,eAAK,MAAM;AAAA,QACZ,CAAC;AAAA,MACF;AAAA,IACD,CAAC;AAED,QAAI,CAAC,KAAK,UAAU;AACnB;AAAA,IACD;AAEA,SAAK,WAAW;AAChB,SAAK,OAAO,sBAAsB,KAAK,MAAM;AAAA,EAC9C;AACD;;;A3BjEA,IAAM,SAAS,CAMb;AAAA,EACD;AAAA,EACA,sBAAsB,CAAC;AAAA,EACvB,kBAAkB,CAAC;AAAA,EACnB,UAAU,oBAAoB,EAAE,KAAK,sBAAsB,CAAC;AAAA,EAC5D,eAAe,QAAQ,QAAQ;AAAA,EAC/B,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB;AAAA,EACA,OAAO,eAAe,CAAC;AAAA,EACvB,MAAM,cAAc,CAAC;AAAA,EACrB,YAAY;AAAA,EACZ,aAAa,CAAC;AAAA,EACd,kBAAkB;AAAA,EAClB,aAAAC,eAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,8BAA8B;AAAA,EAC9B,OAAO,UAAU;AAAA,EACjB,eAAe,QAAQ;AAAA,EACvB,eAAe;AAAA,EACf,WAAW;AAAA,EACX,yBAAyB;AAAA,EACzB,eAAe,EAAE,MAAM,SAAS;AAAA,EAChC;AACD,MAAmE;AAOlE,QAAM,YAAY,OAAO,KAAK,WAAW;AAEzC,QAAM,cAAc,OAAO,CAAC;AAC5B,QAAM,sBAAsB,OAAO,2BAA2B;AAE9D,QAAM,QAAe,CAAC;AAEtB,QAAM,QAAQ,oBAAI,IAAY;AAE9B,QAAM,aAAa,wBAAwB;AAE3C,MAAI,wBAAwB;AAC5B,MAAI,YAAY;AAEhB,MAAI,aAAa,SAAS,WAAW;AACpC,iBAAa,iBAAiB;AAAA,EAC/B;AAEA,QAAM,YAAY,aAAa,SAAS,WAAW,OAAO,aAAa;AACvE,QAAM,oBAAoBC,SAAQ,OAAO,UAAkB;AAC1D,UAAM,OAAO,MAAM,UAAU,KAAK;AAElC,QAAI,MAAM;AACT,YAAM,OAAO,IAAI;AAAA,IAClB;AAAA,EACD,CAAC;AAKD,QAAM,SAAS,CAAC,UAAkB;AACjC,WAAO,MAAM,IAAI,KAAK,GAAG;AAAA,EAC1B;AAEA,QAAM,aAAa,OAAO,SAAgB;AAEzC,QAAI,UAAW;AAEf,WAAO,OAAO,OAAO,UAAU,IAAI,CAAC;AAGpC,QAAI,CAAC,uBAAuB;AAC3B,eAAS,GAAG,YAAY;AAAA,IACzB;AAEA,UAAM,WAAW;AAEjB,aAAS,GAAG,YAAY;AAExB,QAAI,CAAC,uBAAuB;AAC3B,8BAAwB;AAExB,UAAI,kBAAkB,QAAQ;AAC7B,gBAAQ,MAAS;AAAA,MAClB,OAAO;AACN,iBAAS,GAAG,WAAW,aAAa;AAAA,MACrC;AAAA,IACD;AAAA,EACD;AAmBA,QAAM,SAAS,CAAC,SAAgB;AAC/B,WAAO,YAAY,MAAM,WAAW,IAAI,CAAC;AAAA,EAC1C;AAEA,QAAM,iBAAiB,CAAC,UAAkB;AACzC,WAAO;AAAA,MACN;AAAA,QACC,CAAC,QAAQ,QAAQ;AAAA,QACjB,CAAC,MAAM,CAAC;AAAA,MACT;AAAA,MACA;AAAA,MACA,CAAC,OAAO,KAAK,IAAI,CAAC,GAAG,MAAM;AAAA,MAC3B,CAAC;AAAA,IACF;AAAA,EACD;AAMA,QAAM,+BAA+B,MAAM;AAC1C,UAAM,WAAWD,aAAY,WAAW,WAAkB;AAG1D,QAAI,UAAU,SAAS,QAAqB,GAAG;AAC9C,0BAAoB,QAAQ;AAE5B,aAAO;AAAA,IACR;AAEA,QAAIE,MAAK;AACR,YAAM,IAAI;AAAA,QACT,wCAAwC,QAAQ,2BAA2B,UAAU,KAAK,IAAI,CAAC;AAAA,MAChG;AAAA,IACD;AAEA,UAAM;AAAA,EACP;AAMA,QAAM,cAA6C;AAAA,IAClD,OAAO,CAAC;AAAA,IACR,MAAM,MAAM,WAAW;AAAA,IACvB,MAAM,CAAC,6BAA6B,GAAG,0BAA0B,GAAG,GAAG,CAAC;AAAA,EACzE;AAEA,QAAM,cAAc,MAAM,WAAW;AACrC,QAAM,WAAW,MAAgB;AAAA,IAChC,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,SAAS,SAAS,oBAAoB;AAAA,EACvC,CAAC;AAED,QAAM,SAAS,OAAO,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO;AAE7D,QAAM,sBAAsB,OAAO,EAAE,UAAU,MAAwC;AAItF,QAAI,WAAW;AACd,iBAAW,QAAQ,KAAK,mBAAmB;AAC3C;AAAA,IACD;AAEA,UAAM,UAAU,MAAM;AACrB,YAAM,QAAQ,CAAC,GAAG,YAAY,IAAI,EAAE,KAAK,EAAE,QAAQ;AACnD,YAAM,SAAS,MAAM,MAAM,GAAG,aAAa,SAAS,YAAY,aAAa,eAAe,CAAC;AAE7F,iBAAW,CAAC,IAAI,KAAK,QAAQ;AAC5B,qBAAa,IAAI;AAAA,MAClB;AAAA,IACD;AAEA,YAAQ;AAKR,aAAS,OAAO,CAACC,UAAS;AACzB,MAAAA,MAAK,aAAa;AAElB,aAAOA;AAAA,IACR,CAAC;AAAA,EACF;AAEA,aAAW,QAAQ,KAAK,mBAAmB;AAE3C,QAAM,sBAAsB,CAAC,UAAuB;AACnD,QAAI,CAAC,SAAS,IAAI,EAAE,WAAY;AAEhC,UAAMA,QAAO,MAAM,KAAK;AAKxB,eAAWC,SAAQD,MAAK,OAAO;AAC9B,MAAAC,MAAK,CAAC,IAAI,CAAC;AAAA,IACZ;AAEA,YAAQ,IAAID,KAAI;AAAA,EACjB;AAMA,QAAM,oCAAoC,SAAS,MAAM,oBAAoB,YAAY,IAAI,CAAC,GAAG,EAAE;AACnG,QAAM,+BAA+B,SAAS,mCAAmC,eAAe;AAEhG,cAAY,UAAU,4BAA4B;AAElD,MAAI,iBAAiB,QAAS,iBAAiB,UAAU,CAACD,MAAM;AAC/D,qBAAiB,gBAAgB,iCAAiC;AAAA,EACnE;AAEA,QAAM,gBAAgB,YAAY;AACjC,QAAI,SAAS,MAAM,QAAQ,IAAI;AAE/B,eAAW,aAAa,YAAY;AACnC,eAAS,UAAU,MAAM;AAEzB,UAAIA,QAAO,CAAC,QAAQ;AACnB,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACpD;AAAA,IACD;AAEA,QAAI,oBAAoB,CAAC,OAAO,KAAK,CAAC,GAAG;AACxC,aAAO,KAAK,CAAC,IAAI,6BAA6B;AAAA,IAC/C;AAKA,WAAO,KAAK,CAAC,MAAM;AAKnB,WAAO,KAAK,CAAC,MAAM;AACnB,WAAO,KAAK,CAAC,MAAM;AACnB,WAAO,KAAK,CAAC,MAAM;AAMnB,QAAI,QAAQ,OAAO,IAAI,GAAG;AACzB,aAAO,OAAO;AAAA,IACf;AAKA,eAAW,QAAQ;AAEnB,gBAAY,IAAI,MAAuC;AAAA,EACxD;AAMA,eAAa,KAAK,aAAa;AAE/B,QAAM,UAAU,eAAe,MAAM,YAAY,CAAC;AAGlD,QAAM,OAAO,CAAC,SAAqB;AAClC,QAAI,CAAC,SAAS,IAAI,EAAE,WAAY;AAKhC,QAAI,CAAC,aAAa,SAAS,OAAQ;AAKnC,UAAM,QAAQ,SAAS,gBAAgB;AACvC,UAAM,UAAU,MAAM,MAAM,KAAK;AAEjC,gBAAY,OAAO,CAAC,SAAS;AAC5B,YAAMG,WAAU,MAAM;AACrB,aAAK,MAAM,KAAK,MAAM,SAAS,CAAC,IAAI;AAEpC,eAAO;AAAA,MACR;AAEA,YAAM,MAAM,MAAM;AACjB,aAAK,MAAM,KAAK,OAAO;AAEvB,eAAO;AAAA,MACR;AAKA,YAAM,OAAO,KAAK,MAAM,GAAG,EAAE;AAK7B,UAAI,CAAC,KAAM,QAAO,IAAI;AAKtB,cAAQ,CAAC,EAAE,CAAC,IAAI,OAAO,KAAK,IAAI,CAAC;AACjC,cAAQ,CAAC,EAAE,CAAC,IAAI;AAKhB,cAAQ,CAAC,IAAI,CAAC;AAEd,YAAM,cAAc,OAAO,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,KAAK,OAAO,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC;AAC7E,YAAM,6BAA6B,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;AAKvD,UAAI,8BAA8B,KAAK,CAAC,EAAE,CAAC,MAAM,UAAU,SAAS,UAAU;AAC7E,eAAOA,SAAQ;AAAA,MAChB;AAMA,UAAI,KAAK,CAAC,EAAE,CAAC,MAAM,YAAY,SAAS,UAAU,aAAa;AAC9D,eAAO;AAAA,MACR;AAEA,UAAI,8BAA8B,KAAK,CAAC,EAAE,CAAC,MAAM,UAAU,SAAS,QAAQ;AAC3E,eAAOA,SAAQ;AAAA,MAChB;AAEA,aAAO,IAAI;AAAA,IACZ,CAAC;AAAA,EACF;AAIA,QAAM,UAAU,MAAM;AACrB,QAAI,CAAC,SAAS,IAAI,EAAE,WAAY;AAEhC,UAAMD,QAAO,eAAe,MAAM,YAAY,CAAC;AAK/C,QAAI,WAAW;AACd,kBAAY,OAAO,CAAC,SAAS;AAC5B,eAAO,KAAK,MAAM,KAAKA,KAAI,GAAG;AAAA,MAC/B,CAAC;AAAA,IACF;AAEA,UAAM,UAAU,SAAS,WAAW,gBAAgB;AACpD,UAAM,QAAQ,SAAS,OAAO;AAE9B,UAAM,QAAQA;AACd,YAAQ,KAAK,YAAY,QAAQ,KAAK,YAAY;AAElD,aAAS,GAAG,WAAW,MAAM;AAE7B,WAAO,OAAO;AAAA,EACf;AAMA,QAAME,OAAM,CAACF,OAAY,QAAkB;AAC1C,UAAM,QAAQ,SAAS,OAAO,gBAAgB;AAE9C,UAAM,QAAQA;AAEd,WAAO,QAAQA,KAAI;AAAA,EACpB;AAEA,MAAI,aAAa;AAMjB,QAAM,UAAU,OAAOA,UAA2B;AACjD,QAAI,QAAQ,KAAK,GAAG;AACnB,UAAIF,MAAK;AACR,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD;AAEA;AAAA,IACD;AAEA,QAAI,CAAC,SAAS,IAAI,EAAE,WAAY;AAEhC,QAAI,SAASE,SAAQ,YAAY,IAAI,EAAE,MAAM,GAAG,EAAE;AAKlD,QAAI,CAAC,QAAQ;AACZ,eAAS,MAAM,OAAO;AAEtB,kBAAY,OAAO,CAAC,SAAS;AAC5B,aAAK,MAAM,KAAK,MAAO;AAEvB,eAAO;AAAA,MACR,CAAC;AAAA,IACF;AAEA,UAAM,UAAU,SAAS,WAAW,gBAAgB;AACpD,UAAM,QAAQ,SAAS,OAAO;AAE9B,YAAQ,KAAK,YAAY;AAEzB,UAAM,WAAW,MAAM;AAEvB,UAAM,CAAC,IAAI,IAAK,MAAM,QAAQ;AAE9B,aAAS,GAAG,WAAW,MAAM;AAE7B,UAAM,EAAE,MAAM,IAAI,MAAM,MAAM,IAAI;AAElC,QAAI,MAAO,SAAQ,QAAQ,IAAI;AAE/B,UAAM,EAAE,OAAO,MAAM,aAAa,IAAI,MAAM,mBAAmB;AAAA,MAC9D;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACD,CAAC;AAED,UAAM,gBAAgB,6BAA6B,OAAO;AAE1D,QAAI,UAAU;AACb,YAAM,EAAE,OAAO,UAAU,IAAI,MAAM,mBAAmB;AAAA,QACrD;AAAA,QACA,MAAM,SAAS,CAAC;AAAA,QAChB,QAAQ;AAAA,QACR;AAAA,MACD,CAAC;AAED,YAAM,UAA2B,CAAC;AAElC,YAAM,0BAA0B,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AAC/D,YAAM,MAAM,0BAA0B,IAAI,MAAM,SAAS;AAEzD,eAAS,IAAI,UAAU,SAAS,GAAG,KAAK,KAAK,KAAK;AACjD,cAAM,CAACG,SAAQ,EAAE,IAAI,UAAU,CAAC;AAEhC,YAAIA,YAAW,UAAU;AACxB,kBAAQ,KAAK,EAAE;AAAA,QAChB;AAAA,MACD;AAEA,cAAQ,QAAQ;AAEhB,YAAM,cAAc,oBAAI,IAAe;AAEvC,iBAAW,UAAU,SAAS;AAC7B,cAAO,UAAS,IAAI,cAAc,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1D,gBAAM,OAAO,cAAc,CAAC;AAE5B,cAAI,WAAW,KAAK,IAAI;AACvB,+BAAmB,IAAI;AACvB,wBAAY,IAAI,KAAK,IAAI;AAEzB,0BAAc,OAAO,GAAG,CAAC;AAEzB,kBAAM;AAAA,UACP;AAAA,QACD;AAAA,MACD;AAEA,kBAAY,QAAQ,CAAC,MAAM,EAAE,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACL;AAAA,MACA,MAAM,EAAE,MAAM,YAAAC,aAAY,OAAAC,OAAM;AAAA,IACjC,IAAI,qBAAqB,OAAO;AAAA,MAC/B;AAAA,MACA;AAAA,IACD,CAAC;AAED,QAAI,QAAQ,KAAK,WAAW;AAI3B,YAAM,SAAS,CAAC,MAAMD,aAAYC,MAAK,GAAG;AAAA,QACzC,KAAK;AAAA,QACL,MAAM,OAAO,CAAC;AAAA,MACf,CAAC;AAAA,IACF;AAEA,YAAQ,QAAQ,KAAK;AAErB,UAAM,gBAAgB,MAAM,GAAG,EAAE;AACjC,UAAM,kCAAkC,iBAAiB,iBAAiB,aAAa;AAEvF,UAAM,IAAI,CAAC,SAAS;AACnB,UAAI,CAAC,OAAQ;AAKb,UAAI,kBAAkB,QAAQ,iCAAiC;AAC9D;AAAA,MACD;AAEA,YAAM,CAACF,SAAQ,GAAG,KAAK,IAAI;AAE3B,UAAIA,YAAW,UAAU;AAMxB,YAAI,cAAc,KAAK,CAAC,WAAW,OAAO,OAAO,MAAM,CAAC,CAAC,GAAG;AAC3D;AAAA,QACD;AAAA,MACD;AAEA,aAAO,MAAMA,SAAQ,OAAO;AAAA,QAC3B,KAAK;AAAA,QACL,MAAM,OAAO,CAAC;AAAA,MACf,CAAC;AAAA,IACF,CAAC;AAED,QAAI,CAAC,QAAQ,KAAK,WAAW;AAK5B,cAAQ,KAAK,YAAY;AAAA,IAC1B;AAEA,UAAM,OAAO,OAAO;AAEpB,YAAQ,KAAK,YAAY,QAAQ,KAAK,YAAY;AAAA,EACnD;AAGA,QAAM,EAAE,OAAO,aAAa,IAAI,oBAAoB;AAAA,IACnD;AAAA,IACA;AAAA,EACD,CAAC;AAMD,QAAM,OAAO,CAAC,QAAQ,OAAO,SAAS,SAAS;AAI9C,UAAM,MAAM,SAAS,WAAW,gBAAgB;AAEhD,UAAM,QAAQ,SAAS,GAAG;AAC1B,UAAM,UAAU,MAAM;AAEtB,UAAM,UAAU,MAAM;AACrB,YAAM,EAAE,MAAM,IAAI,YAAY,IAAI;AAClC,YAAM,CAAC,aAAa,WAAW,IAAI,MAAM;AAEzC,aAAO,MAAM;AAAA,QACZ,CAAC,CAAC,MAAMJ,OAAM,CAAC,MAAMO,KAAI,CAAC,MACzBA,UAAS,YAAY,MAAM,IAAI,IAAI,KAAK,OAAO,MAAM,WAAW,KAAK,OAAOP,OAAM,WAAW;AAAA,MAC/F;AAAA,IACD;AAEA,QAAI,aAAa,KAAK,CAAC,SAAS,iBAAiB,CAAC,QAAQ,GAAG;AAC5D,eAAS,GAAG,eAAe;AAC3B;AAAA,IACD;AAkBA,QAAI,aAAa,KAAK,QAAQ;AAC7B,WAAK,MAAM;AAAA,IACZ;AAEA,UAAM,MAAM;AACZ,gCAA4B,GAAG;AAC/B,QAAI,MAAM,WAAW,WAAW,EAAE,OAAO,WAAW,QAAQ,UAAU,GAAG,IAAI;AAC7E,aAAS,GAAG,WAAW,UAAU;AACjC,QAAI,MAAM,QAAQ;AAElB,UAAM,CAAC,MAAM,IAAI,IAAI,QAAQ,CAAC;AAM9B,QAAI,SAAS,UAAU,cAAc,KAAK,MAAM,IAAI,IAAI,GAAG;AAC1D,kBAAY,OAAO,CAAC,SAAS;AAC5B,aAAK,QAAQ,KAAK,MAAM,OAAO,CAACC,UAASA,UAAS,OAAO;AAEzD,eAAO;AAAA,MACR,CAAC;AAAA,IACF;AAKA,kBAAc,KAAK;AAInB,UAAM,MAAM;AAAA,EACb;AAGA,QAAM,OAAO,YAAY;AAIxB,UAAM,QAAQ,SAAS,gBAAgB;AAEvC,UAAM,kBAAkB,MAAM;AAE9B,UAAM,KAAK;AAKX,QAAI,OAAO,iBAAiB,MAAM,KAAK,KAAK,CAAC,MAAM,UAAU;AAC5D;AAAA,IACD;AAEA,UAAM,QAAQ,MAAM,KAAK;AAAA,EAC1B;AAEA,QAAM,IAAI,CAAC,KAA6B,SAA6B;AACpE,WAAO,YAAY,IAAiB,EAAE,SAAS,GAAG;AAAA,EACnD;AAQA,QAAM,UAAU,OAAOA,OAAY,SAAqD;AACvF,QAAI,QAAQ,KAAK,GAAG;AACnB,aAAO,QAAQ,QAAQ;AAAA,QACtB,QAAQ,CAAC;AAAA,MACV,CAAC;AAAA,IACF;AAEA,UAAM,CAAC,MAAMD,KAAI,IAAIC;AAErB,UAAM,MAAM,SAAS,WAAW,IAAI;AAEpC,UAAM,EAAE,MAAM,IAAI,MAAM,MAAM,IAAI;AAElC,QAAI,MAAO,KAAI,QAAQ,IAAI;AAE3B,UAAM,EAAE,MAAM,IAAI,MAAM,mBAAmB;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACD,CAAC;AAED,QAAI,QAAQ,KAAK;AAGjB,QAAI,KAAK,YAAY;AACrB,QAAI,KAAK,UAAU;AAEnB,UAAM,YAAY,qBAAqB,OAAO;AAAA,MAC7C,MAAM;AAAA,IACP,CAAC;AAED,aAAS,GAAG,EAAE,KAAK,MAAMA,KAAI,CAAC;AAE9B,UAAM,SAAmB,CAAC;AAC1B,UAAM,eAAgC,CAAC;AAEvC,UAAM,UAAU,IAAI,CAAC,CAACG,SAAW,QAAK,MAAM;AAC3C,UAAI,cAAcA,OAAM,EAAG;AAC3B,UAAIA,YAAW,UAAW;AAC1B,UAAIA,YAAW,MAAO;AAEtB,YAAM,cAAc,WAAW;AAAA,QAC9B,QAAAA;AAAA,QACA;AAAA,QAEA;AAAA,QAEA,MAAM,qBAAqB,WAAW;AAAA,QACtC,QAAQ,mBAAmB,WAAW;AAAA,QAEtC,QAAQ,OAAO,KAAK,KAAK,MAAM;AAAA,QAC/B;AAAA,MACD,CAAC;AAED,mBAAa,KAAK,WAAW;AAE7B,aAAO,MAAMA,SAAQ,OAAO;AAAA,QAC3B;AAAA,QACA,MAAAJ;AAAA,MACD,CAAC;AAAA,IACF,CAAC;AAED,UAAM,QAAQ,IAAI,YAAY;AAE9B,WAAO;AAAA,MACN;AAAA,IACD;AAAA,EACD;AAGA,QAAM,gBAAgB,CAAC,SAAiB;AACvC,cAAU,OAAO,IAAI;AAAA,EACtB;AAEA,QAAM,gBAAgB,CAAC,YAA8B;AACpD,WAAO,SAAS,OAAO,EAAE,MAAM,CAAC;AAAA,EACjC;AAEA,QAAM,mBAAmB,CAAC,YAA8B;AACvD,UAAM,QAAQ,SAAS,OAAO;AAE9B,UAAM,QAAS,CAAC,UAAU;AACzB,YAAM,SAAS,cAAc,OAAO;AAEpC,UAAI,CAAC,OAAO;AACX,eAAO;AAAA,MACR;AAEA,YAAM,OAAO;AACb,YAAM,MAAM,WAAW,KAAK,IAAI,MAAM,IAAI,IAAI,UAAU,MAAM,KAAK;AAEnE,YAAM,MAAM,CAAC,IAAI;AAEjB,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AAEA,QAAM,yBAAyB,CAAC,SAAe;AAC9C,UAAM,WAAW,YAAY,IAAiB;AAE9C,QAAID,QAAO,CAAC,UAAU;AACrB,YAAM,IAAI;AAAA,QACT,wCAAwC,QAAQ,2BAA2B,UAAU,KAAK,IAAI,CAAC;AAAA,MAChG;AAAA,IACD;AAEA,WAAO,WAAW,SAAS,gBAAgB,2BAA2B,IAAI,CAAC;AAAA,EAC5E;AAEA,QAAM,8BAA8B,CAAC,QAAiB;AACrD,UAAM,gBAAgB,6BAA6B,GAAG;AACtD,UAAM,cAAc,oBAAI,IAAe;AAEvC,eAAW,QAAQ,eAAe;AACjC,yBAAmB,IAAI;AACvB,kBAAY,IAAI,KAAK,IAAI;AAAA,IAC1B;AAEA,kBAAc,SAAS;AACvB,gBAAY,QAAQ,CAAC,OAAO,GAAG,CAAC;AAAA,EACjC;AAEA,QAAM,yBAAyB,CAAC,QAAgB;AAC/C,WAAO,gBAAgB;AAAA,MACtB;AAAA,MACA;AAAA,IACD,CAAC;AAAA,EACF;AAEA,QAAM,oBAAoB,CAAC,MAAyB;AACnD,WAAO,KAAK,aAAa,WAAW,CAAC,EAAE,QAAQ;AAAA,EAChD;AAEA,QAAM,qBAAqB,CAAC,WAAmB,YAAoB;AAClE,WAAO,QAAQ,WAAW,SAAS,EAAE,SAAS,OAAO,CAAC,EAAE,IAAI,gBAAgB;AAAA,EAC7E;AAEA,QAAM,mBAAmB,CAAC,cAAyC;AAClE,UAAM,IAAI;AACV,UAAM,KAAK;AACX,UAAM,OAAO,qBAAqB,WAAW;AAE7C,QAAI,KAAK,KAAK,IAAI;AACjB,YAAM,QAAQ,GAAG,CAAC,EAAE;AAEpB,UAAI,OAAO,UAAU,UAAU;AAC9B,eAAO;AAAA,MACR;AAEA,UAAI,QAAQ,OAAO;AAClB,eAAO,MAAM,IAAI;AAAA,MAClB;AAAA,IACD;AAEA,WAAO,OAAO,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,CAAC,SAAiB;AACrC,gBAAY,OAAO,CAAC,SAAS;AAC5B,UAAI,UAAU,SAAS,IAAiB,GAAG;AAC1C,aAAK,KAAK,CAAC,IAAI;AAAA,MAChB;AAEA,UAAI,SAAS,KAAK,KAAK,CAAC,GAAG;AAC1B,4BAAoB,IAAI;AACxB,2BAAmB,IAAiB;AAAA,MACrC;AAEA,aAAO;AAAA,IACR,CAAC;AAAA,EACF;AAGA,QAAM,WAAW,eAAe;AAAA,IAC/B,gBAAgB;AAAA,IAEhB,YAAY,kBAAkB,UAAU;AAAA,IACxC;AAAA,IACA,KAAAI;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,kBAAkB,KAAK;AAAA,MACzC;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa,MAAM,qBAAqB,WAAW;AAAA,MACnD,UAAU,MAAM,SAAS,gBAAgB;AAAA,MACzC,iBAAiB,IAAI,SAAS,gBAAgB,GAAG,IAAI;AAAA,IACtD,CAAC;AAAA,IAED,iBAAiB;AAAA,IAEjB;AAAA,EACD,CAAC;AAGD,QAAM,WAAW,uBAAuB,QAAQ;AAKhD,WAAS,gBAAgB,EAAE,KAAK,OAAO;AAEvC,QAAM,aAAa,SAAS,GAAG,MAAM;AAErC,QAAM,WAAW,CAAC,QAAiB;AAClC,QAAI,IAAI,KAAK,UAAW;AAExB,UAAM,QAAQ,SAAS,GAAG;AAE1B,UAAM,UAAU,MAAM,MAAM,KAAK;AAEjC,YAAQ,CAAC,EAAE,CAAC,IAAI;AAEhB,UAAM,KAAK,OAAO;AAElB,SAAK,MAAM;AAAA,EACZ;AAEA,QAAM,OAAO,CAAC,QAAiB;AAC9B,UAAM,QAAQ,SAAS,GAAG;AAC1B,UAAM,OAAO,MAAM,MAAM,CAAC;AAE1B,aAAS,IAAI;AAAA,EACd;AAEA,QAAM,qBAA0C;AAAA,IAC/C,YAAY,SAAS;AAAA,IACrB,KAAK,KAAK;AACT,UAAI,IAAI,KAAK,UAAW;AAExB,WAAK,GAAG;AACR,aAAO,GAAG;AAAA,IACX;AAAA,IACA,QAAQ,KAAK;AACZ,UAAI,CAAC,IAAI,KAAK,QAAS,UAAS,GAAG;AAEnC,yBAAmB,KAAK,GAAG;AAE3B,UAAI,CAAC,IAAI,KAAK,QAAS,eAAc,IAAI;AAAA,IAC1C;AAAA,IACA,MAAM,mBAAmB,EAAE,QAAAC,SAAQ,OAAO,IAAI,GAAG;AAChD,UAAI,kBAAkB,YAAa;AACnC,UAAI,IAAI,KAAK,WAAW,IAAI,KAAK,UAAW;AAC5C,UAAI,CAAC,iBAAiB,CAACA,SAAQ,GAAG,KAAK,CAAmD,EAAG;AAE7F,UAAI;AACH,cAAM,aAAa,MAAM,mCAAmC;AAAA,UAC3D,MAAM,SAAS,MAAM,SAAS,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;AAAA,UAC5C,OAAO;AAAA,UACP;AAAA,QACD,CAAC;AAED,cAAM,QAAQ,WAAW,IAAI,CAAC,CAACA,SAAW,GAAAI,MAAK,MAAM;AACpD,iBAAO,WAAW;AAAA,YACjB,QAAAJ;AAAA,YACA,OAAOI;AAAA,YAEP;AAAA,YAEA,MAAM,qBAAqB,WAAW;AAAA,YACtC,QAAQ,mBAAmB,WAAW;AAAA,YAEtC,QAAQ;AAAA,YACR;AAAA,UACD,CAAC;AAAA,QACF,CAAC;AAED,cAAM,QAAQ,IAAI,KAAK;AAEvB,+BAAuB;AAAA,UACtB,GAAG,SAAS;AAAA,UACZ;AAAA,UACA,SAAS;AAAA,QACV,CAAC;AAAA,MACF,SAAS,OAAO;AACf,gBAAQ,MAAM,KAAK;AAAA,MACpB;AAAA,IACD;AAAA,EACD;AAEA,QAAM,SAAS,IAAI,cAAc,MAAM;AAGvC,QAAM,EAAE,OAAO,cAAc,IAAI,YAAY,oBAAoB;AAAA,IAChE,KAAK,EAAE,KAAK,MAAAR,OAAM,KAAK,GAAG,CAAC,IAAI,GAAG;AACjC,UAAI,IAAI,KAAK,UAAW;AAExB,iBAAW,MAAM,WAAW,IAAI,IAAI,KAAKA,KAAI,IAAI,IAAI;AAAA,IACtD;AAAA,IACA,eAAe,EAAE,KAAK,KAAK,GAAG,CAAC,UAAU,GAAG;AAC3C,UAAI,SAAS,UAAU,KAAK,QAAQ,UAAU,GAAG;AAChD,YAAI,WAAW;AAAA,UACd,KAAK,iBAAiB,UAAU;AAAA,QACjC,CAAC;AAAA,MACF,OAAO;AACN,YAAI;AAAA,UACH,OAAO,YAAY,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,OAAOS,MAAK,MAAM,CAAC,OAAO,iBAAiBA,MAAK,CAAC,CAAC,CAAC;AAAA,QACxG;AAAA,MACD;AAEA,WAAK;AAAA,IACN;AAAA,IACA,UAAU,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,GAAG;AAClC,UAAI,MAAM,MAAM,iBAAiB,MAAM,GAAG,QAAQ,OAAO,EAAE,KAAK,IAAI;AACpE,WAAK;AAAA,IACN;AAAA,IACA,WAAW,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,GAAG;AACnC,UAAI,MAAM,MAAM,iBAAiB,MAAM,GAAG,QAAQ,OAAO,EAAE,MAAM;AACjE,WAAK;AAAA,IACN;AAAA,IACA,UAAU,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,GAAG;AAClC,UAAI,MAAM,MAAM,iBAAiB,MAAM,GAAG,QAAQ,OAAO,EAAE,KAAK;AAChE,WAAK;AAAA,IACN;AAAA,IACA,UAAU,EAAE,KAAK,KAAK,GAAG,CAAC,QAAQ,IAAI,GAAG;AACxC,UAAI,MAAM,MAAM,iBAAiB,MAAM,GAAG,QAAQ,OAAO,EAAE,KAAK,QAAQ,KAAK;AAC7E,WAAK;AAAA,IACN;AAAA,IACA,WAAW,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,GAAG;AACnC,UAAI,MAAM,MAAM,iBAAiB,MAAM,GAAG,QAAQ,OAAO,EAAE,MAAM;AACjE,WAAK;AAAA,IACN;AAAA,IACA,UAAU,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,GAAG;AAClC,UAAI,MAAM,MAAM,iBAAiB,MAAM,GAAG,QAAQ,OAAO,EAAE,KAAK;AAChE,WAAK;AAAA,IACN;AAAA,IACA,MAAM,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,GAAG;AAC9B,YAAM,OAAO,qBAAqB,WAAW;AAC7C,YAAM,cAAc,SAAS,MAAM,IAAI,SAAS,QAAQ,MAAM,IAAI,SAAS,OAAO,IAAI;AAKtF,UAAI,CAAC,aAAa;AACjB,aAAK;AACL;AAAA,MACD;AAEA,UAAI,MAAM,MAAM,iBAAiB,WAAW,GAAG,MAAM;AACrD,WAAK;AAAA,IACN;AAAA,IACA,UAAU,EAAE,KAAK,KAAK,GAAG;AACxB,UAAI,MAAM,UAAU;AACpB,WAAK;AAAA,IACN;AAAA,IACA,cAAc,EAAE,KAAK,KAAK,GAAG,CAAC,WAAW,SAAS,WAAW,KAAK,GAAG;AACpE,kBAAY,gBAAgB,SAAS;AAErC,UAAIV,QAAO,CAAC,SAAS;AACpB,cAAM,IAAI,MAAM,6BAA6B,SAAS,6BAA6B;AAAA,MACpF;AAEA,UAAI,CAAC,QAAS;AAEd,UAAIA,QAAO,CAAC,WAAW,SAAS,EAAE,SAAS,OAAO,GAAG;AACpD,cAAM,IAAI,MAAM,8BAA8B,SAAS,2BAA2B,OAAO,GAAG;AAAA,MAC7F;AAEA,YAAM,SAAS,IAAI,UAAU,SAAS;AAEtC,aAAO,OAAO,WAAW,OAAO,IAAI,KAAK,SAAS;AAClD,aAAO,QAAQ,SAAS,IAAI;AAE5B,WAAK;AAAA,IACN;AAAA,IACA,cAAc,EAAE,KAAK,KAAK,GAAG,CAAC,WAAW,WAAW,OAAO,QAAQ,GAAG;AACrE,UAAI,UAAU,SAAS,EAAE,OAAO,WAAW,OAAO,UAAU,IAAI,KAAK,SAAS,EAAE,KAAK,IAAI;AAAA,IAC1F;AAAA,IACA,OAAO,EAAE,KAAK,MAAAC,OAAM,QAAQ,GAAG,CAAC,WAAW,SAAS,OAAO,GAAG;AAC7D,YAAM,OAAO,iBAAiB,SAAS;AACvC,YAAM,QAAQ,SAAS,GAAG;AAM1B,UAAI,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,KAAK,WAAW;AAC/C,cAAM,MAAM,CAAC,EAAE,KAAK,MAAMA,KAAI,CAAC;AAAA,MAChC;AAEA,UAAI,qBAAqB,QAAQ;AAEjC,UAAI,OAAO,gBAAgB,SAASA,KAAI,GAAG,gBAAgB,MAAMA,KAAI,GAAG,WAAW,SAAS,OAAO;AAAA,IACpG;AAAA,IACA,SAAS,EAAE,KAAK,KAAK,GAAG,CAAC,EAAE,GAAG;AAC7B,YAAM,EAAE,WAAW,WAAW,SAAAU,SAAQ,IAAI,IAAI;AAE9C,YAAM,SAAS,GAAG;AAAA,QACjB,MAAM,qBAAqB,WAAW;AAAA,QACtC;AAAA,QACA;AAAA,QACA,SAAAA;AAAA,QACA,OAAO,iBAAiB,GAAG;AAAA,MAC5B,CAAC;AAED,UAAI,CAAC,IAAI,KAAK,WAAW;AACxB,iBAAS,OAAO,KAAK,IAAI,IAAI,KAAK;AAAA,MACnC;AAEA,aAAO;AAAA,IACR;AAAA,IACA,OAAO,EAAE,KAAK,MAAAV,MAAK,GAAG,CAAC,UAAU,GAAG,OAAO,GAAG;AAC7C,YAAM,oBAAoB,MAAM,QAAQ,QAAQ;AAEhD,UAAI,mBAAmB;AAItB,gBAAQ,QAAQ,QAAwD;AAKxE,mBAAW;AAAA,MACZ;AAEA,YAAM,qBAAqB,QAAQ,IAAI,CAAC,CAAC,SAAS,WAAW,QAAQ,SAAS,UAAU,KAAK,MAAM;AAClG,cAAM,UAAU,MAAM,KAAK;AAC3B,cAAM,WAAW,MAAM,KAAK;AAE5B,cAAM,OAAO,qBAAqB,WAAW;AAE7C,cAAM,gBAAgB,CAAC,OAAuD;AAE7E,cAAI,CAAC,IAAI;AACR,mBAAO;AAAA,UACR;AAGA,iBAAO,GAAG;AAAA,YACT;AAAA,YACA,OAAO,cAAc,GAAG;AAAA,UACzB,CAAC;AAAA,QACF;AAEA,cAAM,SAAS,MAAM;AACpB,kBAAQ,IAAI,cAAc,MAAM,CAAC;AACjC,mBAAS,IAAI,cAAc,OAAO,CAAC;AAAA,QACpC;AAEA,eAAO;AAEP,cAAM,kBAAkB,YAAY;AACpC,cAAM,kBAAkB,MAAM;AAC7B,0BAAgB;AAAA,YACf,WAAW;AAAA,UACZ,CAAC;AAAA,QACF;AAEA,cAAM,aAAa,QAAQ,iBAAiB,KAAK,IAAI;AAErD,eAAO,CAAC,gBAAgB,SAASA,KAAI,GAAG,SAAS,UAAU,iBAAiB,UAAU;AAAA,MAOvF,CAAC;AAED,UAAID,QAAO,mBAAmB,WAAW,GAAG;AAC3C,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD;AAEA,UAAI,qBAAqB,QAAQ;AAEjC,UAAI,QAAQ,gBAAgB,UAAUC,KAAI,GAAG,oBAAoB,CAAC,aAAa;AAC9E,YAAI,CAAC,IAAI,KAAK,SAAS;AACtB,mBAAS,GAAG;AAAA,QACb;AAEA,cAAM,QAAQ,SAAS,GAAG;AAK1B,cAAM,SAAS,oBAAoB,IAAI;AAEvC,YAAID,QAAO,CAAC,mBAAmB,QAAQ,GAAG;AACzC,gBAAM,IAAI,MAAM,gFAAgF;AAAA,QACjG;AAEA,cAAM,MAAM,CAAC,EAAE,KAAK,CAAC,UAAU,WAAW,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC;AAC5D,eAAO,GAAG;AACV,sBAAc,IAAI;AAAA,MACnB,CAAC;AAAA,IACF;AAAA,IACA,KAAK,EAAE,KAAK,MAAAC,MAAK,GAAG,CAAC,KAAK,GAAG;AAC5B,YAAM,QAAQ,SAAS,GAAG;AAK1B,YAAM,MAAM,CAAC,IAAI;AAAA,QAChB,CAAC,QAAQ,KAAK;AAAA,QACd,CAAC,MAAM,EAAE;AAAA,MACV;AAEA,YAAM,MAAM,CAAC,IAAI,CAAC;AAElB,YAAM,SAAS,CAAC,GAAG;AAAA,QAClB;AAAA,QACA,MAAAA;AAAA,MACD,CAAC;AAAA,IACF;AAAA,IACA,MAAM,EAAE,KAAK,KAAK,GAAG,CAAC,MAAMK,aAAYC,MAAK,GAAG;AAI/C,UAAI,QAAQ,CAAC;AAKb,UAAI;AAAA,QACH,QAAQ;AAAA,QACRD,eAAc;AAAA,QACdC,UAAS,EAAE,OAAO,WAAW,QAAQ,UAAU;AAAA,QAC/C;AAAA,MACD;AAAA,IACD;AAAA,IACA,UAAU,EAAE,KAAK,MAAAN,MAAK,GAAG,CAAC,WAAW,QAAQ,GAAG;AAC/C,UAAID,QAAO,OAAO,OAAO,QAAQ,EAAE,WAAW,GAAG;AAChD,cAAM,IAAI,MAAM,4DAA4D;AAAA,MAC7E;AAEA,UAAI,CAAC,IAAI,KAAK,WAAW;AACxB,cAAM,MAAM,OAAO,UAAUC,KAAI,CAAC;AAElC,YAAID,QAAO,CAAC,SAAS,GAAG,GAAG;AAC1B,gBAAM,IAAI,MAAM,qCAAqC,GAAG,GAAG;AAAA,QAC5D;AAEA,YAAIA,QAAO,SAAS,GAAG,EAAE,WAAW,GAAG;AACtC,gBAAM,IAAI,MAAM,mCAAmC,GAAG,GAAG;AAAA,QAC1D;AAEA,cAAM,QAAQ,SAAS,GAAG;AAE1B,cAAM,MAAM,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AAEjD,eAAO,GAAG;AAAA,MACX;AAAA,IACD;AAAA,IACA,IAAI,EAAE,IAAI,GAAG;AACZ,UAAI,IAAI,KAAK,QAAS;AAEtB,WAAK,MAAM,KAAK;AAAA,IACjB;AAAA,IACA,MAAM,EAAE,KAAK,MAAAC,OAAM,QAAQ,GAAG,CAAC,UAAU,SAAS,KAAK,GAAG;AACzD,UAAI,qBAAqB,OAAO;AAEhC,UAAI,MAAM,gBAAgB,UAAUA,KAAI,GAAG,SAAS,SAAS,MAAM,OAAO;AAAA,IAC3E;AAAA,IACA,OAAO,EAAE,KAAK,KAAK,GAAG,CAAC,EAAE,GAAG;AAC3B,UAAI,GAAG,mBAAmB;AACzB,YAAI,qBAAqB,MAAS;AAAA,MACnC;AAEA,YAAM,QAAQ,iBAAiB,GAAG;AAClC,YAAM,OAAO,qBAAqB,WAAW;AAE7C,YAAM,SAAS,mBAAmB,KAAK,IAAI;AAAA,QAC1C,GAAG,IAAI,OAAO,EAAE;AAAA,QAChB;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,QAAQ,OAAO,KAAK;AAAA,QACpB;AAAA,QACA;AAAA,MACD,CAAC;AAED,YAAMW,QAAO,MAAM;AAClB,YAAI,GAAG,qBAAqB,CAAC,IAAI,KAAK,SAAS;AAC9C,mBAAS,GAAG;AACZ,wBAAc,IAAI;AAAA,QACnB;AAEA,aAAK;AAAA,MACN;AAEA,UAAI,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,WAAW;AAC9C,YAAI,UAAU,MAAM,GAAG;AACtB,iBAAO,KAAKA,KAAI;AAAA,QACjB,OAAO;AACN,UAAAA,MAAK;AAAA,QACN;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAAA,IACA,QAAQ,EAAE,KAAK,KAAK,GAAG,SAAS;AAC/B,UAAI,QAAQ,OAAO;AACnB,WAAK;AAAA,IACN;AAAA,IACA,KAAK,EAAE,KAAK,GAAG;AACd,WAAK;AAAA,IACN;AAAA,IACA,iBAAiB,EAAE,KAAK,KAAK,GAAG,CAAC,WAAW,SAAS,GAAG;AACvD,YAAM,UAAU,UAAU,MAAM,GAAG;AAEnC,UAAIZ,QAAO,QAAQ,WAAW,GAAG;AAChC,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD;AAEA,UAAI,IAAI,KAAK,QAAS;AAEtB,UAAI,UAAU,SAAS,EAAE,QAAQ,OAAO;AAExC,WAAK;AAAA,IACN;AAAA,IACA,KAAK,EAAE,KAAK,MAAAC,OAAM,QAAQ,GAAG,MAAM;AAClC,YAAM,SAAS,KAAK,IAAI,CAAC,YAAY,gBAAgB,SAASA,KAAI,CAAC,EAAE,KAAK,GAAG;AAE7E,UAAID,QAAO,OAAO,WAAW,GAAG;AAC/B,cAAM,IAAI,MAAM,mDAAmD;AAAA,MACpE;AAEA,UAAI,qBAAqB,MAAM;AAE/B,UAAI,KAAK,QAAQ,OAAO;AAAA,IACzB;AAAA,IACA,MAAM,KAAK,EAAE,KAAK,MAAAC,MAAK,GAAG;AACzB,UAAI,IAAI,KAAK,UAAW;AAExB,YAAM,EAAE,eAAe,IAAI,MAAM,SAAS;AAAA,QACzC,MAAM,SAAS,GAAG,EAAE,MAAM,CAAC;AAAA,QAC3B,OAAO;AAAA,QACP,kBAAkB,MAAM;AACvB,gBAAM,OAAO,CAAC,GAAG;AAAA,YAChB;AAAA,YACA,MAAAA;AAAA,UACD,CAAC;AAAA,QACF;AAAA,MACD,CAAC;AAED,UAAI,gBAAgB;AACnB,YAAI,qBAAqB,MAAS;AAClC;AAAA,MACD;AAEA,aAAO,GAAG;AAAA,IACX;AAAA,IACA,QAAQ,EAAE,KAAK,KAAK,GAAG,CAAC,MAAM,GAAG;AAChC,UAAID,QAAO,kBAAkB,QAAQ;AACpC,gBAAQ;AAAA,UACP,iFAAiF,aAAa;AAAA,QAC/F;AAEA,aAAK;AACL;AAAA,MACD;AAEA,YAAM,MAAM,YAAY,MAAM;AAE9B,UAAI,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,KAAK,aAAa,CAAC,iBAAiB,IAAI,GAAG,GAAG;AAC7E,cAAM,UAAU,YAAY;AAC3B,gBAAM,OAAO,QAAQ,MAAM,IAAI,OAAO,OAAO,MAAM,uBAAuB,GAAG;AAE7E,cAAI,SAAS,SAAS;AACrB,qBAAS,KAAK,qBAAqB,GAAG;AAAA,UACvC,WAAW,SAAS,SAAS;AAC5B,qBAAS,KAAK,aAAa,GAAG;AAAA,UAC/B,OAAO;AACN,gBAAIA,MAAK;AACR,sBAAQ,MAAM,2DAA2D,MAAM;AAAA,YAChF;AAEA;AAAA,UACD;AAGA,2BAAiB,IAAI,GAAG;AAAA,QACzB;AAEA,gBAAQ;AAAA,MACT;AAEA,WAAK;AAAA,IACN;AAAA,IACA,MAAM,EAAE,IAAI,GAAG,CAAC,KAAK,GAAG;AACvB,UAAIA,QAAO,CAAC,MAAM,KAAK,GAAG;AACzB,cAAM,IAAI,MAAM,oDAAoD,KAAK,GAAG;AAAA,MAC7E;AAEA,UAAIA,QAAO,MAAM,KAAK,EAAE,WAAW,GAAG;AACrC,cAAM,IAAI,MAAM,kDAAkD,KAAK,GAAG;AAAA,MAC3E;AAEA,UAAI,CAAC,IAAI,KAAK,WAAW;AACxB,cAAM,QAAQ,SAAS,GAAG;AAE1B,cAAM,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC;AAE/C,eAAO,GAAG;AAAA,MACX;AAAA,IACD;AAAA,EACD,CAAC;AAID,QAAM,SAAS,kBAAkB;AAAA,IAChC,iBAAiB,SAAS;AAAA,IAC1B;AAAA,IACA;AAAA,EACD,CAAC;AAID,QAAM,SAAS,OAAO,QAAiB;AACtC,UAAM,QAAQ,SAAS,GAAG;AAC1B,UAAM,CAAC,MAAM,KAAK,IAAI,MAAM;AAE5B,UAAM,EAAE,OAAO,MAAM,IAAI,MAAM,MAAM,IAAI;AAEzC,QAAI,OAAO;AACV,UAAI,QAAQ,IAAI;AAAA,IACjB;AAEA,UAAM,WAAW,MAAM;AAEvB,QAAI,OAAO;AACV,UAAI,QAAQ,KAAK;AAAA,IAClB;AAEA,QAAI,SAAS,QAAQ,GAAG;AACvB,YAAM,CAACK,SAAQ,GAAG,KAAK,IAAI;AAE3B,YAAMA,SAAQ,OAAO;AAAA,QACpB;AAAA,QACA,MAAM;AAAA,MACP,CAAC;AAAA,IACF,WAAW,OAAO,OAAO,KAAK,EAAE,KAAK,CAAC,WAAW,WAAW,QAAQ,GAAG;AAStE,YAAM,OAAO,CAAC,GAAG;AAAA,QAChB;AAAA,QACA,MAAM;AAAA,MACP,CAAC;AAAA,IACF,OAAO;AACN,YAAM,QAAQ,CAAC,GAAG;AAAA,QACjB;AAAA,QACA,MAAM;AAAA,MACP,CAAC;AAAA,IACF;AAAA,EACD;AAGA,QAAM,gBAAgB,CAAC,QAAQ,UAAU;AACxC,iBAAa,QAAQ,aAAa,IAAI;AAAA,EACvC;AAKA,QAAM,kBAAkB,CAAC,SAAuC,WAAkB;AACjF,UAAM;AAAA,MACL,MAAAJ;AAAA,MACA,MAAM,CAAC,IAAI;AAAA,IACZ,IAAI,YAAY,IAAI;AAGpB,UAAM,MAAM,UAAUA;AAGtB,UAAM,MAAM,sBAAsB,CAAC,WAAW,OAAO,KAAK,CAAC,SAAS,OAAO,IAAI,QAAQ,IAAI,IAAI,SAAS,GAAG;AAE3G,UAAMY,KAAI,YAAY,IAAI;AAC1B,UAAM,eAAeA,GAAE,UAAUA,GAAE,YAAY,IAAI,KAAK,YAAYA,GAAE,OAAO,IAAI;AAEjF,WAAO,QAAmB,KAAK,KAAKA,GAAE,QAAQA,GAAE,SAAS,WAAW;AAAA,EACrE;AAEA,QAAM,OAAQ,CAAC,UAAU;AACxB,UAAM,QAAQ,YAAY,IAAI,EAAE;AAEhC,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,MAAM,WAAW,KAAK,IAAI,MAAM,KAAK,IAAI,UAAU,OAAO,KAAc;AAE9E,gBAAY,OAAO,CAAC,SAAS;AAC5B,WAAK,OAAO;AAEZ,aAAO;AAAA,IACR,CAAC;AAED,WAAO;AAAA,EACR;AAEA,QAAM,wBAAwB,MAAM;AACnC,WAAO,SAAS,IAAI,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC,IAAI;AAAA,EAC/D;AAEA,QAAM,iBAAiB,CAACZ,UAAwC;AAC/D,QAAI,WAAW;AACd,UAAID,MAAK;AACR,cAAM,IAAI;AAAA,UACT;AAAA,QACD;AAAA,MACD;AAEA;AAAA,IACD;AAEA,gBAAY,IAAIC,KAAI;AAAA,EACrB;AAGA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,OAAO,iBAAiB,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaP,gBAAgB,SAAwC;AACvD,aAAO,gBAAgB,OAAuC;AAAA,IAC/D;AAAA;AAAA;AAAA;AAAA,IAIA,qBAAqB,SAAyC,OAAc;AAC3E,aAAO,gBAAgB,SAA0C,KAAK;AAAA,IACvE;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,UAAU;AACT,UAAI,UAAW;AAEf,iBAAW,OAAO;AAElB,iBAAW,QAAQ;AAEnB,aAAO,QAAQ;AAEf,0BAAoB,gBAAgB,iCAAiC;AAErE,kBAAY;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA,WAAW,CAACa,YAAoB;AAC/B,eAAS,OAAO,CAAC,SAAS;AACzB,aAAK,SAASA;AAEd,eAAO;AAAA,MACR,CAAC;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAiBA,YAAY,CAAC,YAAqB;AACjC,eAAS,OAAO,CAAC,SAAS;AACzB,aAAK,UAAU;AAEf,eAAO;AAAA,MACR,CAAC;AAAA,IACF;AAAA,EACD;AAED;;;A4BhtDA,IAAM,eAAe,CACpB,MACA,cACoC;AACpC,SAAO;AAAA,IACN,GAAG;AAAA,IACH,GAAG;AAAA,EACJ;AACD;;;AC1BA,IAAM,KAAK;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,OAAO;AAAA,EACP,gBAAgB;AACjB;AAIA,IAAM,KAA6C;AAAA,EAClD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,OAAO;AAAA,EACP,gBAAgB;AACjB;;;ACzEA,IAAM,gBAAgB,oBAAI,IAAsB;AAChD,IAAM,iBAAiB,oBAAI,IAAuB;AAOlD,IAAM,yBAAyB,CAAC,cAA8B;AAC7D,gBAAc,IAAI,UAAU,IAAI;AAChC,iBAAe,IAAI,UAAU,KAAK;AAElC,SAAO,MAAM;AACZ,kBAAc,OAAO,UAAU,IAAI;AACnC,mBAAe,OAAO,UAAU,KAAK;AAAA,EACtC;AACD;AAEA,iBAAiB,SAAS,SAAU,OAAO;AAC1C,aAAW,WAAW,gBAAgB;AACrC,QAAI;AACH,cAAQ,KAAK,KAAK,UAAU,KAAK;AAAA,IAClC,QAAQ;AAAA,IAAC;AAAA,EACV;AACD,CAAC;AAED,iBAAiB,QAAQ,SAAU,OAAO;AACzC,aAAW,WAAW,eAAe;AACpC,QAAI;AACH,cAAQ,KAAK,KAAK,UAAU,KAAK;AAAA,IAClC,QAAQ;AAAA,IAAC;AAAA,EACV;AACD,CAAC;AAED,IAAM,cAAc,CAAC,WAAuD;AAC3E,SAAO;AAAA,IACN,aAAa,uBAAuB;AAAA,MACnC,OAAO,MAAM;AACZ,eAAO,WAAW,IAAI;AAAA,MACvB;AAAA,MACA,MAAM,MAAM;AACX,eAAO,WAAW,KAAK;AAAA,MACxB;AAAA,IACD,CAAC;AAAA,EACF;AACD;","names":["memoize","DEV","supportsMap","supportsMap","asset","DEV","refer","audio","item","next","memoize","DEV","memoize","memoize","memoize","memoize","store","set","set","once","getStack","asset","action","DEV","DEV","action","paused","getLanguage","memoize","DEV","data","save","replace","set","action","characters","audio","type","props","asset","preview","next","t","paused"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@novely/core",
3
3
  "description": "Novely - powerful visual novel engine for creating interactive stories and games with branching narratives and rich multimedia content",
4
- "version": "0.53.0",
4
+ "version": "0.54.0-next.1",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "publishConfig": {