nameable 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dist-kIDsX2Ie.mjs","names":[],"sources":["../../core/dist/index.mjs"],"sourcesContent":["import { builtinModules } from \"node:module\";\nimport { connect } from \"node:net\";\nimport { domainToASCII, domainToUnicode } from \"node:url\";\nimport { gunzipSync, gzipSync, inflateRawSync } from \"node:zlib\";\nimport { mkdir, readFile, rename, rm, rmdir, stat, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join, posix, win32 } from \"node:path\";\n//#region src/tcp-whois.ts\n/**\n* Plain whois over TCP port 43. The only code that opens a socket: unit tests inject a fake whois,\n* and the contract and live tests cover this.\n*/\nconst tcpWhois = (server, query) => new Promise((resolve, reject) => {\n\tconst chunks = [];\n\tconst socket = connect({\n\t\thost: server,\n\t\tport: 43\n\t}, () => {\n\t\tsocket.write(`${query}\\r\\n`);\n\t});\n\tconst deadline = setTimeout(() => {\n\t\tsocket.destroy();\n\t\treject(Object.assign(/* @__PURE__ */ new Error(`whois ${server} timed out`), { name: \"TimeoutError\" }));\n\t}, 1e4);\n\tsocket.on(\"close\", () => clearTimeout(deadline));\n\tsocket.on(\"data\", (chunk) => chunks.push(chunk));\n\tsocket.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf8\")));\n\tsocket.on(\"error\", reject);\n});\n//#endregion\n//#region src/check.ts\nfunction createContext(opts) {\n\treturn {\n\t\tfetch: opts.fetch ?? fetch,\n\t\twhois: opts.whois ?? tcpWhois,\n\t\tgithubToken: opts.githubToken,\n\t\tcache: /* @__PURE__ */ new Map(),\n\t\tgates: /* @__PURE__ */ new Map(),\n\t\tbackoffMs: opts.backoffMs,\n\t\tstore: opts.store,\n\t\trefresh: opts.refresh,\n\t\tnow: opts.now\n\t};\n}\nasync function run(name, channel, ctx, onResult) {\n\tlet result;\n\ttry {\n\t\tresult = await channel.check(name, ctx);\n\t} catch (err) {\n\t\tconst timedOut = err instanceof Error && err.name === \"TimeoutError\";\n\t\tresult = {\n\t\t\tchannel: channel.id,\n\t\t\tlabel: channel.label,\n\t\t\tstatus: \"unknown\",\n\t\t\tnote: timedOut ? \"timed out\" : `request failed: ${err instanceof Error ? err.message : String(err)}`\n\t\t};\n\t}\n\tonResult?.(name, result);\n\treturn result;\n}\n/**\n* Checks every name on every channel concurrently, sharing lookups and per-host limits across names.\n* A channel that throws becomes `unknown`, never `available`.\n*/\nfunction checkMany(names, channels, opts = {}) {\n\tconst ctx = createContext(opts);\n\treturn Promise.all(names.map(async (name) => ({\n\t\tname,\n\t\tresults: await Promise.all(channels.map((c) => run(name, c, ctx, opts.onResult)))\n\t})));\n}\nasync function check(name, channels, opts = {}) {\n\tconst [report] = await checkMany([name], channels, opts);\n\treturn report.results;\n}\n//#endregion\n//#region src/define.ts\n/** Every channel is built with this, so validation, result shape and failure handling are uniform. */\nfunction defineChannel(spec) {\n\treturn {\n\t\tid: spec.id,\n\t\tlabel: spec.label,\n\t\tcategory: spec.category,\n\t\tasync check(name, ctx) {\n\t\t\tconst base = {\n\t\t\t\tchannel: spec.id,\n\t\t\t\tlabel: spec.label\n\t\t\t};\n\t\t\tif (/\\p{Surrogate}/u.test(name)) return {\n\t\t\t\t...base,\n\t\t\t\tstatus: \"unavailable\",\n\t\t\t\tnote: \"names must be valid Unicode text\"\n\t\t\t};\n\t\t\tconst problem = spec.rules(name);\n\t\t\tif (problem) return {\n\t\t\t\t...base,\n\t\t\t\tstatus: \"unavailable\",\n\t\t\t\tnote: problem\n\t\t\t};\n\t\t\tconst result = {\n\t\t\t\t...base,\n\t\t\t\t...await spec.lookup(name, ctx)\n\t\t\t};\n\t\t\tfor (const key of [\"url\", \"note\"]) {\n\t\t\t\tconst value = result[key];\n\t\t\t\tif (typeof value !== \"string\" || !value.trim()) delete result[key];\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t};\n}\n/** The finding for a response the channel does not know how to read. */\nfunction unexpected(service, res) {\n\treturn {\n\t\tstatus: \"unknown\",\n\t\tnote: `${service} returned HTTP ${res.status}`\n\t};\n}\n//#endregion\n//#region src/gate.ts\n/** Limits how many tasks run at once; a finishing task hands its slot straight to the next waiter. */\nvar Gate = class {\n\tmax;\n\t#active = 0;\n\t#waiting = [];\n\tconstructor(max) {\n\t\tthis.max = max;\n\t}\n\tasync run(task) {\n\t\tif (this.#active < this.max) this.#active++;\n\t\telse await new Promise((resolve) => this.#waiting.push(resolve));\n\t\ttry {\n\t\t\treturn await task();\n\t\t} finally {\n\t\t\tconst next = this.#waiting.shift();\n\t\t\tif (next) next();\n\t\t\telse this.#active--;\n\t\t}\n\t}\n};\n/** Concurrent requests allowed per host. Whois servers ban bursts, so they get one. */\nconst LIMITS = {\n\t\"registry.npmjs.org\": 8,\n\t\"api.github.com\": 4\n};\nconst DEFAULT_LIMIT = 4;\nfunction gateFor(gates, host, max) {\n\tlet gate = gates.get(host);\n\tif (!gate) {\n\t\tgate = new Gate(max ?? LIMITS[host] ?? DEFAULT_LIMIT);\n\t\tgates.set(host, gate);\n\t}\n\treturn gate;\n}\n//#endregion\n//#region src/http.ts\nconst USER_AGENT = \"nameable (+https://www.npmjs.com/package/nameable)\";\nfunction retryable(status) {\n\treturn status === 429 || status >= 500;\n}\n/**\n* GET with a timeout and retries on network errors, 429 and 5xx (not on timeouts).\n* Returns the last response when retries run out on a retryable status, and throws when every attempt failed\n* at the network level, so callers never mistake a failure for a 404.\n*/\nasync function get(ctx, url, opts = {}) {\n\tconst { retries = 2, timeoutMs = 1e4 } = opts;\n\tconst backoffMs = ctx.backoffMs ?? 500;\n\tconst gate = gateFor(ctx.gates, new URL(url).host);\n\tlet lastError;\n\tfor (let attempt = 0; attempt <= retries; attempt++) {\n\t\tif (attempt > 0) await new Promise((r) => setTimeout(r, backoffMs * 2 ** (attempt - 1)));\n\t\ttry {\n\t\t\tconst res = await gate.run(() => ctx.fetch(url, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"user-agent\": USER_AGENT,\n\t\t\t\t\t...opts.headers\n\t\t\t\t},\n\t\t\t\tsignal: AbortSignal.timeout(timeoutMs)\n\t\t\t}));\n\t\t\tif (!retryable(res.status) || attempt === retries) return res;\n\t\t\tlastError = /* @__PURE__ */ new Error(`HTTP ${res.status}`);\n\t\t} catch (err) {\n\t\t\tif (err instanceof Error && err.name === \"TimeoutError\") throw err;\n\t\t\tlastError = err;\n\t\t}\n\t}\n\tthrow lastError instanceof Error ? lastError : new Error(String(lastError));\n}\nfunction memo(ctx, key, load) {\n\tlet hit = ctx.cache.get(key);\n\tif (!hit) {\n\t\thit = load();\n\t\tctx.cache.set(key, hit);\n\t}\n\treturn hit;\n}\n//#endregion\n//#region src/lists.ts\n/** Lists change slowly; a day keeps them close to the registry without downloading on every run. */\nconst LIST_TTL_MS = 864e5;\n/** Every list kept in the store, so clearing the cache removes exactly these files and nothing else. */\nconst LIST_KEYS = [\n\t\"pypi-projects\",\n\t\"homebrew-names\",\n\t\"crates-names\"\n];\nconst FORMAT = 1;\n/** The first line of a stored list, naming the list and its format. */\nconst listHeader = (key) => `#nameable ${key} v${FORMAT}\\n`;\n/**\n* A registry-wide list (every PyPI project, every Homebrew alias), from the store when fresh enough,\n* downloaded otherwise. A failed download falls back to an older copy; with no copy at all it throws,\n* and the channel reports that it could not run the check.\n*/\nfunction cachedList(ctx, key, download) {\n\treturn memo(ctx, `list:${key}`, async () => {\n\t\tconst now = ctx.now?.() ?? Date.now();\n\t\tconst stored = await ctx.store?.read(key);\n\t\tconst saved = stored?.text.startsWith(listHeader(key)) ? {\n\t\t\t...stored,\n\t\t\ttext: stored.text.slice(listHeader(key).length)\n\t\t} : void 0;\n\t\tconst age = saved ? now - saved.savedAt : -1;\n\t\tif (saved && !ctx.refresh && age >= 0 && age < 864e5) return {\n\t\t\t...saved,\n\t\t\tstale: false\n\t\t};\n\t\ttry {\n\t\t\tconst text = await download();\n\t\t\tawait ctx.store?.write(key, listHeader(key) + text).catch(() => void 0);\n\t\t\treturn {\n\t\t\t\ttext,\n\t\t\t\tsavedAt: now,\n\t\t\t\tstale: false\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tif (saved) return {\n\t\t\t\t...saved,\n\t\t\t\tstale: true\n\t\t\t};\n\t\t\tthrow err;\n\t\t}\n\t});\n}\n/** The values on every line of `text` whose first tab-separated field is `key`. */\nfunction linesFor(text, key) {\n\tconst found = [];\n\tconst needle = `\\n${key}\\t`;\n\tfor (let at = text.indexOf(needle); at >= 0; at = text.indexOf(needle, at + 1)) {\n\t\tconst end = text.indexOf(\"\\n\", at + 1);\n\t\tfound.push(text.slice(at + needle.length, end < 0 ? void 0 : end).split(\"\t\"));\n\t}\n\treturn found;\n}\n/** How old a stale list is, for notes. */\nconst asOf = (list) => new Date(list.savedAt).toISOString().slice(0, 10);\n//#endregion\n//#region src/zip.ts\nconst END = Buffer.from([\n\t80,\n\t75,\n\t5,\n\t6\n]);\nconst ENTRY = 33639248;\nconst LOCAL = 67324752;\nconst MAX32 = 4294967295;\n/**\n* Files named `wanted` (matched on their last path segment) from a remote zip archive, read with HTTP\n* range requests, so a few small files come out of a multi-gigabyte archive without downloading it.\n* Throws when the archive cannot be read this way (no range support, zip64, a missing file).\n*/\nasync function remoteZipFiles(ctx, url, wanted) {\n\tconst range = async (spec) => {\n\t\tconst res = await get(ctx, url, {\n\t\t\theaders: { range: `bytes=${spec}` },\n\t\t\ttimeoutMs: 12e4\n\t\t});\n\t\tif (res.status !== 206) throw new Error(`${url} answered a range request with HTTP ${res.status}`);\n\t\treturn Buffer.from(await res.arrayBuffer());\n\t};\n\tconst tail = await range(\"-65557\");\n\tconst end = tail.lastIndexOf(END);\n\tif (end < 0) throw new Error(`${url} is not a zip archive`);\n\tconst count = tail.readUInt16LE(end + 10);\n\tconst size = tail.readUInt32LE(end + 12);\n\tconst offset = tail.readUInt32LE(end + 16);\n\tif (size === MAX32 || offset === MAX32) throw new Error(`${url} is a zip64 archive`);\n\tconst dir = await range(`${offset}-${offset + size - 1}`);\n\tconst entries = [];\n\tfor (let at = 0, i = 0; i < count; i++) {\n\t\tif (dir.readUInt32LE(at) !== ENTRY) throw new Error(`${url} has a broken central directory`);\n\t\tconst nameLength = dir.readUInt16LE(at + 28);\n\t\tconst name = dir.toString(\"utf8\", at + 46, at + 46 + nameLength);\n\t\tconst file = wanted.find((w) => name === w || name.endsWith(`/${w}`));\n\t\tif (file) entries.push({\n\t\t\tfile,\n\t\t\tmethod: dir.readUInt16LE(at + 10),\n\t\t\tsize: dir.readUInt32LE(at + 20),\n\t\t\toffset: dir.readUInt32LE(at + 42)\n\t\t});\n\t\tat += 46 + nameLength + dir.readUInt16LE(at + 30) + dir.readUInt16LE(at + 32);\n\t}\n\tconst files = /* @__PURE__ */ new Map();\n\tfor (const e of entries) {\n\t\tif (e.size === MAX32 || e.offset === MAX32) throw new Error(`${url} is a zip64 archive`);\n\t\tconst header = await range(`${e.offset}-${e.offset + 29}`);\n\t\tif (header.readUInt32LE(0) !== LOCAL) throw new Error(`${url} has a broken local header`);\n\t\tconst start = e.offset + 30 + header.readUInt16LE(26) + header.readUInt16LE(28);\n\t\tconst data = e.size ? await range(`${start}-${start + e.size - 1}`) : Buffer.alloc(0);\n\t\tif (e.method === 0) files.set(e.file, data);\n\t\telse if (e.method === 8) files.set(e.file, inflateRawSync(data));\n\t\telse throw new Error(`${url} uses zip compression method ${e.method}`);\n\t}\n\tconst missing = wanted.filter((w) => !files.has(w));\n\tif (missing.length) throw new Error(`${url} has no ${missing.join(\", \")}`);\n\treturn files;\n}\n//#endregion\n//#region src/channels/crates.ts\nconst VALID$2 = /^[a-z][a-z0-9_-]{0,63}$/i;\nconst canon = (name) => name.toLowerCase().replace(/-/g, \"_\");\nconst RESERVED = new Set([\n\t\"alloc\",\n\t\"arena\",\n\t\"ast\",\n\t\"builtins\",\n\t\"collections\",\n\t\"compiler-builtins\",\n\t\"compiler-rt\",\n\t\"compiletest\",\n\t\"core\",\n\t\"coretest\",\n\t\"debug\",\n\t\"driver\",\n\t\"flate\",\n\t\"fmt_macros\",\n\t\"grammar\",\n\t\"graphviz\",\n\t\"macro\",\n\t\"macros\",\n\t\"proc_macro\",\n\t\"rbml\",\n\t\"rust-installer\",\n\t\"rustbook\",\n\t\"rustc\",\n\t\"rustc_back\",\n\t\"rustc_borrowck\",\n\t\"rustc_driver\",\n\t\"rustc_llvm\",\n\t\"rustc_resolve\",\n\t\"rustc_trans\",\n\t\"rustc_typeck\",\n\t\"rustdoc\",\n\t\"rustllvm\",\n\t\"rustuv\",\n\t\"serialize\",\n\t\"std\",\n\t\"syntax\",\n\t\"test\",\n\t\"unicode\",\n\t\"nul\",\n\t\"con\",\n\t\"prn\",\n\t\"aux\",\n\t\"com0\",\n\t\"com1\",\n\t\"com2\",\n\t\"com3\",\n\t\"com4\",\n\t\"com5\",\n\t\"com6\",\n\t\"com7\",\n\t\"com8\",\n\t\"com9\",\n\t\"lpt0\",\n\t\"lpt1\",\n\t\"lpt2\",\n\t\"lpt3\",\n\t\"lpt4\",\n\t\"lpt5\",\n\t\"lpt6\",\n\t\"lpt7\",\n\t\"lpt8\",\n\t\"lpt9\"\n].map(canon));\nconst DUMP = \"https://static.crates.io/db-dump.zip\";\n/** RFC 4180 rows as objects keyed by the header row; deletion messages hold commas, quotes and newlines. */\nfunction csv(text) {\n\tconst rows = [];\n\tlet row = [];\n\tlet field = \"\";\n\tlet quoted = false;\n\tconst endField = () => {\n\t\trow.push(field);\n\t\tfield = \"\";\n\t};\n\tfor (let i = 0; i < text.length; i++) {\n\t\tconst c = text[i];\n\t\tif (quoted && c === \"\\\"\" && text[i + 1] === \"\\\"\") {\n\t\t\tfield += \"\\\"\";\n\t\t\ti++;\n\t\t} else if (c === \"\\\"\") quoted = !quoted;\n\t\telse if (!quoted && c === \",\") endField();\n\t\telse if (!quoted && c === \"\\n\") {\n\t\t\tendField();\n\t\t\trows.push(row);\n\t\t\trow = [];\n\t\t} else field += c;\n\t}\n\tif (field || row.length) {\n\t\tendField();\n\t\trows.push(row);\n\t}\n\tconst [head = [], ...body] = rows;\n\treturn body.map((r) => Object.fromEntries(head.map((h, i) => [h, r[i] ?? \"\"])));\n}\n/** A dump timestamp (`2024-11-18 09:03:35.16643+00`) in ISO form, or undefined when it is not one. */\nconst isoTime = (value = \"\") => /^(\\d{4}-\\d{2}-\\d{2}) (\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?)\\+00$/.exec(value)?.slice(1).join(\"T\").concat(\"Z\");\n/** Reserved names and names still blocked after a deletion, one `canon\\treserved` or `canon\\tdeleted\\tuntil` line each. */\nasync function nameList$1(ctx) {\n\tconst files = await remoteZipFiles(ctx, DUMP, [\"reserved_crate_names.csv\", \"deleted_crates.csv\"]);\n\tconst reserved = csv(files.get(\"reserved_crate_names.csv\").toString(\"utf8\"));\n\tconst deleted = csv(files.get(\"deleted_crates.csv\").toString(\"utf8\"));\n\tif (!reserved.length || !reserved.every((r) => r.name) || !deleted.length || !deleted.every((d) => d.name && isoTime(d.available_at))) throw new Error(\"crates.io database dump is not in the expected shape\");\n\tconst now = ctx.now?.() ?? Date.now();\n\tconst lines = reserved.map((r) => `${canon(r.name)}\\treserved`);\n\tfor (const d of deleted) {\n\t\tconst until = isoTime(d.available_at);\n\t\tif (Date.parse(until) > now) lines.push(`${canon(d.name)}\\tdeleted\\t${until}`);\n\t}\n\treturn `\\n${lines.join(\"\\n\")}\\n`;\n}\nconst crates = defineChannel({\n\tid: \"crates\",\n\tlabel: \"crates.io\",\n\tcategory: \"package\",\n\trules: (name) => {\n\t\tif (!VALID$2.test(name)) return \"crate names start with a letter and use letters, digits, - and _ (max 64)\";\n\t\tif (RESERVED.has(canon(name))) return \"crates.io reserves this name\";\n\t},\n\tasync lookup(name, ctx) {\n\t\tconst res = await get(ctx, `https://crates.io/api/v1/crates/${name}`);\n\t\tif (res.status === 404) {\n\t\t\tlet list;\n\t\t\ttry {\n\t\t\t\tlist = await cachedList(ctx, \"crates-names\", () => nameList$1(ctx));\n\t\t\t} catch {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"available\",\n\t\t\t\t\tcertainty: \"probable\",\n\t\t\t\t\tnote: \"could not read crates.io's database dump to check reserved and recently deleted names\"\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst now = ctx.now?.() ?? Date.now();\n\t\t\tfor (const [kind, until] of linesFor(list.text, canon(name))) {\n\t\t\t\tif (kind === \"reserved\") return {\n\t\t\t\t\tstatus: \"unavailable\",\n\t\t\t\t\tnote: \"crates.io reserves this name\"\n\t\t\t\t};\n\t\t\t\tif (kind === \"deleted\" && Date.parse(until) > now) return {\n\t\t\t\t\tstatus: \"unavailable\",\n\t\t\t\t\tnote: `recently deleted; crates.io frees the name after ${until.slice(0, 16).replace(\"T\", \" \")} UTC`\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn list.stale ? {\n\t\t\t\tstatus: \"available\",\n\t\t\t\tcertainty: \"probable\",\n\t\t\t\tnote: `checked against crates.io's database dump from ${asOf(list)}`\n\t\t\t} : {\n\t\t\t\tstatus: \"available\",\n\t\t\t\tcertainty: \"confirmed\"\n\t\t\t};\n\t\t}\n\t\tif (res.status !== 200) return unexpected(\"crates.io\", res);\n\t\tconst { crate } = await res.json();\n\t\treturn {\n\t\t\tstatus: \"taken\",\n\t\t\turl: `https://crates.io/crates/${crate.name}`,\n\t\t\tnote: crate.description?.trim() || void 0,\n\t\t\tmeta: {\n\t\t\t\tname: crate.name,\n\t\t\t\tupdated: crate.updated_at,\n\t\t\t\tdownloads: crate.downloads\n\t\t\t}\n\t\t};\n\t}\n});\n//#endregion\n//#region src/whois.ts\nconst IANA = \"whois.iana.org\";\n/** One query, at most one at a time per server: whois servers ban bursts. */\nfunction whoisQuery(ctx, server, query) {\n\treturn gateFor(ctx.gates, `whois:${server}`, 1).run(() => ctx.whois(server, query));\n}\n/** The registry's whois server for a TLD, as IANA refers it, or undefined when it lists none. */\nfunction whoisServer(ctx, tld) {\n\treturn memo(ctx, `whois-server:${tld}`, async () => {\n\t\tconst text = await whoisQuery(ctx, IANA, tld);\n\t\treturn /^whois:[ \\t]*(\\S+)/im.exec(text)?.[1];\n\t});\n}\nconst FREE = [\n\t/^domain not found/im,\n\t/^not found/im,\n\t/^no match/im,\n\t/^no data found/im,\n\t/^no entries found/im,\n\t/^the queried object does not exist/im,\n\t/^status:\\s*free\\s*$/im,\n\t/^status:\\s*available\\s*$/im\n];\nconst REGISTERED = [\n\t/^domain name:\\s*\\S/im,\n\t/^domain:\\s*\\S/im,\n\t/^\\[domain name\\]\\s*\\S/im\n];\nconst NOTICE = /^\\s*(%|#|>>>|\\[ |NOTICE|TERMS)/;\nfunction readWhois(text) {\n\tconst body = text.split(/\\r?\\n/).filter((line) => !NOTICE.test(line)).map((line) => line.trim()).join(\"\\n\");\n\tif (FREE.some((re) => re.test(body))) return \"free\";\n\tif (REGISTERED.some((re) => re.test(body))) return \"registered\";\n\treturn \"unrecognized\";\n}\n//#endregion\n//#region src/channels/domain.ts\nconst BOOTSTRAP = \"https://data.iana.org/rdap/dns.json\";\nconst LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;\n/** RDAP base URL for a TLD from IANA's bootstrap registry, or undefined when the TLD has no RDAP service. */\nasync function rdapBase(ctx, tld) {\n\tconst service = (await memo(ctx, BOOTSTRAP, async () => {\n\t\tconst res = await get(ctx, BOOTSTRAP);\n\t\tif (!res.ok) throw new Error(`IANA RDAP bootstrap returned HTTP ${res.status}`);\n\t\treturn await res.json();\n\t})).services.find(([tlds]) => tlds.includes(tld));\n\tconst url = service?.[1].find((u) => u.startsWith(\"https://\")) ?? service?.[1][0];\n\treturn url && (url.endsWith(\"/\") ? url : `${url}/`);\n}\nasync function viaWhois(ctx, fqdn, tld, url) {\n\tconst base = { url };\n\tconst server = await whoisServer(ctx, tld);\n\tif (!server) return {\n\t\t...base,\n\t\tstatus: \"unknown\",\n\t\tnote: `.${tld} has neither RDAP nor whois`\n\t};\n\tconst text = await whoisQuery(ctx, server, fqdn);\n\tconst answer = readWhois(text);\n\tif (answer === \"free\") return {\n\t\t...base,\n\t\tstatus: \"available\",\n\t\tcertainty: \"probable\",\n\t\tnote: freeNote(tld, \" (whois)\")\n\t};\n\tif (answer === \"registered\") {\n\t\tconst registered = /^\\s*(?:creation date|created|registered on):\\s*(\\d{4}-\\d{2}-\\d{2})/im.exec(text)?.[1];\n\t\treturn {\n\t\t\t...base,\n\t\t\tstatus: \"taken\",\n\t\t\tnote: registered ? `registered ${registered} (whois)` : \"registered (whois)\",\n\t\t\tmeta: {\n\t\t\t\tregistered,\n\t\t\t\twhois: server\n\t\t\t}\n\t\t};\n\t}\n\treturn {\n\t\t...base,\n\t\tstatus: \"unknown\",\n\t\tnote: `unrecognized whois answer from ${server}`\n\t};\n}\n/** Why a free answer is still only probable. IDN TLDs (`xn--…`) also limit which scripts they take. */\nconst freeNote = (tld, via) => `not registered${via}; premium or reserved names can still be refused` + (tld.startsWith(\"xn--\") ? \", and this TLD accepts only some scripts\" : \"\") + \", confirm at a registrar\";\n/** `tld` is in its ASCII (punycode) form; `display` is how to show it. */\nfunction domain(tld, display = tld) {\n\treturn defineChannel({\n\t\tid: `domain:${tld}`,\n\t\tlabel: `.${display}`,\n\t\tcategory: \"domain\",\n\t\trules: (name) => {\n\t\t\tconst ascii = domainToASCII(name);\n\t\t\tconst unicode = domainToUnicode(ascii);\n\t\t\tif (/\\P{ASCII}/u.test(unicode) && /[^\\p{L}\\p{M}\\p{N}-]/u.test(unicode)) return \"internationalized domain labels may only use letters, marks and digits (no emoji or symbols)\";\n\t\t\tif (!LABEL.test(ascii)) return \"domain labels are letters, digits and inner hyphens (max 63)\";\n\t\t\tif (ascii.slice(2, 4) === \"--\" && !ascii.startsWith(\"xn--\")) return \"domain labels cannot have \\\"--\\\" in the 3rd and 4th position\";\n\t\t},\n\t\tasync lookup(name, ctx) {\n\t\t\tconst fqdn = `${domainToASCII(name)}.${tld}`;\n\t\t\tconst url = `https://lookup.icann.org/en/lookup?name=${fqdn}`;\n\t\t\tconst rdap = await rdapBase(ctx, tld).catch(() => void 0);\n\t\t\tif (!rdap) return viaWhois(ctx, fqdn, tld, url);\n\t\t\tconst res = await get(ctx, `${rdap}domain/${fqdn}`, { headers: { accept: \"application/rdap+json\" } });\n\t\t\tif (res.status === 404) return {\n\t\t\t\tstatus: \"available\",\n\t\t\t\tcertainty: \"probable\",\n\t\t\t\turl,\n\t\t\t\tnote: freeNote(tld, \"\")\n\t\t\t};\n\t\t\tif (res.status !== 200) return {\n\t\t\t\t...unexpected(\"RDAP\", res),\n\t\t\t\turl\n\t\t\t};\n\t\t\tconst doc = await res.json();\n\t\t\tconst event = (action) => doc.events?.find((e) => e.eventAction === action)?.eventDate.slice(0, 10);\n\t\t\tconst registered = event(\"registration\");\n\t\t\tconst expires = event(\"expiration\");\n\t\t\treturn {\n\t\t\t\tstatus: \"taken\",\n\t\t\t\turl,\n\t\t\t\tnote: [registered && `registered ${registered}`, expires && `expires ${expires}`].filter(Boolean).join(\", \") || void 0,\n\t\t\t\tmeta: {\n\t\t\t\t\tregistered,\n\t\t\t\t\texpires\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\n//#endregion\n//#region src/channels/github.ts\nconst VALID$1 = /^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}$/i;\nconst github = defineChannel({\n\tid: \"github\",\n\tlabel: \"GitHub user/org\",\n\tcategory: \"code\",\n\trules: (name) => VALID$1.test(name) ? void 0 : \"GitHub names are letters, digits and single inner hyphens (max 39)\",\n\tasync lookup(name, ctx) {\n\t\tconst headers = { accept: \"application/vnd.github+json\" };\n\t\tif (ctx.githubToken) headers.authorization = `Bearer ${ctx.githubToken}`;\n\t\tconst res = await get(ctx, `https://api.github.com/users/${name}`, { headers });\n\t\tif (res.status === 200) {\n\t\t\tconst user = await res.json();\n\t\t\treturn {\n\t\t\t\tstatus: \"taken\",\n\t\t\t\turl: `https://github.com/${user.login}`,\n\t\t\t\tnote: `${user.type}, ${user.public_repos} public repos, updated ${user.updated_at.slice(0, 10)}`,\n\t\t\t\tmeta: {\n\t\t\t\t\ttype: user.type,\n\t\t\t\t\tpublicRepos: user.public_repos,\n\t\t\t\t\tupdated: user.updated_at\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tif (res.status === 404) return {\n\t\t\tstatus: \"available\",\n\t\t\tcertainty: \"probable\",\n\t\t\tnote: \"suspended, deleted or reserved accounts also look free; confirm on GitHub's sign-up page\"\n\t\t};\n\t\tif (res.status === 401) return {\n\t\t\tstatus: \"unknown\",\n\t\t\tnote: \"GitHub rejected the token (HTTP 401); check GITHUB_TOKEN\"\n\t\t};\n\t\tif (res.status === 403 || res.status === 429) return {\n\t\t\tstatus: \"unknown\",\n\t\t\tnote: \"rate limited; set GITHUB_TOKEN or log in with `gh auth login`\"\n\t\t};\n\t\treturn unexpected(\"GitHub\", res);\n\t}\n});\n//#endregion\n//#region src/channels/homebrew.ts\nconst API = \"https://formulae.brew.sh/api\";\nfunction auditorProblem(name) {\n\tif (/[A-Z]/.test(name)) return \"uppercase letters\";\n\tif (/\\s/.test(name)) return \"whitespace\";\n\tif (/[^\\x20-\\x7e]/.test(name)) return \"non-ASCII characters\";\n\tif (name.includes(\"--\")) return \"double hyphens\";\n\tif (name.startsWith(\"@\")) return \"a leading @\";\n\tif (name.endsWith(\"@\")) return \"a trailing @\";\n\tif (name.startsWith(\"-\")) return \"a leading hyphen\";\n\tif (name.endsWith(\"-\")) return \"a trailing hyphen\";\n\tif ((name.match(/@/g) ?? []).length > 1) return \"multiple @ symbols\";\n\tif (name.includes(\"-@\")) return \"a hyphen followed by an @\";\n\tif (name.includes(\"@-\")) return \"an @ followed by a hyphen\";\n}\nconst formulaClass = (name) => (name.charAt(0).toUpperCase() + name.slice(1)).replace(/[-_.\\s]([a-zA-Z0-9])/g, (_, c) => c.toUpperCase()).replaceAll(\"+\", \"x\").replace(/(.)@(\\d)/, \"$1AT$2\");\nconst CONSTANT = /^[A-Z]\\w*$/;\nconst DISALLOWED = /^(?:gem|rubygems?|pip|pil|macruby|gsutil|gfortran|play|haskell-platform|mysqldump-secure|ngrok|cargo|cargo-completion|uconv|postgresql|postgres)$/;\nconst disallowed = (name) => DISALLOWED.test(name) || /(?:lib)?lzma/.test(name);\n/**\n* Every name homebrew/core and homebrew/cask hold: formulae with their aliases and old names, casks with\n* their old tokens, one `name\\tkind\\ttarget` line each (about 7 MB to download).\n*/\nasync function nameList(ctx) {\n\tconst load = async (path) => {\n\t\tconst res = await get(ctx, `${API}/${path}`, { timeoutMs: 12e4 });\n\t\tif (!res.ok) throw new Error(`Homebrew ${path} returned HTTP ${res.status}`);\n\t\treturn res.json();\n\t};\n\tconst [formulae, casks] = await Promise.all([load(\"formula.json\"), load(\"cask.json\")]);\n\tconst isList = (x, key, arrays) => Array.isArray(x) && x.length > 0 && x.every((e) => typeof e?.[key] === \"string\" && arrays.every((a) => Array.isArray(e[a])));\n\tif (!isList(formulae, \"name\", [\"aliases\", \"oldnames\"]) || !isList(casks, \"token\", [\"old_tokens\"])) throw new Error(\"Homebrew name lists are not in the expected shape\");\n\tconst lines = [];\n\tfor (const f of formulae) {\n\t\tlines.push(`${f.name}\\tformula\\t${f.name}`);\n\t\tfor (const a of f.aliases) lines.push(`${a}\\talias\\t${f.name}`);\n\t\tfor (const o of f.oldnames) lines.push(`${o}\\told name\\t${f.name}`);\n\t}\n\tfor (const c of casks) {\n\t\tlines.push(`${c.token}\\tcask\\t${c.token}`);\n\t\tfor (const o of c.old_tokens) lines.push(`${o}\\told cask token\\t${c.token}`);\n\t}\n\treturn `\\n${lines.join(\"\\n\")}\\n`;\n}\nconst homebrew = defineChannel({\n\tid: \"homebrew\",\n\tlabel: \"Homebrew\",\n\tcategory: \"package\",\n\trules: (name) => {\n\t\tif (!name) return \"Homebrew names cannot be empty\";\n\t\tconst problem = auditorProblem(name);\n\t\tif (problem) return `Homebrew names must not contain ${problem}`;\n\t\tif (!CONSTANT.test(formulaClass(name))) return \"Homebrew formula names start with a letter and use letters, digits, + . _ - and @ before a version\";\n\t\tif (disallowed(name)) return \"homebrew/core does not allow this name\";\n\t},\n\tasync lookup(name, ctx) {\n\t\tconst [formula, cask] = await Promise.all([get(ctx, `${API}/formula/${name}.json`), get(ctx, `${API}/cask/${name}.json`)]);\n\t\tfor (const [kind, res] of [[\"formula\", formula], [\"cask\", cask]]) if (res.status === 200) {\n\t\t\tconst { desc } = await res.json();\n\t\t\treturn {\n\t\t\t\tstatus: \"taken\",\n\t\t\t\turl: `https://formulae.brew.sh/${kind}/${name}`,\n\t\t\t\tnote: desc,\n\t\t\t\tmeta: { kind }\n\t\t\t};\n\t\t}\n\t\tif (formula.status !== 404 || cask.status !== 404) return {\n\t\t\tstatus: \"unknown\",\n\t\t\tnote: `Homebrew API returned HTTP ${formula.status}/${cask.status}`\n\t\t};\n\t\tlet list;\n\t\ttry {\n\t\t\tlist = await cachedList(ctx, \"homebrew-names\", () => nameList(ctx));\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tstatus: \"available\",\n\t\t\t\tcertainty: \"probable\",\n\t\t\t\tnote: \"could not download Homebrew's alias list to check aliases and old names\"\n\t\t\t};\n\t\t}\n\t\tconst [hit] = linesFor(list.text, name);\n\t\tif (hit) {\n\t\t\tconst [kind, target] = hit;\n\t\t\treturn {\n\t\t\t\tstatus: \"taken\",\n\t\t\t\turl: `https://formulae.brew.sh/${kind.includes(\"cask\") ? \"cask\" : \"formula\"}/${target}`,\n\t\t\t\tnote: target === name ? void 0 : `${kind} of ${target}`,\n\t\t\t\tmeta: {\n\t\t\t\t\tkind,\n\t\t\t\t\ttarget\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\treturn list.stale ? {\n\t\t\tstatus: \"available\",\n\t\t\tcertainty: \"probable\",\n\t\t\tnote: `checked against Homebrew's names from ${asOf(list)}`\n\t\t} : {\n\t\t\tstatus: \"available\",\n\t\t\tcertainty: \"confirmed\",\n\t\t\tnote: \"no homebrew-core formula or cask\"\n\t\t};\n\t}\n});\n//#endregion\n//#region src/channels/npm.ts\nconst REGISTRY = \"https://registry.npmjs.org\";\nconst EXCLUDED = /* @__PURE__ */ new Set([\"node_modules\", \"favicon.ico\"]);\nconst SCOPED = /^(?:@([^/]+?)[/])?([^/]+?)$/;\n/**\n* validate-npm-package-name's `validForNewPackages` (lib/index.js, v7): a new package must have no\n* errors and no warnings. Returns the first reason, in the validator's order.\n*/\nfunction problem(name) {\n\tif (!name.length) return \"npm names cannot be empty\";\n\tif (name.startsWith(\".\")) return \"npm names cannot start with a period\";\n\tif (name.startsWith(\"-\")) return \"npm names cannot start with a hyphen\";\n\tif (name.startsWith(\"_\")) return \"npm names cannot start with an underscore\";\n\tif (name.trim() !== name) return \"npm names cannot have leading or trailing spaces\";\n\tif (EXCLUDED.has(name.toLowerCase())) return `${name} is not a valid npm name`;\n\tif (builtinModules.includes(name.toLowerCase())) return \"npm reserves Node.js core module names\";\n\tif (name.length > 214) return \"npm names are at most 214 characters\";\n\tif (name.toLowerCase() !== name) return \"npm names must be lowercase\";\n\tif (/[~'!()*]/.test(name.split(\"/\").at(-1))) return \"npm names cannot contain ~ ' ! ( ) *\";\n\tif (encodeURIComponent(name) !== name) {\n\t\tconst match = SCOPED.exec(name);\n\t\tconst [user, pkg] = [match?.[1], match?.[2]];\n\t\tif (match && pkg?.startsWith(\".\")) return \"npm names cannot start with a period\";\n\t\tconst urlSafe = (s) => s !== void 0 && encodeURIComponent(s) === s;\n\t\tif (!(match && urlSafe(user) && urlSafe(pkg))) return \"npm names may only contain URL-safe characters\";\n\t}\n}\nconst squash = (s) => s.replace(/[-_.]/g, \"\");\n/**\n* npm refuses an unscoped name that equals an existing package once punctuation is removed\n* (`first-one` vs `firstone`, `babelpresetenv` vs `babel-preset-env`). The registry has no lookup for\n* that, so this catches the common cases: it searches both spellings (search does not surface\n* `firstone` for `first-one`) and, for a name without punctuation, probes every single-hyphen\n* spelling (search never surfaces `lodash-es` for `lodashes`). Spellings with several separators\n* cannot all be probed, so a name that passes is only probably free.\n*/\nconst SEARCH_LENGTH = {\n\tmin: 2,\n\tmax: 64\n};\nconst MAX_PROBED_LENGTH = 40;\nasync function similar(ctx, name) {\n\tconst queries = [.../* @__PURE__ */ new Set([name, squash(name)])].filter((q) => q.length >= SEARCH_LENGTH.min && q.length <= SEARCH_LENGTH.max);\n\tconst found = (await Promise.all(queries.map(async (q) => {\n\t\tconst res = await get(ctx, `${REGISTRY}/-/v1/search?text=${encodeURIComponent(q)}&size=50`);\n\t\tif (!res.ok) throw new Error(`search HTTP ${res.status}`);\n\t\treturn (await res.json()).objects;\n\t}))).flat().map((o) => o.package.name).find((n) => !n.startsWith(\"@\") && n !== name && squash(n) === squash(name));\n\tif (found || name !== squash(name) || name.length > MAX_PROBED_LENGTH) return found;\n\tconst hyphenated = Array.from({ length: name.length - 1 }, (_, i) => `${name.slice(0, i + 1)}-${name.slice(i + 1)}`);\n\treturn (await Promise.all(hyphenated.map(async (variant) => {\n\t\tconst res = await get(ctx, `${REGISTRY}/${variant}`, { headers: { accept: \"application/vnd.npm.install-v1+json\" } });\n\t\tif (res.status !== 200 && res.status !== 404) throw new Error(`registry HTTP ${res.status}`);\n\t\treturn res.status === 200 ? variant : void 0;\n\t}))).find(Boolean);\n}\n/** Only the npm user or organization named after a scope can publish under it. */\nasync function scopeNote(ctx, scope) {\n\tif ((await get(ctx, `${REGISTRY}/-/org/${encodeURIComponent(scope)}/package`).catch(() => void 0))?.status === 200) return `@${scope} is an npm organization; only its members can publish under it`;\n\treturn `only the npm user or organization \"${scope}\" can publish under @${scope}`;\n}\nconst npm = defineChannel({\n\tid: \"npm\",\n\tlabel: \"npm\",\n\tcategory: \"package\",\n\trules: problem,\n\tasync lookup(name, ctx) {\n\t\tconst url = `https://www.npmjs.com/package/${name}`;\n\t\tconst res = await get(ctx, `${REGISTRY}/${name.replace(\"/\", \"%2f\")}`);\n\t\tif (res.status === 200) {\n\t\t\tconst doc = await res.json();\n\t\t\tif (!doc.versions && doc.time?.unpublished) {\n\t\t\t\tconst at = doc.time.unpublished.time;\n\t\t\t\tconst until = Date.parse(at) + 864e5;\n\t\t\t\tif (!((ctx.now?.() ?? Date.now()) >= until)) return {\n\t\t\t\t\tstatus: \"unavailable\",\n\t\t\t\t\turl,\n\t\t\t\t\tnote: `unpublished on ${at.slice(0, 10)}; npm blocks the name until ${new Date(until).toISOString().slice(0, 16).replace(\"T\", \" \")} UTC`\n\t\t\t\t};\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"reclaimable\",\n\t\t\t\t\turl,\n\t\t\t\t\tnote: `unpublished on ${at.slice(0, 10)}; anyone can publish it again`\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tstatus: \"taken\",\n\t\t\t\turl,\n\t\t\t\tnote: doc.description,\n\t\t\t\tmeta: {\n\t\t\t\t\tlatest: doc[\"dist-tags\"]?.latest,\n\t\t\t\t\tmodified: doc.time?.modified\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tif (res.status !== 404) return unexpected(\"npm registry\", res);\n\t\tconst scope = SCOPED.exec(name)?.[1];\n\t\tif (scope) return {\n\t\t\tstatus: \"available\",\n\t\t\tcertainty: \"probable\",\n\t\t\tnote: await scopeNote(ctx, scope)\n\t\t};\n\t\ttry {\n\t\t\tconst clash = await similar(ctx, name);\n\t\t\tif (clash) return {\n\t\t\t\tstatus: \"unavailable\",\n\t\t\t\tnote: `npm rejects names too similar to \"${clash}\"`\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tstatus: \"available\",\n\t\t\t\tcertainty: \"probable\",\n\t\t\t\tnote: \"npm also refuses names equal to an existing one without punctuation; not every spelling can be checked\"\n\t\t\t};\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tstatus: \"available\",\n\t\t\t\tcertainty: \"probable\",\n\t\t\t\tnote: \"could not check npm's similar-name rule\"\n\t\t\t};\n\t\t}\n\t}\n});\n//#endregion\n//#region src/data/pypi-stdlib.ts\nconst PYPI_STDLIB = /* @__PURE__ */ new Set([\n\t\"abc\",\n\t\"abcoll\",\n\t\"aepack\",\n\t\"aetools\",\n\t\"aetypes\",\n\t\"aifc\",\n\t\"aix-support\",\n\t\"al\",\n\t\"android-support\",\n\t\"annotationlib\",\n\t\"antigravity\",\n\t\"anydbm\",\n\t\"apple-support\",\n\t\"applesingle\",\n\t\"argparse\",\n\t\"array\",\n\t\"ast\",\n\t\"ast-unparse\",\n\t\"asynchat\",\n\t\"asyncio\",\n\t\"asyncio-base-events\",\n\t\"asyncio-base-futures\",\n\t\"asyncio-base-subprocess\",\n\t\"asyncio-base-tasks\",\n\t\"asyncio-compat\",\n\t\"asyncio-constants\",\n\t\"asyncio-coroutines\",\n\t\"asyncio-events\",\n\t\"asyncio-exceptions\",\n\t\"asyncio-format-helpers\",\n\t\"asyncio-futures\",\n\t\"asyncio-graph\",\n\t\"asyncio-locks\",\n\t\"asyncio-log\",\n\t\"asyncio-main\",\n\t\"asyncio-mixins\",\n\t\"asyncio-proactor-events\",\n\t\"asyncio-protocols\",\n\t\"asyncio-queues\",\n\t\"asyncio-runners\",\n\t\"asyncio-selector-events\",\n\t\"asyncio-sslproto\",\n\t\"asyncio-staggered\",\n\t\"asyncio-streams\",\n\t\"asyncio-subprocess\",\n\t\"asyncio-taskgroups\",\n\t\"asyncio-tasks\",\n\t\"asyncio-test-utils\",\n\t\"asyncio-threads\",\n\t\"asyncio-timeouts\",\n\t\"asyncio-tools\",\n\t\"asyncio-transports\",\n\t\"asyncio-trsock\",\n\t\"asyncio-unix-events\",\n\t\"asyncio-windows-events\",\n\t\"asyncio-windows-utils\",\n\t\"asyncore\",\n\t\"atexit\",\n\t\"audiodev\",\n\t\"audioop\",\n\t\"autogil\",\n\t\"base64\",\n\t\"basehttpserver\",\n\t\"bastion\",\n\t\"bdb\",\n\t\"binascii\",\n\t\"binhex\",\n\t\"bisect\",\n\t\"blake2\",\n\t\"bootlocale\",\n\t\"bootsubprocess\",\n\t\"bsddb\",\n\t\"bsddb-db\",\n\t\"bsddb-dbobj\",\n\t\"bsddb-dbrecio\",\n\t\"bsddb-dbshelve\",\n\t\"bsddb-dbtables\",\n\t\"bsddb-dbutils\",\n\t\"bsddb-test\",\n\t\"bsddb-test-test-all\",\n\t\"bsddb-test-test-associate\",\n\t\"bsddb-test-test-basics\",\n\t\"bsddb-test-test-compare\",\n\t\"bsddb-test-test-compat\",\n\t\"bsddb-test-test-cursor-pget-bug\",\n\t\"bsddb-test-test-db\",\n\t\"bsddb-test-test-dbenv\",\n\t\"bsddb-test-test-dbobj\",\n\t\"bsddb-test-test-dbshelve\",\n\t\"bsddb-test-test-dbtables\",\n\t\"bsddb-test-test-distributed-transactions\",\n\t\"bsddb-test-test-early-close\",\n\t\"bsddb-test-test-fileid\",\n\t\"bsddb-test-test-get-none\",\n\t\"bsddb-test-test-join\",\n\t\"bsddb-test-test-lock\",\n\t\"bsddb-test-test-misc\",\n\t\"bsddb-test-test-pickle\",\n\t\"bsddb-test-test-queue\",\n\t\"bsddb-test-test-recno\",\n\t\"bsddb-test-test-replication\",\n\t\"bsddb-test-test-sequence\",\n\t\"bsddb-test-test-thread\",\n\t\"buildtools\",\n\t\"builtin\",\n\t\"builtins\",\n\t\"bz2\",\n\t\"calendar\",\n\t\"canvas\",\n\t\"carbon\",\n\t\"carbon-ae\",\n\t\"carbon-ah\",\n\t\"carbon-app\",\n\t\"carbon-appearance\",\n\t\"carbon-carbonevents\",\n\t\"carbon-carbonevt\",\n\t\"carbon-cf\",\n\t\"carbon-cg\",\n\t\"carbon-cm\",\n\t\"carbon-components\",\n\t\"carbon-controlaccessor\",\n\t\"carbon-controls\",\n\t\"carbon-corefounation\",\n\t\"carbon-coregraphics\",\n\t\"carbon-ctl\",\n\t\"carbon-dialogs\",\n\t\"carbon-dlg\",\n\t\"carbon-drag\",\n\t\"carbon-dragconst\",\n\t\"carbon-events\",\n\t\"carbon-evt\",\n\t\"carbon-file\",\n\t\"carbon-files\",\n\t\"carbon-fm\",\n\t\"carbon-folder\",\n\t\"carbon-folders\",\n\t\"carbon-fonts\",\n\t\"carbon-help\",\n\t\"carbon-ibcarbon\",\n\t\"carbon-ibcarbonruntime\",\n\t\"carbon-icns\",\n\t\"carbon-icons\",\n\t\"carbon-launch\",\n\t\"carbon-launchservices\",\n\t\"carbon-list\",\n\t\"carbon-lists\",\n\t\"carbon-machelp\",\n\t\"carbon-mediadescr\",\n\t\"carbon-menu\",\n\t\"carbon-menus\",\n\t\"carbon-mlte\",\n\t\"carbon-osa\",\n\t\"carbon-osaconst\",\n\t\"carbon-qd\",\n\t\"carbon-qdoffs\",\n\t\"carbon-qdoffscreen\",\n\t\"carbon-qt\",\n\t\"carbon-quickdraw\",\n\t\"carbon-quicktime\",\n\t\"carbon-res\",\n\t\"carbon-resources\",\n\t\"carbon-scrap\",\n\t\"carbon-snd\",\n\t\"carbon-sound\",\n\t\"carbon-te\",\n\t\"carbon-textedit\",\n\t\"carbon-win\",\n\t\"carbon-windows\",\n\t\"cd\",\n\t\"cfmfile\",\n\t\"cgi\",\n\t\"cgihttpserver\",\n\t\"cgitb\",\n\t\"chunk\",\n\t\"cmath\",\n\t\"cmd\",\n\t\"code\",\n\t\"codecs\",\n\t\"codecs-cn\",\n\t\"codecs-hk\",\n\t\"codecs-iso2022\",\n\t\"codecs-jp\",\n\t\"codecs-kr\",\n\t\"codecs-tw\",\n\t\"codeop\",\n\t\"collections\",\n\t\"collections-abc\",\n\t\"collections-main\",\n\t\"colorize\",\n\t\"colorpicker\",\n\t\"colorsys\",\n\t\"commands\",\n\t\"compat-pickle\",\n\t\"compileall\",\n\t\"compiler\",\n\t\"compiler-ast\",\n\t\"compiler-consts\",\n\t\"compiler-future\",\n\t\"compiler-misc\",\n\t\"compiler-pyassem\",\n\t\"compiler-pycodegen\",\n\t\"compiler-symbols\",\n\t\"compiler-syntax\",\n\t\"compiler-transformer\",\n\t\"compiler-visitor\",\n\t\"compression\",\n\t\"compression-bz2\",\n\t\"compression-common\",\n\t\"compression-common-streams\",\n\t\"compression-gzip\",\n\t\"compression-lzma\",\n\t\"compression-zlib\",\n\t\"compression-zstd\",\n\t\"compression-zstd-zstdfile\",\n\t\"concurrent\",\n\t\"concurrent-futures\",\n\t\"concurrent-futures-base\",\n\t\"concurrent-futures-interpreter\",\n\t\"concurrent-futures-process\",\n\t\"concurrent-futures-thread\",\n\t\"concurrent-interpreters\",\n\t\"concurrent-interpreters-crossinterp\",\n\t\"concurrent-interpreters-queues\",\n\t\"configparser\",\n\t\"contextlib\",\n\t\"contextvars\",\n\t\"cookie\",\n\t\"cookielib\",\n\t\"copy\",\n\t\"copy-reg\",\n\t\"copyreg\",\n\t\"cpickle\",\n\t\"cprofile\",\n\t\"crypt\",\n\t\"cstringio\",\n\t\"csv\",\n\t\"ctypes\",\n\t\"ctypes-aix\",\n\t\"ctypes-endian\",\n\t\"ctypes-layout\",\n\t\"ctypes-macholib\",\n\t\"ctypes-macholib-dyld\",\n\t\"ctypes-macholib-dylib\",\n\t\"ctypes-macholib-framework\",\n\t\"ctypes-test\",\n\t\"ctypes-test-main\",\n\t\"ctypes-test-runtests\",\n\t\"ctypes-test-test-anon\",\n\t\"ctypes-test-test-array-in-pointer\",\n\t\"ctypes-test-test-arrays\",\n\t\"ctypes-test-test-as-parameter\",\n\t\"ctypes-test-test-bitfields\",\n\t\"ctypes-test-test-buffers\",\n\t\"ctypes-test-test-bytes\",\n\t\"ctypes-test-test-byteswap\",\n\t\"ctypes-test-test-callbacks\",\n\t\"ctypes-test-test-cast\",\n\t\"ctypes-test-test-cfuncs\",\n\t\"ctypes-test-test-checkretval\",\n\t\"ctypes-test-test-delattr\",\n\t\"ctypes-test-test-errno\",\n\t\"ctypes-test-test-find\",\n\t\"ctypes-test-test-frombuffer\",\n\t\"ctypes-test-test-funcptr\",\n\t\"ctypes-test-test-functions\",\n\t\"ctypes-test-test-incomplete\",\n\t\"ctypes-test-test-init\",\n\t\"ctypes-test-test-internals\",\n\t\"ctypes-test-test-keeprefs\",\n\t\"ctypes-test-test-libc\",\n\t\"ctypes-test-test-loading\",\n\t\"ctypes-test-test-macholib\",\n\t\"ctypes-test-test-memfunctions\",\n\t\"ctypes-test-test-numbers\",\n\t\"ctypes-test-test-objects\",\n\t\"ctypes-test-test-parameters\",\n\t\"ctypes-test-test-pep3118\",\n\t\"ctypes-test-test-pickling\",\n\t\"ctypes-test-test-pointers\",\n\t\"ctypes-test-test-prototypes\",\n\t\"ctypes-test-test-python-api\",\n\t\"ctypes-test-test-random-things\",\n\t\"ctypes-test-test-refcounts\",\n\t\"ctypes-test-test-repr\",\n\t\"ctypes-test-test-returnfuncptrs\",\n\t\"ctypes-test-test-simplesubclasses\",\n\t\"ctypes-test-test-sizes\",\n\t\"ctypes-test-test-slicing\",\n\t\"ctypes-test-test-stringptr\",\n\t\"ctypes-test-test-strings\",\n\t\"ctypes-test-test-struct-fields\",\n\t\"ctypes-test-test-structures\",\n\t\"ctypes-test-test-unaligned-structures\",\n\t\"ctypes-test-test-unicode\",\n\t\"ctypes-test-test-values\",\n\t\"ctypes-test-test-varsize-struct\",\n\t\"ctypes-test-test-win32\",\n\t\"ctypes-test-test-wintypes\",\n\t\"ctypes-util\",\n\t\"ctypes-wintypes\",\n\t\"curses\",\n\t\"curses-ascii\",\n\t\"curses-has-key\",\n\t\"curses-panel\",\n\t\"curses-textpad\",\n\t\"curses-wrapper\",\n\t\"dataclasses\",\n\t\"datetime\",\n\t\"dbhash\",\n\t\"dbm\",\n\t\"dbm-dumb\",\n\t\"dbm-gnu\",\n\t\"dbm-ndbm\",\n\t\"dbm-sqlite3\",\n\t\"decimal\",\n\t\"device\",\n\t\"dialog\",\n\t\"difflib\",\n\t\"dircache\",\n\t\"dis\",\n\t\"distutils\",\n\t\"distutils-archive-util\",\n\t\"distutils-bcppcompiler\",\n\t\"distutils-ccompiler\",\n\t\"distutils-cmd\",\n\t\"distutils-collections\",\n\t\"distutils-command\",\n\t\"distutils-command-bdist\",\n\t\"distutils-command-bdist-dumb\",\n\t\"distutils-command-bdist-msi\",\n\t\"distutils-command-bdist-packager\",\n\t\"distutils-command-bdist-rpm\",\n\t\"distutils-command-bdist-wininst\",\n\t\"distutils-command-build\",\n\t\"distutils-command-build-clib\",\n\t\"distutils-command-build-ext\",\n\t\"distutils-command-build-py\",\n\t\"distutils-command-build-scripts\",\n\t\"distutils-command-check\",\n\t\"distutils-command-clean\",\n\t\"distutils-command-config\",\n\t\"distutils-command-framework-compat\",\n\t\"distutils-command-install\",\n\t\"distutils-command-install-data\",\n\t\"distutils-command-install-egg-info\",\n\t\"distutils-command-install-headers\",\n\t\"distutils-command-install-lib\",\n\t\"distutils-command-install-scripts\",\n\t\"distutils-command-py37compat\",\n\t\"distutils-command-register\",\n\t\"distutils-command-sdist\",\n\t\"distutils-command-upload\",\n\t\"distutils-config\",\n\t\"distutils-core\",\n\t\"distutils-cygwinccompiler\",\n\t\"distutils-debug\",\n\t\"distutils-dep-util\",\n\t\"distutils-dir-util\",\n\t\"distutils-dist\",\n\t\"distutils-emxccompiler\",\n\t\"distutils-errors\",\n\t\"distutils-extension\",\n\t\"distutils-fancy-getopt\",\n\t\"distutils-file-util\",\n\t\"distutils-filelist\",\n\t\"distutils-functools\",\n\t\"distutils-log\",\n\t\"distutils-macos-compat\",\n\t\"distutils-msvc9compiler\",\n\t\"distutils-msvccompiler\",\n\t\"distutils-mwerkscompiler\",\n\t\"distutils-py38compat\",\n\t\"distutils-py39compat\",\n\t\"distutils-spawn\",\n\t\"distutils-sysconfig\",\n\t\"distutils-tests\",\n\t\"distutils-tests-setuptools-build-ext\",\n\t\"distutils-tests-setuptools-extension\",\n\t\"distutils-tests-support\",\n\t\"distutils-tests-test-archive-util\",\n\t\"distutils-tests-test-bdist\",\n\t\"distutils-tests-test-bdist-dumb\",\n\t\"distutils-tests-test-bdist-msi\",\n\t\"distutils-tests-test-bdist-rpm\",\n\t\"distutils-tests-test-bdist-wininst\",\n\t\"distutils-tests-test-build\",\n\t\"distutils-tests-test-build-clib\",\n\t\"distutils-tests-test-build-ext\",\n\t\"distutils-tests-test-build-py\",\n\t\"distutils-tests-test-build-scripts\",\n\t\"distutils-tests-test-ccompiler\",\n\t\"distutils-tests-test-check\",\n\t\"distutils-tests-test-clean\",\n\t\"distutils-tests-test-cmd\",\n\t\"distutils-tests-test-config\",\n\t\"distutils-tests-test-config-cmd\",\n\t\"distutils-tests-test-core\",\n\t\"distutils-tests-test-cygwinccompiler\",\n\t\"distutils-tests-test-dep-util\",\n\t\"distutils-tests-test-dir-util\",\n\t\"distutils-tests-test-dist\",\n\t\"distutils-tests-test-extension\",\n\t\"distutils-tests-test-file-util\",\n\t\"distutils-tests-test-filelist\",\n\t\"distutils-tests-test-install\",\n\t\"distutils-tests-test-install-data\",\n\t\"distutils-tests-test-install-headers\",\n\t\"distutils-tests-test-install-lib\",\n\t\"distutils-tests-test-install-scripts\",\n\t\"distutils-tests-test-log\",\n\t\"distutils-tests-test-msvc9compiler\",\n\t\"distutils-tests-test-msvccompiler\",\n\t\"distutils-tests-test-register\",\n\t\"distutils-tests-test-sdist\",\n\t\"distutils-tests-test-spawn\",\n\t\"distutils-tests-test-sysconfig\",\n\t\"distutils-tests-test-text-file\",\n\t\"distutils-tests-test-unixccompiler\",\n\t\"distutils-tests-test-upload\",\n\t\"distutils-tests-test-util\",\n\t\"distutils-tests-test-version\",\n\t\"distutils-tests-test-versionpredicate\",\n\t\"distutils-text-file\",\n\t\"distutils-unixccompiler\",\n\t\"distutils-util\",\n\t\"distutils-version\",\n\t\"distutils-versionpredicate\",\n\t\"dl\",\n\t\"doctest\",\n\t\"docxmlrpcserver\",\n\t\"dumbdbm\",\n\t\"dummy-thread\",\n\t\"dummy-threading\",\n\t\"easydialogs\",\n\t\"elementtree\",\n\t\"email\",\n\t\"email-base64mime\",\n\t\"email-charset\",\n\t\"email-contentmanager\",\n\t\"email-encoded-words\",\n\t\"email-encoders\",\n\t\"email-errors\",\n\t\"email-feedparser\",\n\t\"email-generator\",\n\t\"email-header\",\n\t\"email-header-value-parser\",\n\t\"email-headerregistry\",\n\t\"email-iterators\",\n\t\"email-message\",\n\t\"email-mime\",\n\t\"email-mime-application\",\n\t\"email-mime-audio\",\n\t\"email-mime-base\",\n\t\"email-mime-image\",\n\t\"email-mime-message\",\n\t\"email-mime-multipart\",\n\t\"email-mime-nonmultipart\",\n\t\"email-mime-text\",\n\t\"email-parseaddr\",\n\t\"email-parser\",\n\t\"email-policy\",\n\t\"email-policybase\",\n\t\"email-quoprimime\",\n\t\"email-test\",\n\t\"email-test-test-email\",\n\t\"email-test-test-email-codecs\",\n\t\"email-test-test-email-codecs-renamed\",\n\t\"email-test-test-email-renamed\",\n\t\"email-test-test-email-torture\",\n\t\"email-utils\",\n\t\"encodings\",\n\t\"encodings-aliases\",\n\t\"encodings-ascii\",\n\t\"encodings-base64-codec\",\n\t\"encodings-big5\",\n\t\"encodings-big5hkscs\",\n\t\"encodings-builtin\",\n\t\"encodings-bz2-codec\",\n\t\"encodings-charmap\",\n\t\"encodings-codecs\",\n\t\"encodings-cp037\",\n\t\"encodings-cp1006\",\n\t\"encodings-cp1026\",\n\t\"encodings-cp1125\",\n\t\"encodings-cp1140\",\n\t\"encodings-cp1250\",\n\t\"encodings-cp1251\",\n\t\"encodings-cp1252\",\n\t\"encodings-cp1253\",\n\t\"encodings-cp1254\",\n\t\"encodings-cp1255\",\n\t\"encodings-cp1256\",\n\t\"encodings-cp1257\",\n\t\"encodings-cp1258\",\n\t\"encodings-cp273\",\n\t\"encodings-cp424\",\n\t\"encodings-cp437\",\n\t\"encodings-cp500\",\n\t\"encodings-cp65001\",\n\t\"encodings-cp720\",\n\t\"encodings-cp737\",\n\t\"encodings-cp775\",\n\t\"encodings-cp850\",\n\t\"encodings-cp852\",\n\t\"encodings-cp855\",\n\t\"encodings-cp856\",\n\t\"encodings-cp857\",\n\t\"encodings-cp858\",\n\t\"encodings-cp860\",\n\t\"encodings-cp861\",\n\t\"encodings-cp862\",\n\t\"encodings-cp863\",\n\t\"encodings-cp864\",\n\t\"encodings-cp865\",\n\t\"encodings-cp866\",\n\t\"encodings-cp869\",\n\t\"encodings-cp874\",\n\t\"encodings-cp875\",\n\t\"encodings-cp932\",\n\t\"encodings-cp949\",\n\t\"encodings-cp950\",\n\t\"encodings-encodings\",\n\t\"encodings-euc-jis-2004\",\n\t\"encodings-euc-jisx0213\",\n\t\"encodings-euc-jp\",\n\t\"encodings-euc-kr\",\n\t\"encodings-gb18030\",\n\t\"encodings-gb2312\",\n\t\"encodings-gbk\",\n\t\"encodings-hex-codec\",\n\t\"encodings-hp-roman8\",\n\t\"encodings-hz\",\n\t\"encodings-idna\",\n\t\"encodings-iso2022-jp\",\n\t\"encodings-iso2022-jp-1\",\n\t\"encodings-iso2022-jp-2\",\n\t\"encodings-iso2022-jp-2004\",\n\t\"encodings-iso2022-jp-3\",\n\t\"encodings-iso2022-jp-ext\",\n\t\"encodings-iso2022-kr\",\n\t\"encodings-iso8859-1\",\n\t\"encodings-iso8859-10\",\n\t\"encodings-iso8859-11\",\n\t\"encodings-iso8859-13\",\n\t\"encodings-iso8859-14\",\n\t\"encodings-iso8859-15\",\n\t\"encodings-iso8859-16\",\n\t\"encodings-iso8859-2\",\n\t\"encodings-iso8859-3\",\n\t\"encodings-iso8859-4\",\n\t\"encodings-iso8859-5\",\n\t\"encodings-iso8859-6\",\n\t\"encodings-iso8859-7\",\n\t\"encodings-iso8859-8\",\n\t\"encodings-iso8859-9\",\n\t\"encodings-johab\",\n\t\"encodings-koi8-r\",\n\t\"encodings-koi8-t\",\n\t\"encodings-koi8-u\",\n\t\"encodings-kz1048\",\n\t\"encodings-latin-1\",\n\t\"encodings-mac-arabic\",\n\t\"encodings-mac-centeuro\",\n\t\"encodings-mac-croatian\",\n\t\"encodings-mac-cyrillic\",\n\t\"encodings-mac-farsi\",\n\t\"encodings-mac-greek\",\n\t\"encodings-mac-iceland\",\n\t\"encodings-mac-latin2\",\n\t\"encodings-mac-roman\",\n\t\"encodings-mac-romanian\",\n\t\"encodings-mac-turkish\",\n\t\"encodings-mbcs\",\n\t\"encodings-oem\",\n\t\"encodings-palmos\",\n\t\"encodings-ptcp154\",\n\t\"encodings-punycode\",\n\t\"encodings-quopri-codec\",\n\t\"encodings-raw-unicode-escape\",\n\t\"encodings-rot-13\",\n\t\"encodings-shift-jis\",\n\t\"encodings-shift-jis-2004\",\n\t\"encodings-shift-jisx0213\",\n\t\"encodings-string-escape\",\n\t\"encodings-tis-620\",\n\t\"encodings-undefined\",\n\t\"encodings-unicode-escape\",\n\t\"encodings-unicode-internal\",\n\t\"encodings-utf-16\",\n\t\"encodings-utf-16-be\",\n\t\"encodings-utf-16-le\",\n\t\"encodings-utf-32\",\n\t\"encodings-utf-32-be\",\n\t\"encodings-utf-32-le\",\n\t\"encodings-utf-7\",\n\t\"encodings-utf-8\",\n\t\"encodings-utf-8-sig\",\n\t\"encodings-uu-codec\",\n\t\"encodings-win-cp-codecs\",\n\t\"encodings-zlib-codec\",\n\t\"ensurepip\",\n\t\"ensurepip-bundled\",\n\t\"ensurepip-main\",\n\t\"ensurepip-uninstall\",\n\t\"enum\",\n\t\"errno\",\n\t\"exceptions\",\n\t\"faulthandler\",\n\t\"fcntl\",\n\t\"filecmp\",\n\t\"filedialog\",\n\t\"fileinput\",\n\t\"findertools\",\n\t\"fixtk\",\n\t\"fl\",\n\t\"flp\",\n\t\"fm\",\n\t\"fnmatch\",\n\t\"formatter\",\n\t\"fpectl\",\n\t\"fpformat\",\n\t\"fractions\",\n\t\"framework\",\n\t\"frozen-importlib\",\n\t\"frozen-importlib-external\",\n\t\"ftplib\",\n\t\"functools\",\n\t\"future\",\n\t\"future-builtins\",\n\t\"gc\",\n\t\"gdbm\",\n\t\"genericpath\",\n\t\"gensuitemodule\",\n\t\"getopt\",\n\t\"getpass\",\n\t\"gettext\",\n\t\"gl\",\n\t\"glob\",\n\t\"graphlib\",\n\t\"grp\",\n\t\"gzip\",\n\t\"hashlib\",\n\t\"heapq\",\n\t\"hmac\",\n\t\"hotshot\",\n\t\"hotshot-log\",\n\t\"hotshot-stats\",\n\t\"hotshot-stones\",\n\t\"html\",\n\t\"html-entities\",\n\t\"html-parser\",\n\t\"htmlentitydefs\",\n\t\"htmllib\",\n\t\"htmlparser\",\n\t\"http\",\n\t\"http-client\",\n\t\"http-cookiejar\",\n\t\"http-cookies\",\n\t\"http-server\",\n\t\"httplib\",\n\t\"ic\",\n\t\"icopen\",\n\t\"idlelib\",\n\t\"idlelib-aboutdialog\",\n\t\"idlelib-autocomplete\",\n\t\"idlelib-autocomplete-w\",\n\t\"idlelib-autocompletewindow\",\n\t\"idlelib-autoexpand\",\n\t\"idlelib-bindings\",\n\t\"idlelib-browser\",\n\t\"idlelib-calltip\",\n\t\"idlelib-calltip-w\",\n\t\"idlelib-calltips\",\n\t\"idlelib-calltipwindow\",\n\t\"idlelib-classbrowser\",\n\t\"idlelib-codecontext\",\n\t\"idlelib-colordelegator\",\n\t\"idlelib-colorizer\",\n\t\"idlelib-config\",\n\t\"idlelib-config-key\",\n\t\"idlelib-configdialog\",\n\t\"idlelib-confighandler\",\n\t\"idlelib-confighelpsourceedit\",\n\t\"idlelib-configsectionnamedialog\",\n\t\"idlelib-debugger\",\n\t\"idlelib-debugger-r\",\n\t\"idlelib-debugobj\",\n\t\"idlelib-debugobj-r\",\n\t\"idlelib-delegator\",\n\t\"idlelib-dynoption\",\n\t\"idlelib-dynoptionmenuwidget\",\n\t\"idlelib-editor\",\n\t\"idlelib-editorwindow\",\n\t\"idlelib-filelist\",\n\t\"idlelib-format\",\n\t\"idlelib-formatparagraph\",\n\t\"idlelib-grep\",\n\t\"idlelib-grepdialog\",\n\t\"idlelib-help\",\n\t\"idlelib-help-about\",\n\t\"idlelib-history\",\n\t\"idlelib-hyperparser\",\n\t\"idlelib-idle\",\n\t\"idlelib-idle-test\",\n\t\"idlelib-idle-test-htest\",\n\t\"idlelib-idle-test-mock-idle\",\n\t\"idlelib-idle-test-mock-tk\",\n\t\"idlelib-idle-test-template\",\n\t\"idlelib-idle-test-test-autocomplete\",\n\t\"idlelib-idle-test-test-autocomplete-w\",\n\t\"idlelib-idle-test-test-autoexpand\",\n\t\"idlelib-idle-test-test-browser\",\n\t\"idlelib-idle-test-test-calltip\",\n\t\"idlelib-idle-test-test-calltip-w\",\n\t\"idlelib-idle-test-test-calltips\",\n\t\"idlelib-idle-test-test-codecontext\",\n\t\"idlelib-idle-test-test-colorizer\",\n\t\"idlelib-idle-test-test-config\",\n\t\"idlelib-idle-test-test-config-help\",\n\t\"idlelib-idle-test-test-config-key\",\n\t\"idlelib-idle-test-test-config-name\",\n\t\"idlelib-idle-test-test-configdialog\",\n\t\"idlelib-idle-test-test-debugger\",\n\t\"idlelib-idle-test-test-debugger-r\",\n\t\"idlelib-idle-test-test-debugobj\",\n\t\"idlelib-idle-test-test-debugobj-r\",\n\t\"idlelib-idle-test-test-delegator\",\n\t\"idlelib-idle-test-test-editmenu\",\n\t\"idlelib-idle-test-test-editor\",\n\t\"idlelib-idle-test-test-filelist\",\n\t\"idlelib-idle-test-test-format\",\n\t\"idlelib-idle-test-test-formatparagraph\",\n\t\"idlelib-idle-test-test-grep\",\n\t\"idlelib-idle-test-test-help\",\n\t\"idlelib-idle-test-test-help-about\",\n\t\"idlelib-idle-test-test-helpabout\",\n\t\"idlelib-idle-test-test-history\",\n\t\"idlelib-idle-test-test-hyperparser\",\n\t\"idlelib-idle-test-test-idlehistory\",\n\t\"idlelib-idle-test-test-io\",\n\t\"idlelib-idle-test-test-iomenu\",\n\t\"idlelib-idle-test-test-macosx\",\n\t\"idlelib-idle-test-test-mainmenu\",\n\t\"idlelib-idle-test-test-multicall\",\n\t\"idlelib-idle-test-test-outwin\",\n\t\"idlelib-idle-test-test-paragraph\",\n\t\"idlelib-idle-test-test-parenmatch\",\n\t\"idlelib-idle-test-test-pathbrowser\",\n\t\"idlelib-idle-test-test-percolator\",\n\t\"idlelib-idle-test-test-pyparse\",\n\t\"idlelib-idle-test-test-pyshell\",\n\t\"idlelib-idle-test-test-query\",\n\t\"idlelib-idle-test-test-redirector\",\n\t\"idlelib-idle-test-test-replace\",\n\t\"idlelib-idle-test-test-replacedialog\",\n\t\"idlelib-idle-test-test-rpc\",\n\t\"idlelib-idle-test-test-rstrip\",\n\t\"idlelib-idle-test-test-run\",\n\t\"idlelib-idle-test-test-runscript\",\n\t\"idlelib-idle-test-test-scrolledlist\",\n\t\"idlelib-idle-test-test-search\",\n\t\"idlelib-idle-test-test-searchbase\",\n\t\"idlelib-idle-test-test-searchdialog\",\n\t\"idlelib-idle-test-test-searchdialogbase\",\n\t\"idlelib-idle-test-test-searchengine\",\n\t\"idlelib-idle-test-test-sidebar\",\n\t\"idlelib-idle-test-test-squeezer\",\n\t\"idlelib-idle-test-test-stackviewer\",\n\t\"idlelib-idle-test-test-statusbar\",\n\t\"idlelib-idle-test-test-text\",\n\t\"idlelib-idle-test-test-textview\",\n\t\"idlelib-idle-test-test-tooltip\",\n\t\"idlelib-idle-test-test-tree\",\n\t\"idlelib-idle-test-test-undo\",\n\t\"idlelib-idle-test-test-undodelegator\",\n\t\"idlelib-idle-test-test-util\",\n\t\"idlelib-idle-test-test-warning\",\n\t\"idlelib-idle-test-test-widgetredir\",\n\t\"idlelib-idle-test-test-window\",\n\t\"idlelib-idle-test-test-zoomheight\",\n\t\"idlelib-idle-test-test-zzdummy\",\n\t\"idlelib-idle-test-tkinter-testing-utils\",\n\t\"idlelib-idlehistory\",\n\t\"idlelib-idlever\",\n\t\"idlelib-iobinding\",\n\t\"idlelib-iomenu\",\n\t\"idlelib-keybindingdialog\",\n\t\"idlelib-macosx\",\n\t\"idlelib-macosxsupport\",\n\t\"idlelib-main\",\n\t\"idlelib-mainmenu\",\n\t\"idlelib-multicall\",\n\t\"idlelib-multistatusbar\",\n\t\"idlelib-objectbrowser\",\n\t\"idlelib-outputwindow\",\n\t\"idlelib-outwin\",\n\t\"idlelib-paragraph\",\n\t\"idlelib-parenmatch\",\n\t\"idlelib-pathbrowser\",\n\t\"idlelib-percolator\",\n\t\"idlelib-pyclbr\",\n\t\"idlelib-pyparse\",\n\t\"idlelib-pyshell\",\n\t\"idlelib-query\",\n\t\"idlelib-redirector\",\n\t\"idlelib-remotedebugger\",\n\t\"idlelib-remoteobjectbrowser\",\n\t\"idlelib-replace\",\n\t\"idlelib-replacedialog\",\n\t\"idlelib-rpc\",\n\t\"idlelib-rstrip\",\n\t\"idlelib-rstripextension\",\n\t\"idlelib-run\",\n\t\"idlelib-runscript\",\n\t\"idlelib-scriptbinding\",\n\t\"idlelib-scrolledlist\",\n\t\"idlelib-search\",\n\t\"idlelib-searchbase\",\n\t\"idlelib-searchdialog\",\n\t\"idlelib-searchdialogbase\",\n\t\"idlelib-searchengine\",\n\t\"idlelib-sidebar\",\n\t\"idlelib-squeezer\",\n\t\"idlelib-stackviewer\",\n\t\"idlelib-statusbar\",\n\t\"idlelib-tabbedpages\",\n\t\"idlelib-textview\",\n\t\"idlelib-tooltip\",\n\t\"idlelib-tree\",\n\t\"idlelib-treewidget\",\n\t\"idlelib-undo\",\n\t\"idlelib-undodelegator\",\n\t\"idlelib-util\",\n\t\"idlelib-widgetredirector\",\n\t\"idlelib-window\",\n\t\"idlelib-windowlist\",\n\t\"idlelib-zoomheight\",\n\t\"idlelib-zzdummy\",\n\t\"ihooks\",\n\t\"imageop\",\n\t\"imaplib\",\n\t\"imgfile\",\n\t\"imghdr\",\n\t\"imp\",\n\t\"importlib\",\n\t\"importlib-abc\",\n\t\"importlib-adapters\",\n\t\"importlib-bootstrap\",\n\t\"importlib-bootstrap-external\",\n\t\"importlib-common\",\n\t\"importlib-machinery\",\n\t\"importlib-metadata\",\n\t\"importlib-metadata-adapters\",\n\t\"importlib-metadata-collections\",\n\t\"importlib-metadata-diagnose\",\n\t\"importlib-metadata-functools\",\n\t\"importlib-metadata-itertools\",\n\t\"importlib-metadata-meta\",\n\t\"importlib-metadata-text\",\n\t\"importlib-readers\",\n\t\"importlib-resources\",\n\t\"importlib-resources-abc\",\n\t\"importlib-resources-adapters\",\n\t\"importlib-resources-common\",\n\t\"importlib-resources-functional\",\n\t\"importlib-resources-itertools\",\n\t\"importlib-resources-legacy\",\n\t\"importlib-resources-readers\",\n\t\"importlib-resources-simple\",\n\t\"importlib-simple\",\n\t\"importlib-util\",\n\t\"imputil\",\n\t\"inspect\",\n\t\"interpchannels\",\n\t\"interpqueues\",\n\t\"interpreters\",\n\t\"io\",\n\t\"ios-support\",\n\t\"ipaddress\",\n\t\"itertools\",\n\t\"jpeg\",\n\t\"json\",\n\t\"json-decoder\",\n\t\"json-encoder\",\n\t\"json-json\",\n\t\"json-main\",\n\t\"json-re\",\n\t\"json-scanner\",\n\t\"json-struct\",\n\t\"json-sys\",\n\t\"json-tests\",\n\t\"json-tests-test-check-circular\",\n\t\"json-tests-test-decode\",\n\t\"json-tests-test-default\",\n\t\"json-tests-test-dump\",\n\t\"json-tests-test-encode-basestring-ascii\",\n\t\"json-tests-test-fail\",\n\t\"json-tests-test-float\",\n\t\"json-tests-test-indent\",\n\t\"json-tests-test-pass1\",\n\t\"json-tests-test-pass2\",\n\t\"json-tests-test-pass3\",\n\t\"json-tests-test-recursion\",\n\t\"json-tests-test-scanstring\",\n\t\"json-tests-test-separators\",\n\t\"json-tests-test-speedups\",\n\t\"json-tests-test-tool\",\n\t\"json-tests-test-unicode\",\n\t\"json-tool\",\n\t\"keyword\",\n\t\"lib\",\n\t\"lib-libpython3\",\n\t\"lib2to3\",\n\t\"lib2to3-btm-matcher\",\n\t\"lib2to3-btm-utils\",\n\t\"lib2to3-fixer-base\",\n\t\"lib2to3-fixer-util\",\n\t\"lib2to3-fixes\",\n\t\"lib2to3-fixes-fix-apply\",\n\t\"lib2to3-fixes-fix-asserts\",\n\t\"lib2to3-fixes-fix-basestring\",\n\t\"lib2to3-fixes-fix-buffer\",\n\t\"lib2to3-fixes-fix-callable\",\n\t\"lib2to3-fixes-fix-dict\",\n\t\"lib2to3-fixes-fix-except\",\n\t\"lib2to3-fixes-fix-exec\",\n\t\"lib2to3-fixes-fix-execfile\",\n\t\"lib2to3-fixes-fix-exitfunc\",\n\t\"lib2to3-fixes-fix-filter\",\n\t\"lib2to3-fixes-fix-funcattrs\",\n\t\"lib2to3-fixes-fix-future\",\n\t\"lib2to3-fixes-fix-getcwdu\",\n\t\"lib2to3-fixes-fix-has-key\",\n\t\"lib2to3-fixes-fix-idioms\",\n\t\"lib2to3-fixes-fix-import\",\n\t\"lib2to3-fixes-fix-imports\",\n\t\"lib2to3-fixes-fix-imports2\",\n\t\"lib2to3-fixes-fix-input\",\n\t\"lib2to3-fixes-fix-intern\",\n\t\"lib2to3-fixes-fix-isinstance\",\n\t\"lib2to3-fixes-fix-itertools\",\n\t\"lib2to3-fixes-fix-itertools-imports\",\n\t\"lib2to3-fixes-fix-long\",\n\t\"lib2to3-fixes-fix-map\",\n\t\"lib2to3-fixes-fix-metaclass\",\n\t\"lib2to3-fixes-fix-methodattrs\",\n\t\"lib2to3-fixes-fix-ne\",\n\t\"lib2to3-fixes-fix-next\",\n\t\"lib2to3-fixes-fix-nonzero\",\n\t\"lib2to3-fixes-fix-numliterals\",\n\t\"lib2to3-fixes-fix-operator\",\n\t\"lib2to3-fixes-fix-paren\",\n\t\"lib2to3-fixes-fix-print\",\n\t\"lib2to3-fixes-fix-raise\",\n\t\"lib2to3-fixes-fix-raw-input\",\n\t\"lib2to3-fixes-fix-reduce\",\n\t\"lib2to3-fixes-fix-reload\",\n\t\"lib2to3-fixes-fix-renames\",\n\t\"lib2to3-fixes-fix-repr\",\n\t\"lib2to3-fixes-fix-set-literal\",\n\t\"lib2to3-fixes-fix-standarderror\",\n\t\"lib2to3-fixes-fix-sys-exc\",\n\t\"lib2to3-fixes-fix-throw\",\n\t\"lib2to3-fixes-fix-tuple-params\",\n\t\"lib2to3-fixes-fix-types\",\n\t\"lib2to3-fixes-fix-unicode\",\n\t\"lib2to3-fixes-fix-urllib\",\n\t\"lib2to3-fixes-fix-ws-comma\",\n\t\"lib2to3-fixes-fix-xrange\",\n\t\"lib2to3-fixes-fix-xreadlines\",\n\t\"lib2to3-fixes-fix-zip\",\n\t\"lib2to3-main\",\n\t\"lib2to3-patcomp\",\n\t\"lib2to3-pgen2\",\n\t\"lib2to3-pgen2-conv\",\n\t\"lib2to3-pgen2-driver\",\n\t\"lib2to3-pgen2-grammar\",\n\t\"lib2to3-pgen2-literals\",\n\t\"lib2to3-pgen2-parse\",\n\t\"lib2to3-pgen2-pgen\",\n\t\"lib2to3-pgen2-token\",\n\t\"lib2to3-pgen2-tokenize\",\n\t\"lib2to3-pygram\",\n\t\"lib2to3-pytree\",\n\t\"lib2to3-refactor\",\n\t\"lib2to3-tests\",\n\t\"lib2to3-tests-data\",\n\t\"lib2to3-tests-data-bom\",\n\t\"lib2to3-tests-data-crlf\",\n\t\"lib2to3-tests-data-different-encoding\",\n\t\"lib2to3-tests-data-false-encoding\",\n\t\"lib2to3-tests-data-fixers\",\n\t\"lib2to3-tests-data-fixers-bad-order\",\n\t\"lib2to3-tests-data-fixers-myfixes\",\n\t\"lib2to3-tests-data-fixers-myfixes-fix-explicit\",\n\t\"lib2to3-tests-data-fixers-myfixes-fix-first\",\n\t\"lib2to3-tests-data-fixers-myfixes-fix-last\",\n\t\"lib2to3-tests-data-fixers-myfixes-fix-parrot\",\n\t\"lib2to3-tests-data-fixers-myfixes-fix-preorder\",\n\t\"lib2to3-tests-data-fixers-no-fixer-cls\",\n\t\"lib2to3-tests-data-fixers-parrot-example\",\n\t\"lib2to3-tests-data-infinite-recursion\",\n\t\"lib2to3-tests-data-py2-test-grammar\",\n\t\"lib2to3-tests-data-py3-test-grammar\",\n\t\"lib2to3-tests-main\",\n\t\"lib2to3-tests-pytree-idempotency\",\n\t\"lib2to3-tests-support\",\n\t\"lib2to3-tests-test-all-fixers\",\n\t\"lib2to3-tests-test-fixers\",\n\t\"lib2to3-tests-test-main\",\n\t\"lib2to3-tests-test-parser\",\n\t\"lib2to3-tests-test-pytree\",\n\t\"lib2to3-tests-test-refactor\",\n\t\"lib2to3-tests-test-util\",\n\t\"linecache\",\n\t\"linuxaudiodev\",\n\t\"locale\",\n\t\"logging\",\n\t\"logging-config\",\n\t\"logging-handlers\",\n\t\"lsprof\",\n\t\"lwpcookiejar\",\n\t\"lzma\",\n\t\"macerrors\",\n\t\"macos\",\n\t\"macostools\",\n\t\"macpath\",\n\t\"macresource\",\n\t\"macurl2path\",\n\t\"mailbox\",\n\t\"mailcap\",\n\t\"main\",\n\t\"markupbase\",\n\t\"marshal\",\n\t\"math\",\n\t\"md5\",\n\t\"mhlib\",\n\t\"mimetools\",\n\t\"mimetypes\",\n\t\"mimewriter\",\n\t\"mimify\",\n\t\"miniaeframe\",\n\t\"mmap\",\n\t\"modulefinder\",\n\t\"mozillacookiejar\",\n\t\"msi\",\n\t\"msilib\",\n\t\"msvcrt\",\n\t\"multibytecodec\",\n\t\"multifile\",\n\t\"multiprocessing\",\n\t\"multiprocessing-connection\",\n\t\"multiprocessing-context\",\n\t\"multiprocessing-dummy\",\n\t\"multiprocessing-dummy-connection\",\n\t\"multiprocessing-forking\",\n\t\"multiprocessing-forkserver\",\n\t\"multiprocessing-heap\",\n\t\"multiprocessing-managers\",\n\t\"multiprocessing-pool\",\n\t\"multiprocessing-popen-fork\",\n\t\"multiprocessing-popen-forkserver\",\n\t\"multiprocessing-popen-spawn-posix\",\n\t\"multiprocessing-popen-spawn-win32\",\n\t\"multiprocessing-process\",\n\t\"multiprocessing-queues\",\n\t\"multiprocessing-reduction\",\n\t\"multiprocessing-resource-sharer\",\n\t\"multiprocessing-resource-tracker\",\n\t\"multiprocessing-semaphore-tracker\",\n\t\"multiprocessing-shared-memory\",\n\t\"multiprocessing-sharedctypes\",\n\t\"multiprocessing-spawn\",\n\t\"multiprocessing-synchronize\",\n\t\"multiprocessing-util\",\n\t\"mutex\",\n\t\"nav\",\n\t\"netrc\",\n\t\"new\",\n\t\"nis\",\n\t\"nntplib\",\n\t\"nt\",\n\t\"ntpath\",\n\t\"nturl2path\",\n\t\"numbers\",\n\t\"opcode\",\n\t\"opcode-metadata\",\n\t\"operator\",\n\t\"optparse\",\n\t\"os\",\n\t\"os-path\",\n\t\"os2emxpath\",\n\t\"ossaudiodev\",\n\t\"osx-support\",\n\t\"overlapped\",\n\t\"parser\",\n\t\"pathlib\",\n\t\"pathlib-abc\",\n\t\"pathlib-local\",\n\t\"pathlib-os\",\n\t\"pathlib-types\",\n\t\"pdb\",\n\t\"peg-parser\",\n\t\"phello\",\n\t\"phello-foo\",\n\t\"pickle\",\n\t\"pickletools\",\n\t\"pipes\",\n\t\"pixmapwrapper\",\n\t\"pkgutil\",\n\t\"platform\",\n\t\"plistlib\",\n\t\"popen2\",\n\t\"poplib\",\n\t\"posix\",\n\t\"posixfile\",\n\t\"posixpath\",\n\t\"posixshmem\",\n\t\"posixsubprocess\",\n\t\"pprint\",\n\t\"profile\",\n\t\"pstats\",\n\t\"pty\",\n\t\"pwd\",\n\t\"py-abc\",\n\t\"py-compile\",\n\t\"py-warnings\",\n\t\"pyclbr\",\n\t\"pydatetime\",\n\t\"pydecimal\",\n\t\"pydoc\",\n\t\"pydoc-data\",\n\t\"pydoc-data-topics\",\n\t\"pyexpat\",\n\t\"pyexpat-errors\",\n\t\"pyexpat-model\",\n\t\"pyio\",\n\t\"pylong\",\n\t\"pyrepl\",\n\t\"pyrepl-base-eventqueue\",\n\t\"pyrepl-commands\",\n\t\"pyrepl-completing-reader\",\n\t\"pyrepl-console\",\n\t\"pyrepl-curses\",\n\t\"pyrepl-fancy-termios\",\n\t\"pyrepl-historical-reader\",\n\t\"pyrepl-input\",\n\t\"pyrepl-keymap\",\n\t\"pyrepl-main\",\n\t\"pyrepl-minimal-curses\",\n\t\"pyrepl-module-completer\",\n\t\"pyrepl-pager\",\n\t\"pyrepl-reader\",\n\t\"pyrepl-readline\",\n\t\"pyrepl-simple-interact\",\n\t\"pyrepl-terminfo\",\n\t\"pyrepl-threading-handler\",\n\t\"pyrepl-trace\",\n\t\"pyrepl-types\",\n\t\"pyrepl-unix-console\",\n\t\"pyrepl-unix-eventqueue\",\n\t\"pyrepl-utils\",\n\t\"pyrepl-windows-console\",\n\t\"pyrepl-windows-eventqueue\",\n\t\"queue\",\n\t\"quopri\",\n\t\"random\",\n\t\"re\",\n\t\"re-casefix\",\n\t\"re-compiler\",\n\t\"re-constants\",\n\t\"re-parser\",\n\t\"readline\",\n\t\"remote-debugging\",\n\t\"repr\",\n\t\"reprlib\",\n\t\"resource\",\n\t\"rexec\",\n\t\"rfc822\",\n\t\"rlcompleter\",\n\t\"robotparser\",\n\t\"runpy\",\n\t\"sched\",\n\t\"scproxy\",\n\t\"scrolledtext\",\n\t\"secrets\",\n\t\"select\",\n\t\"selectors\",\n\t\"sets\",\n\t\"sgmllib\",\n\t\"sha\",\n\t\"sha1\",\n\t\"sha2\",\n\t\"sha256\",\n\t\"sha3\",\n\t\"sha512\",\n\t\"shelve\",\n\t\"shlex\",\n\t\"shutil\",\n\t\"signal\",\n\t\"simpledialog\",\n\t\"simplehttpserver\",\n\t\"simplexmlrpcserver\",\n\t\"site\",\n\t\"sitebuiltins\",\n\t\"smtpd\",\n\t\"smtplib\",\n\t\"sndhdr\",\n\t\"socket\",\n\t\"socketserver\",\n\t\"spwd\",\n\t\"sqlite3\",\n\t\"sqlite3-dbapi2\",\n\t\"sqlite3-dump\",\n\t\"sqlite3-main\",\n\t\"sqlite3-test\",\n\t\"sqlite3-test-backup\",\n\t\"sqlite3-test-dbapi\",\n\t\"sqlite3-test-dump\",\n\t\"sqlite3-test-factory\",\n\t\"sqlite3-test-hooks\",\n\t\"sqlite3-test-py25tests\",\n\t\"sqlite3-test-regression\",\n\t\"sqlite3-test-transactions\",\n\t\"sqlite3-test-types\",\n\t\"sqlite3-test-userfunctions\",\n\t\"sre\",\n\t\"sre-compile\",\n\t\"sre-constants\",\n\t\"sre-parse\",\n\t\"ssl\",\n\t\"stat\",\n\t\"statistics\",\n\t\"statvfs\",\n\t\"string\",\n\t\"string-templatelib\",\n\t\"stringio\",\n\t\"stringold\",\n\t\"stringprep\",\n\t\"strop\",\n\t\"strptime\",\n\t\"struct\",\n\t\"subprocess\",\n\t\"suggestions\",\n\t\"sunau\",\n\t\"sunaudio\",\n\t\"sunaudiodev\",\n\t\"symbol\",\n\t\"symtable\",\n\t\"sys\",\n\t\"sysconfig\",\n\t\"sysconfig-main\",\n\t\"sysconfigdata\",\n\t\"sysconfigdata-x86-64-conda-cos6-linux-gnu\",\n\t\"sysconfigdata-x86-64-conda-linux-gnu\",\n\t\"syslog\",\n\t\"tabnanny\",\n\t\"tarfile\",\n\t\"telnetlib\",\n\t\"tempfile\",\n\t\"termios\",\n\t\"test\",\n\t\"test-ann-module\",\n\t\"test-ann-module2\",\n\t\"test-ann-module3\",\n\t\"test-ann-module5\",\n\t\"test-ann-module6\",\n\t\"test-ann-module7\",\n\t\"test-audiotests\",\n\t\"test-audit-tests\",\n\t\"test-autotest\",\n\t\"test-bad-coding\",\n\t\"test-bad-coding2\",\n\t\"test-bad-coding3\",\n\t\"test-bad-getattr\",\n\t\"test-bad-getattr2\",\n\t\"test-bad-getattr3\",\n\t\"test-badsyntax-3131\",\n\t\"test-badsyntax-async1\",\n\t\"test-badsyntax-async2\",\n\t\"test-badsyntax-async3\",\n\t\"test-badsyntax-async4\",\n\t\"test-badsyntax-async5\",\n\t\"test-badsyntax-async6\",\n\t\"test-badsyntax-async7\",\n\t\"test-badsyntax-async8\",\n\t\"test-badsyntax-future10\",\n\t\"test-badsyntax-future3\",\n\t\"test-badsyntax-future4\",\n\t\"test-badsyntax-future5\",\n\t\"test-badsyntax-future6\",\n\t\"test-badsyntax-future7\",\n\t\"test-badsyntax-future8\",\n\t\"test-badsyntax-future9\",\n\t\"test-badsyntax-nocaret\",\n\t\"test-badsyntax-pep3120\",\n\t\"test-bisect\",\n\t\"test-bisect-cmd\",\n\t\"test-buffer-tests\",\n\t\"test-bytecode-helper\",\n\t\"test-coding20731\",\n\t\"test-curses-tests\",\n\t\"test-dataclass-module-1\",\n\t\"test-dataclass-module-1-str\",\n\t\"test-dataclass-module-2\",\n\t\"test-dataclass-module-2-str\",\n\t\"test-dataclass-textanno\",\n\t\"test-datetimetester\",\n\t\"test-dis-module\",\n\t\"test-doctest-aliases\",\n\t\"test-double-const\",\n\t\"test-dtracedata\",\n\t\"test-dtracedata-call-stack\",\n\t\"test-dtracedata-gc\",\n\t\"test-dtracedata-instance\",\n\t\"test-dtracedata-line\",\n\t\"test-eintrdata\",\n\t\"test-eintrdata-eintr-tester\",\n\t\"test-encoded-modules\",\n\t\"test-encoded-modules-module-iso-8859-1\",\n\t\"test-encoded-modules-module-koi8-r\",\n\t\"test-final-a\",\n\t\"test-final-b\",\n\t\"test-fork-wait\",\n\t\"test-future-test1\",\n\t\"test-future-test2\",\n\t\"test-gdb-sample\",\n\t\"test-good-getattr\",\n\t\"test-imp-dummy\",\n\t\"test-infinite-reload\",\n\t\"test-inspect-fodder\",\n\t\"test-inspect-fodder2\",\n\t\"test-libregrtest\",\n\t\"test-libregrtest-cmdline\",\n\t\"test-libregrtest-main\",\n\t\"test-libregrtest-pgo\",\n\t\"test-libregrtest-refleak\",\n\t\"test-libregrtest-runtest\",\n\t\"test-libregrtest-runtest-mp\",\n\t\"test-libregrtest-save-env\",\n\t\"test-libregrtest-setup\",\n\t\"test-libregrtest-utils\",\n\t\"test-libregrtest-win-utils\",\n\t\"test-list-tests\",\n\t\"test-lock-tests\",\n\t\"test-main\",\n\t\"test-make-ssl-certs\",\n\t\"test-mapping-tests\",\n\t\"test-memory-watchdog\",\n\t\"test-mock-backport\",\n\t\"test-mock-socket\",\n\t\"test-mod-generics-cache\",\n\t\"test-mp-fork-bomb\",\n\t\"test-mp-preload\",\n\t\"test-multibytecodec-support\",\n\t\"test-outstanding-bugs\",\n\t\"test-pickletester\",\n\t\"test-profilee\",\n\t\"test-pyclbr-input\",\n\t\"test-pydoc-mod\",\n\t\"test-pydocfodder\",\n\t\"test-pystone\",\n\t\"test-pythoninfo\",\n\t\"test-re-tests\",\n\t\"test-regrtest\",\n\t\"test-relimport\",\n\t\"test-reperf\",\n\t\"test-sample-doctest\",\n\t\"test-sample-doctest-no-docstrings\",\n\t\"test-sample-doctest-no-doctests\",\n\t\"test-script-helper\",\n\t\"test-seq-tests\",\n\t\"test-signalinterproctester\",\n\t\"test-sortperf\",\n\t\"test-ssl-servers\",\n\t\"test-ssltests\",\n\t\"test-string-tests\",\n\t\"test-subprocessdata\",\n\t\"test-subprocessdata-fd-status\",\n\t\"test-subprocessdata-input-reader\",\n\t\"test-subprocessdata-qcat\",\n\t\"test-subprocessdata-qgrep\",\n\t\"test-subprocessdata-sigchild-ignore\",\n\t\"test-support\",\n\t\"test-support-bytecode-helper\",\n\t\"test-support-hashlib-helper\",\n\t\"test-support-logging-helper\",\n\t\"test-support-script-helper\",\n\t\"test-support-socket-helper\",\n\t\"test-support-testresult\",\n\t\"test-support-warnings-helper\",\n\t\"test-symlink-support\",\n\t\"test-test-abc\",\n\t\"test-test-abstract-numbers\",\n\t\"test-test-aepack\",\n\t\"test-test-aifc\",\n\t\"test-test-al\",\n\t\"test-test-all\",\n\t\"test-test-anydbm\",\n\t\"test-test-applesingle\",\n\t\"test-test-argparse\",\n\t\"test-test-array\",\n\t\"test-test-ascii-formatd\",\n\t\"test-test-asdl-parser\",\n\t\"test-test-ast\",\n\t\"test-test-asyncgen\",\n\t\"test-test-asynchat\",\n\t\"test-test-asyncio\",\n\t\"test-test-asyncio-echo\",\n\t\"test-test-asyncio-echo2\",\n\t\"test-test-asyncio-echo3\",\n\t\"test-test-asyncio-functional\",\n\t\"test-test-asyncio-main\",\n\t\"test-test-asyncio-test-asyncio-waitfor\",\n\t\"test-test-asyncio-test-base-events\",\n\t\"test-test-asyncio-test-buffered-proto\",\n\t\"test-test-asyncio-test-context\",\n\t\"test-test-asyncio-test-events\",\n\t\"test-test-asyncio-test-futures\",\n\t\"test-test-asyncio-test-futures2\",\n\t\"test-test-asyncio-test-locks\",\n\t\"test-test-asyncio-test-pep492\",\n\t\"test-test-asyncio-test-proactor-events\",\n\t\"test-test-asyncio-test-protocols\",\n\t\"test-test-asyncio-test-queues\",\n\t\"test-test-asyncio-test-runners\",\n\t\"test-test-asyncio-test-selector-events\",\n\t\"test-test-asyncio-test-sendfile\",\n\t\"test-test-asyncio-test-server\",\n\t\"test-test-asyncio-test-sock-lowlevel\",\n\t\"test-test-asyncio-test-sslproto\",\n\t\"test-test-asyncio-test-streams\",\n\t\"test-test-asyncio-test-subprocess\",\n\t\"test-test-asyncio-test-tasks\",\n\t\"test-test-asyncio-test-threads\",\n\t\"test-test-asyncio-test-transports\",\n\t\"test-test-asyncio-test-unix-events\",\n\t\"test-test-asyncio-test-waitfor\",\n\t\"test-test-asyncio-test-windows-events\",\n\t\"test-test-asyncio-test-windows-utils\",\n\t\"test-test-asyncio-utils\",\n\t\"test-test-asyncore\",\n\t\"test-test-atexit\",\n\t\"test-test-audioop\",\n\t\"test-test-audit\",\n\t\"test-test-augassign\",\n\t\"test-test-base64\",\n\t\"test-test-baseexception\",\n\t\"test-test-bastion\",\n\t\"test-test-bdb\",\n\t\"test-test-bigaddrspace\",\n\t\"test-test-bigmem\",\n\t\"test-test-binascii\",\n\t\"test-test-binhex\",\n\t\"test-test-binop\",\n\t\"test-test-bisect\",\n\t\"test-test-bool\",\n\t\"test-test-bsddb\",\n\t\"test-test-bsddb185\",\n\t\"test-test-bsddb3\",\n\t\"test-test-buffer\",\n\t\"test-test-bufio\",\n\t\"test-test-builtin\",\n\t\"test-test-bytes\",\n\t\"test-test-bz2\",\n\t\"test-test-c-locale-coercion\",\n\t\"test-test-calendar\",\n\t\"test-test-call\",\n\t\"test-test-capi\",\n\t\"test-test-cd\",\n\t\"test-test-cfgparser\",\n\t\"test-test-cgi\",\n\t\"test-test-cgitb\",\n\t\"test-test-charmapcodec\",\n\t\"test-test-check-c-globals\",\n\t\"test-test-cl\",\n\t\"test-test-class\",\n\t\"test-test-clinic\",\n\t\"test-test-cmath\",\n\t\"test-test-cmd\",\n\t\"test-test-cmd-line\",\n\t\"test-test-cmd-line-script\",\n\t\"test-test-code\",\n\t\"test-test-code-module\",\n\t\"test-test-codeccallbacks\",\n\t\"test-test-codecencodings-cn\",\n\t\"test-test-codecencodings-hk\",\n\t\"test-test-codecencodings-iso2022\",\n\t\"test-test-codecencodings-jp\",\n\t\"test-test-codecencodings-kr\",\n\t\"test-test-codecencodings-tw\",\n\t\"test-test-codecmaps-cn\",\n\t\"test-test-codecmaps-hk\",\n\t\"test-test-codecmaps-jp\",\n\t\"test-test-codecmaps-kr\",\n\t\"test-test-codecmaps-tw\",\n\t\"test-test-codecs\",\n\t\"test-test-codeop\",\n\t\"test-test-coercion\",\n\t\"test-test-collections\",\n\t\"test-test-colorsys\",\n\t\"test-test-commands\",\n\t\"test-test-compare\",\n\t\"test-test-compile\",\n\t\"test-test-compileall\",\n\t\"test-test-compiler\",\n\t\"test-test-complex\",\n\t\"test-test-complex-args\",\n\t\"test-test-concurrent-futures\",\n\t\"test-test-configparser\",\n\t\"test-test-contains\",\n\t\"test-test-context\",\n\t\"test-test-contextlib\",\n\t\"test-test-contextlib-async\",\n\t\"test-test-cookie\",\n\t\"test-test-cookielib\",\n\t\"test-test-copy\",\n\t\"test-test-copy-reg\",\n\t\"test-test-copyreg\",\n\t\"test-test-coroutines\",\n\t\"test-test-cpickle\",\n\t\"test-test-cprofile\",\n\t\"test-test-crashers\",\n\t\"test-test-crypt\",\n\t\"test-test-csv\",\n\t\"test-test-ctypes\",\n\t\"test-test-curses\",\n\t\"test-test-dataclasses\",\n\t\"test-test-datetime\",\n\t\"test-test-dbm\",\n\t\"test-test-dbm-dumb\",\n\t\"test-test-dbm-gnu\",\n\t\"test-test-dbm-ndbm\",\n\t\"test-test-decimal\",\n\t\"test-test-decorators\",\n\t\"test-test-defaultdict\",\n\t\"test-test-deque\",\n\t\"test-test-descr\",\n\t\"test-test-descrtut\",\n\t\"test-test-devpoll\",\n\t\"test-test-dict\",\n\t\"test-test-dict-version\",\n\t\"test-test-dictcomps\",\n\t\"test-test-dictviews\",\n\t\"test-test-difflib\",\n\t\"test-test-dircache\",\n\t\"test-test-dis\",\n\t\"test-test-distutils\",\n\t\"test-test-dl\",\n\t\"test-test-doctest\",\n\t\"test-test-doctest2\",\n\t\"test-test-docxmlrpc\",\n\t\"test-test-dtrace\",\n\t\"test-test-dumbdbm\",\n\t\"test-test-dummy-thread\",\n\t\"test-test-dummy-threading\",\n\t\"test-test-dynamic\",\n\t\"test-test-dynamicclassattribute\",\n\t\"test-test-eintr\",\n\t\"test-test-email\",\n\t\"test-test-email-codecs\",\n\t\"test-test-email-main\",\n\t\"test-test-email-renamed\",\n\t\"test-test-email-test-asian-codecs\",\n\t\"test-test-email-test-contentmanager\",\n\t\"test-test-email-test-defect-handling\",\n\t\"test-test-email-test-email\",\n\t\"test-test-email-test-encoded-words\",\n\t\"test-test-email-test-generator\",\n\t\"test-test-email-test-header-value-parser\",\n\t\"test-test-email-test-headerregistry\",\n\t\"test-test-email-test-inversion\",\n\t\"test-test-email-test-message\",\n\t\"test-test-email-test-parser\",\n\t\"test-test-email-test-pickleable\",\n\t\"test-test-email-test-policy\",\n\t\"test-test-email-test-utils\",\n\t\"test-test-email-torture-test\",\n\t\"test-test-embed\",\n\t\"test-test-ensurepip\",\n\t\"test-test-enum\",\n\t\"test-test-enumerate\",\n\t\"test-test-eof\",\n\t\"test-test-epoll\",\n\t\"test-test-errno\",\n\t\"test-test-exception-hierarchy\",\n\t\"test-test-exception-variations\",\n\t\"test-test-exceptions\",\n\t\"test-test-extcall\",\n\t\"test-test-faulthandler\",\n\t\"test-test-fcntl\",\n\t\"test-test-file\",\n\t\"test-test-file-eintr\",\n\t\"test-test-file2k\",\n\t\"test-test-filecmp\",\n\t\"test-test-fileinput\",\n\t\"test-test-fileio\",\n\t\"test-test-finalization\",\n\t\"test-test-float\",\n\t\"test-test-flufl\",\n\t\"test-test-fnmatch\",\n\t\"test-test-fork1\",\n\t\"test-test-format\",\n\t\"test-test-fpformat\",\n\t\"test-test-fractions\",\n\t\"test-test-frame\",\n\t\"test-test-frozen\",\n\t\"test-test-fstring\",\n\t\"test-test-ftplib\",\n\t\"test-test-funcattrs\",\n\t\"test-test-functools\",\n\t\"test-test-future\",\n\t\"test-test-future-builtins\",\n\t\"test-test-future1\",\n\t\"test-test-future2\",\n\t\"test-test-future3\",\n\t\"test-test-future4\",\n\t\"test-test-future5\",\n\t\"test-test-gc\",\n\t\"test-test-gdb\",\n\t\"test-test-gdbm\",\n\t\"test-test-generator-stop\",\n\t\"test-test-generators\",\n\t\"test-test-genericalias\",\n\t\"test-test-genericclass\",\n\t\"test-test-genericpath\",\n\t\"test-test-genexps\",\n\t\"test-test-getargs\",\n\t\"test-test-getargs2\",\n\t\"test-test-getopt\",\n\t\"test-test-getpass\",\n\t\"test-test-gettext\",\n\t\"test-test-gl\",\n\t\"test-test-glob\",\n\t\"test-test-global\",\n\t\"test-test-grammar\",\n\t\"test-test-graphlib\",\n\t\"test-test-grp\",\n\t\"test-test-gzip\",\n\t\"test-test-hash\",\n\t\"test-test-hashlib\",\n\t\"test-test-heapq\",\n\t\"test-test-hmac\",\n\t\"test-test-hotshot\",\n\t\"test-test-html\",\n\t\"test-test-htmllib\",\n\t\"test-test-htmlparser\",\n\t\"test-test-http-cookiejar\",\n\t\"test-test-http-cookies\",\n\t\"test-test-httplib\",\n\t\"test-test-httpservers\",\n\t\"test-test-idle\",\n\t\"test-test-imageop\",\n\t\"test-test-imaplib\",\n\t\"test-test-imgfile\",\n\t\"test-test-imghdr\",\n\t\"test-test-imp\",\n\t\"test-test-import\",\n\t\"test-test-import-data\",\n\t\"test-test-import-data-circular-imports\",\n\t\"test-test-import-data-circular-imports-basic\",\n\t\"test-test-import-data-circular-imports-basic2\",\n\t\"test-test-import-data-circular-imports-binding\",\n\t\"test-test-import-data-circular-imports-binding2\",\n\t\"test-test-import-data-circular-imports-from-cycle1\",\n\t\"test-test-import-data-circular-imports-from-cycle2\",\n\t\"test-test-import-data-circular-imports-indirect\",\n\t\"test-test-import-data-circular-imports-rebinding\",\n\t\"test-test-import-data-circular-imports-rebinding2\",\n\t\"test-test-import-data-circular-imports-source\",\n\t\"test-test-import-data-circular-imports-subpackage\",\n\t\"test-test-import-data-circular-imports-subpkg\",\n\t\"test-test-import-data-circular-imports-subpkg-subpackage2\",\n\t\"test-test-import-data-circular-imports-subpkg-util\",\n\t\"test-test-import-data-circular-imports-use\",\n\t\"test-test-import-data-circular-imports-util\",\n\t\"test-test-import-data-package\",\n\t\"test-test-import-data-package-submodule\",\n\t\"test-test-import-data-package2\",\n\t\"test-test-import-data-package2-submodule1\",\n\t\"test-test-import-data-package2-submodule2\",\n\t\"test-test-import-magic\",\n\t\"test-test-import-main\",\n\t\"test-test-importhooks\",\n\t\"test-test-importlib\",\n\t\"test-test-importlib-abc\",\n\t\"test-test-importlib-builtin\",\n\t\"test-test-importlib-builtin-main\",\n\t\"test-test-importlib-builtin-test-finder\",\n\t\"test-test-importlib-builtin-test-loader\",\n\t\"test-test-importlib-builtin-util\",\n\t\"test-test-importlib-data\",\n\t\"test-test-importlib-data01\",\n\t\"test-test-importlib-data01-subdirectory\",\n\t\"test-test-importlib-data02\",\n\t\"test-test-importlib-data02-one\",\n\t\"test-test-importlib-data02-two\",\n\t\"test-test-importlib-data03\",\n\t\"test-test-importlib-data03-namespace\",\n\t\"test-test-importlib-data03-namespace-portion1\",\n\t\"test-test-importlib-data03-namespace-portion2\",\n\t\"test-test-importlib-extension\",\n\t\"test-test-importlib-extension-main\",\n\t\"test-test-importlib-extension-test-case-sensitivity\",\n\t\"test-test-importlib-extension-test-finder\",\n\t\"test-test-importlib-extension-test-loader\",\n\t\"test-test-importlib-extension-test-path-hook\",\n\t\"test-test-importlib-extension-util\",\n\t\"test-test-importlib-fixtures\",\n\t\"test-test-importlib-frozen\",\n\t\"test-test-importlib-frozen-main\",\n\t\"test-test-importlib-frozen-test-finder\",\n\t\"test-test-importlib-frozen-test-loader\",\n\t\"test-test-importlib-import\",\n\t\"test-test-importlib-import-main\",\n\t\"test-test-importlib-import-test-api\",\n\t\"test-test-importlib-import-test-caching\",\n\t\"test-test-importlib-import-test-fromlist\",\n\t\"test-test-importlib-import-test-loader\",\n\t\"test-test-importlib-import-test-meta-path\",\n\t\"test-test-importlib-import-test-package\",\n\t\"test-test-importlib-import-test-packages\",\n\t\"test-test-importlib-import-test-path\",\n\t\"test-test-importlib-import-test-relative-imports\",\n\t\"test-test-importlib-import-util\",\n\t\"test-test-importlib-main\",\n\t\"test-test-importlib-namespace-pkgs\",\n\t\"test-test-importlib-namespace-pkgs-both-portions\",\n\t\"test-test-importlib-namespace-pkgs-both-portions-foo\",\n\t\"test-test-importlib-namespace-pkgs-both-portions-foo-one\",\n\t\"test-test-importlib-namespace-pkgs-both-portions-foo-two\",\n\t\"test-test-importlib-namespace-pkgs-module-and-namespace-package\",\n\t\"test-test-importlib-namespace-pkgs-module-and-namespace-package-a-test\",\n\t\"test-test-importlib-namespace-pkgs-not-a-namespace-pkg\",\n\t\"test-test-importlib-namespace-pkgs-not-a-namespace-pkg-foo\",\n\t\"test-test-importlib-namespace-pkgs-not-a-namespace-pkg-foo-one\",\n\t\"test-test-importlib-namespace-pkgs-portion1\",\n\t\"test-test-importlib-namespace-pkgs-portion1-foo\",\n\t\"test-test-importlib-namespace-pkgs-portion1-foo-one\",\n\t\"test-test-importlib-namespace-pkgs-portion2\",\n\t\"test-test-importlib-namespace-pkgs-portion2-foo\",\n\t\"test-test-importlib-namespace-pkgs-portion2-foo-two\",\n\t\"test-test-importlib-namespace-pkgs-project1\",\n\t\"test-test-importlib-namespace-pkgs-project1-parent\",\n\t\"test-test-importlib-namespace-pkgs-project1-parent-child\",\n\t\"test-test-importlib-namespace-pkgs-project1-parent-child-one\",\n\t\"test-test-importlib-namespace-pkgs-project2\",\n\t\"test-test-importlib-namespace-pkgs-project2-parent\",\n\t\"test-test-importlib-namespace-pkgs-project2-parent-child\",\n\t\"test-test-importlib-namespace-pkgs-project2-parent-child-two\",\n\t\"test-test-importlib-namespace-pkgs-project3\",\n\t\"test-test-importlib-namespace-pkgs-project3-parent\",\n\t\"test-test-importlib-namespace-pkgs-project3-parent-child\",\n\t\"test-test-importlib-namespace-pkgs-project3-parent-child-three\",\n\t\"test-test-importlib-regrtest\",\n\t\"test-test-importlib-source\",\n\t\"test-test-importlib-source-main\",\n\t\"test-test-importlib-source-test-case-sensitivity\",\n\t\"test-test-importlib-source-test-file-loader\",\n\t\"test-test-importlib-source-test-finder\",\n\t\"test-test-importlib-source-test-path-hook\",\n\t\"test-test-importlib-source-test-source-encoding\",\n\t\"test-test-importlib-source-util\",\n\t\"test-test-importlib-stubs\",\n\t\"test-test-importlib-test-abc\",\n\t\"test-test-importlib-test-api\",\n\t\"test-test-importlib-test-files\",\n\t\"test-test-importlib-test-lazy\",\n\t\"test-test-importlib-test-locks\",\n\t\"test-test-importlib-test-main\",\n\t\"test-test-importlib-test-metadata-api\",\n\t\"test-test-importlib-test-namespace-pkgs\",\n\t\"test-test-importlib-test-open\",\n\t\"test-test-importlib-test-path\",\n\t\"test-test-importlib-test-pkg-import\",\n\t\"test-test-importlib-test-read\",\n\t\"test-test-importlib-test-resource\",\n\t\"test-test-importlib-test-spec\",\n\t\"test-test-importlib-test-threaded-import\",\n\t\"test-test-importlib-test-util\",\n\t\"test-test-importlib-test-windows\",\n\t\"test-test-importlib-test-zip\",\n\t\"test-test-importlib-threaded-import-hangers\",\n\t\"test-test-importlib-util\",\n\t\"test-test-importlib-zipdata01\",\n\t\"test-test-importlib-zipdata02\",\n\t\"test-test-index\",\n\t\"test-test-inspect\",\n\t\"test-test-int\",\n\t\"test-test-int-literal\",\n\t\"test-test-io\",\n\t\"test-test-ioctl\",\n\t\"test-test-ipaddress\",\n\t\"test-test-isinstance\",\n\t\"test-test-iter\",\n\t\"test-test-iterlen\",\n\t\"test-test-itertools\",\n\t\"test-test-json\",\n\t\"test-test-json-main\",\n\t\"test-test-json-test-decode\",\n\t\"test-test-json-test-default\",\n\t\"test-test-json-test-dump\",\n\t\"test-test-json-test-encode-basestring-ascii\",\n\t\"test-test-json-test-enum\",\n\t\"test-test-json-test-fail\",\n\t\"test-test-json-test-float\",\n\t\"test-test-json-test-indent\",\n\t\"test-test-json-test-pass1\",\n\t\"test-test-json-test-pass2\",\n\t\"test-test-json-test-pass3\",\n\t\"test-test-json-test-recursion\",\n\t\"test-test-json-test-scanstring\",\n\t\"test-test-json-test-separators\",\n\t\"test-test-json-test-speedups\",\n\t\"test-test-json-test-tool\",\n\t\"test-test-json-test-unicode\",\n\t\"test-test-keyword\",\n\t\"test-test-keywordonlyarg\",\n\t\"test-test-kqueue\",\n\t\"test-test-largefile\",\n\t\"test-test-lib2to3\",\n\t\"test-test-linecache\",\n\t\"test-test-linuxaudiodev\",\n\t\"test-test-list\",\n\t\"test-test-listcomps\",\n\t\"test-test-lltrace\",\n\t\"test-test-locale\",\n\t\"test-test-logging\",\n\t\"test-test-long\",\n\t\"test-test-long-future\",\n\t\"test-test-longexp\",\n\t\"test-test-lzma\",\n\t\"test-test-macos\",\n\t\"test-test-macostools\",\n\t\"test-test-macpath\",\n\t\"test-test-macurl2path\",\n\t\"test-test-mailbox\",\n\t\"test-test-mailcap\",\n\t\"test-test-marshal\",\n\t\"test-test-math\",\n\t\"test-test-md5\",\n\t\"test-test-memoryio\",\n\t\"test-test-memoryview\",\n\t\"test-test-metaclass\",\n\t\"test-test-mhlib\",\n\t\"test-test-mimetools\",\n\t\"test-test-mimetypes\",\n\t\"test-test-mimewriter\",\n\t\"test-test-minidom\",\n\t\"test-test-mmap\",\n\t\"test-test-module\",\n\t\"test-test-modulefinder\",\n\t\"test-test-msilib\",\n\t\"test-test-multibytecodec\",\n\t\"test-test-multifile\",\n\t\"test-test-multiprocessing\",\n\t\"test-test-multiprocessing-fork\",\n\t\"test-test-multiprocessing-forkserver\",\n\t\"test-test-multiprocessing-main-handling\",\n\t\"test-test-multiprocessing-spawn\",\n\t\"test-test-mutants\",\n\t\"test-test-mutex\",\n\t\"test-test-named-expressions\",\n\t\"test-test-netrc\",\n\t\"test-test-new\",\n\t\"test-test-nis\",\n\t\"test-test-nntplib\",\n\t\"test-test-normalization\",\n\t\"test-test-ntpath\",\n\t\"test-test-numeric-tower\",\n\t\"test-test-old-mailbox\",\n\t\"test-test-opcode\",\n\t\"test-test-opcodes\",\n\t\"test-test-openpty\",\n\t\"test-test-operator\",\n\t\"test-test-optparse\",\n\t\"test-test-ordered-dict\",\n\t\"test-test-os\",\n\t\"test-test-ossaudiodev\",\n\t\"test-test-osx-env\",\n\t\"test-test-osx-support\",\n\t\"test-test-parser\",\n\t\"test-test-pathlib\",\n\t\"test-test-pdb\",\n\t\"test-test-peepholer\",\n\t\"test-test-peg-generator\",\n\t\"test-test-peg-generator-main\",\n\t\"test-test-peg-generator-test-c-parser\",\n\t\"test-test-peg-generator-test-first-sets\",\n\t\"test-test-peg-generator-test-pegen\",\n\t\"test-test-peg-parser\",\n\t\"test-test-pep247\",\n\t\"test-test-pep277\",\n\t\"test-test-pep292\",\n\t\"test-test-pep3120\",\n\t\"test-test-pep3131\",\n\t\"test-test-pep3151\",\n\t\"test-test-pep352\",\n\t\"test-test-pep380\",\n\t\"test-test-pep479\",\n\t\"test-test-pickle\",\n\t\"test-test-picklebuffer\",\n\t\"test-test-pickletools\",\n\t\"test-test-pipes\",\n\t\"test-test-pkg\",\n\t\"test-test-pkgimport\",\n\t\"test-test-pkgutil\",\n\t\"test-test-platform\",\n\t\"test-test-plistlib\",\n\t\"test-test-poll\",\n\t\"test-test-popen\",\n\t\"test-test-popen2\",\n\t\"test-test-poplib\",\n\t\"test-test-positional-only-arg\",\n\t\"test-test-posix\",\n\t\"test-test-posixpath\",\n\t\"test-test-pow\",\n\t\"test-test-pprint\",\n\t\"test-test-print\",\n\t\"test-test-profile\",\n\t\"test-test-property\",\n\t\"test-test-pstats\",\n\t\"test-test-pty\",\n\t\"test-test-pulldom\",\n\t\"test-test-pwd\",\n\t\"test-test-py-compile\",\n\t\"test-test-py3kwarn\",\n\t\"test-test-pyclbr\",\n\t\"test-test-pydoc\",\n\t\"test-test-pyexpat\",\n\t\"test-test-queue\",\n\t\"test-test-quopri\",\n\t\"test-test-raise\",\n\t\"test-test-random\",\n\t\"test-test-range\",\n\t\"test-test-re\",\n\t\"test-test-readline\",\n\t\"test-test-regrtest\",\n\t\"test-test-repl\",\n\t\"test-test-repr\",\n\t\"test-test-reprlib\",\n\t\"test-test-resource\",\n\t\"test-test-rfc822\",\n\t\"test-test-richcmp\",\n\t\"test-test-rlcompleter\",\n\t\"test-test-robotparser\",\n\t\"test-test-runpy\",\n\t\"test-test-sax\",\n\t\"test-test-sched\",\n\t\"test-test-scope\",\n\t\"test-test-script-helper\",\n\t\"test-test-scriptpackages\",\n\t\"test-test-secrets\",\n\t\"test-test-select\",\n\t\"test-test-selectors\",\n\t\"test-test-set\",\n\t\"test-test-setcomps\",\n\t\"test-test-sets\",\n\t\"test-test-sgmllib\",\n\t\"test-test-sha\",\n\t\"test-test-shelve\",\n\t\"test-test-shlex\",\n\t\"test-test-shutil\",\n\t\"test-test-signal\",\n\t\"test-test-simplehttpserver\",\n\t\"test-test-site\",\n\t\"test-test-slice\",\n\t\"test-test-smtpd\",\n\t\"test-test-smtplib\",\n\t\"test-test-smtpnet\",\n\t\"test-test-sndhdr\",\n\t\"test-test-socket\",\n\t\"test-test-socketserver\",\n\t\"test-test-softspace\",\n\t\"test-test-sort\",\n\t\"test-test-source-encoding\",\n\t\"test-test-spwd\",\n\t\"test-test-sqlite\",\n\t\"test-test-ssl\",\n\t\"test-test-startfile\",\n\t\"test-test-stat\",\n\t\"test-test-statistics\",\n\t\"test-test-str\",\n\t\"test-test-strftime\",\n\t\"test-test-string\",\n\t\"test-test-string-literals\",\n\t\"test-test-stringio\",\n\t\"test-test-stringprep\",\n\t\"test-test-strlit\",\n\t\"test-test-strop\",\n\t\"test-test-strptime\",\n\t\"test-test-strtod\",\n\t\"test-test-struct\",\n\t\"test-test-structmembers\",\n\t\"test-test-structseq\",\n\t\"test-test-subclassinit\",\n\t\"test-test-subprocess\",\n\t\"test-test-sunau\",\n\t\"test-test-sunaudiodev\",\n\t\"test-test-sundry\",\n\t\"test-test-super\",\n\t\"test-test-support\",\n\t\"test-test-symbol\",\n\t\"test-test-symtable\",\n\t\"test-test-syntax\",\n\t\"test-test-sys\",\n\t\"test-test-sys-setprofile\",\n\t\"test-test-sys-settrace\",\n\t\"test-test-sysconfig\",\n\t\"test-test-syslog\",\n\t\"test-test-tabnanny\",\n\t\"test-test-tarfile\",\n\t\"test-test-tcl\",\n\t\"test-test-telnetlib\",\n\t\"test-test-tempfile\",\n\t\"test-test-test-support\",\n\t\"test-test-textwrap\",\n\t\"test-test-thread\",\n\t\"test-test-threaded-import\",\n\t\"test-test-threadedtempfile\",\n\t\"test-test-threading\",\n\t\"test-test-threading-local\",\n\t\"test-test-threadsignals\",\n\t\"test-test-time\",\n\t\"test-test-timeit\",\n\t\"test-test-timeout\",\n\t\"test-test-tix\",\n\t\"test-test-tk\",\n\t\"test-test-tokenize\",\n\t\"test-test-tools\",\n\t\"test-test-tools-main\",\n\t\"test-test-tools-test-fixcid\",\n\t\"test-test-tools-test-gprof2html\",\n\t\"test-test-tools-test-i18n\",\n\t\"test-test-tools-test-lll\",\n\t\"test-test-tools-test-md5sum\",\n\t\"test-test-tools-test-pathfix\",\n\t\"test-test-tools-test-pdeps\",\n\t\"test-test-tools-test-pindent\",\n\t\"test-test-tools-test-reindent\",\n\t\"test-test-tools-test-sundry\",\n\t\"test-test-tools-test-unparse\",\n\t\"test-test-trace\",\n\t\"test-test-traceback\",\n\t\"test-test-tracemalloc\",\n\t\"test-test-transformer\",\n\t\"test-test-ttk-guionly\",\n\t\"test-test-ttk-textonly\",\n\t\"test-test-tuple\",\n\t\"test-test-turtle\",\n\t\"test-test-type-comments\",\n\t\"test-test-typechecks\",\n\t\"test-test-types\",\n\t\"test-test-typing\",\n\t\"test-test-ucn\",\n\t\"test-test-unary\",\n\t\"test-test-undocumented-details\",\n\t\"test-test-unicode\",\n\t\"test-test-unicode-file\",\n\t\"test-test-unicode-file-functions\",\n\t\"test-test-unicode-identifiers\",\n\t\"test-test-unicodedata\",\n\t\"test-test-unittest\",\n\t\"test-test-univnewlines\",\n\t\"test-test-univnewlines2k\",\n\t\"test-test-unpack\",\n\t\"test-test-unpack-ex\",\n\t\"test-test-unparse\",\n\t\"test-test-urllib\",\n\t\"test-test-urllib-response\",\n\t\"test-test-urllib2\",\n\t\"test-test-urllib2-localnet\",\n\t\"test-test-urllib2net\",\n\t\"test-test-urllibnet\",\n\t\"test-test-urlparse\",\n\t\"test-test-userdict\",\n\t\"test-test-userlist\",\n\t\"test-test-userstring\",\n\t\"test-test-utf8-mode\",\n\t\"test-test-utf8source\",\n\t\"test-test-uu\",\n\t\"test-test-uuid\",\n\t\"test-test-venv\",\n\t\"test-test-wait3\",\n\t\"test-test-wait4\",\n\t\"test-test-warnings\",\n\t\"test-test-warnings-data\",\n\t\"test-test-warnings-data-import-warning\",\n\t\"test-test-warnings-data-stacklevel\",\n\t\"test-test-warnings-main\",\n\t\"test-test-wave\",\n\t\"test-test-weakref\",\n\t\"test-test-weakset\",\n\t\"test-test-webbrowser\",\n\t\"test-test-whichdb\",\n\t\"test-test-winconsoleio\",\n\t\"test-test-winreg\",\n\t\"test-test-winsound\",\n\t\"test-test-with\",\n\t\"test-test-wsgiref\",\n\t\"test-test-xdrlib\",\n\t\"test-test-xml-dom-minicompat\",\n\t\"test-test-xml-etree\",\n\t\"test-test-xml-etree-c\",\n\t\"test-test-xmllib\",\n\t\"test-test-xmlrpc\",\n\t\"test-test-xmlrpc-net\",\n\t\"test-test-xpickle\",\n\t\"test-test-xrange\",\n\t\"test-test-xxsubinterpreters\",\n\t\"test-test-xxtestfuzz\",\n\t\"test-test-yield-from\",\n\t\"test-test-zipapp\",\n\t\"test-test-zipfile\",\n\t\"test-test-zipfile64\",\n\t\"test-test-zipimport\",\n\t\"test-test-zipimport-support\",\n\t\"test-test-zlib\",\n\t\"test-test-zoneinfo\",\n\t\"test-test-zoneinfo-main\",\n\t\"test-test-zoneinfo-support\",\n\t\"test-test-zoneinfo-test-zoneinfo\",\n\t\"test-testall\",\n\t\"test-testcodec\",\n\t\"test-tf-inherit-check\",\n\t\"test-threaded-import-hangers\",\n\t\"test-time-hashlib\",\n\t\"test-tracedmodules\",\n\t\"test-tracedmodules-testmod\",\n\t\"test-typed-dict-helper\",\n\t\"test-warning-tests\",\n\t\"test-win-console-handler\",\n\t\"test-xmltests\",\n\t\"test-ziptestdata\",\n\t\"test-ziptestdata-testdata-module-inside-zip\",\n\t\"testbuffer\",\n\t\"testcapi\",\n\t\"testimportmultiple\",\n\t\"testinternalcapi\",\n\t\"testmultiphase\",\n\t\"textwrap\",\n\t\"this\",\n\t\"thread\",\n\t\"threading\",\n\t\"threading-local\",\n\t\"time\",\n\t\"timeit\",\n\t\"tix\",\n\t\"tkcolorchooser\",\n\t\"tkcommondialog\",\n\t\"tkconstants\",\n\t\"tkdnd\",\n\t\"tkfiledialog\",\n\t\"tkfont\",\n\t\"tkinter\",\n\t\"tkinter-colorchooser\",\n\t\"tkinter-commondialog\",\n\t\"tkinter-constants\",\n\t\"tkinter-dialog\",\n\t\"tkinter-dnd\",\n\t\"tkinter-filedialog\",\n\t\"tkinter-fix\",\n\t\"tkinter-font\",\n\t\"tkinter-main\",\n\t\"tkinter-messagebox\",\n\t\"tkinter-scrolledtext\",\n\t\"tkinter-simpledialog\",\n\t\"tkinter-test\",\n\t\"tkinter-test-runtktests\",\n\t\"tkinter-test-support\",\n\t\"tkinter-test-test-tkinter\",\n\t\"tkinter-test-test-tkinter-test-colorchooser\",\n\t\"tkinter-test-test-tkinter-test-font\",\n\t\"tkinter-test-test-tkinter-test-geometry-managers\",\n\t\"tkinter-test-test-tkinter-test-images\",\n\t\"tkinter-test-test-tkinter-test-loadtk\",\n\t\"tkinter-test-test-tkinter-test-messagebox\",\n\t\"tkinter-test-test-tkinter-test-misc\",\n\t\"tkinter-test-test-tkinter-test-simpledialog\",\n\t\"tkinter-test-test-tkinter-test-text\",\n\t\"tkinter-test-test-tkinter-test-variables\",\n\t\"tkinter-test-test-tkinter-test-widgets\",\n\t\"tkinter-test-test-ttk\",\n\t\"tkinter-test-test-ttk-test-extensions\",\n\t\"tkinter-test-test-ttk-test-functions\",\n\t\"tkinter-test-test-ttk-test-style\",\n\t\"tkinter-test-test-ttk-test-widgets\",\n\t\"tkinter-test-widget-tests\",\n\t\"tkinter-tix\",\n\t\"tkinter-ttk\",\n\t\"tkmessagebox\",\n\t\"tksimpledialog\",\n\t\"toaiff\",\n\t\"token\",\n\t\"tokenize\",\n\t\"tomllib\",\n\t\"tomllib-parser\",\n\t\"tomllib-re\",\n\t\"tomllib-types\",\n\t\"trace\",\n\t\"traceback\",\n\t\"tracemalloc\",\n\t\"ttk\",\n\t\"tty\",\n\t\"turtle\",\n\t\"turtledemo\",\n\t\"turtledemo-bytedesign\",\n\t\"turtledemo-chaos\",\n\t\"turtledemo-clock\",\n\t\"turtledemo-colormixer\",\n\t\"turtledemo-forest\",\n\t\"turtledemo-fractalcurves\",\n\t\"turtledemo-lindenmayer\",\n\t\"turtledemo-main\",\n\t\"turtledemo-minimal-hanoi\",\n\t\"turtledemo-nim\",\n\t\"turtledemo-paint\",\n\t\"turtledemo-peace\",\n\t\"turtledemo-penrose\",\n\t\"turtledemo-planet-and-moon\",\n\t\"turtledemo-rosette\",\n\t\"turtledemo-round-dance\",\n\t\"turtledemo-sorting-animate\",\n\t\"turtledemo-tree\",\n\t\"turtledemo-two-canvases\",\n\t\"turtledemo-wikipedia\",\n\t\"turtledemo-yinyang\",\n\t\"types\",\n\t\"typing\",\n\t\"typing-io\",\n\t\"typing-re\",\n\t\"unicodedata\",\n\t\"unittest\",\n\t\"unittest-async-case\",\n\t\"unittest-case\",\n\t\"unittest-loader\",\n\t\"unittest-log\",\n\t\"unittest-main\",\n\t\"unittest-mock\",\n\t\"unittest-result\",\n\t\"unittest-runner\",\n\t\"unittest-signals\",\n\t\"unittest-suite\",\n\t\"unittest-test\",\n\t\"unittest-test-dummy\",\n\t\"unittest-test-main\",\n\t\"unittest-test-support\",\n\t\"unittest-test-test-assertions\",\n\t\"unittest-test-test-async-case\",\n\t\"unittest-test-test-break\",\n\t\"unittest-test-test-case\",\n\t\"unittest-test-test-discovery\",\n\t\"unittest-test-test-functiontestcase\",\n\t\"unittest-test-test-loader\",\n\t\"unittest-test-test-program\",\n\t\"unittest-test-test-result\",\n\t\"unittest-test-test-runner\",\n\t\"unittest-test-test-setups\",\n\t\"unittest-test-test-skipping\",\n\t\"unittest-test-test-suite\",\n\t\"unittest-test-test-warnings\",\n\t\"unittest-test-testmock\",\n\t\"unittest-test-testmock-main\",\n\t\"unittest-test-testmock-support\",\n\t\"unittest-test-testmock-testasync\",\n\t\"unittest-test-testmock-testcallable\",\n\t\"unittest-test-testmock-testhelpers\",\n\t\"unittest-test-testmock-testmagicmethods\",\n\t\"unittest-test-testmock-testmock\",\n\t\"unittest-test-testmock-testpatch\",\n\t\"unittest-test-testmock-testsealable\",\n\t\"unittest-test-testmock-testsentinel\",\n\t\"unittest-test-testmock-testwith\",\n\t\"unittest-util\",\n\t\"urllib\",\n\t\"urllib-error\",\n\t\"urllib-parse\",\n\t\"urllib-request\",\n\t\"urllib-response\",\n\t\"urllib-robotparser\",\n\t\"urllib2\",\n\t\"urlparse\",\n\t\"user\",\n\t\"userdict\",\n\t\"userlist\",\n\t\"userstring\",\n\t\"uu\",\n\t\"uuid\",\n\t\"venv\",\n\t\"venv-main\",\n\t\"videoreader\",\n\t\"w\",\n\t\"warnings\",\n\t\"wave\",\n\t\"weakref\",\n\t\"weakrefset\",\n\t\"webbrowser\",\n\t\"whichdb\",\n\t\"winapi\",\n\t\"winreg\",\n\t\"winsound\",\n\t\"wmi\",\n\t\"wsgiref\",\n\t\"wsgiref-handlers\",\n\t\"wsgiref-headers\",\n\t\"wsgiref-simple-server\",\n\t\"wsgiref-types\",\n\t\"wsgiref-util\",\n\t\"wsgiref-validate\",\n\t\"xdrlib\",\n\t\"xml\",\n\t\"xml-dom\",\n\t\"xml-dom-domreg\",\n\t\"xml-dom-expatbuilder\",\n\t\"xml-dom-minicompat\",\n\t\"xml-dom-minidom\",\n\t\"xml-dom-nodefilter\",\n\t\"xml-dom-pulldom\",\n\t\"xml-dom-xmlbuilder\",\n\t\"xml-etree\",\n\t\"xml-etree-celementtree\",\n\t\"xml-etree-elementinclude\",\n\t\"xml-etree-elementpath\",\n\t\"xml-etree-elementtree\",\n\t\"xml-parsers\",\n\t\"xml-parsers-expat\",\n\t\"xml-parsers-expat-errors\",\n\t\"xml-parsers-expat-errors-dom\",\n\t\"xml-parsers-expat-errors-etree\",\n\t\"xml-parsers-expat-errors-parsers\",\n\t\"xml-parsers-expat-errors-sax\",\n\t\"xml-parsers-expat-model\",\n\t\"xml-parsers-expat-model-dom\",\n\t\"xml-parsers-expat-model-etree\",\n\t\"xml-parsers-expat-model-parsers\",\n\t\"xml-parsers-expat-model-sax\",\n\t\"xml-sax\",\n\t\"xml-sax-exceptions\",\n\t\"xml-sax-expatreader\",\n\t\"xml-sax-handler\",\n\t\"xml-sax-saxutils\",\n\t\"xml-sax-xmlreader\",\n\t\"xmllib\",\n\t\"xmlrpc\",\n\t\"xmlrpc-client\",\n\t\"xmlrpc-server\",\n\t\"xmlrpclib\",\n\t\"xxlimited\",\n\t\"xxsubinterpreters\",\n\t\"xxsubtype\",\n\t\"xxtestfuzz\",\n\t\"zipapp\",\n\t\"zipfile\",\n\t\"zipfile-main\",\n\t\"zipfile-path\",\n\t\"zipfile-path-glob\",\n\t\"zipimport\",\n\t\"zlib\",\n\t\"zoneinfo\",\n\t\"zoneinfo-common\",\n\t\"zoneinfo-tzpath\",\n\t\"zoneinfo-zoneinfo\",\n\t\"zstd\"\n]);\n//#endregion\n//#region src/channels/pypi.ts\n/** PEP 503: case-insensitive, runs of `-`, `_` and `.` are equivalent. */\nconst normalizePypi = (name) => name.toLowerCase().replace(/[-_.]+/g, \"-\");\n/**\n* Warehouse's `ultranormalize_name`: drops `. _ -`, then maps l/L/i/I to 1 and o/O to 0, so `f1ask`\n* collides with `flask`. PyPI refuses a new name whose ultranormalized form matches an existing project.\n*/\nconst ultranormalizePypi = (name) => name.replace(/[._-]/g, \"\").replace(/[lLiI]/g, \"1\").replace(/[oO]/g, \"0\").toLowerCase();\nconst VALID = /^([a-z0-9]|[a-z0-9][a-z0-9._-]*[a-z0-9])$/i;\nconst SIMPLE_JSON = \"application/vnd.pypi.simple.v1+json\";\n/** Every project on PyPI, one `ultranormalized\\tname` line each, from the simple index (about 10 MB). */\nasync function projectList(ctx) {\n\tconst res = await get(ctx, \"https://pypi.org/simple/\", {\n\t\theaders: { accept: SIMPLE_JSON },\n\t\ttimeoutMs: 12e4\n\t});\n\tif (!res.ok) throw new Error(`PyPI simple index returned HTTP ${res.status}`);\n\tconst { projects } = await res.json();\n\tif (!Array.isArray(projects) || !projects.length || typeof projects[0]?.name !== \"string\") throw new Error(\"PyPI simple index is not in the expected shape\");\n\treturn `\\n${projects.map((p) => `${ultranormalizePypi(p.name)}\\t${p.name}`).join(\"\\n\")}\\n`;\n}\nconst pypi = defineChannel({\n\tid: \"pypi\",\n\tlabel: \"PyPI\",\n\tcategory: \"package\",\n\trules: (name) => {\n\t\tif (!VALID.test(name)) return \"PyPI names are letters, digits, and inner . _ -\";\n\t\tif (PYPI_STDLIB.has(normalizePypi(name))) return \"PyPI reserves Python standard library names\";\n\t},\n\tasync lookup(name, ctx) {\n\t\tconst normalized = normalizePypi(name);\n\t\tconst url = `https://pypi.org/project/${normalized}/`;\n\t\tconst res = await get(ctx, `https://pypi.org/pypi/${normalized}/json`);\n\t\tif (res.status === 200) {\n\t\t\tconst { info } = await res.json();\n\t\t\treturn {\n\t\t\t\tstatus: \"taken\",\n\t\t\t\turl,\n\t\t\t\tnote: info.summary || void 0,\n\t\t\t\tmeta: {\n\t\t\t\t\tname: info.name,\n\t\t\t\t\tlatest: info.version\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tif (res.status !== 404) return unexpected(\"PyPI\", res);\n\t\tconst simple = await get(ctx, `https://pypi.org/simple/${normalized}/`, { headers: { accept: SIMPLE_JSON } });\n\t\tif (simple.status === 200) {\n\t\t\tconst doc = await simple.json();\n\t\t\tconst state = doc[\"project-status\"]?.status;\n\t\t\treturn {\n\t\t\t\tstatus: \"taken\",\n\t\t\t\turl,\n\t\t\t\tnote: state && state !== \"active\" ? `the project exists but is ${state}` : \"the project exists but has no installable release\",\n\t\t\t\tmeta: {\n\t\t\t\t\tname: doc.name,\n\t\t\t\t\tstate\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tif (simple.status !== 404) return unexpected(\"PyPI\", simple);\n\t\tlet list;\n\t\ttry {\n\t\t\tlist = await cachedList(ctx, \"pypi-projects\", () => projectList(ctx));\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tstatus: \"available\",\n\t\t\t\tcertainty: \"probable\",\n\t\t\t\tnote: \"could not download PyPI's project list to check its similar-name rule\"\n\t\t\t};\n\t\t}\n\t\tconst matches = linesFor(list.text, ultranormalizePypi(name)).map(([n]) => n);\n\t\tif (matches[0]) return {\n\t\t\tstatus: \"unavailable\",\n\t\t\tnote: `PyPI rejects names too similar to \"${matches[0]}\"`\n\t\t};\n\t\treturn list.stale ? {\n\t\t\tstatus: \"available\",\n\t\t\tcertainty: \"probable\",\n\t\t\tnote: `checked against PyPI's project list from ${asOf(list)}`\n\t\t} : {\n\t\t\tstatus: \"available\",\n\t\t\tcertainty: \"confirmed\"\n\t\t};\n\t}\n});\n//#endregion\n//#region src/channels/index.ts\nconst DEFAULT_TLDS = [\"com\", \"dev\"];\nconst fixed = [\n\tnpm,\n\tpypi,\n\tcrates,\n\thomebrew,\n\tgithub\n];\nfunction channelIds() {\n\treturn [\n\t\t...fixed.map((c) => c.id),\n\t\t\"domain\",\n\t\t\"domain:<tld>\"\n\t];\n}\n/** A domain channel for a TLD as typed (`.dev`, `COM`, `рф`), or an error for one it cannot check. */\nfunction domainFor(raw) {\n\tconst display = raw.trim().replace(/^\\./, \"\").toLowerCase();\n\tif (!display) throw new Error(\"a domain channel needs a TLD, as in domain:dev\");\n\tif (display.includes(\".\")) throw new Error(`\"${display}\" has several labels; only top-level domains are supported`);\n\tconst ascii = domainToASCII(display);\n\tif (!ascii) throw new Error(`\"${display}\" is not a valid TLD`);\n\treturn domain(ascii, display);\n}\nconst unique = (channels) => channels.filter((c, i) => channels.findIndex((p) => p.id === c.id) === i);\nfunction selectChannels({ only, tlds = DEFAULT_TLDS } = {}) {\n\tconst all = unique([...fixed, ...tlds.map(domainFor)]);\n\tif (!only?.length) return all;\n\tconst picked = [];\n\tfor (const raw of only) {\n\t\tconst id = raw.trim().toLowerCase();\n\t\tif (id === \"domain\") picked.push(...all.filter((c) => c.category === \"domain\"));\n\t\telse if (id.startsWith(\"domain:\")) picked.push(domainFor(raw.trim().slice(7)));\n\t\telse {\n\t\t\tconst channel = fixed.find((c) => c.id === id);\n\t\t\tif (!channel) throw new Error(`unknown channel \"${raw}\"; expected one of: ${channelIds().join(\", \")}`);\n\t\t\tpicked.push(channel);\n\t\t}\n\t}\n\treturn unique(picked);\n}\n//#endregion\n//#region src/store.ts\n/** The OS cache directory: ~/Library/Caches on macOS, XDG on Linux, LOCALAPPDATA on Windows. */\nfunction defaultCacheDir(env = process.env, platform = process.platform, home = homedir()) {\n\tif (env.NAMEABLE_CACHE_DIR) return env.NAMEABLE_CACHE_DIR;\n\tconst path = platform === \"win32\" ? win32 : posix;\n\tconst base = (value) => value && path.isAbsolute(value) ? value : void 0;\n\tif (platform === \"darwin\") return path.join(home, \"Library\", \"Caches\", \"nameable\");\n\tif (platform === \"win32\") return path.join(base(env.LOCALAPPDATA) ?? path.join(home, \"AppData\", \"Local\"), \"nameable\", \"Cache\");\n\treturn path.join(base(env.XDG_CACHE_HOME) ?? path.join(home, \".cache\"), \"nameable\");\n}\n/** Gzipped files in `dir`, one per key; a file's modification time is when it was saved. */\nfunction fileStore(dir) {\n\tconst path = (key) => join(dir, `${key}.gz`);\n\treturn {\n\t\tasync read(key) {\n\t\t\ttry {\n\t\t\t\tconst [data, info] = await Promise.all([readFile(path(key)), stat(path(key))]);\n\t\t\t\treturn {\n\t\t\t\t\ttext: gunzipSync(data).toString(\"utf8\"),\n\t\t\t\t\tsavedAt: info.mtimeMs\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t\tasync write(key, text) {\n\t\t\tawait mkdir(dir, { recursive: true });\n\t\t\tconst partial = `${path(key)}.${process.pid}.partial`;\n\t\t\tawait writeFile(partial, gzipSync(text));\n\t\t\tawait rename(partial, path(key));\n\t\t}\n\t};\n}\n/** Deletes the lists this tool saves in `dir`, and `dir` itself only when nothing else is left in it. */\nasync function clearStore(dir) {\n\tawait Promise.all(LIST_KEYS.map((key) => rm(join(dir, `${key}.gz`), { force: true })));\n\tawait rmdir(dir).catch(() => void 0);\n}\n//#endregion\nexport { DEFAULT_TLDS, LIST_TTL_MS, channelIds, check, checkMany, clearStore, defaultCacheDir, fileStore, normalizePypi, readWhois, selectChannels, ultranormalizePypi };\n\n//# sourceMappingURL=index.mjs.map"],"mappings":"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CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;;AAID,MAAM,iBAAiB,SAAS,KAAK,YAAY,CAAC,CAAC,QAAQ,WAAW,GAAG;;;;;AAKzE,MAAM,sBAAsB,SAAS,KAAK,QAAQ,UAAU,EAAE,CAAC,CAAC,QAAQ,WAAW,GAAG,CAAC,CAAC,QAAQ,SAAS,GAAG,CAAC,CAAC,YAAY;AAC1H,MAAM,QAAQ;AACd,MAAM,cAAc;;AAEpB,eAAe,YAAY,KAAK;CAC/B,MAAM,MAAM,MAAM,IAAI,KAAK,4BAA4B;EACtD,SAAS,EAAE,QAAQ,YAAY;EAC/B,WAAW;CACZ,CAAC;CACD,IAAI,CAAC,IAAI,IAAI,MAAM,IAAI,MAAM,mCAAmC,IAAI,QAAQ;CAC5E,MAAM,EAAE,aAAa,MAAM,IAAI,KAAK;CACpC,IAAI,CAAC,MAAM,QAAQ,QAAQ,KAA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"}
@@ -0,0 +1,104 @@
1
+ import { n as channelIds, o as fileStore, r as checkMany, s as selectChannels, t as DEFAULT_TLDS } from "./dist-kIDsX2Ie.mjs";
2
+ import { McpServer } from "@modelcontextprotocol/server";
3
+ import { serveStdio } from "@modelcontextprotocol/server/stdio";
4
+ import * as z from "zod";
5
+ //#region src/mcp.ts
6
+ const result = z.object({
7
+ channel: z.string(),
8
+ label: z.string(),
9
+ status: z.enum([
10
+ "available",
11
+ "reclaimable",
12
+ "taken",
13
+ "unavailable",
14
+ "unknown"
15
+ ]),
16
+ certainty: z.enum(["confirmed", "probable"]).optional(),
17
+ url: z.string().optional(),
18
+ note: z.string().optional(),
19
+ meta: z.record(z.string(), z.unknown()).optional()
20
+ });
21
+ const output = z.object({
22
+ schema: z.literal(1),
23
+ reports: z.array(z.object({
24
+ name: z.string(),
25
+ results: z.array(result)
26
+ }))
27
+ });
28
+ const DESCRIPTION = `Check whether names are free on package registries, GitHub and domains.
29
+
30
+ Each result has a status:
31
+ - available: nobody holds it and the registry would accept it. certainty "confirmed" means every rule
32
+ that public data allows was checked; "probable" means one could not be, and note says which.
33
+ - reclaimable: held before but released; it can be taken again.
34
+ - taken: someone holds it; url shows who.
35
+ - unavailable: nobody holds it exactly, but the registry would refuse it (invalid, reserved, too
36
+ similar to an existing name, or blocked for now after a deletion); note says why.
37
+ - unknown: no trustworthy answer (network error, rate limit). Never treat it as free.
38
+
39
+ Pick only the channels that matter for the project instead of checking everything.`;
40
+ /** The MCP server: one read-only tool that runs the same checks as the CLI. */
41
+ function createMcpServer(deps) {
42
+ const server = new McpServer({
43
+ name: "nameable",
44
+ version: deps.version
45
+ });
46
+ server.registerTool("check_names", {
47
+ title: "Check name availability",
48
+ description: DESCRIPTION,
49
+ inputSchema: z.object({
50
+ names: z.array(z.string().refine((n) => n.trim() !== "", "names cannot be empty")).min(1).max(50).describe("Candidate names, checked on every selected channel"),
51
+ channels: z.array(z.string()).min(1).optional().describe(`Channels to check (default: all). One of: ${channelIds().join(", ")}. "domain" means every TLD in tlds.`),
52
+ tlds: z.array(z.string()).min(1).optional().describe(`TLDs for "domain" (default: ${DEFAULT_TLDS.join(", ")})`),
53
+ refresh: z.boolean().optional().describe("Download registry name lists again even when the cached copy is fresh")
54
+ }),
55
+ outputSchema: output,
56
+ annotations: {
57
+ readOnlyHint: true,
58
+ idempotentHint: true,
59
+ openWorldHint: true
60
+ }
61
+ }, async ({ names, channels: only, tlds, refresh }) => {
62
+ let channels;
63
+ try {
64
+ channels = selectChannels({
65
+ only,
66
+ tlds
67
+ });
68
+ } catch (err) {
69
+ return {
70
+ isError: true,
71
+ content: [{
72
+ type: "text",
73
+ text: err.message
74
+ }]
75
+ };
76
+ }
77
+ const structured = {
78
+ schema: 1,
79
+ reports: await checkMany([...new Set(names)], channels, {
80
+ fetch: deps.fetch,
81
+ whois: deps.whois,
82
+ githubToken: channels.some((c) => c.id === "github") ? await deps.githubToken?.() : void 0,
83
+ store: deps.cacheDir ? fileStore(deps.cacheDir) : void 0,
84
+ refresh
85
+ })
86
+ };
87
+ return {
88
+ content: [{
89
+ type: "text",
90
+ text: JSON.stringify(structured)
91
+ }],
92
+ structuredContent: structured
93
+ };
94
+ });
95
+ return server;
96
+ }
97
+ /** Serves the MCP server over stdio, or over `transport` when given; it runs until the connection closes. */
98
+ function serveMcp(deps, transport) {
99
+ serveStdio(() => createMcpServer(deps), { transport });
100
+ }
101
+ //#endregion
102
+ export { serveMcp };
103
+
104
+ //# sourceMappingURL=mcp-BO8l8n9u.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-BO8l8n9u.mjs","names":[],"sources":["../src/mcp.ts"],"sourcesContent":["import { McpServer, type Transport } from \"@modelcontextprotocol/server\";\nimport { serveStdio } from \"@modelcontextprotocol/server/stdio\";\nimport {\n channelIds,\n checkMany,\n DEFAULT_TLDS,\n fileStore,\n selectChannels,\n type Channel,\n type Fetch,\n type Whois,\n} from \"@nameable/core\";\nimport * as z from \"zod\";\n\nexport type McpDeps = {\n version: string;\n githubToken?: () => Promise<string | undefined>;\n fetch?: Fetch;\n whois?: Whois;\n cacheDir?: string;\n};\n\n// Mirrors the CLI's JSON output, so an agent and a script read the same contract.\nconst result = z.object({\n channel: z.string(),\n label: z.string(),\n status: z.enum([\"available\", \"reclaimable\", \"taken\", \"unavailable\", \"unknown\"]),\n certainty: z.enum([\"confirmed\", \"probable\"]).optional(),\n url: z.string().optional(),\n note: z.string().optional(),\n meta: z.record(z.string(), z.unknown()).optional(),\n});\nconst output = z.object({\n schema: z.literal(1),\n reports: z.array(z.object({ name: z.string(), results: z.array(result) })),\n});\n\nconst DESCRIPTION = `Check whether names are free on package registries, GitHub and domains.\n\nEach result has a status:\n- available: nobody holds it and the registry would accept it. certainty \"confirmed\" means every rule\n that public data allows was checked; \"probable\" means one could not be, and note says which.\n- reclaimable: held before but released; it can be taken again.\n- taken: someone holds it; url shows who.\n- unavailable: nobody holds it exactly, but the registry would refuse it (invalid, reserved, too\n similar to an existing name, or blocked for now after a deletion); note says why.\n- unknown: no trustworthy answer (network error, rate limit). Never treat it as free.\n\nPick only the channels that matter for the project instead of checking everything.`;\n\n/** The MCP server: one read-only tool that runs the same checks as the CLI. */\nexport function createMcpServer(deps: McpDeps): McpServer {\n const server = new McpServer({ name: \"nameable\", version: deps.version });\n server.registerTool(\n \"check_names\",\n {\n title: \"Check name availability\",\n description: DESCRIPTION,\n inputSchema: z.object({\n names: z\n .array(z.string().refine((n) => n.trim() !== \"\", \"names cannot be empty\"))\n .min(1)\n .max(50)\n .describe(\"Candidate names, checked on every selected channel\"),\n channels: z\n .array(z.string())\n .min(1)\n .optional()\n .describe(\n `Channels to check (default: all). One of: ${channelIds().join(\", \")}. \"domain\" means every TLD in tlds.`,\n ),\n tlds: z\n .array(z.string())\n .min(1)\n .optional()\n .describe(`TLDs for \"domain\" (default: ${DEFAULT_TLDS.join(\", \")})`),\n refresh: z\n .boolean()\n .optional()\n .describe(\"Download registry name lists again even when the cached copy is fresh\"),\n }),\n outputSchema: output,\n annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },\n },\n async ({ names, channels: only, tlds, refresh }) => {\n let channels: Channel[];\n try {\n channels = selectChannels({ only, tlds });\n } catch (err) {\n // A bad channel or TLD is the caller's to fix, so it comes back as a tool error it can read.\n return { isError: true, content: [{ type: \"text\", text: (err as Error).message }] };\n }\n const reports = await checkMany([...new Set(names)], channels, {\n fetch: deps.fetch,\n whois: deps.whois,\n githubToken: channels.some((c) => c.id === \"github\")\n ? await deps.githubToken?.()\n : undefined,\n store: deps.cacheDir ? fileStore(deps.cacheDir) : undefined,\n refresh,\n });\n const structured = { schema: 1 as const, reports };\n return {\n content: [{ type: \"text\", text: JSON.stringify(structured) }],\n structuredContent: structured,\n };\n },\n );\n return server;\n}\n\n/** Serves the MCP server over stdio, or over `transport` when given; it runs until the connection closes. */\nexport function serveMcp(deps: McpDeps, transport?: Transport): void {\n serveStdio(() => createMcpServer(deps), { transport });\n}\n"],"mappings":";;;;;AAuBA,MAAM,SAAS,EAAE,OAAO;CACtB,SAAS,EAAE,OAAO;CAClB,OAAO,EAAE,OAAO;CAChB,QAAQ,EAAE,KAAK;EAAC;EAAa;EAAe;EAAS;EAAe;CAAS,CAAC;CAC9E,WAAW,EAAE,KAAK,CAAC,aAAa,UAAU,CAAC,CAAC,CAAC,SAAS;CACtD,KAAK,EAAE,OAAO,CAAC,CAAC,SAAS;CACzB,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS;CAC1B,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;AACnD,CAAC;AACD,MAAM,SAAS,EAAE,OAAO;CACtB,QAAQ,EAAE,QAAQ,CAAC;CACnB,SAAS,EAAE,MAAM,EAAE,OAAO;EAAE,MAAM,EAAE,OAAO;EAAG,SAAS,EAAE,MAAM,MAAM;CAAE,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,cAAc;;;;;;;;;;;;;AAcpB,SAAgB,gBAAgB,MAA0B;CACxD,MAAM,SAAS,IAAI,UAAU;EAAE,MAAM;EAAY,SAAS,KAAK;CAAQ,CAAC;CACxE,OAAO,aACL,eACA;EACE,OAAO;EACP,aAAa;EACb,aAAa,EAAE,OAAO;GACpB,OAAO,EACJ,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,MAAM,EAAE,KAAK,MAAM,IAAI,uBAAuB,CAAC,CAAC,CACzE,IAAI,CAAC,CAAC,CACN,IAAI,EAAE,CAAC,CACP,SAAS,oDAAoD;GAChE,UAAU,EACP,MAAM,EAAE,OAAO,CAAC,CAAC,CACjB,IAAI,CAAC,CAAC,CACN,SAAS,CAAC,CACV,SACC,6CAA6C,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,oCACvE;GACF,MAAM,EACH,MAAM,EAAE,OAAO,CAAC,CAAC,CACjB,IAAI,CAAC,CAAC,CACN,SAAS,CAAC,CACV,SAAS,+BAA+B,aAAa,KAAK,IAAI,EAAE,EAAE;GACrE,SAAS,EACN,QAAQ,CAAC,CACT,SAAS,CAAC,CACV,SAAS,uEAAuE;EACrF,CAAC;EACD,cAAc;EACd,aAAa;GAAE,cAAc;GAAM,gBAAgB;GAAM,eAAe;EAAK;CAC/E,GACA,OAAO,EAAE,OAAO,UAAU,MAAM,MAAM,cAAc;EAClD,IAAI;EACJ,IAAI;GACF,WAAW,eAAe;IAAE;IAAM;GAAK,CAAC;EAC1C,SAAS,KAAK;GAEZ,OAAO;IAAE,SAAS;IAAM,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAO,IAAc;IAAQ,CAAC;GAAE;EACpF;EAUA,MAAM,aAAa;GAAE,QAAQ;GAAY,SAAA,MATnB,UAAU,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,GAAG,UAAU;IAC7D,OAAO,KAAK;IACZ,OAAO,KAAK;IACZ,aAAa,SAAS,MAAM,MAAM,EAAE,OAAO,QAAQ,IAC/C,MAAM,KAAK,cAAc,IACzB,KAAA;IACJ,OAAO,KAAK,WAAW,UAAU,KAAK,QAAQ,IAAI,KAAA;IAClD;GACF,CAAC;EACgD;EACjD,OAAO;GACL,SAAS,CAAC;IAAE,MAAM;IAAQ,MAAM,KAAK,UAAU,UAAU;GAAE,CAAC;GAC5D,mBAAmB;EACrB;CACF,CACF;CACA,OAAO;AACT;;AAGA,SAAgB,SAAS,MAAe,WAA6B;CACnE,iBAAiB,gBAAgB,IAAI,GAAG,EAAE,UAAU,CAAC;AACvD"}
package/package.json CHANGED
@@ -1,6 +1,59 @@
1
1
  {
2
2
  "name": "nameable",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "Find out if a name is free everywhere it matters for your project, and whether someone already built the same thing.",
5
+ "keywords": [
6
+ "agent-skill",
7
+ "availability",
8
+ "brand",
9
+ "claude-code",
10
+ "cli",
11
+ "codex",
12
+ "crates",
13
+ "domain",
14
+ "github",
15
+ "homebrew",
16
+ "mcp",
17
+ "mcp-server",
18
+ "name",
19
+ "name-availability",
20
+ "naming",
21
+ "npm",
22
+ "pypi",
23
+ "rdap",
24
+ "whois"
25
+ ],
26
+ "homepage": "https://github.com/minanyang/nameable#readme",
27
+ "bugs": {
28
+ "url": "https://github.com/minanyang/nameable/issues"
29
+ },
30
+ "license": "MIT",
31
+ "author": {
32
+ "name": "Min-An Yang",
33
+ "url": "https://github.com/minanyang"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/minanyang/nameable.git"
38
+ },
39
+ "bin": {
40
+ "nameable": "./dist/cli.mjs"
41
+ },
42
+ "files": [
43
+ "dist"
44
+ ],
45
+ "type": "module",
46
+ "dependencies": {
47
+ "@modelcontextprotocol/server": "2.3.1",
48
+ "zod": "4.6.5"
49
+ },
50
+ "devDependencies": {
51
+ "@nameable/core": "0.1.0"
52
+ },
53
+ "engines": {
54
+ "node": ">=22"
55
+ },
56
+ "scripts": {
57
+ "build": "vp pack"
58
+ }
6
59
  }