{
  "version": 3,
  "sources": ["../Source/FileSystem/Module/index.ts", "../Source/FileSystem/Module/Extension.ts", "../Source/FileSystem/FileSystem.ts", "../Source/String/String.ts", "../Source/FileSystem/Module/Module.ts"],
  "sourcesContent": ["/**\n * Utilities for working JavaScript/TypeScript module files.\n *\n * @module @sorrell/utilities/fs/module\n */\n/**\n * @file      index.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\nexport * as Extension from \"./Extension.ts\";\nexport * from \"./Module.ts\";\n", "/**\n * @file      Extension.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\n/* eslint-disable jsdoc/require-example */\n/* eslint-disable @typescript-eslint/typedef */\nexport /**\n       * The valid file extensions for TypeScript *source* modules.\n       */ const Source = [\n    \".ts\",\n    \".tsx\",\n    \".mts\",\n    \".cts\"\n] as const;\nexport /**\n       * The valid file extensions for TypeScript *declaration* modules.\n       */ const Declaration = [\n    \".d.ts\",\n    \".d.mts\",\n    \".d.cts\"\n] as const;\nexport /**\n       * The valid file extensions for *any* TypeScript module.\n       */ const Any = [\n    \".ts\",\n    \".tsx\",\n    \".mts\",\n    \".cts\",\n    \".d.ts\",\n    \".d.mts\",\n    \".d.cts\"\n] as const;\n/* eslint-enable @typescript-eslint/typedef */\nexport /**\n       * A {@link RegExp | regular expression} that describes all file names\n       * with a valid extension.\n       */ const IsValidRegExp: RegExp = /\\.(ts|tsx|mts|cts|d\\.ts|d\\.mts|d\\.cts)$/iu;\n/**\n * Determine whether a given {@link In | string} is a {@link Any | valid TypeScript module extension}.\n *\n * @param In - The string to test.\n *\n * @returns {In is Any} Whether the given {@link In | string} is a valid TypeScript module extension.\n */\nexport function IsValid(In: string): In is Any {\n    return IsValidRegExp.test(In);\n}\n/** The type of any valid TypeScript module file extension. */\nexport type Any = typeof Any[number];\n/** The type of any valid TypeScript *declaration* module file extension. */\nexport type Declaration = typeof Declaration[number];\n/** The type of any valid TypeScript *source* module file extension. */\nexport type Source = typeof Source[number];\n/** Specify how file extensions should be used in the context of module file names. */\nexport type Policy = \n/** An extension name is required in the given context. */\n\"Require\"\n/** Extension names are *banned* in the given context. */\n | \"Disallow\"\n/** An extension name is required *and* must be one of the extensions in this {@link ReadonlyArray}. */\n | ReadonlyArray<Any>;\n", "/**\n * @file      FileSystem.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\n// @TODO TEMPORARY\n/* eslint-disable jsdoc/require-jsdoc */\nimport * as FileSystem from \"node:fs/promises\";\nimport * as Path from \"node:path\";\nimport type { Dirent, Stats } from \"node:fs\";\nimport { basename, dirname, extname, join } from \"path\";\nimport { type FFileExtension } from \"./FileSystem.Types.ts\";\nimport { type FileHandle } from \"fs/promises\";\nimport { promises as Fs } from \"fs\";\nimport { constants as FsConstants } from \"fs\";\nimport os from \"os\";\n/* eslint-disable jsdoc/require-example */\n/**\n * Determine whether an object exists at the given {@link Path}.\n *\n * @param Path - The path to check for the existence of an object within the current file system.\n * @returns {Promise<boolean>} Whether there is an object at the given {@link Path}.\n */\nasync function PathExists(Path: string): Promise<boolean> {\n    try {\n        await Fs.access(Path, FsConstants.F_OK);\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\n/**\n * Determine whether the given {@link Extension | file extension} is valid on the current platform.\n *\n * @param Extension - The {@link FFileExtension | file extension} to test.\n * @returns {boolean} Whether the file extension is valid on the current platform.\n */\nexport function IsSupportedFileExtension(Extension: FFileExtension): boolean {\n    let NormalizedExtension: string = Extension.slice(1);\n    if (NormalizedExtension.startsWith(\".\")) {\n        NormalizedExtension = NormalizedExtension.slice(1);\n    }\n    if (NormalizedExtension.length === 0) {\n        return false;\n    }\n    if (NormalizedExtension.includes(\"/\")\n        || NormalizedExtension.includes(\"\\\\\")\n        || NormalizedExtension.includes(\"\\0\")) {\n        return false;\n    }\n    if (os.platform() === \"win32\") {\n        /* eslint-disable-next-line no-control-regex */\n        const HasIllegalCharacters: boolean = /[<>:\"/\\\\|?*\\x00-\\x1F]/u.test(NormalizedExtension);\n        if (HasIllegalCharacters) {\n            return false;\n        }\n        if (/[ .]$/u.test(NormalizedExtension)) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Given a path at which we wish to create a new file, check if a file at that\n * path already exists, and if so, then append `(${ number })` before the file\n * extension, consistent with the Windows Explorer handles conflicting file\n * names when pasting files.\n *\n * @param InPath - The path from which a safe path is derived.\n *\n * @returns {Promise<string>} The path derived from the given {@link InPath | path}\n * at which no object yet exists.\n */\nexport async function GetSafeNewPath(InPath: string): Promise<string> {\n    const DirectoryPath: string = dirname(InPath);\n    const Extension: string = extname(InPath);\n    const FileName: string = basename(InPath);\n    const BaseFileName: string = Extension === \"\"\n        ? FileName\n        : basename(InPath, Extension);\n    let CandidatePath: string = InPath;\n    let Index: number = 1;\n    while (await PathExists(CandidatePath)) {\n        const CandidateFileName: string = `${BaseFileName} (${Index})${Extension}`;\n        CandidatePath = join(DirectoryPath, CandidateFileName);\n        Index++;\n    }\n    return CandidatePath;\n}\n/* eslint-disable-next-line @typescript-eslint/typedef */\nexport const ReservedWindowsFileNames = [\n    \"CON\",\n    \"PRN\",\n    \"AUX\",\n    \"NUL\",\n    \"COM1\",\n    \"COM2\",\n    \"COM3\",\n    \"COM4\",\n    \"COM5\",\n    \"COM6\",\n    \"COM7\",\n    \"COM8\",\n    \"COM9\",\n    \"LPT1\",\n    \"LPT2\",\n    \"LPT3\",\n    \"LPT4\",\n    \"LPT5\",\n    \"LPT6\",\n    \"LPT7\",\n    \"LPT8\",\n    \"LPT9\"\n] as const;\n/* eslint-disable no-control-regex */\nexport /** A regular expression describing the characters that are not permitted in file names. */ const InvalidCharacters: RegExp = /[<>:\"/\\\\|?*\\u0000-\\u001F]/u;\n/* eslint-enable no-control-regex */\n/**\n * Determines whether the given {@link FileName} is valid within the given {@link DirectoryPath}.\n *\n * @remarks This *does* attempt to create a file at the desired path.  The file is\n * temporary iff `!PersistNewFile`, and is never created when this function\n * returns `false`.\n *\n * @param DirectoryPath - The path to the directory in which you wish to check.\n * @param FileName - The desired file name.\n * @param PersistNewFile - If specified, whether to keep the otherwise-temporary file\n * created at the desired path.  This defaults to `false`.\n * @param Extension - If provided, the function will only return `true` if\n * `FileName.endsWith(Extension)` *and* the `Extension` is a valid file extension.\n *\n * @returns {Promise<boolean>} Whether a file of the given `FileName` can be created in `DirectoryPath`.\n */\nexport async function IsValidFileNameOnSystem(DirectoryPath: string, FileName: string, PersistNewFile: boolean = false, Extension: FFileExtension | undefined = undefined): Promise<boolean> {\n    const ExtensionSafe: FFileExtension | null | \"\" = Extension !== undefined\n        ? (Extension.startsWith(\".\") && IsSupportedFileExtension(Extension))\n            ? Extension\n            : null\n        : \"\";\n    const IsExtensionImproper: boolean = (ExtensionSafe === null ||\n        ExtensionSafe === \".\" ||\n        !FileName.endsWith(ExtensionSafe));\n    if (IsExtensionImproper) {\n        return false;\n    }\n    const FilePath: string = join(DirectoryPath, FileName);\n    try {\n        const ThisFileHandle: FileHandle = await Fs.open(FilePath, \"wx\");\n        await ThisFileHandle.close();\n        if (!PersistNewFile) {\n            await Fs.unlink(FilePath);\n        }\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\n/**\n * Write a text file to a given {@link Path} having contents {@link Contents}.\n *\n * @param Path - The path of the file that will be written.\n * @param Contents - The text contents of the file to write.\n *\n * @returns {Promise<void>} A {@link Promise} that resolves when the call to {@link Fs.writeFile} resolves.\n *\n * @example\n * ```typescript\n * import { WriteTextFile } from \"@sorrell/utilities/fs\";\n * import { resolve } from \"path\";\n *\n * const MyReadMe: string = \"# ReadMe\\n\\nThis package accomplishes...\\n\";\n * const MyReadMePath: string = resolve(\".\");\n *\n * await WriteTextFile(MyReadMePath, MyReadMe);\n * ```\n */\nexport async function WriteTextFile(Path: string, Contents: string): Promise<void> {\n    await Fs.writeFile(Path, Contents, { encoding: \"utf-8\" });\n}\ntype DeletePhase = \"Scanning\" | \"Deleting\" | \"Done\";\ntype DeleteEntryKind = \"File\" | \"Directory\" | \"Other\";\ntype DeleteEntry = {\n    EntryPath: string;\n    Kind: DeleteEntryKind;\n    Size: number;\n};\ntype DeleteProgress = {\n    Phase: DeletePhase;\n    CurrentPath: string | null;\n    DiscoveredEntries: number;\n    TotalEntries: number;\n    DeletedEntries: number;\n    TotalBytes: number;\n    DeletedBytes: number;\n};\ntype DeleteWithProgressOptions = {\n    OnProgress?: (Progress: DeleteProgress) => void;\n    Signal?: AbortSignal;\n};\nfunction IsMissingFileError(ErrorValue: unknown): boolean {\n    return (typeof ErrorValue === \"object\" &&\n        ErrorValue !== null &&\n        \"code\" in ErrorValue &&\n        ErrorValue.code === \"ENOENT\");\n}\nfunction CloneProgress(Progress: DeleteProgress): DeleteProgress {\n    return { ...Progress };\n}\nasync function BuildDeletionPlan(RootPath: string, Progress: DeleteProgress, Options: DeleteWithProgressOptions): Promise<Array<DeleteEntry>> {\n    const Entries: Array<DeleteEntry> = [];\n    /* eslint-disable-next-line jsdoc/require-jsdoc */\n    async function Visit(CurrentPath: string): Promise<void> {\n        Options.Signal?.throwIfAborted();\n        Progress.Phase = \"Scanning\";\n        Progress.CurrentPath = CurrentPath;\n        Options.OnProgress?.(CloneProgress(Progress));\n        let Stats: Stats;\n        try {\n            Stats = await FileSystem.lstat(CurrentPath);\n        }\n        catch (ErrorValue) {\n            if (IsMissingFileError(ErrorValue)) {\n                return;\n            }\n            throw ErrorValue;\n        }\n        if (Stats.isDirectory()) {\n            const Children: Array<Dirent<string>> = await FileSystem.readdir(CurrentPath, {\n                withFileTypes: true\n            });\n            for (const Child of Children) {\n                await Visit(Path.join(CurrentPath, Child.name));\n            }\n            Entries.push({\n                EntryPath: CurrentPath,\n                Kind: \"Directory\",\n                Size: 0\n            });\n        }\n        else {\n            const Size: number = Stats.isFile() ? Stats.size : 0;\n            Entries.push({\n                EntryPath: CurrentPath,\n                Kind: Stats.isFile() ? \"File\" : \"Other\",\n                Size\n            });\n            Progress.TotalBytes += Size;\n        }\n        Progress.DiscoveredEntries = Entries.length;\n        Options.OnProgress?.(CloneProgress(Progress));\n    }\n    await Visit(RootPath);\n    return Entries;\n}\nexport async function DeleteWithProgress(RootPath: string, Options: DeleteWithProgressOptions = {}): Promise<void> {\n    const Progress: DeleteProgress = {\n        CurrentPath: null,\n        DeletedBytes: 0,\n        DeletedEntries: 0,\n        DiscoveredEntries: 0,\n        Phase: \"Scanning\",\n        TotalBytes: 0,\n        TotalEntries: 0\n    };\n    const Entries: Array<DeleteEntry> = await BuildDeletionPlan(RootPath, Progress, Options);\n    Progress.Phase = \"Deleting\";\n    Progress.TotalEntries = Entries.length;\n    Progress.CurrentPath = null;\n    Options.OnProgress?.(CloneProgress(Progress));\n    for (const Entry of Entries) {\n        Options.Signal?.throwIfAborted();\n        Progress.CurrentPath = Entry.EntryPath;\n        Options.OnProgress?.(CloneProgress(Progress));\n        try {\n            if (Entry.Kind === \"Directory\") {\n                await FileSystem.rmdir(Entry.EntryPath);\n            }\n            else {\n                await FileSystem.unlink(Entry.EntryPath);\n            }\n        }\n        catch (ErrorValue) {\n            if (!IsMissingFileError(ErrorValue)) {\n                throw ErrorValue;\n            }\n        }\n        Progress.DeletedEntries += 1;\n        Progress.DeletedBytes += Entry.Size;\n        Options.OnProgress?.(CloneProgress(Progress));\n    }\n    Progress.Phase = \"Done\";\n    Progress.CurrentPath = null;\n    Options.OnProgress?.(CloneProgress(Progress));\n}\nconst TsJsExtensions: Set<string> = new Set([\n    \".ts\",\n    \".tsx\",\n    \".mts\",\n    \".cts\",\n    \".js\",\n    \".jsx\",\n    \".mjs\",\n    \".cjs\"\n]);\nexport function IsValidFileSubpath(DirectoryPath: string, FilePath: string): boolean {\n    if (IsValidDirectoryPath(DirectoryPath) === false) {\n        return false;\n    }\n    if (IsValidExtensionlessFilePath(FilePath) === false) {\n        return false;\n    }\n    if (Path.isAbsolute(FilePath) === false) {\n        return true;\n    }\n    return IsPathContainedUnderDirectory(DirectoryPath, FilePath);\n}\n;\nconst IsValidDirectoryPath = (DirectoryPath: string): boolean => {\n    if (DirectoryPath.trim() === \"\") {\n        return false;\n    }\n    const NormalizedDirectoryPath: string = Path.normalize(DirectoryPath);\n    const DirectoryBaseName: string = Path.basename(NormalizedDirectoryPath);\n    return IsValidPathSegment(DirectoryBaseName);\n};\nconst IsValidExtensionlessFilePath = (FilePath: string): boolean => {\n    if (FilePath.trim() === \"\") {\n        return false;\n    }\n    const NormalizedFilePath: string = Path.normalize(FilePath);\n    if (NormalizedFilePath.endsWith(Path.sep)) {\n        return false;\n    }\n    const FileName: string = Path.basename(NormalizedFilePath);\n    if (IsValidFileName(FileName) === false) {\n        return false;\n    }\n    const Extension: string = Path.extname(FileName).toLowerCase();\n    return TsJsExtensions.has(Extension) === false;\n};\nexport function IsPathContainedUnderDirectory(ParentPath: string, ChildPath: string): boolean {\n    const ResolvedParentPath: string = Path.resolve(ParentPath);\n    const ResolvedChildPath: string = Path.resolve(ChildPath);\n    const RelativePath: string = Path.relative(ResolvedParentPath, ResolvedChildPath);\n    if (RelativePath === \"\") {\n        return false;\n    }\n    if (RelativePath === \"..\") {\n        return false;\n    }\n    if (RelativePath.startsWith(`..${Path.sep}`)) {\n        return false;\n    }\n    return Path.isAbsolute(RelativePath) === false;\n}\n;\nfunction IsValidFileName(FileName: string): boolean {\n    if (IsValidPathSegment(FileName) === false) {\n        return false;\n    }\n    if (FileName === \".\" || FileName === \"..\") {\n        return false;\n    }\n    return true;\n}\n;\nconst IsValidPathSegment = (PathSegment: string): boolean => {\n    if (PathSegment.trim() === \"\") {\n        return false;\n    }\n    /* eslint-disable-next-line no-control-regex */\n    if (/[<>:\"/\\\\|?*\\x00-\\x1F]/u.test(PathSegment)) {\n        return false;\n    }\n    if (/[. ]$/u.test(PathSegment)) {\n        return false;\n    }\n    return ReservedWindowsFileNames.every((Reserved: string): boolean => {\n        return !PathSegment.includes(Reserved);\n    });\n};\n/* eslint-enable jsdoc/require-example */\n", "/**\n * @file      String.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\nimport { dfs } from \"effect/Graph\";\nimport { FilterDefined } from \"../Array\";\n/**\n * @module String\n * Functions for manipulating strings.\n */\n// @TODO TEMPORARY.\n/* eslint-disable jsdoc/require-example */\n/**\n * Does the given {@link TestString} contain only letters?\n * This is equivalent to Python's\n * {@link https://docs.python.org/3/library/stdtypes.html#str.isalpha | isalpha} function.\n *\n * @remarks This is an alias for {@link IsAlpha}.\n *\n * @param TestString - The string that you wish to test.\n *\n * @returns {boolean} Whether the given string contains *only* (Latin alphabet) letters.\n */\nexport function IsLetters(TestString: string): boolean {\n    return /^[a-zA-Z]*$/.test(TestString);\n}\n/**\n * Does the given {@link TestString} contain only letters?\n * This is equivalent to Python's\n * {@link https://docs.python.org/3/library/stdtypes.html#str.isalpha | isalpha} function.\n *\n * @param TestString - The string that you wish to test.\n *\n * @returns {boolean} Whether the given string contains *only* (Latin alphabet) letters.\n */\nexport function IsAlpha(TestString: string): boolean {\n    return IsLetters(TestString);\n}\n/**\n * Does the given {@link TestString} contain only digits?\n *\n * This is equivalent to Python's\n * {@link https://docs.python.org/3/library/stdtypes.html#str.isnumeric | isnumeric} function.\n *\n * @param TestString - The string that you wish to test.\n *\n * @returns {boolean} Whether the given string contains *only* numeric digits.\n */\nexport function IsNumeric(TestString: string): boolean {\n    return /^\\d+$/.test(TestString);\n}\n/**\n * This function provides a convenient way to define long strings across multiple lines.\n * The linebreaks and leading indentation are removed from the final string.\n * Please see the example below for how this is to be done.\n *\n * @param Content - The given string to dedent.\n * @param IndentLength - The number of spaces for which this function will check.  This\n * is necessary only if the number of spaces used in the {@link Content} is not a multiple\n * of two.\n *\n * @returns {string} The given {@link Content}, but with the spaces at the beginning\n * of each line (excluding the first line if no spaces exist in the first line) removed.\n *\n * @example\n * ```typescript\n * import { Dedent } from \"@sorrell/utilities/string\";\n *\n * const MyLongString: string = Dedent(`Lorem ipsum dolor sit amet, consectetur adipiscing elit,\n *             sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad\n *                 minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea\n *             commodo consequat.`);\n *\n * // `MyLongString` <- `\"Lorem ipsum dolor sit amet, consectetur adipiscing elit, \\\n * sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad \\\n *     minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea \\\n * commodo consequat.\"`\n * ```\n */\nexport function Dedent(Content: string, IndentLength?: number): string {\n    const WhitespaceSubstring: string = ((): string => {\n        if (IndentLength !== undefined) {\n            return \"\\n\" + \" \".repeat(IndentLength);\n        }\n        let WhitespaceSubstring: string = \"\\n\";\n        while (true) {\n            const TestString: string = WhitespaceSubstring + \"  \";\n            if (Content.includes(TestString)) {\n                WhitespaceSubstring = TestString;\n            }\n            else {\n                break;\n            }\n        }\n        return WhitespaceSubstring;\n    })();\n    return Content.replaceAll(WhitespaceSubstring, \"\");\n}\n/**\n * Given a {@link ReadonlyArray} of `string`s (and possibly `undefined`), join the `string`s\n * with a given {@link Separator} `string`.\n *\n * @param StringArray - The {@link ReadonlyArray} of `string`s, and possibly `undefined`.\n * @param Separator - The `string` passed to {@link Array.join} on the filtered {@link StringArray}.\n *\n * @returns {string} The joined `string`s in the given {@link StringArray}, separated by\n * the given {@link Separator}.\n */\nexport function JoinDefined<ElementType extends string | undefined>(StringArray: ReadonlyArray<ElementType>, Separator: string): string {\n    const IsDefined = <Type>(Element: Type): boolean => Element !== undefined;\n    const DefinedOnly: ReadonlyArray<string> = StringArray.filter(IsDefined) as ReadonlyArray<string>;\n    return DefinedOnly.join(Separator);\n}\nexport function GetUtf8ByteLength(Text: string): number {\n    return new TextEncoder().encode(Text).length;\n}\n", "/**\n * @file      Module.ts\n * @author    Gage Sorrell <gage@sorrell.sh>\n * @copyright (c) 2026 Gage Sorrell\n * @license   MIT\n */\n/* eslint-disable jsdoc/require-example */\nimport * as Extension from \"./Extension.ts\";\nimport { InvalidCharacters, ReservedWindowsFileNames } from \"../FileSystem.ts\";\nimport { GetUtf8ByteLength } from \"../../String/String.ts\";\nexport namespace FileName {\n    /**\n     * For a given {@link FileName} and {@link ExtensionPolicy:param}, determine whether\n     * the given {@link FileName} is a valid TypeScript module file name.\n     *\n     * @param FileName - The file name to test.\n     *\n     * @param ExtensionPolicy - How the file extension (or lack of file extension) should affect\n     * the validity of the given {@link FileName}.\n     *\n     * @returns {boolean} Whether the given {@link FileName} is a valid name for a TypeScript module.\n     */\n    export function IsValid(FileName: string, ExtensionPolicy: Extension.Policy = \"Disallow\"): boolean {\n        if (FileName.length === 0) {\n            return false;\n        }\n        if (FileName === \".\" || FileName === \"..\") {\n            return false;\n        }\n        const DoesExtensionSatisfyPolicy: boolean = ((ExtensionPolicy === \"Disallow\" && !Extension.IsValidRegExp.test(FileName)) ||\n            (ExtensionPolicy === \"Require\" && Extension.IsValidRegExp.test(FileName)) ||\n            (Array.isArray(ExtensionPolicy) && ExtensionPolicy.some(FileName.endsWith)));\n        if (!DoesExtensionSatisfyPolicy) {\n            return false;\n        }\n        if (FileName.endsWith(\".\") || FileName.endsWith(\" \")) {\n            return false;\n        }\n        if (GetUtf8ByteLength(FileName) > 255) {\n            return false;\n        }\n        if (InvalidCharacters.test(FileName)) {\n            return false;\n        }\n        const FileNameWithoutDots: string | undefined = FileName.split(\".\")[0]?.toUpperCase();\n        const FileNameContainsWindowsReserved: boolean = (FileNameWithoutDots !== undefined &&\n            (ReservedWindowsFileNames as ReadonlyArray<string>).includes(FileNameWithoutDots));\n        if (FileNameContainsWindowsReserved) {\n            return false;\n        }\n        return true;\n    }\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUU,IAAM,SAAS;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAGU,IAAM,cAAc;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACJ;AAGU,IAAM,MAAM;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAKU,IAAM,gBAAwB;AAQjC,SAAS,QAAQ,IAAuB;AAC3C,SAAO,cAAc,KAAK,EAAE;AAChC;;;ACxCA,iBAA4B;AAC5B,WAAsB;AAEtB,kBAAiD;AAGjD,gBAA+B;AAC/B,IAAAA,aAAyC;AACzC,gBAAe;AA4ER,IAAM,2BAA2B;AAAA,EACpC;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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEmG,IAAM,oBAA4B;;;ACF9H,SAAS,kBAAkB,MAAsB;AACpD,SAAO,IAAI,YAAY,EAAE,OAAO,IAAI,EAAE;AAC1C;;;AC3GO,IAAU;AAAA,CAAV,CAAUC,cAAV;AAYI,WAASC,SAAQD,WAAkB,kBAAoC,YAAqB;AAC/F,QAAIA,UAAS,WAAW,GAAG;AACvB,aAAO;AAAA,IACX;AACA,QAAIA,cAAa,OAAOA,cAAa,MAAM;AACvC,aAAO;AAAA,IACX;AACA,UAAM,6BAAwC,oBAAoB,cAAc,CAAW,cAAc,KAAKA,SAAQ,KACjH,oBAAoB,aAAuB,cAAc,KAAKA,SAAQ,KACtE,MAAM,QAAQ,eAAe,KAAK,gBAAgB,KAAKA,UAAS,QAAQ;AAC7E,QAAI,CAAC,4BAA4B;AAC7B,aAAO;AAAA,IACX;AACA,QAAIA,UAAS,SAAS,GAAG,KAAKA,UAAS,SAAS,GAAG,GAAG;AAClD,aAAO;AAAA,IACX;AACA,QAAI,kBAAkBA,SAAQ,IAAI,KAAK;AACnC,aAAO;AAAA,IACX;AACA,QAAI,kBAAkB,KAAKA,SAAQ,GAAG;AAClC,aAAO;AAAA,IACX;AACA,UAAM,sBAA0CA,UAAS,MAAM,GAAG,EAAE,CAAC,GAAG,YAAY;AACpF,UAAM,kCAA4C,wBAAwB,UACrE,yBAAmD,SAAS,mBAAmB;AACpF,QAAI,iCAAiC;AACjC,aAAO;AAAA,IACX;AACA,WAAO;AAAA,EACX;AA7BO,EAAAA,UAAS,UAAAC;AAAA,GAZH;",
  "names": ["import_fs", "FileName", "IsValid"]
}
