diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml deleted file mode 100644 index 8915143..0000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,47 +0,0 @@ -name: Build and Test - -on: - pull_request: - branches: - - v4 - push: - branches: - - v4 - -jobs: - build-and-test: - if: ${{ github.repository == 'jackyzha0/quartz' }} - strategy: - matrix: - os: [windows-latest, macos-latest, ubuntu-latest] - runs-on: ${{ matrix.os }} - permissions: - contents: write - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: 18 - - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - run: npm ci - - - name: Check types and style - run: npm run check - - - name: Test - run: npm test - - - name: Ensure Quartz builds, check bundle info - run: npx quartz build --bundleInfo diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index c8c129a..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Deploy Quartz site to GitHub Pages - -on: - push: - branches: - - v4 - -permissions: - contents: read - pages: write - id-token: write - -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - build: - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 # Fetch all history for git info - - uses: actions/setup-node@v3 - with: - node-version: 18.14 - - name: Install Dependencies - run: npm ci - - name: Build Quartz - run: npx quartz build - - name: Upload artifact - uses: actions/upload-pages-artifact@v2 - with: - path: public - - deploy: - needs: build - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v2 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..9e986d5 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,17 @@ +on: [push] + +permissions: + contents: write +jobs: + test: + runs-on: ubuntu-latest + name: Publish Logseq graph + steps: + - uses: actions/checkout@v3 + - uses: logseq/publish-spa@v0.2.0 + - name: add a nojekyll file # to make sure asset paths are correctly identified + run: touch $GITHUB_WORKSPACE/www/.nojekyll + - name: Deploy šŸš€ + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: www diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 887a2c4..0000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,90 +0,0 @@ -# Citizen Code of Conduct - -## 1. Purpose - -A primary goal of the Quartz community is to be inclusive to the largest number of contributors, with the most varied and diverse backgrounds possible. As such, we are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof). - -This code of conduct outlines our expectations for all those who participate in our community, as well as the consequences for unacceptable behavior. - -We invite all those who participate in the Quartz community to help us create safe and positive experiences for everyone. - -## 2. Open [Source/Culture/Tech] Citizenship - -A supplemental goal of this Code of Conduct is to increase open [source/culture/tech] citizenship by encouraging participants to recognize and strengthen the relationships between our actions and their effects on our community. - -Communities mirror the societies in which they exist and positive action is essential to counteract the many forms of inequality and abuses of power that exist in society. - -If you see someone who is making an extra effort to ensure our community is welcoming, friendly, and encourages all participants to contribute to the fullest extent, we want to know. - -## 3. Expected Behavior - -The following behaviors are expected and requested of all community members: - -- Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this community. -- Exercise consideration and respect in your speech and actions. -- Attempt collaboration before conflict. -- Refrain from demeaning, discriminatory, or harassing behavior and speech. -- Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential. -- Remember that community event venues may be shared with members of the public; please be respectful to all patrons of these locations. - -## 4. Unacceptable Behavior - -The following behaviors are considered harassment and are unacceptable within our community: - -- Violence, threats of violence or violent language directed against another person. -- Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory jokes and language. -- Posting or displaying sexually explicit or violent material. -- Posting or threatening to post other people's personally identifying information ("doxing"). -- Personal insults, particularly those related to gender, sexual orientation, race, religion, or disability. -- Inappropriate photography or recording. -- Inappropriate physical contact. You should have someone's consent before touching them. -- Unwelcome sexual attention. This includes, sexualized comments or jokes; inappropriate touching, groping, and unwelcomed sexual advances. -- Deliberate intimidation, stalking or following (online or in person). -- Advocating for, or encouraging, any of the above behavior. -- Sustained disruption of community events, including talks and presentations. - -## 5. Weapons Policy - -No weapons will be allowed at Quartz community events, community spaces, or in other spaces covered by the scope of this Code of Conduct. Weapons include but are not limited to guns, explosives (including fireworks), and large knives such as those used for hunting or display, as well as any other item used for the purpose of causing injury or harm to others. Anyone seen in possession of one of these items will be asked to leave immediately, and will only be allowed to return without the weapon. Community members are further expected to comply with all state and local laws on this matter. - -## 6. Consequences of Unacceptable Behavior - -Unacceptable behavior from any community member, including sponsors and those with decision-making authority, will not be tolerated. - -Anyone asked to stop unacceptable behavior is expected to comply immediately. - -If a community member engages in unacceptable behavior, the community organizers may take any action they deem appropriate, up to and including a temporary ban or permanent expulsion from the community without warning (and without refund in the case of a paid event). - -## 7. Reporting Guidelines - -If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible. j.zhao2k19@gmail.com. - -Additionally, community organizers are available to help community members engage with local law enforcement or to otherwise help those experiencing unacceptable behavior feel safe. In the context of in-person events, organizers will also provide escorts as desired by the person experiencing distress. - -## 8. Addressing Grievances - -If you feel you have been falsely or unfairly accused of violating this Code of Conduct, you should notify @jackyzha0 with a concise description of your grievance. Your grievance will be handled in accordance with our existing governing policies. - -## 9. Scope - -We expect all community participants (contributors, paid or otherwise; sponsors; and other guests) to abide by this Code of Conduct in all community venues--online and in-person--as well as in all one-on-one communications pertaining to community business. - -This code of conduct and its related procedures also applies to unacceptable behavior occurring outside the scope of community activities when such behavior has the potential to adversely affect the safety and well-being of community members. - -## 10. Contact info - -j.zhao2k19@gmail.com - -## 11. License and attribution - -The Citizen Code of Conduct is distributed by [Stumptown Syndicate](http://stumptownsyndicate.org) under a [Creative Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/). - -Portions of text derived from the [Django Code of Conduct](https://www.djangoproject.com/conduct/) and the [Geek Feminism Anti-Harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy). - -_Revision 2.3. Posted 6 March 2017._ - -_Revision 2.2. Posted 4 February 2016._ - -_Revision 2.1. Posted 23 June 2014._ - -_Revision 2.0, adopted by the [Stumptown Syndicate](http://stumptownsyndicate.org) board on 10 January 2013. Posted 17 March 2013._ diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 147e2ca..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 jackyzha0 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 4b4731c..0000000 --- a/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Quartz v4 - -> ā€œ[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.ā€ ā€” Richard Hamming - -Quartz is a set of tools that helps you publish your [digital garden](https://jzhao.xyz/posts/networked-thought) and notes as a website for free. -Quartz v4 features a from-the-ground rewrite focusing on end-user extensibility and ease-of-use. - -**If you are looking for Quartz v3, you can find it on the [`hugo` branch](https://github.com/jackyzha0/quartz/tree/hugo).** - -šŸ”— Read the documentation and get started: https://quartz.jzhao.xyz/ - -[Join the Discord Community](https://discord.gg/cRFFHYye7t) - -## Sponsors - -

- - - -

diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index ecac4f9..0000000 Binary files a/bun.lockb and /dev/null differ diff --git a/docs/advanced/architecture.md b/docs/advanced/architecture.md deleted file mode 100644 index 33da89d..0000000 --- a/docs/advanced/architecture.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Architecture ---- - -Quartz is a static site generator. How does it work? - -This question is best answered by tracing what happens when a user (you!) runs `npx quartz build` in the command line: - -## On the server - -1. After running `npx quartz build`, npm will look at `package.json` to find the `bin` entry for `quartz` which points at `./quartz/bootstrap-cli.mjs`. -2. This file has a [shebang]() line at the top which tells npm to execute it using Node. -3. `bootstrap-cli.mjs` is responsible for a few things: - 1. Parsing the command-line arguments using [yargs](http://yargs.js.org/). - 2. Transpiling and bundling the rest of Quartz (which is in Typescript) to regular JavaScript using [esbuild](https://esbuild.github.io/). The `esbuild` configuration here is slightly special as it also handles `.scss` file imports using [esbuild-sass-plugin v2](https://www.npmjs.com/package/esbuild-sass-plugin). Additionally, we bundle 'inline' client-side scripts (any `.inline.ts` file) that components declare using a custom `esbuild` plugin that runs another instance of `esbuild` which bundles for the browser instead of `node`. Modules of both types are imported as plain text. - 3. Running the local preview server if `--serve` is set. This starts two servers: - 1. A WebSocket server on port 3001 to handle hot-reload signals. This tracks all inbound connections and sends a 'rebuild' message a server-side change is detected (either content or configuration). - 2. An HTTP file-server on a user defined port (normally 8080) to serve the actual website files. - 4. If the `--serve` flag is set, it also starts a file watcher to detect source-code changes (e.g. anything that is `.ts`, `.tsx`, `.scss`, or packager files). On a change, we rebuild the module (step 2 above) using esbuild's [rebuild API](https://esbuild.github.io/api/#rebuild) which drastically reduces the build times. - 5. After transpiling the main Quartz build module (`quartz/build.ts`), we write it to a cache file `.quartz-cache/transpiled-build.mjs` and then dynamically import this using `await import(cacheFile)`. However, we need to be pretty smart about how to bust Node's [import cache](https://github.com/nodejs/modules/issues/307) so we add a random query string to fake Node into thinking it's a new module. This does, however, cause memory leaks so we just hope that the user doesn't hot-reload their configuration too many times in a single session :)) (it leaks about ~350kB memory on each reload). After importing the module, we then invoke it, passing in the command line arguments we parsed earlier along with a callback function to signal the client to refresh. -4. In `build.ts`, we start by installing source map support manually to account for the query string cache busting hack we introduced earlier. Then, we start processing content: - 1. Clean the output directory. - 2. Recursively glob all files in the `content` folder, respecting the `.gitignore`. - 3. Parse the Markdown files. - 1. Quartz detects the number of threads available and chooses to spawn worker threads if there are >128 pieces of content to parse (rough heuristic). If it needs to spawn workers, it will invoke esbuild again to transpile the worker script `quartz/worker.ts`. Then, a work-stealing [workerpool](https://www.npmjs.com/package/workerpool) is then created and batches of 128 files are assigned to workers. - 2. Each worker (or just the main thread if there is no concurrency) creates a [unified](https://github.com/unifiedjs/unified) parser based off of the plugins defined in the [[configuration]]. - 3. Parsing has three steps: - 1. Read the file into a [vfile](https://github.com/vfile/vfile). - 2. Applied plugin-defined text transformations over the content. - 3. Slugify the file path and store it in the data for the file. See the page on [[paths]] for more details about how path logic works in Quartz (spoiler: its complicated). - 4. Markdown parsing using [remark-parse](https://www.npmjs.com/package/remark-parse) (text to [mdast](https://github.com/syntax-tree/mdast)). - 5. Apply plugin-defined Markdown-to-Markdown transformations. - 6. Convert Markdown into HTML using [remark-rehype](https://github.com/remarkjs/remark-rehype) ([mdast](https://github.com/syntax-tree/mdast) to [hast](https://github.com/syntax-tree/hast)). - 7. Apply plugin-defined HTML-to-HTML transformations. - 4. Filter out unwanted content using plugins. - 5. Emit files using plugins. - 1. Gather all the static resources (e.g. external CSS, JS modules, etc.) each emitter plugin declares. - 2. Emitters that emit HTML files do a bit of extra work here as they need to transform the [hast](https://github.com/syntax-tree/hast) produced in the parse step to JSX. This is done using [hast-util-to-jsx-runtime](https://github.com/syntax-tree/hast-util-to-jsx-runtime) with the [Preact](https://preactjs.com/) runtime. Finally, the JSX is rendered to HTML using [preact-render-to-string](https://github.com/preactjs/preact-render-to-string) which statically renders the JSX to HTML (i.e. doesn't care about `useState`, `useEffect`, or any other React/Preact interactive bits). Here, we also do a bunch of fun stuff like assemble the page [[layout]] from `quartz.layout.ts`, assemble all the inline scripts that actually get shipped to the client, and all the transpiled styles. The bulk of this logic can be found in `quartz/components/renderPage.tsx`. Other fun things of note: - 1. CSS is minified and transformed using [Lightning CSS](https://github.com/parcel-bundler/lightningcss) to add vendor prefixes and do syntax lowering. - 2. Scripts are split into `beforeDOMLoaded` and `afterDOMLoaded` and are inserted in the `` and `` respectively. - 3. Finally, each emitter plugin is responsible for emitting and writing it's own emitted files to disk. - 6. If the `--serve` flag was detected, we also set up another file watcher to detect content changes (only `.md` files). We keep a content map that tracks the parsed AST and plugin data for each slug and update this on file changes. Newly added or modified paths are rebuilt and added to the content map. Then, all the filters and emitters are run over the resulting content map. This file watcher is debounced with a threshold of 250ms. On success, we send a client refresh signal using the passed in callback function. - -## On the client - -1. The browser opens a Quartz page and loads the HTML. The `` also links to page styles (emitted to `public/index.css`) and page-critical JS (emitted to `public/prescript.js`) -2. Then, once the body is loaded, the browser loads the non-critical JS (emitted to `public/postscript.js`) -3. Once the page is done loading, the page will then dispatch a custom synthetic browser event `"nav"`. This is used so client-side scripts declared by components can 'setup' anything that requires access to the page DOM. - 1. If the [[SPA Routing|enableSPA option]] is enabled in the [[configuration]], this `"nav"` event is also fired on any client-navigation to allow for components to unregister and reregister any event handlers and state. - 2. If it's not, we wire up the `"nav"` event to just be fired a single time after page load to allow for consistency across how state is setup across both SPA and non-SPA contexts. - -The architecture and design of the plugin system was intentionally left pretty vague here as this is described in much more depth in the guide on [[making plugins|making your own plugin]]. diff --git a/docs/advanced/creating components.md b/docs/advanced/creating components.md deleted file mode 100644 index 1496b15..0000000 --- a/docs/advanced/creating components.md +++ /dev/null @@ -1,233 +0,0 @@ ---- -title: Creating your own Quartz components ---- - -> [!warning] -> This guide assumes you have experience writing JavaScript and are familiar with TypeScript. - -Normally on the web, we write layout code using HTML which looks something like the following: - -```html -
-

An article header

-

Some content

-
-``` - -This piece of HTML represents an article with a leading header that says "An article header" and a paragraph that contains the text "Some content". This is combined with CSS to style the page and JavaScript to add interactivity. - -However, HTML doesn't let you create reusable templates. If you wanted to create a new page, you would need to copy and paste the above snippet and edit the header and content yourself. This isn't great if we have a lot of content on our site that shares a lot of similar layout. The smart people who created React also had similar complaints and invented the concept of Components -- JavaScript functions that return JSX -- to solve the code duplication problem. - -In effect, components allow you to write a JavaScript function that takes some data and produces HTML as an output. **While Quartz doesn't use React, it uses the same component concept to allow you to easily express layout templates in your Quartz site.** - -## An Example Component - -### Constructor - -Component files are written in `.tsx` files that live in the `quartz/components` folder. These are re-exported in `quartz/components/index.ts` so you can use them in layouts and other components more easily. - -Each component file should have a default export that satisfies the `QuartzComponentConstructor` function signature. It's a function that takes in a single optional parameter `opts` and returns a Quartz Component. The type of the parameters `opts` is defined by the interface `Options` which you as the component creator also decide. - -In your component, you can use the values from the configuration option to change the rendering behaviour inside of your component. For example, the component in the code snippet below will not render if the `favouriteNumber` option is below 0. - -```tsx {11-17} -interface Options { - favouriteNumber: number -} - -const defaultOptions: Options = { - favouriteNumber: 42, -} - -export default ((userOpts?: Options) => { - const opts = { ...userOpts, ...defaultOpts } - function YourComponent(props: QuartzComponentProps) { - if (opts.favouriteNumber < 0) { - return null - } - - return

My favourite number is {opts.favouriteNumber}

- } - - return YourComponent -}) satisfies QuartzComponentConstructor -``` - -### Props - -The Quartz component itself (lines 11-17 highlighted above) looks like a React component. It takes in properties (sometimes called [props](https://react.dev/learn/passing-props-to-a-component)) and returns JSX. - -All Quartz components accept the same set of props: - -```tsx title="quartz/components/types.ts" -// simplified for sake of demonstration -export type QuartzComponentProps = { - fileData: QuartzPluginData - cfg: GlobalConfiguration - tree: Node - allFiles: QuartzPluginData[] - displayClass?: "mobile-only" | "desktop-only" -} -``` - -- `fileData`: Any metadata [[making plugins|plugins]] may have added to the current page. - - `fileData.slug`: slug of the current page. - - `fileData.frontmatter`: any frontmatter parsed. -- `cfg`: The `configuration` field in `quartz.config.ts`. -- `tree`: the resulting [HTML AST](https://github.com/syntax-tree/hast) after processing and transforming the file. This is useful if you'd like to render the content using [hast-util-to-jsx-runtime](https://github.com/syntax-tree/hast-util-to-jsx-runtime) (you can find an example of this in `quartz/components/pages/Content.tsx`). -- `allFiles`: Metadata for all files that have been parsed. Useful for doing page listings or figuring out the overall site structure. -- `displayClass`: a utility class that indicates a preference from the user about how to render it in a mobile or desktop setting. Helpful if you want to conditionally hide a component on mobile or desktop. - -### Styling - -Quartz components can also define a `.css` property on the actual function component which will get picked up by Quartz. This is expected to be a CSS string which can either be inlined or imported from a `.scss` file. - -Note that inlined styles **must** be plain vanilla CSS: - -```tsx {6-10} title="quartz/components/YourComponent.tsx" -export default (() => { - function YourComponent() { - return

Example Component

- } - - YourComponent.css = ` - p.red-text { - color: red; - } - ` - - return YourComponent -}) satisfies QuartzComponentConstructor -``` - -Imported styles, however, can be from SCSS files: - -```tsx {1-2,9} title="quartz/components/YourComponent.tsx" -// assuming your stylesheet is in quartz/components/styles/YourComponent.scss -import styles from "./styles/YourComponent.scss" - -export default (() => { - function YourComponent() { - return

Example Component

- } - - YourComponent.css = styles - return YourComponent -}) satisfies QuartzComponentConstructor -``` - -> [!warning] -> Quartz does not use CSS modules so any styles you declare here apply _globally_. If you only want it to apply to your component, make sure you use specific class names and selectors. - -### Scripts and Interactivity - -What about interactivity? Suppose you want to add an-click handler for example. Like the `.css` property on the component, you can also declare `.beforeDOMLoaded` and `.afterDOMLoaded` properties that are strings that contain the script. - -```tsx title="quartz/components/YourComponent.tsx" -export default (() => { - function YourComponent() { - return - } - - YourComponent.beforeDOM = ` - console.log("hello from before the page loads!") - ` - - YourComponent.afterDOM = ` - document.getElementById('btn').onclick = () => { - alert('button clicked!') - } - ` - return YourComponent -}) satisfies QuartzComponentConstructor -``` - -> [!hint] -> For those coming from React, Quartz components are different from React components in that it only uses JSX for templating and layout. Hooks like `useEffect`, `useState`, etc. are not rendered and other properties that accept functions like `onClick` handlers will not work. Instead, do it using a regular JS script that modifies the DOM element directly. - -As the names suggest, the `.beforeDOMLoaded` scripts are executed _before_ the page is done loading so it doesn't have access to any elements on the page. This is mostly used to prefetch any critical data. - -The `.afterDOMLoaded` script executes once the page has been completely loaded. This is a good place to setup anything that should last for the duration of a site visit (e.g. getting something saved from local storage). - -If you need to create an `afterDOMLoaded` script that depends on _page specific_ elements that may change when navigating to a new page, you can listen for the `"nav"` event that gets fired whenever a page loads (which may happen on navigation if [[SPA Routing]] is enabled). - -```ts -document.addEventListener("nav", () => { - // do page specific logic here - // e.g. attach event listeners - const toggleSwitch = document.querySelector("#switch") as HTMLInputElement - toggleSwitch.removeEventListener("change", switchTheme) - toggleSwitch.addEventListener("change", switchTheme) -}) -``` - -It is best practice to also unmount any existing event handlers to prevent memory leaks. - -#### Importing Code - -Of course, it isn't always practical (nor desired!) to write your code as a string literal in the component. - -Quartz supports importing component code through `.inline.ts` files. - -```tsx title="quartz/components/YourComponent.tsx" -// @ts-ignore: typescript doesn't know about our inline bundling system -// so we need to silence the error -import script from "./scripts/graph.inline" - -export default (() => { - function YourComponent() { - return - } - - YourComponent.afterDOM = script - return YourComponent -}) satisfies QuartzComponentConstructor -``` - -```ts title="quartz/components/scripts/graph.inline.ts" -// any imports here are bundled for the browser -import * as d3 from "d3" - -document.getElementById("btn").onclick = () => { - alert("button clicked!") -} -``` - -Additionally, like what is shown in the example above, you can import packages in `.inline.ts` files. This will be bundled by Quartz and included in the actual script. - -### Using a Component - -After creating your custom component, re-export it in `quartz/components/index.ts`: - -```ts title="quartz/components/index.ts" {4,10} -import ArticleTitle from "./ArticleTitle" -import Content from "./pages/Content" -import Darkmode from "./Darkmode" -import YourComponent from "./YourComponent" - -export { ArticleTitle, Content, Darkmode, YourComponent } -``` - -Then, you can use it like any other component in `quartz.layout.ts` via `Component.YourComponent()`. See the [[configuration#Layout|layout]] section for more details. - -As Quartz components are just functions that return React components, you can compositionally use them in other Quartz components. - -```tsx title="quartz/components/AnotherComponent.tsx" -import YourComponent from "./YourComponent" - -export default (() => { - function AnotherComponent(props: QuartzComponentProps) { - return ( -
-

It's nested!

- -
- ) - } - - return AnotherComponent -}) satisfies QuartzComponentConstructor -``` - -> [!hint] -> Look in `quartz/components` for more examples of components in Quartz as reference for your own components! diff --git a/docs/advanced/making plugins.md b/docs/advanced/making plugins.md deleted file mode 100644 index 1f1616f..0000000 --- a/docs/advanced/making plugins.md +++ /dev/null @@ -1,302 +0,0 @@ ---- -title: Making your own plugins ---- - -> [!warning] -> This part of the documentation will assume you have working knowledge in TypeScript and will include code snippets that describe the interface of what Quartz plugins should look like. - -Quartz's plugins are a series of transformations over content. This is illustrated in the diagram of the processing pipeline below: - -![[quartz transform pipeline.png]] - -All plugins are defined as a function that takes in a single parameter for options `type OptionType = object | undefined` and return an object that corresponds to the type of plugin it is. - -```ts -type OptionType = object | undefined -type QuartzPlugin = (opts?: Options) => QuartzPluginInstance -type QuartzPluginInstance = - | QuartzTransformerPluginInstance - | QuartzFilterPluginInstance - | QuartzEmitterPluginInstance -``` - -The following sections will go into detail for what methods can be implemented for each plugin type. Before we do that, let's clarify a few more ambiguous types: - -- `BuildCtx` is defined in `quartz/ctx.ts`. It consists of - - `argv`: The command line arguments passed to the Quartz [[build]] command - - `cfg`: The full Quartz [[configuration]] - - `allSlugs`: a list of all the valid content slugs (see [[paths]] for more information on what a `ServerSlug` is) -- `StaticResources` is defined in `quartz/resources.tsx`. It consists of - - `css`: a list of URLs for stylesheets that should be loaded - - `js`: a list of scripts that should be loaded. A script is described with the `JSResource` type which is also defined in `quartz/resources.tsx`. It allows you to define a load time (either before or after the DOM has been loaded), whether it should be a module, and either the source URL or the inline content of the script. - -## Transformers - -Transformers **map** over content, taking a Markdown file and outputting modified content or adding metadata to the file itself. - -```ts -export type QuartzTransformerPluginInstance = { - name: string - textTransform?: (ctx: BuildCtx, src: string | Buffer) => string | Buffer - markdownPlugins?: (ctx: BuildCtx) => PluggableList - htmlPlugins?: (ctx: BuildCtx) => PluggableList - externalResources?: (ctx: BuildCtx) => Partial -} -``` - -All transformer plugins must define at least a `name` field to register the plugin and a few optional functions that allow you to hook into various parts of transforming a single Markdown file. - -- `textTransform` performs a text-to-text transformation _before_ a file is parsed into the [Markdown AST](https://github.com/syntax-tree/mdast). -- `markdownPlugins` defines a list of [remark plugins](https://github.com/remarkjs/remark/blob/main/doc/plugins.md). `remark` is a tool that transforms Markdown to Markdown in a structured way. -- `htmlPlugins` defines a list of [rehype plugins](https://github.com/rehypejs/rehype/blob/main/doc/plugins.md). Similar to how `remark` works, `rehype` is a tool that transforms HTML to HTML in a structured way. -- `externalResources` defines any external resources the plugin may need to load on the client-side for it to work properly. - -Normally for both `remark` and `rehype`, you can find existing plugins that you can use to . If you'd like to create your own `remark` or `rehype` plugin, checkout the [guide to creating a plugin](https://unifiedjs.com/learn/guide/create-a-plugin/) using `unified` (the underlying AST parser and transformer library). - -A good example of a transformer plugin that borrows from the `remark` and `rehype` ecosystems is the [[Latex]] plugin: - -```ts title="quartz/plugins/transformers/latex.ts" -import remarkMath from "remark-math" -import rehypeKatex from "rehype-katex" -import rehypeMathjax from "rehype-mathjax/svg.js" -import { QuartzTransformerPlugin } from "../types" - -interface Options { - renderEngine: "katex" | "mathjax" -} - -export const Latex: QuartzTransformerPlugin = (opts?: Options) => { - const engine = opts?.renderEngine ?? "katex" - return { - name: "Latex", - markdownPlugins() { - return [remarkMath] - }, - htmlPlugins() { - if (engine === "katex") { - // if you need to pass options into a plugin, you - // can use a tuple of [plugin, options] - return [[rehypeKatex, { output: "html" }]] - } else { - return [rehypeMathjax] - } - }, - externalResources() { - if (engine === "katex") { - return { - css: ["https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css"], - js: [ - { - src: "https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js", - loadTime: "afterDOMReady", - contentType: "external", - }, - ], - } - } else { - return {} - } - }, - } -} -``` - -Another common thing that transformer plugins will do is parse a file and add extra data for that file: - -```ts -export const AddWordCount: QuartzTransformerPlugin = () => { - return { - name: "AddWordCount", - markdownPlugins() { - return [ - () => { - return (tree, file) => { - // tree is an `mdast` root element - // file is a `vfile` - const text = file.value - const words = text.split(" ").length - file.data.wordcount = words - } - }, - ] - }, - } -} - -// tell typescript about our custom data fields we are adding -// other plugins will then also be aware of this data field -declare module "vfile" { - interface DataMap { - wordcount: number - } -} -``` - -Finally, you can also perform transformations over Markdown or HTML ASTs using the `visit` function from the `unist-util-visit` package or the `findAndReplace` function from the `mdast-util-find-and-replace` package. - -```ts -export const TextTransforms: QuartzTransformerPlugin = () => { - return { - name: "TextTransforms", - markdownPlugins() { - return [() => { - return (tree, file) => { - // replace _text_ with the italics version - findAndReplace(tree, /_(.+)_/, (_value: string, ...capture: string[]) => { - // inner is the text inside of the () of the regex - const [inner] = capture - // return an mdast node - // https://github.com/syntax-tree/mdast - return { - type: "emphasis", - children: [{ type: 'text', value: inner }] - } - }) - - // remove all links (replace with just the link content) - // match by 'type' field on an mdast node - // https://github.com/syntax-tree/mdast#link in this example - visit(tree, "link", (link: Link) => { - return { - type: "paragraph" - children: [{ type: 'text', value: link.title }] - } - }) - } - }] - } - } -} -``` - -All transformer plugins can be found under `quartz/plugins/transformers`. If you decide to write your own transformer plugin, don't forget to re-export it under `quartz/plugins/transformers/index.ts` - -A parting word: transformer plugins are quite complex so don't worry if you don't get them right away. Take a look at the built in transformers and see how they operate over content to get a better sense for how to accomplish what you are trying to do. - -## Filters - -Filters **filter** content, taking the output of all the transformers and determining what files to actually keep and what to discard. - -```ts -export type QuartzFilterPlugin = ( - opts?: Options, -) => QuartzFilterPluginInstance - -export type QuartzFilterPluginInstance = { - name: string - shouldPublish(ctx: BuildCtx, content: ProcessedContent): boolean -} -``` - -A filter plugin must define a `name` field and a `shouldPublish` function that takes in a piece of content that has been processed by all the transformers and returns a `true` or `false` depending on whether it should be passed to the emitter plugins or not. - -For example, here is the built-in plugin for removing drafts: - -```ts title="quartz/plugins/filters/draft.ts" -import { QuartzFilterPlugin } from "../types" - -export const RemoveDrafts: QuartzFilterPlugin<{}> = () => ({ - name: "RemoveDrafts", - shouldPublish(_ctx, [_tree, vfile]) { - // uses frontmatter parsed from transformers - const draftFlag: boolean = vfile.data?.frontmatter?.draft ?? false - return !draftFlag - }, -}) -``` - -## Emitters - -Emitters **reduce** over content, taking in a list of all the transformed and filtered content and creating output files. - -```ts -export type QuartzEmitterPlugin = ( - opts?: Options, -) => QuartzEmitterPluginInstance - -export type QuartzEmitterPluginInstance = { - name: string - emit( - ctx: BuildCtx, - content: ProcessedContent[], - resources: StaticResources, - emitCallback: EmitCallback, - ): Promise - getQuartzComponents(ctx: BuildCtx): QuartzComponent[] -} -``` - -An emitter plugin must define a `name` field an `emit` function and a `getQuartzComponents` function. `emit` is responsible for looking at all the parsed and filtered content and then appropriately creating files and returning a list of paths to files the plugin created. - -Creating new files can be done via regular Node [fs module](https://nodejs.org/api/fs.html) (i.e. `fs.cp` or `fs.writeFile`) or via the `emitCallback` if you are creating files that contain text. The `emitCallback` function is the 4th argument of the emit function. It's interface looks something like this: - -```ts -export type EmitCallback = (data: { - // the name of the file to emit (not including the file extension) - slug: ServerSlug - // the file extension - ext: `.${string}` | "" - // the file content to add - content: string -}) => Promise -``` - -This is a thin wrapper around writing to the appropriate output folder and ensuring that intermediate directories exist. If you choose to use the native Node `fs` APIs, ensure you emit to the `argv.output` folder as well. - -If you are creating an emitter plugin that needs to render components, there are three more things to be aware of: - -- Your component should use `getQuartzComponents` to declare a list of `QuartzComponents` that it uses to construct the page. See the page on [[creating components]] for more information. -- You can use the `renderPage` function defined in `quartz/components/renderPage.tsx` to render Quartz components into HTML. -- If you need to render an HTML AST to JSX, you can use the `toJsxRuntime` function from `hast-util-to-jsx-runtime` library. An example of this can be found in `quartz/components/pages/Content.tsx`. - -For example, the following is a simplified version of the content page plugin that renders every single page. - -```tsx title="quartz/plugins/emitters/contentPage.tsx" -export const ContentPage: QuartzEmitterPlugin = () => { - // construct the layout - const layout: FullPageLayout = { - ...sharedPageComponents, - ...defaultContentPageLayout, - pageBody: Content(), - } - const { head, header, beforeBody, pageBody, left, right, footer } = layout - return { - name: "ContentPage", - getQuartzComponents() { - return [head, ...header, ...beforeBody, pageBody, ...left, ...right, footer] - }, - async emit(ctx, content, resources, emit): Promise { - const cfg = ctx.cfg.configuration - const fps: FilePath[] = [] - const allFiles = content.map((c) => c[1].data) - for (const [tree, file] of content) { - const slug = canonicalizeServer(file.data.slug!) - const externalResources = pageResources(slug, resources) - const componentData: QuartzComponentProps = { - fileData: file.data, - externalResources, - cfg, - children: [], - tree, - allFiles, - } - - const content = renderPage(slug, componentData, opts, externalResources) - const fp = await emit({ - content, - slug: file.data.slug!, - ext: ".html", - }) - - fps.push(fp) - } - return fps - }, - } -} -``` - -Note that it takes in a `FullPageLayout` as the options. It's made by combining a `SharedLayout` and a `PageLayout` both of which are provided through the `quartz.layout.ts` file. - -> [!hint] -> Look in `quartz/plugins` for more examples of plugins in Quartz as reference for your own plugins! diff --git a/docs/advanced/paths.md b/docs/advanced/paths.md deleted file mode 100644 index 9455b98..0000000 --- a/docs/advanced/paths.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Paths in Quartz ---- - -Paths are pretty complex to reason about because, especially for a static site generator, they can come from so many places. - -A full file path to a piece of content? Also a path. What about a slug for a piece of content? Yet another path. - -It would be silly to type these all as `string` and call it a day as it's pretty common to accidentally mistake one type of path for another. Unfortunately, TypeScript does not have [nominal types](https://en.wikipedia.org/wiki/Nominal_type_system) for type aliases meaning even if you made custom types of a server-side slug or a client-slug slug, you can still accidentally assign one to another and TypeScript wouldn't catch it. - -Luckily, we can mimic nominal typing using [brands](https://www.typescriptlang.org/play#example/nominal-typing). - -```typescript -// instead of -type FullSlug = string - -// we do -type FullSlug = string & { __brand: "full" } - -// that way, the following will fail typechecking -const slug: FullSlug = "some random string" -``` - -While this prevents most typing mistakes _within_ our nominal typing system (e.g. mistaking a server slug for a client slug), it doesn't prevent us from _accidentally_ mistaking a string for a client slug when we forcibly cast it. - -Thus, we still need to be careful when casting from a string to one of these nominal types in the 'entrypoints', illustrated with hexagon shapes in the diagram below. - -The following diagram draws the relationships between all the path sources, nominal path types, and what functions in `quartz/path.ts` convert between them. - -```mermaid -graph LR - Browser{{Browser}} --> Window{{Body}} & LinkElement{{Link Element}} - Window --"getFullSlug()"--> FullSlug[Full Slug] - LinkElement --".href"--> Relative[Relative URL] - FullSlug --"simplifySlug()" --> SimpleSlug[Simple Slug] - SimpleSlug --"pathToRoot()"--> Relative - SimpleSlug --"resolveRelative()" --> Relative - MD{{Markdown File}} --> FilePath{{File Path}} & Links[Markdown links] - Links --"transformLink()"--> Relative - FilePath --"slugifyFilePath()"--> FullSlug[Full Slug] - style FullSlug stroke-width:4px -``` - -Here are the main types of slugs with a rough description of each type of path: - -- `FilePath`: a real file path to a file on disk. Cannot be relative and must have a file extension. -- `FullSlug`: cannot be relative and may not have leading or trailing slashes. It can have `index` as it's last segment. Use this wherever possible is it's the most 'general' interpretation of a slug. -- `SimpleSlug`: cannot be relative and shouldn't have `/index` as an ending or a file extension. It _can_ however have a trailing slash to indicate a folder path. -- `RelativeURL`: must start with `.` or `..` to indicate it's a relative URL. Shouldn't have `/index` as an ending or a file extension but can contain a trailing slash. - -To get a clearer picture of how these relate to each other, take a look at the path tests in `quartz/path.test.ts`. diff --git a/docs/authoring content.md b/docs/authoring content.md deleted file mode 100644 index fa6eea2..0000000 --- a/docs/authoring content.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Authoring Content ---- - -All of the content in your Quartz should go in theĀ `/content`Ā folder. The content for the home page of your Quartz lives in `content/index.md`. If you've [[index#šŸŖ“ Get Started|setup Quartz]] already, this folder should already be initailized. Any Markdown in this folder will get processed by Quartz. - -It is recommended that you use [Obsidian](https://obsidian.md/) as a way to edit and maintain your Quartz. It comes with a nice editor and graphical interface to preview, edit, and link your local files and attachments. - -Got everything setup? Let's [[build]] and preview your Quartz locally! - -## Syntax - -As Quartz uses Markdown files as the main way of writing content, it fully supports Markdown syntax. By default, Quartz also ships with a few syntax extensions like [Github Flavored Markdown](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax) (footnotes, strikethrough, tables, tasklists) and [Obsidian Flavored Markdown](https://help.obsidian.md/Editing+and+formatting/Obsidian+Flavored+Markdown) ([[callouts]], [[wikilinks]]). - -Additionally, Quartz also allows you to specify additional metadata in your notes called **frontmatter**. - -```md title="content/note.md" ---- -title: Example Title -draft: false -tags: - - example-tag ---- - -The rest of your content lives here. You can use **Markdown** here :) -``` - -Some common frontmatter fields that are natively supported by Quartz: - -- `title`: Title of the page. If it isn't provided, Quartz will use the name of the file as the title. -- `aliases`: Other names for this note. This is a list of strings. -- `draft`: Whether to publish the page or not. This is one way to make [[private pages|pages private]] in Quartz. -- `date`: A string representing the day the note was published. Normally uses `YYYY-MM-DD` format. - -## Syncing your Content - -When your Quartz is at a point you're happy with, you can save your changes to GitHub by doing `npx quartz sync`. - -> [!hint] Flags and options -> For full help options, you can run `npx quartz sync --help`. -> -> Most of these have sensible defaults but you can override them if you have a custom setup: -> -> - `-d` or `--directory`: the content folder. This is normally just `content` -> - `-v` or `--verbose`: print out extra logging information -> - `--commit` or `--no-commit`: whether to make a `git` commit for your changes -> - `--push` or `--no-push`: whether to push updates to your GitHub fork of Quartz -> - `--pull` or `--no-pull`: whether to try and pull in any updates from your GitHub fork (i.e. from other devices) before pushing diff --git a/docs/build.md b/docs/build.md deleted file mode 100644 index 1447687..0000000 --- a/docs/build.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: "Building your Quartz" ---- - -Once you've [[index#šŸŖ“ Get Started|initialized]] Quartz, let's see what it looks like locally: - -```bash -npx quartz build --serve -``` - -This will start a local web server to run your Quartz on your computer. Open a web browser and visit `http://localhost:8080/` to view it. - -> [!hint] Flags and options -> For full help options, you can run `npx quartz build --help`. -> -> Most of these have sensible defaults but you can override them if you have a custom setup: -> -> - `-d` or `--directory`: the content folder. This is normally just `content` -> - `-v` or `--verbose`: print out extra logging information -> - `-o` or `--output`: the output folder. This is normally just `public` -> - `--serve`: run a local hot-reloading server to preview your Quartz -> - `--port`: what port to run the local preview server on -> - `--concurrency`: how many threads to use to parse notes diff --git a/docs/configuration.md b/docs/configuration.md deleted file mode 100644 index 047f6ca..0000000 --- a/docs/configuration.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -title: Configuration ---- - -Quartz is meant to be extremely configurable, even if you don't know any coding. Most of the configuration you should need can be done by just editing `quartz.config.ts` or changing [[layout|the layout]] in `quartz.layout.ts`. - -> [!tip] -> If you edit Quartz configuration using a text-editor that has TypeScript language support like VSCode, it will warn you when you you've made an error in your configuration, helping you avoid configuration mistakes! - -The configuration of Quartz can be broken down into two main parts: - -```ts title="quartz.config.ts" -const config: QuartzConfig = { - configuration: { ... }, - plugins: { ... }, -} -``` - -## General Configuration - -This part of the configuration concerns anything that can affect the whole site. The following is a list breaking down all the things you can configure: - -- `pageTitle`: title of the site. This is also used when generating the [[RSS Feed]] for your site. -- `enableSPA`: whether to enable [[SPA Routing]] on your site. -- `enablePopovers`: whether to enable [[popover previews]] on your site. -- `analytics`: what to use for analytics on your site. Values can be - - `null`: don't use analytics; - - `{ provider: 'plausible' }`: use [Plausible](https://plausible.io/), a privacy-friendly alternative to Google Analytics; or - - `{ provider: 'google', tagId: }`: use Google Analytics -- `baseUrl`: this is used for sitemaps and RSS feeds that require an absolute URL to know where the canonical 'home' of your site lives. This is normally the deployed URL of your site (e.g. `quartz.jzhao.xyz` for this site). Do not include the protocol (i.e. `https://`) or any leading or trailing slashes. - - This should also include the subpath if you are [[hosting]] on GitHub pages without a custom domain. For example, if my repository is `jackyzha0/quartz`, GitHub pages would deploy to `https://jackyzha0.github.io/quartz` and the `baseUrl` would be `jackyzha0.github.io/quartz` - - Note that Quartz 4 will avoid using this as much as possible and use relative URLs whenever it can to make sure your site works no matter _where_ you end up actually deploying it. -- `ignorePatterns`: a list of [glob]() patterns that Quartz should ignore and not search through when looking for files inside the `content` folder. See [[private pages]] for more details. -- `defaultDateType`: whether to use created, modified, or published as the default date to display on pages and page listings. -- `theme`: configure how the site looks. - - `typography`: what fonts to use. Any font available on [Google Fonts](https://fonts.google.com/) works here. - - `header`: Font to use for headers - - `code`: Font for inline and block quotes. - - `body`: Font for everything - - `colors`: controls the theming of the site. - - `light`: page background - - `lightgray`: borders - - `gray`: graph links, heavier borders - - `darkgray`: body text - - `dark`: header text and icons - - `secondary`: link colour, current [[graph view|graph]] node - - `tertiary`: hover states and visited [[graph view|graph]] nodes - - `highlight`: internal link background, highlighted text, [[syntax highlighting|highlighted lines of code]] - -## Plugins - -You can think of Quartz plugins as a series of transformations over content. - -![[quartz transform pipeline.png]] - -```ts -plugins: { - transformers: [...], - filters: [...], - emitters: [...], -} -``` - -- [[making plugins#Transformers|Transformers]] **map** over content (e.g. parsing frontmatter, generating a description) -- [[making plugins#Filters|Filters]] **filter** content (e.g. filtering out drafts) -- [[making plugins#Emitters|Emitters]] **reduce** over content (e.g. creating an RSS feed or pages that list all files with a specific tag) - -By adding, removing, and reordering plugins from the `tranformers`, `filters`, and `emitters` fields, you can customize the behaviour of Quartz. - -> [!note] -> Each node is modified by every transformer _in order_. Some transformers are position-sensitive so you may need to take special note of whether it needs come before or after any other particular plugins. - -Additionally, plugins may also have their own configuration settings that you can pass in. For example, the [[Latex]] plugin allows you to pass in a field specifying the `renderEngine` to choose between Katex and MathJax. - -```ts -transformers: [ - Plugin.FrontMatter(), // uses default options - Plugin.Latex({ renderEngine: "katex" }), // specify some options -] -``` - -If you'd like to make your own plugins, read the guide on [[making plugins]] for more information. diff --git a/docs/features/Latex.md b/docs/features/Latex.md deleted file mode 100644 index 3c8f6ff..0000000 --- a/docs/features/Latex.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -tags: - - plugin/transformer ---- - -Quartz uses [Katex](https://katex.org/) by default to typeset both inline and block math expressions at build time. - -## Syntax - -### Block Math - -Block math can be rendered by delimiting math expression with `$$`. - -``` -$$ -f(x) = \int_{-\infty}^\infty - f\hat(\xi),e^{2 \pi i \xi x} - \,d\xi -$$ -``` - -$$ -f(x) = \int_{-\infty}^\infty - f\hat(\xi),e^{2 \pi i \xi x} - \,d\xi -$$ - -$$ -\begin{aligned} -a &= b + c \\ &= e + f \\ -\end{aligned} -$$ - -$$ -\begin{bmatrix} -1 & 2 & 3 \\ -a & b & c -\end{bmatrix} -$$ - -### Inline Math - -Similarly, inline math can be rendered by delimiting math expression with a single `$`. For example, `$e^{i\pi} = -1$` produces $e^{i\pi} = -1$ - -### Escaping symbols - -There will be cases where you may have more than one `$` in a paragraph at once which may accidentally trigger MathJax/Katex. - -To get around this, you can escape the dollar sign by doing `\$` instead. - -For example: - -- Incorrect: `I have $1 and you have $2` produces I have $1 and you have $2 -- Correct: `I have \$1 and you have \$2` produces I have \$1 and you have \$2 - -## MathJax - -In `quartz.config.ts`, you can configure Quartz to use [MathJax SVG rendering](https://docs.mathjax.org/en/latest/output/svg.html) by replacing `Plugin.Latex({ renderEngine: 'katex' })` with `Plugin.Latex({ renderEngine: 'mathjax' })` - -## Customization - -- Removing Latex support: remove all instances of `Plugin.Latex()` from `quartz.config.ts`. -- Plugin: `quartz/plugins/transformers/latex.ts` diff --git a/docs/features/Mermaid diagrams.md b/docs/features/Mermaid diagrams.md deleted file mode 100644 index f14a558..0000000 --- a/docs/features/Mermaid diagrams.md +++ /dev/null @@ -1,28 +0,0 @@ -Quartz supports Mermaid which allows you to add diagrams and charts to your notes. Mermaid supports a range of diagrams, such asĀ [flow charts](https://mermaid.js.org/syntax/flowchart.html),Ā [sequence diagrams](https://mermaid.js.org/syntax/sequenceDiagram.html), andĀ [timelines](https://mermaid.js.org/syntax/timeline.html). This is enabled as a part of [[Obsidian compatibility]] and can be configured and enabled/disabled from that plugin. - -By default, Quartz will render Mermaid diagrams to match the site theme. - -> [!warning] -> Wondering why Mermaid diagrams may not be showing up even if you have them enabled? You may need to reorder your plugins so that `Plugin.ObsidianFlavoredMarkdown()` is _after_ `Plugin.SyntaxHighlighting()`. - -## Syntax - -To add a Mermaid diagram, create a mermaid code block. - -```` -```mermaid -sequenceDiagram - Alice->>+John: Hello John, how are you? - Alice->>+John: John, can you hear me? - John-->>-Alice: Hi Alice, I can hear you! - John-->>-Alice: I feel great! -``` -```` - -```mermaid -sequenceDiagram - Alice->>+John: Hello John, how are you? - Alice->>+John: John, can you hear me? - John-->>-Alice: Hi Alice, I can hear you! - John-->>-Alice: I feel great! -``` diff --git a/docs/features/Obsidian compatibility.md b/docs/features/Obsidian compatibility.md deleted file mode 100644 index 61fcc06..0000000 --- a/docs/features/Obsidian compatibility.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -tags: - - plugin/transformer ---- - -Quartz was originally designed as a tool to publish Obsidian vaults as websites. Even as the scope of Quartz has widened over time, it hasn't lost the ability to seamlessly interoperate with Obsidian. - -By default, Quartz ships with `Plugin.ObsidianFlavoredMarkdown` which is a transformer plugin that adds support for [Obsidian Flavored Markdown](https://help.obsidian.md/Editing+and+formatting/Obsidian+Flavored+Markdown). This includes support for features like [[wikilinks]] and [[Mermaid diagrams]]. - -It also ships with support for [frontmatter parsing](https://help.obsidian.md/Editing+and+formatting/Properties) with the same fields that Obsidian uses through the `Plugin.FrontMatter` transformer plugin. - -Finally, Quartz also provides `Plugin.CrawlLinks` which allows you to customize Quartz's link resolution behaviour to match Obsidian. - -## Configuration - -- Frontmatter parsing: - - Disabling: remove all instances of `Plugin.FrontMatter()` from `quartz.config.ts`. - - Customize default values for frontmatter: edit `quartz/plugins/transformers/frontmatter.ts` -- Obsidian Flavored Markdown: - - Disabling: remove all instances of `Plugin.ObsidianFlavoredMarkdown()` from `quartz.config.ts` - - Customizing features: `Plugin.ObsidianFlavoredMarkdown` has several other options to toggle on and off: - - `comments`: whether to enable `%%` style Obsidian comments. Defaults to `true` - - `highlight`: whether to enable `==` style highlights. Defaults to `true` - - `wikilinks`: whether to enable turning [[wikilinks]] into regular links. Defaults to `true` - - `callouts`: whether to enable [[callouts]]. Defaults to `true` - - `mermaid`: whether to enable [[Mermaid diagrams]]. Defaults to `true` - - `parseTags`: whether to try and parse tags in the content body. Defaults to `true` - - `enableInHtmlEmbed`: whether to try and parse Obsidian flavoured markdown in raw HTML. Defaults to `false` -- Link resolution behaviour: - - Disabling: remove all instances of `Plugin.CrawlLinks()` from `quartz.config.ts` - - Changing link resolution preference: set `markdownLinkResolution` to one of `absolute`, `relative` or `shortest` diff --git a/docs/features/OxHugo compatibility.md b/docs/features/OxHugo compatibility.md deleted file mode 100644 index b25167f..0000000 --- a/docs/features/OxHugo compatibility.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -tags: - - plugin/transformer ---- - -[org-roam](https://www.orgroam.com/) is a plain-text personal knowledge management system for [emacs](https://en.wikipedia.org/wiki/Emacs). [ox-hugo](https://github.com/kaushalmodi/ox-hugo) is org exporter backend that exports `org-mode` files to [Hugo](https://gohugo.io/) compatible Markdown. - -Because the Markdown generated by ox-hugo is not pure Markdown but Hugo specific, we need to transform it to fit into Quartz. This is done by `Plugin.OxHugoFlavouredMarkdown`. Even though this [[making plugins|plugin]] was written with `ox-hugo` in mind, it should work for any Hugo specific Markdown. - -```typescript title="quartz.config.ts" -plugins: { - transformers: [ - Plugin.FrontMatter({ delims: "+++", language: "toml" }), // if toml frontmatter - // ... - Plugin.OxHugoFlavouredMarkdown(), - Plugin.GitHubFlavoredMarkdown(), - // ... - ], -}, -``` - -## Usage - -Quartz by default doesn't understand `org-roam` files as they aren't Markdown. You're responsible for using an external tool like `ox-hugo` to export the `org-roam` files as Markdown content to Quartz and managing the static assets so that they're available in the final output. - -## Configuration - -- Link resolution - - `wikilinks`: Whether to replace `{{ relref }}` with Quartz [[wikilinks]] - - `removePredefinedAnchor`: Whether to remove [pre-defined anchor set by ox-hugo](https://ox-hugo.scripter.co/doc/anchors/). -- Image handling - - `replaceFigureWithMdImg`: Whether to replace `
` with `![]()` -- Formatting - - `removeHugoShortcode`: Whether to remove hugo shortcode syntax (`{{}}`) - -> [!warning] -> -> While you can use `Plugin.OxHugoFlavoredMarkdown` and `Plugin.ObsidianFlavoredMarkdown` together, it's not recommended because it might mutate the file in unexpected ways. Use with caution. diff --git a/docs/features/RSS Feed.md b/docs/features/RSS Feed.md deleted file mode 100644 index bfeb399..0000000 --- a/docs/features/RSS Feed.md +++ /dev/null @@ -1,7 +0,0 @@ -Quartz creates an RSS feed for all the content on your site by generating an `index.xml` file that RSS readers can subscribe to. Because of the RSS spec, this requires the `baseUrl` property in your [[configuration]] to be set properly for RSS readers to pick it up properly. - -## Configuration - -- Remove RSS feed: set the `enableRSS` field of `Plugin.ContentIndex` in `quartz.config.ts` to be `false`. -- Change number of entries: set the `rssLimit` field of `Plugin.ContentIndex` to be the desired value. It defaults to latest 10 items. -- Use rich HTML output in RSS: set `rssFullHtml` field of `Plugin.ContentIndex` to be `true`. diff --git a/docs/features/SPA Routing.md b/docs/features/SPA Routing.md deleted file mode 100644 index 3004af9..0000000 --- a/docs/features/SPA Routing.md +++ /dev/null @@ -1,7 +0,0 @@ -Single-page-app style rendering. This prevents flashes of unstyled content and improves the smoothness of Quartz. - -Under the hood, this is done by hijacking page navigations and instead fetching the HTML via a `GET` request and then diffing and selectively replacing parts of the page using [micromorph](https://github.com/natemoo-re/micromorph). This allows us to change the content of the page without fully refreshing the page, reducing the amount of content that the browser needs to load. - -## Configuration - -- Disable SPA Routing: set the `enableSPA` field of the [[configuration]] in `quartz.config.ts` to be `false`. diff --git a/docs/features/backlinks.md b/docs/features/backlinks.md deleted file mode 100644 index f558f4a..0000000 --- a/docs/features/backlinks.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: Backlinks -tags: - - component ---- - -A backlink for a note is a link from another note to that note. Links in the backlink pane also feature rich [[popover previews]] if you have that feature enabled. - -## Customization - -- Removing backlinks: delete all usages of `Component.Backlinks()` from `quartz.layout.ts`. -- Component: `quartz/components/Backlinks.tsx` -- Style: `quartz/components/styles/backlinks.scss` -- Script: `quartz/components/scripts/search.inline.ts` diff --git a/docs/features/callouts.md b/docs/features/callouts.md deleted file mode 100644 index 63051ad..0000000 --- a/docs/features/callouts.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: Callouts -tags: - - plugin/transformer ---- - -Quartz supports the same Admonition-callout syntax as Obsidian. - -This includes - -- 12 Distinct callout types (each with several aliases) -- Collapsable callouts - -``` -> [!info] Title -> This is a callout! -``` - -SeeĀ [documentation on supported types and syntax here](https://help.obsidian.md/Editing+and+formatting/Callouts). - -> [!warning] -> Wondering why callouts may not be showing up even if you have them enabled? You may need to reorder your plugins so that `Plugin.ObsidianFlavoredMarkdown()` is _after_ `Plugin.SyntaxHighlighting()`. - -## Customization - -- Disable callouts: simply pass `callouts: false` to the plugin: `Plugin.ObsidianFlavoredMarkdown({ callouts: false })` -- Editing icons: `quartz/plugins/transformers/ofm.ts` - -## Showcase - -> [!info] -> Default title - -> [!question]+ Can callouts be nested? -> -> > [!todo]- Yes!, they can. -> > -> > > [!example] You can even use multiple layers of nesting. - -> [!EXAMPLE] Examples -> -> Aliases: example - -> [!note] Notes -> -> Aliases: note - -> [!abstract] Summaries -> -> Aliases: abstract, summary, tldr - -> [!info] Info -> -> Aliases: info, todo - -> [!tip] Hint -> -> Aliases: tip, hint, important - -> [!success] Success -> -> Aliases: success, check, done - -> [!question] Question -> -> Aliases: question, help, faq - -> [!warning] Warning -> -> Aliases: warning, caution, attention - -> [!failure] Failure -> -> Aliases: failure, fail, missing - -> [!danger] Error -> -> Aliases: danger, error - -> [!bug] Bug -> -> Aliases: bug - -> [!quote] Quote -> -> Aliases: quote, cite diff --git a/docs/features/darkmode.md b/docs/features/darkmode.md deleted file mode 100644 index dfa2314..0000000 --- a/docs/features/darkmode.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "Darkmode" -tags: - - component ---- - -Quartz supports darkmode out of the box that respects the user's theme preference. Any future manual toggles of the darkmode switch will be saved in the browser's local storage so it can be persisted across future page loads. - -## Customization - -- Removing darkmode: delete all usages of `Component.Darkmode()` from `quartz.layout.ts`. -- Component: `quartz/components/Darkmode.tsx` -- Style: `quartz/components/styles/darkmode.scss` -- Script: `quartz/components/scripts/darkmode.inline.ts` diff --git a/docs/features/explorer.md b/docs/features/explorer.md deleted file mode 100644 index 6f941b8..0000000 --- a/docs/features/explorer.md +++ /dev/null @@ -1,227 +0,0 @@ ---- -title: "Explorer" -tags: - - component ---- - -Quartz features an explorer that allows you to navigate all files and folders on your site. It supports nested folders and is highly customizable. - -By default, it shows all folders and files on your page. To display the explorer in a different spot, you can edit the [[layout]]. - -> [!info] -> The explorer uses local storage by default to save the state of your explorer. This is done to ensure a smooth experience when navigating to different pages. -> -> To clear/delete the explorer state from local storage, delete the `fileTree` entry (guide on how to delete a key from local storage in chromium based browsers can be found [here](https://docs.devolutions.net/kb/general-knowledge-base/clear-browser-local-storage/clear-chrome-local-storage/)). You can disable this by passing `useSavedState: false` as an argument. - -## Customization - -Most configuration can be done by passing in options to `Component.Explorer()`. - -For example, here's what the default configuration looks like: - -```typescript title="quartz.layout.ts" -Component.Explorer({ - title: "Explorer", // title of the explorer component - folderClickBehavior: "collapse", // what happens when you click a folder ("link" to navigate to folder page on click or "collapse" to collapse folder on click) - folderDefaultState: "collapsed", // default state of folders ("collapsed" or "open") - useSavedState: true, // wether to use local storage to save "state" (which folders are opened) of explorer - // Sort order: folders first, then files. Sort folders and files alphabetically - sortFn: (a, b) => { - ... // default implementation shown later - }, - filterFn: undefined, - mapFn: undefined, - // what order to apply functions in - order: ["filter", "map", "sort"], -}) -``` - -When passing in your own options, you can omit any or all of these fields if you'd like to keep the default value for that field. - -Want to customize it even more? - -- Removing table of contents: remove `Component.Explorer()` from `quartz.layout.ts` - - (optional): After removing the explorer component, you can move the [[table of contents | Table of Contents]] component back to the `left` part of the layout -- Changing `sort`, `filter` and `map` behavior: explained in [[#Advanced customization]] -- Component: - - Wrapper (Outer component, generates file tree, etc): `quartz/components/Explorer.tsx` - - Explorer node (recursive, either a folder or a file): `quartz/components/ExplorerNode.tsx` -- Style: `quartz/components/styles/explorer.scss` -- Script: `quartz/components/scripts/explorer.inline.ts` - -## Advanced customization - -This component allows you to fully customize all of its behavior. You can pass a custom `sort`, `filter` and `map` function. -All functions you can pass work with the `FileNode` class, which has the following properties: - -```ts title="quartz/components/ExplorerNode.tsx" {2-5} -export class FileNode { - children: FileNode[] // children of current node - name: string // name of node (only useful for folders) - file: QuartzPluginData | null // set if node is a file, see `QuartzPluginData` for more detail - depth: number // depth of current node - - ... // rest of implementation -} -``` - -Every function you can pass is optional. By default, only a `sort` function will be used: - -```ts title="Default sort function" -// Sort order: folders first, then files. Sort folders and files alphabetically -Component.Explorer({ - sortFn: (a, b) => { - if ((!a.file && !b.file) || (a.file && b.file)) { - return a.name.localeCompare(b.name) - } - if (a.file && !b.file) { - return 1 - } else { - return -1 - } - }, -}) -``` - ---- - -You can pass your own functions for `sortFn`, `filterFn` and `mapFn`. All functions will be executed in the order provided by the `order` option (see [[#Customization]]). These functions behave similarly to their `Array.prototype` counterpart, except they modify the entire `FileNode` tree in place instead of returning a new one. - -For more information on how to use `sort`, `filter` and `map`, you can check [Array.prototype.sort()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort), [Array.prototype.filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) and [Array.prototype.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map). - -Type definitions look like this: - -```ts -sortFn: (a: FileNode, b: FileNode) => number -filterFn: (node: FileNode) => boolean -mapFn: (node: FileNode) => void -``` - -> [!tip] -> You can check if a `FileNode` is a folder or a file like this: -> -> ```ts -> if (node.file) { -> // node is a file -> } else { -> // node is a folder -> } -> ``` - -## Basic examples - -These examples show the basic usage of `sort`, `map` and `filter`. - -### Use `sort` to put files first - -Using this example, the explorer will alphabetically sort everything, but put all **files** above all **folders**. - -```ts title="quartz.layout.ts" -Component.Explorer({ - sortFn: (a, b) => { - if ((!a.file && !b.file) || (a.file && b.file)) { - return a.name.localeCompare(b.name) - } - if (a.file && !b.file) { - return -1 - } else { - return 1 - } - }, -}) -``` - -### Change display names (`map`) - -Using this example, the display names of all `FileNodes` (folders + files) will be converted to full upper case. - -```ts title="quartz.layout.ts" -Component.Explorer({ - mapFn: (node) => { - node.name = node.name.toUpperCase() - }, -}) -``` - -### Remove list of elements (`filter`) - -Using this example, you can remove elements from your explorer by providing an array of folders/files using the `omit` set. - -```ts title="quartz.layout.ts" -Component.Explorer({ - filterFn: (node) => { - // set containing names of everything you want to filter out - const omit = new Set(["authoring content", "tags", "hosting"]) - return !omit.has(node.name.toLowerCase()) - }, -}) -``` - -You can customize this by changing the entries of the `omit` set. Simply add all folder or file names you want to remove. - -## Advanced examples - -### Add emoji prefix - -To add emoji prefixes (šŸ“ for folders, šŸ“„ for files), you could use a map function like this: - -```ts title="quartz.layout.ts" -Component.Explorer({ - mapFn: (node) => { - // dont change name of root node - if (node.depth > 0) { - // set emoji for file/folder - if (node.file) { - node.name = "šŸ“„ " + node.name - } else { - node.name = "šŸ“ " + node.name - } - } - }, -}}) -``` - -### Putting it all together - -In this example, we're going to customize the explorer by using functions from examples above to [[#Add emoji prefix | add emoji prefixes]], [[#remove-list-of-elements-filter| filter out some folders]] and [[#use-sort-to-put-files-first | sort with files above folders]]. - -```ts title="quartz.layout.ts" -Component.Explorer({ - filterFn: sampleFilterFn, - mapFn: sampleMapFn, - sortFn: sampleSortFn, - order: ["filter", "sort", "map"], -}) -``` - -Notice how we customized the `order` array here. This is done because the default order applies the `sort` function last. While this normally works well, it would cause unintended behavior here, since we changed the first characters of all display names. In our example, `sort` would be applied based off the emoji prefix instead of the first _real_ character. - -To fix this, we just changed around the order and apply the `sort` function before changing the display names in the `map` function. - -> [!tip] -> When writing more complicated functions, the `layout` file can start to look very cramped. -> You can fix this by defining your functions in another file. -> -> ```ts title="functions.ts" -> import { Options } from "./quartz/components/ExplorerNode" -> export const mapFn: Options["mapFn"] = (node) => { -> // implement your function here -> } -> export const filterFn: Options["filterFn"] = (node) => { -> // implement your function here -> } -> export const sortFn: Options["sortFn"] = (a, b) => { -> // implement your function here -> } -> ``` -> -> You can then import them like this: -> -> ```ts title="quartz.layout.ts" -> import { mapFn, filterFn, sortFn } from "./functions.ts" -> Component.Explorer({ -> mapFn: mapFn, -> filterFn: filterFn, -> sortFn: sortFn, -> }) -> ``` diff --git a/docs/features/folder and tag listings.md b/docs/features/folder and tag listings.md deleted file mode 100644 index dfde7c2..0000000 --- a/docs/features/folder and tag listings.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Folder and Tag Listings -tags: - - plugin/emitter ---- - -Quartz creates listing pages for any folders and tags you have. - -## Folder Listings - -Quartz will generate an index page for all the pages under that folder. This includes any content that is multiple levels deep. - -Additionally, Quartz will also generate pages for subfolders. Say you have a note in a nested folder `content/abc/def/note.md`. Then, Quartz would generate a page for all the notes under `abc` _and_ a page for all the notes under `abc/def`. - -By default, Quartz will title the page `Folder: ` and no description. You can override this by creating an `index.md` file in the folder with the `title` [[authoring content#Syntax|frontmatter]] field. Any content you write in this file will also be used in the description of the folder. - -For example, for the folder `content/posts`, you can add another file `content/posts/index.md` to add a specific description for it. - -## Tag Listings - -Quartz will also create an index page for each unique tag in your vault and render a list of all notes with that tag. - -Quartz also supports tag hierarchies as well (e.g. `plugin/emitter`) and will also render a separate tag page for each layer of the tag hierarchy. It will also create a default global tag index page at `/tags` that displays a list of all the tags in your Quartz. - -Like folder listings, you can also provide a description and title for a tag page by creating a file for each tag. For example, if you wanted to create a custom description for the #component tag, you would create a file at `content/tags/component.md` with a title and description. - -## Customization - -The layout for both the folder and content pages can be customized. By default, they use the `defaultListPageLayout` in `quartz.layouts.ts`. If you'd like to make more involved changes to the layout and don't mind editing some [[creating components|Quartz components]], you can take a look at `quartz/components/pages/FolderContent.tsx` and `quartz/components/pages/TagContent.tsx` respectively. - -- Removing folder listings: remove `Plugin.FolderPage()` from `emitters` in `quartz.config.ts` -- Removing tag listings: remove `Plugin.TagPage()` from `emitters` in `quartz.config.ts` diff --git a/docs/features/full-text search.md b/docs/features/full-text search.md deleted file mode 100644 index 85ec030..0000000 --- a/docs/features/full-text search.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Full-text Search -tags: - - component ---- - -Full-text search in Quartz is powered by [Flexsearch](https://github.com/nextapps-de/flexsearch). It's fast enough to return search results in under 10ms for Quartzs as large as half a million words. - -It can be opened by either clicking on the search bar or pressing `āŒ˜`/`ctrl` + `K`. The top 5 search results are shown on each query. Matching subterms are highlighted and the most relevant 30 words are excerpted. Clicking on a search result will navigate to that page. - -To search content by tags, you can either press `āŒ˜`/`ctrl` + `shift` + `K` or start your query with `#` (e.g. `#components`). - -This component is also keyboard accessible: Tab and Shift+Tab will cycle forward and backward through search results and Enter will navigate to the highlighted result (first result by default). You are also able to navigate search results using `ArrowUp` and `ArrowDown`. - -> [!info] -> Search requires the `ContentIndex` emitter plugin to be present in the [[configuration]]. - -### Indexing Behaviour - -By default, it indexes every page on the site with **Markdown syntax removed**. This means link URLs for instance are not indexed. - -It properly tokenizes Chinese, Korean, and Japenese characters and constructs separate indexes for the title, content and tags, weighing title matches above content matches. - -## Customization - -- Removing search: delete all usages of `Component.Search()` from `quartz.layout.ts`. -- Component: `quartz/components/Search.tsx` -- Style: `quartz/components/styles/search.scss` -- Script: `quartz/components/scripts/search.inline.ts` - - You can edit `contextWindowWords`, `numSearchResults` or `numTagResults` to suit your needs diff --git a/docs/features/graph view.md b/docs/features/graph view.md deleted file mode 100644 index c7ddb03..0000000 --- a/docs/features/graph view.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -title: "Graph View" -tags: - - component ---- - -Quartz features a graph-view that can show both a local graph view and a global graph view. - -- The local graph view shows files that either link to the current file or are linked from the current file. In other words, it shows all notes that are _at most_ one hop away. -- The global graph view can be toggled by clicking the graph icon on the top-right of the local graph view. It shows _all_ the notes in your graph and how they connect to each other. - -By default, the node radius is proportional to the total number of incoming and outgoing internal links from that file. - -Additionally, similar to how browsers highlight visited links a different colour, the graph view will also show nodes that you have visited in a different colour. - -> [!info] -> Graph View requires the `ContentIndex` emitter plugin to be present in the [[configuration]]. - -## Customization - -Most configuration can be done by passing in options to `Component.Graph()`. - -For example, here's what the default configuration looks like: - -```typescript title="quartz.layout.ts" -Component.Graph({ - localGraph: { - drag: true, // whether to allow panning the view around - zoom: true, // whether to allow zooming in and out - depth: 1, // how many hops of notes to display - scale: 1.1, // default view scale - repelForce: 0.5, // how much nodes should repel each other - centerForce: 0.3, // how much force to use when trying to center the nodes - linkDistance: 30, // how long should the links be by default? - fontSize: 0.6, // what size should the node labels be? - opacityScale: 1, // how quickly do we fade out the labels when zooming out? - }, - globalGraph: { - drag: true, - zoom: true, - depth: -1, - scale: 0.9, - repelForce: 0.5, - centerForce: 0.3, - linkDistance: 30, - fontSize: 0.6, - opacityScale: 1, - }, -}) -``` - -When passing in your own options, you can omit any or all of these fields if you'd like to keep the default value for that field. - -Want to customize it even more? - -- Removing graph view: delete all usages of `Component.Graph()` from `quartz.layout.ts`. -- Component: `quartz/components/Graph.tsx` -- Style: `quartz/components/styles/graph.scss` -- Script: `quartz/components/scripts/graph.inline.ts` diff --git a/docs/features/index.md b/docs/features/index.md deleted file mode 100644 index 2997b3a..0000000 --- a/docs/features/index.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Feature List ---- diff --git a/docs/features/popover previews.md b/docs/features/popover previews.md deleted file mode 100644 index f882224..0000000 --- a/docs/features/popover previews.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: Popover Previews ---- - -Like Wikipedia, when you hover over a link in Quartz, there is a popup of a page preview that you can scroll to see the entire content. Links to headers will also scroll the popup to show that specific header in view. - -By default, Quartz only fetches previews for pages inside your vault due to [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). It does this by selecting all HTML elements with the `popover-hint` class. For most pages, this includes the page title, page metadata like words and time to read, tags, and the actual page content. - -When [[creating components|creating your own components]], you can include this `popover-hint` class to also include it in the popover. - -## Configuration - -- Remove popovers: set the `enablePopovers` field in `quartz.config.ts` to be `false`. -- Style: `quartz/components/styles/popover.scss` -- Script: `quartz/components/scripts/popover.inline.ts` diff --git a/docs/features/private pages.md b/docs/features/private pages.md deleted file mode 100644 index 5c3940b..0000000 --- a/docs/features/private pages.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Private Pages -tags: - - plugin/filter ---- - -There may be some notes you want to avoid publishing as a website. Quartz supports this through two mechanisms which can be used in conjunction: - -## Filter Plugins - -[[making plugins#Filters|Filter plugins]] are plugins that filter out content based off of certain criteria. By default, Quartz uses the `Plugin.RemoveDrafts` plugin which filters out any note that has `draft: true` in the frontmatter. - -If you'd like to only publish a select number of notes, you can instead use `Plugin.ExplicitPublish` which will filter out all notes except for any that have `publish: true` in the frontmatter. - -## `ignorePatterns` - -This is a field in `quartz.config.ts` under the main [[configuration]] which allows you to specify a list of patterns to effectively exclude from parsing all together. Any valid [glob](https://github.com/mrmlnc/fast-glob#pattern-syntax) pattern works here. - -Common examples include: - -- `some/folder`: exclude the entire of `some/folder` -- `*.md`: exclude all files with a `.md` extension -- `!*.md` exclude all files that _don't_ have a `.md` extension -- `**/private`: exclude any files or folders named `private` at any level of nesting - -> [!warning] -> Marking something as private via either a plugin or through the `ignorePatterns` pattern will only prevent a page from being included in the final built site. If your GitHub repository is public, also be sure to include an ignore for those in the `.gitignore` of your Quartz. See the `git` [documentation](https://git-scm.com/docs/gitignore#_pattern_format) for more information. diff --git a/docs/features/recent notes.md b/docs/features/recent notes.md deleted file mode 100644 index 439d6d0..0000000 --- a/docs/features/recent notes.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Recent Notes -tags: component ---- - -Quartz can generate a list of recent notes for based on some filtering and sorting criteria. Though this component isn't included in any [[layout]] by default, you can add it by using `Component.RecentNotes`. - -## Customization - -- Changing the title from "Recent notes": pass in an additional parameter to `Component.RecentNotes({ title: "Recent writing" })` -- Changing the number of recent notes: pass in an additional parameter to `Component.RecentNotes({ limit: 5 })` -- Show a 'see more' link: pass in an additional parameter to `Component.RecentNotes({ linkToMore: "tags/components" })`. This field should be a full slug to a page that exists. -- Customize filtering: pass in an additional parameter to `Component.RecentNotes({ filter: someFilterFunction })`. The filter function should be a function that has the signature `(f: QuartzPluginData) => boolean`. -- Customize sorting: pass in an additional parameter to `Component.RecentNotes({ sort: someSortFunction })`. By default, Quartz will sort by date and then tie break lexographically. The sort function should be a function that has the signature `(f1: QuartzPluginData, f2: QuartzPluginData) => number`. See `byDateAndAlphabetical` in `quartz/components/PageList.tsx` for an example. -- Component: `quartz/components/RecentNotes.tsx` -- Style: `quartz/components/styles/recentNotes.scss` diff --git a/docs/features/syntax highlighting.md b/docs/features/syntax highlighting.md deleted file mode 100644 index 68436c2..0000000 --- a/docs/features/syntax highlighting.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: Syntax Highlighting -tags: - - plugin/transformer ---- - -Syntax highlighting in Quartz is completely done at build-time. This means that Quartz only ships pre-calculated CSS to highlight the right words so there is no heavy client-side bundle that does the syntax highlighting. - -And, unlike some client-side highlighters, it has a full TextMate parser grammar instead of using Regexes, allowing for highly accurate code highlighting. - -In short, it generates HTML that looks exactly like your code in an editor like VS Code. Under the hood, it's powered by [Rehype Pretty Code](https://rehype-pretty-code.netlify.app/) which uses [Shiki](https://github.com/shikijs/shiki). - -> [!warning] -> Syntax highlighting does have an impact on build speed if you have a lot of code snippets in your notes. - -## Formatting - -Text inside `backticks` on a line will be formatted like code. - -```` -```ts -export function trimPathSuffix(fp: string): string { - fp = clientSideSlug(fp) - let [cleanPath, anchor] = fp.split("#", 2) - anchor = anchor === undefined ? "" : "#" + anchor - - return cleanPath + anchor -} -``` -```` - -```ts -export function trimPathSuffix(fp: string): string { - fp = clientSideSlug(fp) - let [cleanPath, anchor] = fp.split("#", 2) - anchor = anchor === undefined ? "" : "#" + anchor - - return cleanPath + anchor -} -``` - -### Titles - -Add a file title to your code block, with text inside double quotes (`""`): - -```` -```js title="..." - -``` -```` - -```ts title="quartz/path.ts" -export function trimPathSuffix(fp: string): string { - fp = clientSideSlug(fp) - let [cleanPath, anchor] = fp.split("#", 2) - anchor = anchor === undefined ? "" : "#" + anchor - - return cleanPath + anchor -} -``` - -### Line highlighting - -Place a numeric range insideĀ `{}`. - -```` -```js {1-3,4} - -``` -```` - -```ts {2-3,6} -export function trimPathSuffix(fp: string): string { - fp = clientSideSlug(fp) - let [cleanPath, anchor] = fp.split("#", 2) - anchor = anchor === undefined ? "" : "#" + anchor - - return cleanPath + anchor -} -``` - -### Word highlighting - -A series of characters, like a literal regex. - -```` -```js /useState/ -const [age, setAge] = useState(50); -const [name, setName] = useState('Taylor'); -``` -```` - -```js /useState/ -const [age, setAge] = useState(50) -const [name, setName] = useState("Taylor") -``` - -### Line numbers - -Syntax highlighting has line numbers configured automatically. If you want to start line numbers at a specific number, useĀ `showLineNumbers{number}`: - -```` -```js showLineNumbers{number} - -``` -```` - -```ts showLineNumbers{20} -export function trimPathSuffix(fp: string): string { - fp = clientSideSlug(fp) - let [cleanPath, anchor] = fp.split("#", 2) - anchor = anchor === undefined ? "" : "#" + anchor - - return cleanPath + anchor -} -``` - -### Escaping code blocks - -You can format a codeblock inside of a codeblock by wrapping it with another level of backtick fences that has one more backtick than the previous fence. - -````` -```` -```js /useState/ -const [age, setAge] = useState(50); -const [name, setName] = useState('Taylor'); -``` -```` -````` - -## Customization - -- Removing syntax highlighting: delete all usages of `Plugin.SyntaxHighlighting()` from `quartz.config.ts`. -- Style: By default, Quartz uses derivatives of the GitHub light and dark themes. You can customize the colours in the `quartz/styles/syntax.scss` file. -- Plugin: `quartz/plugins/transformers/syntax.ts` diff --git a/docs/features/table of contents.md b/docs/features/table of contents.md deleted file mode 100644 index f058573..0000000 --- a/docs/features/table of contents.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "Table of Contents" -tags: - - component - - plugin/transformer ---- - -Quartz can automatically generate a table of contents from a list of headings on each page. It will also show you your current scroll position on the site by marking headings you've scrolled through with a different colour. - -By default, it will show all headers from H1 (`# Title`) all the way to H3 (`### Title`) and will only show the table of contents if there is more than 1 header on the page. - -> [!info] -> This feature requires both `Plugin.TableOfContents` in your `quartz.config.ts` and `Component.TableOfContents` in your `quartz.layout.ts` to function correctly. - -## Customization - -- Removing table of contents: remove all instances of `Plugin.TableOfContents()` from `quartz.config.ts`. and `Component.TableOfContents()` from `quartz.layout.ts` -- Changing the max depth: pass in a parameter to `Plugin.TableOfContents({ maxDepth: 4 })` -- Changing the minimum number of entries in the Table of Contents before it renders: pass in a parameter to `Plugin.TableOfContents({ minEntries: 3 })` -- Component: `quartz/components/TableOfContents.tsx` -- Style: - - Modern (default): `quartz/components/styles/toc.scss` - - Legacy Quartz 3 style: `quartz/components/styles/legacyToc.scss` -- Script: `quartz/components/scripts/toc.inline.ts` diff --git a/docs/features/upcoming features.md b/docs/features/upcoming features.md deleted file mode 100644 index 76adda0..0000000 --- a/docs/features/upcoming features.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -draft: true ---- - -## high priority backlog - -- static dead link detection -- block links: https://help.obsidian.md/Linking+notes+and+files/Internal+links#Link+to+a+block+in+a+note -- note/header/block transcludes: https://help.obsidian.md/Linking+notes+and+files/Embedding+files -- docker support - -## misc backlog - -- breadcrumbs component -- cursor chat extension -- https://giscus.app/ extension -- sidenotes? https://github.com/capnfabs/paperesque -- direct match in search using double quotes -- https://help.obsidian.md/Advanced+topics/Using+Obsidian+URI -- audio/video embed styling -- Canvas -- parse all images in page: use this for page lists if applicable? -- CV mode? with print stylesheet diff --git a/docs/features/wikilinks.md b/docs/features/wikilinks.md deleted file mode 100644 index 50bbb1b..0000000 --- a/docs/features/wikilinks.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Wikilinks ---- - -Wikilinks were pioneered by earlier internet wikis to make it easier to write links across pages without needing to write Markdown or HTML links each time. - -Quartz supports Wikilinks by default and these links are resolved by Quartz using `Plugin.CrawlLinks`. See the [Obsidian Help page on Internal Links](https://help.obsidian.md/Linking+notes+and+files/Internal+links) for more information on Wikilink syntax. - -This is enabled as a part of [[Obsidian compatibility]] and can be configured and enabled/disabled from that plugin. - -## Syntax - -- `[[Path to file]]`: produces a link to `Path to file.md` (or `Path-to-file.md`) with the text `Path to file` -- `[[Path to file | Here's the title override]]`: produces a link to `Path to file.md` with the text `Here's the title override` -- `[[Path to file#Anchor]]`: produces a link to the anchor `Anchor` in the file `Path to file.md` -- `[[Path to file#^block-ref]]`: produces a link to the specific block `block-ref` in the file `Path to file.md` diff --git a/docs/hosting.md b/docs/hosting.md deleted file mode 100644 index 01d130f..0000000 --- a/docs/hosting.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -title: Hosting ---- - -Quartz effectively turns your Markdown files and other resources into a bundle of HTML, JS, and CSS files (a website!). - -However, if you'd like to publish your site to the world, you need a way to host it online. This guide will detail how to deploy with either GitHub Pages or Cloudflare pages but any service that allows you to deploy static HTML should work as well (e.g. Netlify, Replit, etc.) - -> [!hint] -> Some Quartz features (like [[RSS Feed]] and sitemap generation) require `baseUrl` to be configured properly in your [[configuration]] to work properly. Make sure you set this before deploying! - -## Cloudflare Pages - -1. Log in to theĀ [Cloudflare dashboard](https://dash.cloudflare.com/)Ā and select your account. -2. In Account Home, selectĀ **Workers & Pages**Ā >Ā **Create application**Ā >Ā **Pages**Ā >Ā **Connect to Git**. -3. Select the new GitHub repository that you created and, in theĀ **Set up builds and deployments**Ā section, provide the following information: - -| Configuration option | Value | -| ---------------------- | ------------------ | -| Production branch | `v4` | -| Framework preset | `None` | -| Build command | `npx quartz build` | -| Build output directory | `public` | - -Press "Save and deploy" and Cloudflare should have a deployed version of your site in about a minute. Then, every time you sync your Quartz changes to GitHub, your site should be updated. - -To add a custom domain, check out [Cloudflare's documentation](https://developers.cloudflare.com/pages/platform/custom-domains/). - -## GitHub Pages - -Like Quartz 3, you can deploy the site generated by Quartz 4 via GitHub Pages. - -> [!warning] -> Quartz generates files in the format of `file.html` instead of `file/index.html` which means the trailing slashes for _non-folder paths_ are dropped. As GitHub pages does not do this redirect, this may cause existing links to your site that use trailing slashes to break. If not breaking existing links is important to you, consider using [[#Cloudflare Pages]]. - -In your local Quartz, create a new file `quartz/.github/workflows/deploy.yml`. - -```yaml title="quartz/.github/workflows/deploy.yml" -name: Deploy Quartz site to GitHub Pages - -on: - push: - branches: - - v4 - -permissions: - contents: read - pages: write - id-token: write - -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - build: - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 # Fetch all history for git info - - uses: actions/setup-node@v3 - with: - node-version: 18.14 - - name: Install Dependencies - run: npm ci - - name: Build Quartz - run: npx quartz build - - name: Upload artifact - uses: actions/upload-pages-artifact@v2 - with: - path: public - - deploy: - needs: build - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v2 -``` - -Then: - -1. Head to "Settings" tab of your forked repository and in the sidebar, click "Pages". Under "Source", select "GitHub Actions". -2. Commit these changes by doing `npx quartz sync`. This should deploy your site to `.github.io/`. - -> [!hint] -> If you get an error about not being allowed to deploy to `github-pages` due to environment protection rules, make sure you remove any existing GitHub pages environments. -> -> You can do this by going to your Settings page on your GitHub fork and going to the Environments tab and pressing the trash icon. The GitHub action will recreate the environment for you correctly the next time you sync your Quartz. - -### Custom Domain - -Here's how to add a custom domain to your GitHub pages deployment. - -1. Head to the "Settings" tab of your forked repository. -2. In the "Code and automation" section of the sidebar, click "Pages". -3. Under "Custom Domain", type your custom domain and click "Save". -4. This next step depends on whether you are using an apex domain (`example.com`) or a subdomain (`subdomain.example.com`). - - If you are using an apex domain, navigate to your DNS provider and create an `A` record that points your apex domain to GitHub's name servers which have the following IP addresses: - - `185.199.108.153` - - `185.199.109.153` - - `185.199.110.153` - - `185.199.111.153` - - If you are using a subdomain, navigate to your DNS provider and create aĀ `CNAME`Ā record that points your subdomain to the default domain for your site. For example, if you want to use the subdomainĀ `quartz.example.com`Ā for your user site, create aĀ `CNAME`Ā record that pointsĀ `quartz.example.com`Ā toĀ `.github.io`. - -![[dns records.png]]_The above shows a screenshot of Google Domains configured for both `jzhao.xyz` (an apex domain) and `quartz.jzhao.xyz` (a subdomain)._ - -See the [GitHub documentation](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site#configuring-a-subdomain) for more detail about how to setup your own custom domain with GitHub Pages. - -> [!question] Why aren't my changes showing up? -> There could be many different reasons why your changes aren't showing up but the most likely reason is that you forgot to push your changes to GitHub. -> -> Make sure you save your changes to Git and sync it to GitHub by doing `npx quartz sync`. This will also make sure to pull any updates you may have made from other devices so you have them locally. - -## Vercel - -### Fix URLs - -Before deploying to Vercel, a `vercel.json` file is required at the root of the project directory. It needs to contain the following configuration so that URLs don't require the `.html` extension: - -```json title="vercel.json" -{ - "cleanUrls": true -} -``` - -### Deploy to Vercel - -1. Log in to the [Vercel Dashboard](https://vercel.com/dashboard) and click "Add New..." > Project -2. Import the Git repository containing your Quartz project. -3. Give the project a name (lowercase characters and hyphens only) -4. Check that these configuration options are set: - -| Configuration option | Value | -| ----------------------------------------- | ------------------ | -| Framework Preset | `Other` | -| Root Directory | `./` | -| Build and Output Settings > Build Command | `npx quartz build` | - -5. Press Deploy. Once it's live, you'll have 2 `*.vercel.app` URLs to view the page. - -### Custom Domain - -> [!note] -> If there is something already hosted on the domain, these steps will not work without replacing the previous content. As a workaround, you could use Next.js rewrites or use the next section to create a subdomain. - -1. Update the `baseUrl` in `quartz.config.js` if necessary. -2. Go to the [Domains - Dashboard](https://vercel.com/dashboard/domains) page in Vercel. -3. Connect the domain to Vercel -4. Press "Add" to connect a custom domain to Vercel. -5. Select your Quartz repository and press Continue. -6. Enter the domain you want to connect it to. -7. Follow the instructions to update your DNS records until you see "Valid Configuration" - -### Use a Subdomain - -Using `docs.example.com` is an example of a subdomain. They're a simple way of connecting multiple deployments to one domain. - -1. Update the `baseUrl` in `quartz.config.js` if necessary. -2. Ensure your domain has been added to the [Domains - Dashboard](https://vercel.com/dashboard/domains) page in Vercel. -3. Go to the [Vercel Dashboard](https://vercel.com/dashboard) and select your Quartz project. -4. Go to the Settings tab and then click Domains in the sidebar -5. Enter your subdomain into the field and press Add diff --git a/docs/images/dns records.png b/docs/images/dns records.png deleted file mode 100644 index bf9f854..0000000 Binary files a/docs/images/dns records.png and /dev/null differ diff --git a/docs/images/quartz layout.png b/docs/images/quartz layout.png deleted file mode 100644 index 03435f7..0000000 Binary files a/docs/images/quartz layout.png and /dev/null differ diff --git a/docs/images/quartz transform pipeline.png b/docs/images/quartz transform pipeline.png deleted file mode 100644 index 657f0a3..0000000 Binary files a/docs/images/quartz transform pipeline.png and /dev/null differ diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 05de2ba..0000000 --- a/docs/index.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: Welcome to Quartz 4 ---- - -Quartz is a fast, batteries-included static-site generator that transforms Markdown content into fully functional websites. Thousands of students, developers, and teachers are [[showcase|already using Quartz]] to publish personal notes, wikis, and [digital gardens](https://jzhao.xyz/posts/networked-thought) to the web. - -## šŸŖ“ Get Started - -Quartz requires **at least [Node](https://nodejs.org/) v18.14** to function correctly. Ensure you have this installed on your machine before continuing. - -Then, in your terminal of choice, enter the following commands line by line: - -```shell -git clone https://github.com/jackyzha0/quartz.git -cd quartz -npm i -npx quartz create -``` - -This will guide you through initializing your Quartz with content. Once you've done so, see how to: - -1. [[authoring content|Author content]] in Quartz -2. [[configuration|Configure]] Quartz's behaviour -3. Change Quartz's [[layout]] -4. [[build|Build and preview]] Quartz -5. [[hosting|Host]] Quartz online - -> [!info] -> Coming from Quartz 3? See the [[migrating from Quartz 3|migration guide]] for the differences between Quartz 3 and Quartz 4 and how to migrate. - -## šŸ”§ Features - -- [[Obsidian compatibility]], [[full-text search]], [[graph view]], note transclusion, [[wikilinks]], [[backlinks]], [[Latex]], [[syntax highlighting]], [[popover previews]], and [many more](./features) right out of the box -- Hot-reload for both configuration and content -- Simple JSX layouts and [[creating components|page components]] -- [[SPA Routing|Ridiculously fast page loads]] and tiny bundle sizes -- Fully-customizable parsing, filtering, and page generation through [[making plugins|plugins]] - -For a comprehensive list of features, visit the [features page](/features). You can read more about the _why_ behind these features on the [[philosophy]] page and a technical overview on the [[architecture]] page. - -### šŸš§ Troubleshooting + Updating - -Having trouble with Quartz? Try searching for your issue using the search feature. If you haven't already, [[upgrading|upgrade]] to the newest version of Quartz to see if this fixes your issue. - -If you're still having trouble, feel free to [submit an issue](https://github.com/jackyzha0/quartz/issues) if you feel you found a bug or ask for help in our [Discord Community](https://discord.gg/cRFFHYye7t). diff --git a/docs/layout.md b/docs/layout.md deleted file mode 100644 index 3fabeb7..0000000 --- a/docs/layout.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Layout ---- - -Certain emitters may also output [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) files. To enable easy customization, these emitters allow you to fully rearrange the layout of the page. The default page layouts can be found in `quartz.layout.ts`. - -Each page is composed of multiple different sections which contain `QuartzComponents`. The following code snippet lists all of the valid sections that you can add components to: - -```typescript title="quartz/cfg.ts" -export interface FullPageLayout { - head: QuartzComponent // single component - header: QuartzComponent[] // laid out horizontally - beforeBody: QuartzComponent[] // laid out vertically - pageBody: QuartzComponent // single component - left: QuartzComponent[] // vertical on desktop, horizontal on mobile - right: QuartzComponent[] // vertical on desktop, horizontal on mobile - footer: QuartzComponent // single component -} -``` - -These correspond to following parts of the page: - -![[quartz layout.png|800]] - -> [!note] -> There are two additional layout fields that are _not_ shown in the above diagram. -> -> 1. `head` is a single component that renders the `` [tag](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/head) in the HTML. This doesn't appear visually on the page and is only is responsible for metadata about the document like the tab title, scripts, and styles. -> 2. `header` is a set of components that are laid out horizontally and appears _before_ the `beforeBody` section. This enables you to replicate the old Quartz 3 header bar where the title, search bar, and dark mode toggle. By default, Quartz 4 doesn't place any components in the `header`. - -Quartz **components**, like plugins, can take in additional properties as configuration options. If you're familiar with React terminology, you can think of them as Higher-order Components. - -See [a list of all the components](component.md) for all available components along with their configuration options. You can also checkout the guide on [[creating components]] if you're interested in further customizing the behaviour of Quartz. - -### Style - -Most meaningful style changes like colour scheme and font can be done simply through the [[configuration#General Configuration|general configuration]] options. However, if you'd like to make more involved style changes, you can do this by writing your own styles. Quartz 4, like Quartz 3, uses [Sass](https://sass-lang.com/guide/) for styling. - -You can see the base style sheet in `quartz/styles/base.scss` and write your own in `quartz/styles/custom.scss`. - -> [!note] -> Some components may provide their own styling as well! For example, `quartz/components/Darkmode.tsx` imports styles from `quartz/components/styles/darkmode.scss`. If you'd like to customize styling for a specific component, double check the component definition to see how its styles are defined. diff --git a/docs/migrating from Quartz 3.md b/docs/migrating from Quartz 3.md deleted file mode 100644 index 2fdc731..0000000 --- a/docs/migrating from Quartz 3.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "Migrating from Quartz 3" ---- - -As you already have Quartz locally, you don't need to fork or clone it again. Simply just checkout the alpha branch, install the dependencies, and import your old vault. - -```bash -git fetch -git checkout v4 -git pull upstream v4 -npm i -npx quartz create -``` - -If you get an error like `fatal: 'upstream' does not appear to be a git repository`, make sure you add `upstream` as a remote origin: - -```shell -git remote add upstream https://github.com/jackyzha0/quartz.git -``` - -When running `npx quartz create`, you will be prompted as to how to initialize your content folder. Here, you can choose to import or link your previous content folder and Quartz should work just as you expect it to. - -> [!note] -> If the existing content folder you'd like to use is at the _same_ path on a different branch, clone the repo again somewhere at a _different_ path in order to use it. - -## Key changes - -1. **Removing Hugo and `hugo-obsidian`**: Hugo worked well for earlier versions of Quartz but it also made it hard for people outside of the Golang and Hugo communities to fully understand what Quartz was doing under the hood and be able to properly customize it to their needs. Quartz 4 now uses a Node-based static-site generation process which should lead to a much more helpful error messages and an overall smoother user experience. -2. **Full-hot reload**: The many rough edges of how `hugo-obsidian` integrated with Hugo meant that watch mode didn't re-trigger `hugo-obsidian` to update the content index. This lead to a lot of weird cases where the watch mode output wasn't accurate. Quartz 4 now uses a cohesive parse, filter, and emit pipeline which gets run on every change so hot-reloads are always accurate. -3. **Replacing Go template syntax with JSX**: Quartz 3 used [Go templates](https://pkg.go.dev/text/template) to create layouts for pages. However, the syntax isn't great for doing any sort of complex rendering (like [text processing](https://github.com/jackyzha0/quartz/blob/hugo/layouts/partials/textprocessing.html)) and it got very difficult to make any meaningful layout changes to Quartz 3. Quartz 4 uses an extension of JavaScript syntax called JSX which allows you to write layout code that looks like HTML in JavaScript which is significantly easier to understand and maintain. -4. **A new extensible [[configuration]] and [[configuration#Plugins|plugin]] system**: Quartz 3 was hard to configure without technical knowledge of how Hugo's partials worked. Extensions were even hard to make. Quartz 4's configuration and plugin system is designed to be extended by users while making updating to new versions of Quartz easy. - -## Things to update - -- You will need to update your deploy scripts. See the [[hosting]] guide for more details. -- Ensure that your default branch on GitHub is updated from `hugo` to `v4`. -- [[folder and tag listings|Folder and tag listings]] have also changed. - - Folder descriptions should go under `content//index.md` where `` is the name of the folder. - - Tag descriptions should go under `content/tags/.md` where `` is the name of the tag. -- Some HTML layout may not be the same between Quartz 3 and Quartz 4. If you depended on a particular HTML hierarchy or class names, you may need to update your custom CSS to reflect these changes. -- If you customized the layout of Quartz 3, you may need to translate these changes from Go templates back to JSX as Quartz 4 no longer uses Hugo. For components, check out the guide on [[creating components]] for more details on this. diff --git a/docs/philosophy.md b/docs/philosophy.md deleted file mode 100644 index b8af845..0000000 --- a/docs/philosophy.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Philosophy of Quartz ---- - -## A garden should be a true hypertext - -> The garden is the web as topology. Every walk through the garden creates new paths, new meanings, and when we add things to the garden we add them in a way that allows many future, unpredicted relationships. -> -> _(The Garden and the Stream)_ - -The problem with the file cabinet is that it focuses on efficiency of access and interoperability rather than generativity and creativity. Thinking is not linear, nor is it hierarchical. In fact, not many things are linear or hierarchical at all. Then why is it that most tools and thinking strategies assume a nice chronological or hierarchical order for my thought processes? The ideal tool for thought for me would embrace the messiness of my mind, and organically help insights emerge from chaos instead of forcing an artificial order. A rhizomatic, not arboresecent, form of note taking. - -My goal with a digital garden is not purely as an organizing system and information store (though it works nicely for that). I want my digital garden to be a playground for new ways ideas can connect together. As a result, existing formal organizing systems like Zettelkasten or the hierarchical folder structures of Notion donā€™t work well for me. There is way too much upfront friction that by the time Iā€™ve thought about how to organize my thought into folders categories, Iā€™ve lost it. - -Quartz embraces the inherent rhizomatic and web-like nature of our thinking and tries to encourage note-taking in a similar form. - ---- - -## A garden should be shared - -The goal of digital gardening should be to tap into your networkā€™s collective intelligence to create constructive feedback loops. If done well, I have a shareable representation of my thoughts that I can send out into the world and people can respond. Even for my most half-baked thoughts, this helps me create a feedback cycle to strengthen and fully flesh out that idea. - -Quartz is designed first and foremost as a tool for publishing [digital gardens](https://jzhao.xyz/posts/networked-thought) to the web. To me, digital gardening is not just passive knowledge collection. Itā€™s a form of expression and sharing. - -> ā€œ[One] who works with the door open gets all kinds of interruptions, but [they] also occasionally gets clues as to what the world is and what might be important.ā€ -> ā€” Richard Hamming - -**The goal of Quartz is to make sharing your digital garden free and simple.** At its core, Quartz is designed to be easy to use enough for non-technical people to get going but also powerful enough that senior developers can tweak it to work how they'd like it to work. diff --git a/docs/showcase.md b/docs/showcase.md deleted file mode 100644 index d2282be..0000000 --- a/docs/showcase.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: "Quartz Showcase" ---- - -Want to see what Quartz can do? Here are some cool community gardens: - -- [Quartz Documentation (this site!)](https://quartz.jzhao.xyz/) -- [Jacky Zhao's Garden](https://jzhao.xyz/) -- [Brandon Boswell's Garden](https://brandonkboswell.com) -- [Scaling Synthesis - A hypertext research notebook](https://scalingsynthesis.com/) -- [AWAGMI Intern Notes](https://notes.awagmi.xyz/) -- [Course notes for Information Technology Advanced Theory](https://a2itnotes.github.io/quartz/) -- [Data Dictionary šŸ§ ](https://glossary.airbyte.com/) -- [sspaeti.com's Second Brain](https://brain.sspaeti.com/) -- [oldwinter ć®ę•°å­—čŠ±å›­](https://garden.oldwinter.top/) -- [Abhijeet's Math Wiki](https://abhmul.github.io/quartz/Math-Wiki/) -- [Mike's AI Garden šŸ¤–šŸŖ“](https://mwalton.me/) -- [Matt Dunn's Second Brain](https://mattdunn.info/) -- [Pelayo Arbues' Notes](https://pelayoarbues.github.io/) - -If you want to see your own on here, submit a [Pull Request adding yourself to this file](https://github.com/jackyzha0/quartz/blob/v4/content/showcase.md)! diff --git a/docs/tags/component.md b/docs/tags/component.md deleted file mode 100644 index 57592e8..0000000 --- a/docs/tags/component.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Components ---- - -Want to create your own custom component? Check out the advanced guide on [[creating components]] for more information. diff --git a/docs/upgrading.md b/docs/upgrading.md deleted file mode 100644 index a3a8275..0000000 --- a/docs/upgrading.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Upgrading Quartz" ---- - -> [!note] -> This is specifically a guide for upgrading Quartz 4 version to a more recent update. If you are coming from Quartz 3, check out the [[migrating from Quartz 3|migration guide]] for more info. - -To fetch the latest Quartz updates, simply run - -```bash -npx quartz update -``` - -As Quartz uses [git](https://git-scm.com/) under the hood for versioning, updating effectively 'pulls' in the updates from the official Quartz GitHub repository. If you have local changes that might conflict with the updates, you may need to resolve these manually yourself (or, pull manually using `git pull origin upstream`). - -> [!hint] -> Quartz will try to cache your content before updating to try and prevent merge conflicts. If you get a conflict mid-merge, you can stop the merge and then run `npx quartz restore` to restore your content from the cache. - -If you have the [GitHub desktop app](https://desktop.github.com/), this will automatically open to help you resolve the conflicts. Otherwise, you will need to resolve this in a text editor like VSCode. For more help on resolving conflicts manually, check out the [GitHub guide on resolving merge conflicts](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/resolving-a-merge-conflict-using-the-command-line#competing-line-change-merge-conflicts). diff --git a/globals.d.ts b/globals.d.ts deleted file mode 100644 index 4473d59..0000000 --- a/globals.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -export declare global { - interface Document { - addEventListener( - type: K, - listener: (this: Document, ev: CustomEventMap[K]) => void, - ): void - dispatchEvent(ev: CustomEventMap[K]): void - } - interface Window { - spaNavigate(url: URL, isBack: boolean = false) - } -} diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index aec536d..0000000 --- a/index.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -declare module "*.scss" { - const content: string - export = content -} - -// dom custom event -interface CustomEventMap { - nav: CustomEvent<{ url: FullSlug }> -} - -declare const fetchData: Promise diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 4d25605..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6208 +0,0 @@ -{ - "name": "@jackyzha0/quartz", - "version": "4.0.11", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@jackyzha0/quartz", - "version": "4.0.11", - "license": "MIT", - "dependencies": { - "@clack/prompts": "^0.6.3", - "@floating-ui/dom": "^1.4.0", - "@napi-rs/simple-git": "0.1.9", - "async-mutex": "^0.4.0", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cli-spinner": "^0.2.10", - "d3": "^7.8.5", - "esbuild-sass-plugin": "^2.12.0", - "flexsearch": "0.7.21", - "github-slugger": "^2.0.0", - "globby": "^13.1.4", - "gray-matter": "^4.0.3", - "hast-util-to-html": "^8.0.4", - "hast-util-to-jsx-runtime": "^1.2.0", - "hast-util-to-string": "^2.0.0", - "is-absolute-url": "^4.0.1", - "js-yaml": "^4.1.0", - "lightningcss": "1.21.7", - "mdast-util-find-and-replace": "^2.2.2", - "mdast-util-to-hast": "^12.3.0", - "mdast-util-to-string": "^3.2.0", - "micromorph": "^0.4.5", - "plausible-tracker": "^0.3.8", - "preact": "^10.14.1", - "preact-render-to-string": "^6.0.3", - "pretty-bytes": "^6.1.0", - "pretty-time": "^1.1.0", - "reading-time": "^1.5.0", - "rehype-autolink-headings": "^6.1.1", - "rehype-katex": "^6.0.3", - "rehype-mathjax": "^4.0.3", - "rehype-pretty-code": "^0.10.0", - "rehype-raw": "^6.1.1", - "rehype-slug": "^5.1.0", - "remark": "^14.0.2", - "remark-breaks": "^3.0.3", - "remark-frontmatter": "^4.0.1", - "remark-gfm": "^3.0.1", - "remark-math": "^5.1.1", - "remark-parse": "^10.0.1", - "remark-rehype": "^10.1.0", - "remark-smartypants": "^2.0.0", - "rimraf": "^5.0.1", - "serve-handler": "^6.1.5", - "shiki": "^0.14.4", - "source-map-support": "^0.5.21", - "to-vfile": "^7.2.4", - "toml": "^3.0.0", - "unified": "^10.1.2", - "unist-util-visit": "^4.1.2", - "vfile": "^5.3.7", - "workerpool": "^6.4.0", - "ws": "^8.13.0", - "yargs": "^17.7.2" - }, - "bin": { - "quartz": "quartz/bootstrap-cli.mjs" - }, - "devDependencies": { - "@types/cli-spinner": "^0.2.1", - "@types/d3": "^7.4.0", - "@types/flexsearch": "^0.7.3", - "@types/hast": "^2.3.4", - "@types/js-yaml": "^4.0.5", - "@types/node": "^20.1.2", - "@types/pretty-time": "^1.1.2", - "@types/source-map-support": "^0.5.6", - "@types/workerpool": "^6.4.0", - "@types/ws": "^8.5.5", - "@types/yargs": "^17.0.24", - "esbuild": "0.19.2", - "prettier": "^3.0.0", - "tsx": "^3.12.7", - "typescript": "^5.0.4" - }, - "engines": { - "node": ">=18.14" - } - }, - "node_modules/@clack/core": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.3.2.tgz", - "integrity": "sha512-FZnsNynwGDIDktx6PEZK1EuCkFpY4ldEX6VYvfl0dqeoLPb9Jpw1xoUXaVcGR8ExmYNm1w2vdGdJkEUYD/2pqg==", - "dependencies": { - "picocolors": "^1.0.0", - "sisteransi": "^1.0.5" - } - }, - "node_modules/@clack/prompts": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.6.3.tgz", - "integrity": "sha512-AM+kFmAHawpUQv2q9+mcB6jLKxXGjgu/r2EQjEwujgpCdzrST6BJqYw00GRn56/L/Izw5U7ImoLmy00X/r80Pw==", - "bundleDependencies": [ - "is-unicode-supported" - ], - "dependencies": { - "@clack/core": "^0.3.2", - "is-unicode-supported": "*", - "picocolors": "^1.0.0", - "sisteransi": "^1.0.5" - } - }, - "node_modules/@clack/prompts/node_modules/is-unicode-supported": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@esbuild-kit/cjs-loader": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@esbuild-kit/cjs-loader/-/cjs-loader-2.4.2.tgz", - "integrity": "sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==", - "dev": true, - "dependencies": { - "@esbuild-kit/core-utils": "^3.0.0", - "get-tsconfig": "^4.4.0" - } - }, - "node_modules/@esbuild-kit/core-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.1.0.tgz", - "integrity": "sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==", - "dev": true, - "dependencies": { - "esbuild": "~0.17.6", - "source-map-support": "^0.5.21" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "node_modules/@esbuild-kit/esm-loader": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.5.5.tgz", - "integrity": "sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==", - "dev": true, - "dependencies": { - "@esbuild-kit/core-utils": "^3.0.0", - "get-tsconfig": "^4.4.0" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", - "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", - "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", - "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", - "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", - "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", - "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", - "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", - "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", - "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", - "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", - "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", - "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", - "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", - "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", - "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", - "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", - "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", - "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", - "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", - "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", - "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", - "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", - "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==" - }, - "node_modules/@floating-ui/dom": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.3.tgz", - "integrity": "sha512-nB/68NyaQlcdY22L+Fgd1HERQ7UGv7XFN+tPxwrEfQL4nKtAP/jIZnZtpUlXbtV+VEGHh6W/63Gy2C5biWI3sA==", - "dependencies": { - "@floating-ui/core": "^1.3.1" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@napi-rs/simple-git": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.9.tgz", - "integrity": "sha512-qKzDS0+VjMvVyU28px+C6zlD1HKy83NIdYzfMQWa/g/V1iG/Ic8uwrS2ihHfm7mp7X0PPrmINLiTTi6ieUIKfw==", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@napi-rs/simple-git-android-arm-eabi": "0.1.9", - "@napi-rs/simple-git-android-arm64": "0.1.9", - "@napi-rs/simple-git-darwin-arm64": "0.1.9", - "@napi-rs/simple-git-darwin-x64": "0.1.9", - "@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.9", - "@napi-rs/simple-git-linux-arm64-gnu": "0.1.9", - "@napi-rs/simple-git-linux-arm64-musl": "0.1.9", - "@napi-rs/simple-git-linux-x64-gnu": "0.1.9", - "@napi-rs/simple-git-linux-x64-musl": "0.1.9", - "@napi-rs/simple-git-win32-arm64-msvc": "0.1.9", - "@napi-rs/simple-git-win32-x64-msvc": "0.1.9" - } - }, - "node_modules/@napi-rs/simple-git-android-arm-eabi": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm-eabi/-/simple-git-android-arm-eabi-0.1.9.tgz", - "integrity": "sha512-9D4JnfePMpgL4pg9aMUX7/TIWEUQ+Tgx8n3Pf8TNCMGjUbImJyYsDSLJzbcv9wH7srgn4GRjSizXFJHAPjzEug==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/simple-git-android-arm64": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-android-arm64/-/simple-git-android-arm64-0.1.9.tgz", - "integrity": "sha512-Krilsw0gPrrASZzudNEl9pdLuNbhoTK0j7pUbfB8FRifpPdFB/zouwuEm0aSnsDXN4ftGrmGG82kuiR/2MeoPg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/simple-git-darwin-arm64": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-arm64/-/simple-git-darwin-arm64-0.1.9.tgz", - "integrity": "sha512-H/F09nDgYjv4gcFrZBgdTKkZEepqt0KLYcCJuUADuxkKupmjLdecMhypXLk13AzvLW4UQI7NlLTLDXUFLyr2BA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/simple-git-darwin-x64": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-darwin-x64/-/simple-git-darwin-x64-0.1.9.tgz", - "integrity": "sha512-jBR2xS9nVPqmHv0TWz874W0m/d453MGrMeLjB+boK5IPPLhg3AWIZj0aN9jy2Je1BGVAa0w3INIQJtBBeB6kFA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/simple-git-linux-arm-gnueabihf": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm-gnueabihf/-/simple-git-linux-arm-gnueabihf-0.1.9.tgz", - "integrity": "sha512-3n0+VpO4YfZxndZ0sCvsHIvsazd+JmbSjrlTRBCnJeAU1/sfos3skNZtKGZksZhjvd+3o+/GFM8L7Xnv01yggA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/simple-git-linux-arm64-gnu": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-gnu/-/simple-git-linux-arm64-gnu-0.1.9.tgz", - "integrity": "sha512-lIzf0KHU2SKC12vMrWwCtysG2Sdt31VHRPMUiz9lD9t3xwVn8qhFSTn5yDkTeG3rgX6o0p5EKalfQN5BXsJq2w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/simple-git-linux-arm64-musl": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-arm64-musl/-/simple-git-linux-arm64-musl-0.1.9.tgz", - "integrity": "sha512-KQozUoNXrxrB8k741ncWXSiMbjl1AGBGfZV21PANzUM8wH4Yem2bg3kfglYS/QIx3udspsT35I9abu49n7D1/w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/simple-git-linux-x64-gnu": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-gnu/-/simple-git-linux-x64-gnu-0.1.9.tgz", - "integrity": "sha512-O/Niui5mnHPcK3iYC3ui8wgERtJWsQ3Y74W/09t0bL/3dgzGMl4oQt0qTj9dWCsnoGsIEYHPzwCBp/2vqYp/pw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/simple-git-linux-x64-musl": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-linux-x64-musl/-/simple-git-linux-x64-musl-0.1.9.tgz", - "integrity": "sha512-L9n+e8Wn3hKr3RsIdY8GaB+ry4xZ4BaGwyKExgoB8nDGQuRUY9oP6p0WA4hWfJvJnU1H6hvo36a5UFPReyBO7A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/simple-git-win32-arm64-msvc": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-arm64-msvc/-/simple-git-win32-arm64-msvc-0.1.9.tgz", - "integrity": "sha512-Z6Ja/SZK+lMvRWaxj7wjnvSbAsGrH006sqZo8P8nxKUdZfkVvoCaAWr1r0cfkk2Z3aijLLtD+vKeXGlUPH6gGQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@napi-rs/simple-git-win32-x64-msvc": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@napi-rs/simple-git-win32-x64-msvc/-/simple-git-win32-x64-msvc-0.1.9.tgz", - "integrity": "sha512-VAZj1UvC+R2MjKOD3I/Y7dmQlHWAYy4omhReQJRpbCf+oGCBi9CWiIduGqeYEq723nLIKdxP7XjaO0wl1NnUww==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/cli-spinner": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@types/cli-spinner/-/cli-spinner-0.2.1.tgz", - "integrity": "sha512-bsdlZy3LThi9QbsK0GXm5s/e3F6HAJi1tMsIanm9trtoStSlV3gzir9JpfOK40gERMNIVevDTpG5NzSGnYs3QA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/d3": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", - "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", - "dev": true, - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", - "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==", - "dev": true - }, - "node_modules/@types/d3-axis": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", - "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", - "dev": true, - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", - "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", - "dev": true, - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", - "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", - "dev": true - }, - "node_modules/@types/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", - "dev": true - }, - "node_modules/@types/d3-contour": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", - "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", - "dev": true, - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", - "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", - "dev": true - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", - "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", - "dev": true - }, - "node_modules/@types/d3-drag": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", - "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", - "dev": true, - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", - "dev": true - }, - "node_modules/@types/d3-ease": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", - "dev": true - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", - "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", - "dev": true, - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", - "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", - "dev": true - }, - "node_modules/@types/d3-format": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", - "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", - "dev": true - }, - "node_modules/@types/d3-geo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", - "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", - "dev": true, - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", - "dev": true - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", - "dev": true, - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", - "dev": true - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", - "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", - "dev": true - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", - "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", - "dev": true - }, - "node_modules/@types/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", - "dev": true - }, - "node_modules/@types/d3-scale": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", - "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", - "dev": true, - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", - "dev": true - }, - "node_modules/@types/d3-selection": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", - "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", - "dev": true - }, - "node_modules/@types/d3-shape": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", - "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", - "dev": true, - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", - "dev": true - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", - "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", - "dev": true - }, - "node_modules/@types/d3-timer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", - "dev": true - }, - "node_modules/@types/d3-transition": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", - "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", - "dev": true, - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.3.tgz", - "integrity": "sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==", - "dev": true, - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/flexsearch": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@types/flexsearch/-/flexsearch-0.7.3.tgz", - "integrity": "sha512-HXwADeHEP4exXkCIwy2n1+i0f1ilP1ETQOH5KDOugjkTFZPntWo0Gr8stZOaebkxsdx+k0X/K6obU/+it07ocg==", - "dev": true - }, - "node_modules/@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", - "dev": true - }, - "node_modules/@types/hast": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz", - "integrity": "sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg==", - "dependencies": { - "@types/unist": "^2" - } - }, - "node_modules/@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==", - "dev": true - }, - "node_modules/@types/katex": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.14.0.tgz", - "integrity": "sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==" - }, - "node_modules/@types/mathjax": { - "version": "0.0.37", - "resolved": "https://registry.npmjs.org/@types/mathjax/-/mathjax-0.0.37.tgz", - "integrity": "sha512-y0WSZBtBNQwcYipTU/BhgeFu1EZNlFvUNCmkMXV9kBQZq7/o5z82dNVyH3yy2Xv5zzeNeQoHSL4Xm06+EQiH+g==" - }, - "node_modules/@types/mdast": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz", - "integrity": "sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, - "node_modules/@types/nlcst": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-1.0.0.tgz", - "integrity": "sha512-3TGCfOcy8R8mMQ4CNSNOe3PG66HttvjcLzCoOpvXvDtfWOTi+uT/rxeOKm/qEwbM4SNe1O/PjdiBK2YcTjU4OQ==", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/node": { - "version": "20.3.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.3.tgz", - "integrity": "sha512-wheIYdr4NYML61AjC8MKj/2jrR/kDQri/CIpVoZwldwhnIrD/j9jIU5bJ8yBKuB2VhpFV7Ab6G2XkBjv9r9Zzw==", - "dev": true - }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" - }, - "node_modules/@types/pretty-time": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/pretty-time/-/pretty-time-1.1.2.tgz", - "integrity": "sha512-4i+Y+O5H80Rh01lY/3Z0hB/UWc4R64ReE83joEpVsIG3iQWpYx66k6pQh1amJNZquKtJQyu/RcfkTtvL0KwssA==", - "dev": true - }, - "node_modules/@types/source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-b2nJ9YyXmkhGaa2b8VLM0kJ04xxwNyijcq12/kDoomCt43qbHBeK2SLNJ9iJmETaAj+bKUT05PQUu3Q66GvLhQ==", - "dev": true, - "dependencies": { - "source-map": "^0.6.0" - } - }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "node_modules/@types/workerpool": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@types/workerpool/-/workerpool-6.4.0.tgz", - "integrity": "sha512-SIF2/169pDsLKeM8GQGHkOFifGalDbZgiBSaLUnnlVSRsAOenkAvQ6h4uhV2W+PZZczS+8LQxACwNkSykdT91A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", - "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==" - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/array-iterate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", - "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/async-mutex": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.0.tgz", - "integrity": "sha512-eJFZ1YhRR8UN8eBLoNzcDPcy/jqjsg6I1AP+KvWQX80BqOSW1oJPJXDylPUEeMr2ZQvHgnQ//Lp6f3RQ1zI7HA==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cli-spinner": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/cli-spinner/-/cli-spinner-0.2.10.tgz", - "integrity": "sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/d3": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", - "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "dependencies": { - "robust-predicates": "^3.0.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/esbuild": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", - "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.2", - "@esbuild/android-arm64": "0.19.2", - "@esbuild/android-x64": "0.19.2", - "@esbuild/darwin-arm64": "0.19.2", - "@esbuild/darwin-x64": "0.19.2", - "@esbuild/freebsd-arm64": "0.19.2", - "@esbuild/freebsd-x64": "0.19.2", - "@esbuild/linux-arm": "0.19.2", - "@esbuild/linux-arm64": "0.19.2", - "@esbuild/linux-ia32": "0.19.2", - "@esbuild/linux-loong64": "0.19.2", - "@esbuild/linux-mips64el": "0.19.2", - "@esbuild/linux-ppc64": "0.19.2", - "@esbuild/linux-riscv64": "0.19.2", - "@esbuild/linux-s390x": "0.19.2", - "@esbuild/linux-x64": "0.19.2", - "@esbuild/netbsd-x64": "0.19.2", - "@esbuild/openbsd-x64": "0.19.2", - "@esbuild/sunos-x64": "0.19.2", - "@esbuild/win32-arm64": "0.19.2", - "@esbuild/win32-ia32": "0.19.2", - "@esbuild/win32-x64": "0.19.2" - } - }, - "node_modules/esbuild-sass-plugin": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/esbuild-sass-plugin/-/esbuild-sass-plugin-2.12.0.tgz", - "integrity": "sha512-+k/5WM/Yf/Ur7ahn6XXxEPwa/lmuacLO7vrCIAJuvQapX1CiIHtlX/nc2eiMoJ6P6RvqZhKpQvIiwgYJonzHtw==", - "dependencies": { - "resolve": "^1.22.2", - "sass": "^1.65.1" - }, - "peerDependencies": { - "esbuild": "^0.19.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", - "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flexsearch": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.21.tgz", - "integrity": "sha512-W7cHV7Hrwjid6lWmy0IhsWDFQboWSng25U3VVywpHOTJnnAZNPScog67G+cVpeX9f7yDD21ih0WDrMMT+JoaYg==" - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-tsconfig": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.2.tgz", - "integrity": "sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/github-slugger": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" - }, - "node_modules/glob": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.1.tgz", - "integrity": "sha512-9BKYcEeIs7QwlCYs+Y3GBvqAMISufUS0i2ELd11zpZjxI5V9iyRj0HgzB5/cLf2NY4vcYBTYzJ7GIui7j/4DOw==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.10.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.1.tgz", - "integrity": "sha512-DPCBxctI7dN4EeIqjW2KGqgdcUMbrhJ9AzON+PlxCtvppWhubTLD4+a0GFxiym14ZvacUydTPjLPc2DlKz7EIg==", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hash-obj": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hash-obj/-/hash-obj-4.0.0.tgz", - "integrity": "sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg==", - "dependencies": { - "is-obj": "^3.0.0", - "sort-keys": "^5.0.0", - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hast-util-from-dom": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz", - "integrity": "sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==", - "dependencies": { - "hastscript": "^7.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-1.0.2.tgz", - "integrity": "sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-parse5": "^7.0.0", - "parse5": "^7.0.0", - "vfile": "^5.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-html-isomorphic": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-1.0.0.tgz", - "integrity": "sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-from-dom": "^4.0.0", - "hast-util-from-html": "^1.0.0", - "unist-util-remove-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-from-parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", - "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hastscript": "^7.0.0", - "property-information": "^6.0.0", - "vfile": "^5.0.0", - "vfile-location": "^4.0.0", - "web-namespaces": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-has-property": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-2.0.1.tgz", - "integrity": "sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-heading-rank": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-2.1.1.tgz", - "integrity": "sha512-iAuRp+ESgJoRFJbSyaqsfvJDY6zzmFoEnL1gtz1+U8gKtGGj1p0CVlysuUAUjq95qlZESHINLThwJzNGmgGZxA==", - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-is-element": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz", - "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-parse-selector": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", - "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", - "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/parse5": "^6.0.0", - "hast-util-from-parse5": "^7.0.0", - "hast-util-to-parse5": "^7.0.0", - "html-void-elements": "^2.0.0", - "parse5": "^6.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0", - "vfile": "^5.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-raw/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/hast-util-to-html": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", - "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-raw": "^7.0.0", - "hast-util-whitespace": "^2.0.0", - "html-void-elements": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-1.2.0.tgz", - "integrity": "sha512-Y4FB8Dx2k6zJZrwbexkVm6YVRA8Sho2tTwacjDSr/x5c0wioOpc1VIoLyGUSb8+8xkAnQPAtHbdMvzA6bl0F1w==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-object": "^0.4.1", - "unist-util-position": "^4.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", - "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-2.0.0.tgz", - "integrity": "sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==", - "dependencies": { - "@types/hast": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-text": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz", - "integrity": "sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/unist": "^2.0.0", - "hast-util-is-element": "^2.0.0", - "unist-util-find-after": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", - "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", - "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", - "dependencies": { - "@types/hast": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^3.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", - "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.3.tgz", - "integrity": "sha512-808ZFYMsIRAjLAu5xkKo0TsbY9LBy9H5MazTKIEHerNkg0ymgilGfBPMR/3G7d/ihGmuK2Hw8S1izY2d3kd3wA==" - }, - "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/is-absolute-url": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", - "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-3.0.0.tgz", - "integrity": "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/jackspeak": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", - "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" - }, - "node_modules/katex": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-ftuDnJbcbOckGY11OO+zg3OofESlbR5DRl2cmN8HeWeeFIV7wTXvAOx8kEjZjobhA+9wh2fbKeO6cdcA9Mnovg==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/lightningcss": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.21.7.tgz", - "integrity": "sha512-xITZyh5sLFwRPYUSw15T00Rm7gcQ1qOPuQwNOcvHsTm6nLWTQ723w7zl42wrC5t+xtdg6FPmnXHml1nZxxvp1w==", - "dependencies": { - "detect-libc": "^1.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.21.7", - "lightningcss-darwin-x64": "1.21.7", - "lightningcss-freebsd-x64": "1.21.7", - "lightningcss-linux-arm-gnueabihf": "1.21.7", - "lightningcss-linux-arm64-gnu": "1.21.7", - "lightningcss-linux-arm64-musl": "1.21.7", - "lightningcss-linux-x64-gnu": "1.21.7", - "lightningcss-linux-x64-musl": "1.21.7", - "lightningcss-win32-x64-msvc": "1.21.7" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.21.7.tgz", - "integrity": "sha512-tt7hIsFio9jZofTVHtCACz6rB6c9RyABMXfA9A/VcKOjS3sq+koX/QkRJWY06utwOImbJIXBC5hbg9t3RkPUAQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.21.7.tgz", - "integrity": "sha512-F4gS4bf7eWekfPT+TxJNm/pF+QRgZiTrTkQH6cw4/UWfdeZISfuhD5El2dm16giFnY0K5ylIwO+ZusgYNkGSXA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.21.7.tgz", - "integrity": "sha512-RMfNzJWXCSfPnL55fcLWEAadcY6QUFT0S8NceNKYzp1KiCZtkJIy6RQ5SaVxPzRqd3iMsahUf5sfnG8N1UQSNQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.21.7.tgz", - "integrity": "sha512-biSRUDZNx7vubWP1jArw/qqfZKPGpkV/qzunasZzxmqijbZ43sW9faDQYxWNcxPWljJJdF/qs6qcurYFovWtrQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.21.7.tgz", - "integrity": "sha512-PENY8QekqL9TG3AY/A7rkUBb5ymefGxea7Oe7+x7Hbw4Bz4Hpj5cec5OoMypMqFbURPmpi0fTWx4vSWUPzpDcA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.21.7.tgz", - "integrity": "sha512-pfOipKvA/0X1OjRaZt3870vnV9UGBSjayIqHh0fGx/+aRz3O0MVFHE/60P2UWXpM3YGJEw/hMWtNkrFwqOge8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.21.7.tgz", - "integrity": "sha512-dgcsis4TAA7s0ia4f31QHX+G4PWPwxk+wJaEQLaV0NdJs09O5hHoA8DpLEr8nrvc/tsRTyVNBP1rDtgzySjpXg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.21.7.tgz", - "integrity": "sha512-A+9dXpxld3p4Cd6fxev2eqEvaauYtrgNpXV3t7ioCJy30Oj9nYiNGwiGusM+4MJVcEpUPGUGiuAqY4sWilRDwA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.21.7.tgz", - "integrity": "sha512-07/8vogEq+C/mF99pdMhh/f19/xreq8N9Ca6AWeVHZIdODyF/pt6KdKSCWDZWIn+3CUxI8gCJWuUWyOc3xymvw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/lru-cache": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", - "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/mathjax-full": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", - "integrity": "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==", - "dependencies": { - "esm": "^3.2.25", - "mhchemparser": "^4.1.0", - "mj-context-menu": "^0.6.1", - "speech-rule-engine": "^4.0.6" - } - }, - "node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", - "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", - "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-1.0.1.tgz", - "integrity": "sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-extension-frontmatter": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", - "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", - "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", - "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", - "dependencies": { - "@types/mdast": "^3.0.0", - "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", - "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", - "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", - "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", - "dependencies": { - "@types/mdast": "^3.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", - "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-math": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz", - "integrity": "sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==", - "dependencies": { - "@types/mdast": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-newline-to-break": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-newline-to-break/-/mdast-util-newline-to-break-1.0.0.tgz", - "integrity": "sha512-491LcYv3gbGhhCrLoeALncQmega2xPh+m3gbsIhVsOX4sw85+ShLFPvPyibxc1Swx/6GtzxgVodq+cGa/47ULg==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-find-and-replace": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", - "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", - "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/mhchemparser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz", - "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==" - }, - "node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-extension-frontmatter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-1.1.1.tgz", - "integrity": "sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==", - "dependencies": { - "fault": "^2.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", - "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", - "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", - "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", - "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", - "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", - "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", - "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", - "dependencies": { - "micromark-util-types": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", - "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz", - "integrity": "sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==", - "dependencies": { - "@types/katex": "^0.16.0", - "katex": "^0.16.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math/node_modules/@types/katex": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.0.tgz", - "integrity": "sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw==" - }, - "node_modules/micromark-factory-destination": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", - "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", - "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", - "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", - "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", - "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", - "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", - "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", - "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", - "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", - "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", - "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", - "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", - "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", - "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", - "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", - "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", - "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", - "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", - "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromorph": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/micromorph/-/micromorph-0.4.5.tgz", - "integrity": "sha512-Erasr0xiDvDeEhh7B/k7RFTwwfaAX10D7BMorNpokkwDh6XsRLYWDPaWF1m5JQeMSkGdqlEtQ8s68NcdDWuGgw==" - }, - "node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.2.tgz", - "integrity": "sha512-PZOT9g5v2ojiTL7r1xF6plNHLtOeTpSlDI007As2NlA2aYBMfVom17yqa6QzhmDP8QOhn7LjHTg7DFCVSSa6yg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mj-context-menu": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", - "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==" - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/nlcst-to-string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz", - "integrity": "sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==", - "dependencies": { - "@types/nlcst": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" - }, - "node_modules/parse-latin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-5.0.1.tgz", - "integrity": "sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==", - "dependencies": { - "nlcst-to-string": "^3.0.0", - "unist-util-modify-children": "^3.0.0", - "unist-util-visit-children": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-numeric-range": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", - "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.0.tgz", - "integrity": "sha512-tZFEaRQbMLjwrsmidsGJ6wDMv0iazJWk6SfIKnY4Xru8auXgmJkOBa5DUbYFcFD2Rzk2+KDlIiF0GVXNCbgC7g==", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/plausible-tracker": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/plausible-tracker/-/plausible-tracker-0.3.8.tgz", - "integrity": "sha512-lmOWYQ7s9KOUJ1R+YTOR3HrjdbxIS2Z4de0P/Jx2dQPteznJl2eX3tXxKClpvbfyGP59B5bbhW8ftN59HbbFSg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/preact": { - "version": "10.15.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", - "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/preact-render-to-string": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.1.0.tgz", - "integrity": "sha512-/AsKU4Q4R8r4aKwwNQrkQQNUVEDmTeZr6IwesDffobFRPcTk4dSQrfo1VOcXjtlcUss6QYEe7JShUGbQIhaw+A==", - "dependencies": { - "pretty-format": "^3.8.0" - }, - "peerDependencies": { - "preact": ">=10" - } - }, - "node_modules/prettier": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", - "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-bytes": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.0.tgz", - "integrity": "sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ==", - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", - "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" - }, - "node_modules/pretty-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", - "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/property-information": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.2.0.tgz", - "integrity": "sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reading-time": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", - "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" - }, - "node_modules/rehype-autolink-headings": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rehype-autolink-headings/-/rehype-autolink-headings-6.1.1.tgz", - "integrity": "sha512-NMYzZIsHM3sA14nC5rAFuUPIOfg+DFmf9EY1YMhaNlB7+3kK/ZlE6kqPfuxr1tsJ1XWkTrMtMoyHosU70d35mA==", - "dependencies": { - "@types/hast": "^2.0.0", - "extend": "^3.0.0", - "hast-util-has-property": "^2.0.0", - "hast-util-heading-rank": "^2.0.0", - "hast-util-is-element": "^2.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-katex": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-6.0.3.tgz", - "integrity": "sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/katex": "^0.14.0", - "hast-util-from-html-isomorphic": "^1.0.0", - "hast-util-to-text": "^3.1.0", - "katex": "^0.16.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-mathjax": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/rehype-mathjax/-/rehype-mathjax-4.0.3.tgz", - "integrity": "sha512-QIwWH9U+r54nMQklVkT1qluxhKyzdPWz9dFwgel3BrseQsWZafRTDTUj8VR8/14nFuRIV2ChuCMz4zpACPoYvg==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mathjax": "^0.0.37", - "hast-util-from-dom": "^4.0.0", - "hast-util-to-text": "^3.1.0", - "jsdom": "^20.0.0", - "mathjax-full": "^3.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-pretty-code": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/rehype-pretty-code/-/rehype-pretty-code-0.10.0.tgz", - "integrity": "sha512-qCD071Y+vUxEy9yyrATPk2+W9q7qCbzZgtc9suZhu75bmRQvOlBhJt4d3WvqSMTamkKoFkvqtCjyAk+ggH+aXQ==", - "dependencies": { - "@types/hast": "^2.0.0", - "hash-obj": "^4.0.0", - "parse-numeric-range": "^1.3.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "shiki": "0.x" - } - }, - "node_modules/rehype-raw": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-6.1.1.tgz", - "integrity": "sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==", - "dependencies": { - "@types/hast": "^2.0.0", - "hast-util-raw": "^7.2.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-slug": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-5.1.0.tgz", - "integrity": "sha512-Gf91dJoXneiorNEnn+Phx97CO7oRMrpi+6r155tTxzGuLtm+QrI4cTwCa9e1rtePdL4i9tSO58PeSS6HWfgsiw==", - "dependencies": { - "@types/hast": "^2.0.0", - "github-slugger": "^2.0.0", - "hast-util-has-property": "^2.0.0", - "hast-util-heading-rank": "^2.0.0", - "hast-util-to-string": "^2.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.3.tgz", - "integrity": "sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==", - "dependencies": { - "@types/mdast": "^3.0.0", - "remark-parse": "^10.0.0", - "remark-stringify": "^10.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-breaks": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/remark-breaks/-/remark-breaks-3.0.3.tgz", - "integrity": "sha512-C7VkvcUp1TPUc2eAYzsPdaUh8Xj4FSbQnYA5A9f80diApLZscTDeG7efiWP65W8hV2sEy3JuGVU0i6qr5D8Hug==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-newline-to-break": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-frontmatter": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-4.0.1.tgz", - "integrity": "sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-frontmatter": "^1.0.0", - "micromark-extension-frontmatter": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", - "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-math": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-5.1.1.tgz", - "integrity": "sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-math": "^2.0.0", - "micromark-extension-math": "^2.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", - "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz", - "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==", - "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-to-hast": "^12.1.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-smartypants": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-2.0.0.tgz", - "integrity": "sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==", - "dependencies": { - "retext": "^8.1.0", - "retext-smartypants": "^5.1.0", - "unist-util-visit": "^4.1.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/remark-stringify": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz", - "integrity": "sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/retext": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/retext/-/retext-8.1.0.tgz", - "integrity": "sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==", - "dependencies": { - "@types/nlcst": "^1.0.0", - "retext-latin": "^3.0.0", - "retext-stringify": "^3.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-latin": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-3.1.0.tgz", - "integrity": "sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==", - "dependencies": { - "@types/nlcst": "^1.0.0", - "parse-latin": "^5.0.0", - "unherit": "^3.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-smartypants": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-5.2.0.tgz", - "integrity": "sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==", - "dependencies": { - "@types/nlcst": "^1.0.0", - "nlcst-to-string": "^3.0.0", - "unified": "^10.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/retext-stringify": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-3.1.0.tgz", - "integrity": "sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==", - "dependencies": { - "@types/nlcst": "^1.0.0", - "nlcst-to-string": "^3.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", - "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", - "dependencies": { - "glob": "^10.2.5" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sass": { - "version": "1.66.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz", - "integrity": "sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==", - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/serve-handler/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shiki": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.4.tgz", - "integrity": "sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==", - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sort-keys": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-5.0.0.tgz", - "integrity": "sha512-Pdz01AvCAottHTPQGzndktFNdbRA75BgOfeT1hH+AMnJFv8lynkPi42rfeEhpx1saTEI3YNMWxfqu0sFD1G8pw==", - "dependencies": { - "is-plain-obj": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/speech-rule-engine": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz", - "integrity": "sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==", - "dependencies": { - "commander": "9.2.0", - "wicked-good-xpath": "1.3.0", - "xmldom-sre": "0.1.31" - }, - "bin": { - "sre": "bin/sre" - } - }, - "node_modules/speech-rule-engine/node_modules/commander": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", - "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/stringify-entities": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz", - "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/style-to-object": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.1.tgz", - "integrity": "sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw==", - "dependencies": { - "inline-style-parser": "0.1.1" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-vfile": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-7.2.4.tgz", - "integrity": "sha512-2eQ+rJ2qGbyw3senPI0qjuM7aut8IYXK6AEoOWb+fJx/mQYzviTckm1wDjq91QYHAPBTYzmdJXxMFA6Mk14mdw==", - "dependencies": { - "is-buffer": "^2.0.0", - "vfile": "^5.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/toml": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", - "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tr46/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tsx": { - "version": "3.12.7", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-3.12.7.tgz", - "integrity": "sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==", - "dev": true, - "dependencies": { - "@esbuild-kit/cjs-loader": "^2.4.2", - "@esbuild-kit/core-utils": "^3.0.0", - "@esbuild-kit/esm-loader": "^2.5.5" - }, - "bin": { - "tsx": "dist/cli.js" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unherit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz", - "integrity": "sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-find-after": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz", - "integrity": "sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-modify-children": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-3.1.1.tgz", - "integrity": "sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==", - "dependencies": { - "@types/unist": "^2.0.0", - "array-iterate": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-remove-position": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz", - "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", - "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-children": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-2.0.2.tgz", - "integrity": "sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vfile": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", - "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", - "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", - "dependencies": { - "@types/unist": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", - "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==" - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==" - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wicked-good-xpath": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", - "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==" - }, - "node_modules/workerpool": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.4.0.tgz", - "integrity": "sha512-i3KR1mQMNwY2wx20ozq2EjISGtQWDIfV56We+yGJ5yDs8jTwQiLLaqHlkBHITlCuJnYlVRmXegxFxZg7gqI++A==" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/xmldom-sre": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", - "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==", - "engines": { - "node": ">=0.1" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 2c4edfb..0000000 --- a/package.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "name": "@jackyzha0/quartz", - "description": "šŸŒ± publish your digital garden and notes as a website", - "private": true, - "version": "4.0.11", - "type": "module", - "author": "jackyzha0 ", - "license": "MIT", - "homepage": "https://quartz.jzhao.xyz", - "repository": { - "type": "git", - "url": "https://github.com/jackyzha0/quartz.git" - }, - "scripts": { - "docs": "npx quartz build --serve -d docs", - "check": "tsc --noEmit && npx prettier . --check", - "format": "npx prettier . --write", - "test": "tsx ./quartz/util/path.test.ts", - "profile": "0x -D prof ./quartz/bootstrap-cli.mjs build --concurrency=1" - }, - "engines": { - "node": ">=18.14" - }, - "keywords": [ - "site generator", - "ssg", - "digital-garden", - "markdown", - "blog", - "quartz" - ], - "bin": { - "quartz": "./quartz/bootstrap-cli.mjs" - }, - "dependencies": { - "@clack/prompts": "^0.6.3", - "@floating-ui/dom": "^1.4.0", - "@napi-rs/simple-git": "0.1.9", - "async-mutex": "^0.4.0", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cli-spinner": "^0.2.10", - "d3": "^7.8.5", - "esbuild-sass-plugin": "^2.12.0", - "flexsearch": "0.7.21", - "github-slugger": "^2.0.0", - "globby": "^13.1.4", - "gray-matter": "^4.0.3", - "hast-util-to-html": "^8.0.4", - "hast-util-to-jsx-runtime": "^1.2.0", - "hast-util-to-string": "^2.0.0", - "is-absolute-url": "^4.0.1", - "js-yaml": "^4.1.0", - "lightningcss": "1.21.7", - "mdast-util-find-and-replace": "^2.2.2", - "mdast-util-to-hast": "^12.3.0", - "mdast-util-to-string": "^3.2.0", - "micromorph": "^0.4.5", - "plausible-tracker": "^0.3.8", - "preact": "^10.14.1", - "preact-render-to-string": "^6.0.3", - "pretty-bytes": "^6.1.0", - "pretty-time": "^1.1.0", - "reading-time": "^1.5.0", - "rehype-autolink-headings": "^6.1.1", - "rehype-katex": "^6.0.3", - "rehype-mathjax": "^4.0.3", - "rehype-pretty-code": "^0.10.0", - "rehype-raw": "^6.1.1", - "rehype-slug": "^5.1.0", - "remark": "^14.0.2", - "remark-breaks": "^3.0.3", - "remark-frontmatter": "^4.0.1", - "remark-gfm": "^3.0.1", - "remark-math": "^5.1.1", - "remark-parse": "^10.0.1", - "remark-rehype": "^10.1.0", - "remark-smartypants": "^2.0.0", - "rimraf": "^5.0.1", - "serve-handler": "^6.1.5", - "shiki": "^0.14.4", - "source-map-support": "^0.5.21", - "to-vfile": "^7.2.4", - "toml": "^3.0.0", - "unified": "^10.1.2", - "unist-util-visit": "^4.1.2", - "vfile": "^5.3.7", - "workerpool": "^6.4.0", - "ws": "^8.13.0", - "yargs": "^17.7.2" - }, - "devDependencies": { - "@types/cli-spinner": "^0.2.1", - "@types/d3": "^7.4.0", - "@types/flexsearch": "^0.7.3", - "@types/hast": "^2.3.4", - "@types/js-yaml": "^4.0.5", - "@types/node": "^20.1.2", - "@types/pretty-time": "^1.1.2", - "@types/source-map-support": "^0.5.6", - "@types/workerpool": "^6.4.0", - "@types/ws": "^8.5.5", - "@types/yargs": "^17.0.24", - "esbuild": "0.19.2", - "prettier": "^3.0.0", - "tsx": "^3.12.7", - "typescript": "^5.0.4" - } -} diff --git a/quartz.config.ts b/quartz.config.ts deleted file mode 100644 index 5d8a1f9..0000000 --- a/quartz.config.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { QuartzConfig } from "./quartz/cfg" -import * as Plugin from "./quartz/plugins" - -const config: QuartzConfig = { - configuration: { - pageTitle: "šŸŖ“ Quartz 4.0", - enableSPA: true, - enablePopovers: true, - analytics: { - provider: "plausible", - }, - baseUrl: "notes.flup.dev", - ignorePatterns: ["private", "templates", ".obsidian"], - defaultDateType: "created", - theme: { - typography: { - header: "Schibsted Grotesk", - body: "Source Sans Pro", - code: "IBM Plex Mono", - }, - colors: { - lightMode: { - light: "#faf8f8", - lightgray: "#e5e5e5", - gray: "#b8b8b8", - darkgray: "#4e4e4e", - dark: "#2b2b2b", - secondary: "#284b63", - tertiary: "#84a59d", - highlight: "rgba(143, 159, 169, 0.15)", - }, - darkMode: { - light: "#161618", - lightgray: "#393639", - gray: "#646464", - darkgray: "#d4d4d4", - dark: "#ebebec", - secondary: "#7b97aa", - tertiary: "#84a59d", - highlight: "rgba(143, 159, 169, 0.15)", - }, - }, - }, - }, - plugins: { - transformers: [ - Plugin.FrontMatter(), - Plugin.TableOfContents(), - Plugin.CreatedModifiedDate({ - priority: ["frontmatter", "filesystem"], // you can add 'git' here for last modified from Git but this makes the build slower - }), - Plugin.SyntaxHighlighting(), - Plugin.ObsidianFlavoredMarkdown({ enableInHtmlEmbed: false }), - Plugin.GitHubFlavoredMarkdown(), - Plugin.CrawlLinks({ markdownLinkResolution: "shortest" }), - Plugin.Latex({ renderEngine: "katex" }), - Plugin.Description(), - ], - filters: [Plugin.RemoveDrafts()], - emitters: [ - Plugin.AliasRedirects(), - Plugin.ComponentResources({ fontOrigin: "googleFonts" }), - Plugin.ContentPage(), - Plugin.FolderPage(), - Plugin.TagPage(), - Plugin.ContentIndex({ - enableSiteMap: true, - enableRSS: true, - }), - Plugin.Assets(), - Plugin.Static(), - Plugin.NotFoundPage(), - ], - }, -} - -export default config diff --git a/quartz.layout.ts b/quartz.layout.ts deleted file mode 100644 index 8c1c6c1..0000000 --- a/quartz.layout.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { PageLayout, SharedLayout } from "./quartz/cfg" -import * as Component from "./quartz/components" - -// components shared across all pages -export const sharedPageComponents: SharedLayout = { - head: Component.Head(), - header: [], - footer: Component.Footer({ - links: { - GitHub: "https://github.com/jackyzha0/quartz", - "Discord Community": "https://discord.gg/cRFFHYye7t", - }, - }), -} - -// components for pages that display a single page (e.g. a single note) -export const defaultContentPageLayout: PageLayout = { - beforeBody: [Component.ArticleTitle(), Component.ContentMeta(), Component.TagList()], - left: [ - Component.PageTitle(), - Component.MobileOnly(Component.Spacer()), - Component.Search(), - Component.Darkmode(), - Component.DesktopOnly(Component.Explorer()), - ], - right: [ - Component.Graph(), - Component.DesktopOnly(Component.TableOfContents()), - Component.Backlinks(), - ], -} - -// components for pages that display lists of pages (e.g. tags or folders) -export const defaultListPageLayout: PageLayout = { - beforeBody: [Component.ArticleTitle()], - left: [ - Component.PageTitle(), - Component.MobileOnly(Component.Spacer()), - Component.Search(), - Component.Darkmode(), - ], - right: [], -} diff --git a/quartz/bootstrap-cli.mjs b/quartz/bootstrap-cli.mjs deleted file mode 100755 index 35d06af..0000000 --- a/quartz/bootstrap-cli.mjs +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env node -import yargs from "yargs" -import { hideBin } from "yargs/helpers" -import { - handleBuild, - handleCreate, - handleUpdate, - handleRestore, - handleSync, -} from "./cli/handlers.js" -import { CommonArgv, BuildArgv, CreateArgv, SyncArgv } from "./cli/args.js" -import { version } from "./cli/constants.js" - -yargs(hideBin(process.argv)) - .scriptName("quartz") - .version(version) - .usage("$0 [args]") - .command("create", "Initialize Quartz", CreateArgv, async (argv) => { - await handleCreate(argv) - }) - .command("update", "Get the latest Quartz updates", CommonArgv, async (argv) => { - await handleUpdate(argv) - }) - .command( - "restore", - "Try to restore your content folder from the cache", - CommonArgv, - async (argv) => { - await handleRestore(argv) - }, - ) - .command("sync", "Sync your Quartz to and from GitHub.", SyncArgv, async (argv) => { - await handleSync(argv) - }) - .command("build", "Build Quartz into a bundle of static HTML files", BuildArgv, async (argv) => { - await handleBuild(argv) - }) - .showHelpOnFail(false) - .help() - .strict() - .demandCommand().argv diff --git a/quartz/bootstrap-worker.mjs b/quartz/bootstrap-worker.mjs deleted file mode 100644 index b08689c..0000000 --- a/quartz/bootstrap-worker.mjs +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -import workerpool from "workerpool" -const cacheFile = "./.quartz-cache/transpiled-worker.mjs" -const { parseFiles } = await import(cacheFile) -workerpool.worker({ - parseFiles, -}) diff --git a/quartz/build.ts b/quartz/build.ts deleted file mode 100644 index 5752caa..0000000 --- a/quartz/build.ts +++ /dev/null @@ -1,183 +0,0 @@ -import sourceMapSupport from "source-map-support" -sourceMapSupport.install(options) -import path from "path" -import { PerfTimer } from "./util/perf" -import { rimraf } from "rimraf" -import { isGitIgnored } from "globby" -import chalk from "chalk" -import { parseMarkdown } from "./processors/parse" -import { filterContent } from "./processors/filter" -import { emitContent } from "./processors/emit" -import cfg from "../quartz.config" -import { FilePath, joinSegments, slugifyFilePath } from "./util/path" -import chokidar from "chokidar" -import { ProcessedContent } from "./plugins/vfile" -import { Argv, BuildCtx } from "./util/ctx" -import { glob, toPosixPath } from "./util/glob" -import { trace } from "./util/trace" -import { options } from "./util/sourcemap" -import { Mutex } from "async-mutex" - -async function buildQuartz(argv: Argv, mut: Mutex, clientRefresh: () => void) { - const ctx: BuildCtx = { - argv, - cfg, - allSlugs: [], - } - - const perf = new PerfTimer() - const output = argv.output - - const pluginCount = Object.values(cfg.plugins).flat().length - const pluginNames = (key: "transformers" | "filters" | "emitters") => - cfg.plugins[key].map((plugin) => plugin.name) - if (argv.verbose) { - console.log(`Loaded ${pluginCount} plugins`) - console.log(` Transformers: ${pluginNames("transformers").join(", ")}`) - console.log(` Filters: ${pluginNames("filters").join(", ")}`) - console.log(` Emitters: ${pluginNames("emitters").join(", ")}`) - } - - const release = await mut.acquire() - perf.addEvent("clean") - await rimraf(output) - console.log(`Cleaned output directory \`${output}\` in ${perf.timeSince("clean")}`) - - perf.addEvent("glob") - const allFiles = await glob("**/*.*", argv.directory, cfg.configuration.ignorePatterns) - const fps = allFiles.filter((fp) => fp.endsWith(".md")).sort() - console.log( - `Found ${fps.length} input files from \`${argv.directory}\` in ${perf.timeSince("glob")}`, - ) - - const filePaths = fps.map((fp) => joinSegments(argv.directory, fp) as FilePath) - ctx.allSlugs = allFiles.map((fp) => slugifyFilePath(fp as FilePath)) - - const parsedFiles = await parseMarkdown(ctx, filePaths) - const filteredContent = filterContent(ctx, parsedFiles) - await emitContent(ctx, filteredContent) - console.log(chalk.green(`Done processing ${fps.length} files in ${perf.timeSince()}`)) - release() - - if (argv.serve) { - return startServing(ctx, mut, parsedFiles, clientRefresh) - } -} - -// setup watcher for rebuilds -async function startServing( - ctx: BuildCtx, - mut: Mutex, - initialContent: ProcessedContent[], - clientRefresh: () => void, -) { - const { argv } = ctx - - const ignored = await isGitIgnored() - const contentMap = new Map() - for (const content of initialContent) { - const [_tree, vfile] = content - contentMap.set(vfile.data.filePath!, content) - } - - const initialSlugs = ctx.allSlugs - let lastBuildMs = 0 - const toRebuild: Set = new Set() - const toRemove: Set = new Set() - const trackedAssets: Set = new Set() - async function rebuild(fp: string, action: "add" | "change" | "delete") { - // don't do anything for gitignored files - if (ignored(fp)) { - return - } - - // dont bother rebuilding for non-content files, just track and refresh - fp = toPosixPath(fp) - const filePath = joinSegments(argv.directory, fp) as FilePath - if (path.extname(fp) !== ".md") { - if (action === "add" || action === "change") { - trackedAssets.add(filePath) - } else if (action === "delete") { - trackedAssets.delete(filePath) - } - clientRefresh() - return - } - - if (action === "add" || action === "change") { - toRebuild.add(filePath) - } else if (action === "delete") { - toRemove.add(filePath) - } - - // debounce rebuilds every 250ms - - const buildStart = new Date().getTime() - lastBuildMs = buildStart - const release = await mut.acquire() - if (lastBuildMs > buildStart) { - release() - return - } - - const perf = new PerfTimer() - console.log(chalk.yellow("Detected change, rebuilding...")) - try { - const filesToRebuild = [...toRebuild].filter((fp) => !toRemove.has(fp)) - - const trackedSlugs = [...new Set([...contentMap.keys(), ...toRebuild, ...trackedAssets])] - .filter((fp) => !toRemove.has(fp)) - .map((fp) => slugifyFilePath(path.posix.relative(argv.directory, fp) as FilePath)) - - ctx.allSlugs = [...new Set([...initialSlugs, ...trackedSlugs])] - const parsedContent = await parseMarkdown(ctx, filesToRebuild) - for (const content of parsedContent) { - const [_tree, vfile] = content - contentMap.set(vfile.data.filePath!, content) - } - - for (const fp of toRemove) { - contentMap.delete(fp) - } - - const parsedFiles = [...contentMap.values()] - const filteredContent = filterContent(ctx, parsedFiles) - - // TODO: we can probably traverse the link graph to figure out what's safe to delete here - // instead of just deleting everything - await rimraf(argv.output) - await emitContent(ctx, filteredContent) - console.log(chalk.green(`Done rebuilding in ${perf.timeSince()}`)) - } catch { - console.log(chalk.yellow(`Rebuild failed. Waiting on a change to fix the error...`)) - } - - clientRefresh() - toRebuild.clear() - toRemove.clear() - release() - } - - const watcher = chokidar.watch(".", { - persistent: true, - cwd: argv.directory, - ignoreInitial: true, - }) - - watcher - .on("add", (fp) => rebuild(fp, "add")) - .on("change", (fp) => rebuild(fp, "change")) - .on("unlink", (fp) => rebuild(fp, "delete")) - - return async () => { - await watcher.close() - } -} - -export default async (argv: Argv, mut: Mutex, clientRefresh: () => void) => { - try { - return await buildQuartz(argv, mut, clientRefresh) - } catch (err) { - trace("\nExiting Quartz due to a fatal error", err as Error) - } -} diff --git a/quartz/cfg.ts b/quartz/cfg.ts deleted file mode 100644 index 8371b5e..0000000 --- a/quartz/cfg.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { ValidDateType } from "./components/Date" -import { QuartzComponent } from "./components/types" -import { PluginTypes } from "./plugins/types" -import { Theme } from "./util/theme" - -export type Analytics = - | null - | { - provider: "plausible" - } - | { - provider: "google" - tagId: string - } - | { - provider: "umami" - websiteId: string - } - -export interface GlobalConfiguration { - pageTitle: string - /** Whether to enable single-page-app style rendering. this prevents flashes of unstyled content and improves smoothness of Quartz */ - enableSPA: boolean - /** Whether to display Wikipedia-style popovers when hovering over links */ - enablePopovers: boolean - /** Analytics mode */ - analytics: Analytics - /** Glob patterns to not search */ - ignorePatterns: string[] - /** Whether to use created, modified, or published as the default type of date */ - defaultDateType: ValidDateType - /** Base URL to use for CNAME files, sitemaps, and RSS feeds that require an absolute URL. - * Quartz will avoid using this as much as possible and use relative URLs most of the time - */ - baseUrl?: string - theme: Theme -} - -export interface QuartzConfig { - configuration: GlobalConfiguration - plugins: PluginTypes -} - -export interface FullPageLayout { - head: QuartzComponent - header: QuartzComponent[] - beforeBody: QuartzComponent[] - pageBody: QuartzComponent - left: QuartzComponent[] - right: QuartzComponent[] - footer: QuartzComponent -} - -export type PageLayout = Pick -export type SharedLayout = Pick diff --git a/quartz/cli/args.js b/quartz/cli/args.js deleted file mode 100644 index 3543e2e..0000000 --- a/quartz/cli/args.js +++ /dev/null @@ -1,98 +0,0 @@ -export const CommonArgv = { - directory: { - string: true, - alias: ["d"], - default: "content", - describe: "directory to look for content files", - }, - verbose: { - boolean: true, - alias: ["v"], - default: false, - describe: "print out extra logging information", - }, -} - -export const CreateArgv = { - ...CommonArgv, - source: { - string: true, - alias: ["s"], - describe: "source directory to copy/create symlink from", - }, - strategy: { - string: true, - alias: ["X"], - choices: ["new", "copy", "symlink"], - describe: "strategy for content folder setup", - }, - links: { - string: true, - alias: ["l"], - choices: ["absolute", "shortest", "relative"], - describe: "strategy to resolve links", - }, -} - -export const SyncArgv = { - ...CommonArgv, - commit: { - boolean: true, - default: true, - describe: "create a git commit for your unsaved changes", - }, - push: { - boolean: true, - default: true, - describe: "push updates to your Quartz fork", - }, - pull: { - boolean: true, - default: true, - describe: "pull updates from your Quartz fork", - }, -} - -export const BuildArgv = { - ...CommonArgv, - output: { - string: true, - alias: ["o"], - default: "public", - describe: "output folder for files", - }, - serve: { - boolean: true, - default: false, - describe: "run a local server to live-preview your Quartz", - }, - baseDir: { - string: true, - default: "", - describe: "base path to serve your local server on", - }, - port: { - number: true, - default: 8080, - describe: "port to serve Quartz on", - }, - wsPort: { - number: true, - default: 3001, - describe: "port to use for WebSocket-based hot-reload notifications", - }, - remoteDevHost: { - string: true, - default: "", - describe: "A URL override for the websocket connection if you are not developing on localhost", - }, - bundleInfo: { - boolean: true, - default: false, - describe: "show detailed bundle information", - }, - concurrency: { - number: true, - describe: "how many threads to use to parse notes", - }, -} diff --git a/quartz/cli/constants.js b/quartz/cli/constants.js deleted file mode 100644 index f4a9ce5..0000000 --- a/quartz/cli/constants.js +++ /dev/null @@ -1,15 +0,0 @@ -import path from "path" -import { readFileSync } from "fs" - -/** - * All constants relating to helpers or handlers - */ -export const ORIGIN_NAME = "origin" -export const UPSTREAM_NAME = "upstream" -export const QUARTZ_SOURCE_BRANCH = "v4" -export const cwd = process.cwd() -export const cacheDir = path.join(cwd, ".quartz-cache") -export const cacheFile = "./quartz/.quartz-cache/transpiled-build.mjs" -export const fp = "./quartz/build.ts" -export const { version } = JSON.parse(readFileSync("./package.json").toString()) -export const contentCacheFolder = path.join(cacheDir, "content-cache") diff --git a/quartz/cli/handlers.js b/quartz/cli/handlers.js deleted file mode 100644 index bc3da73..0000000 --- a/quartz/cli/handlers.js +++ /dev/null @@ -1,511 +0,0 @@ -import { promises, readFileSync } from "fs" -import path from "path" -import esbuild from "esbuild" -import chalk from "chalk" -import { sassPlugin } from "esbuild-sass-plugin" -import fs from "fs" -import { intro, outro, select, text } from "@clack/prompts" -import { rimraf } from "rimraf" -import chokidar from "chokidar" -import prettyBytes from "pretty-bytes" -import { execSync, spawnSync } from "child_process" -import http from "http" -import serveHandler from "serve-handler" -import { WebSocketServer } from "ws" -import { randomUUID } from "crypto" -import { Mutex } from "async-mutex" -import { CreateArgv } from "./args.js" -import { - exitIfCancel, - escapePath, - gitPull, - popContentFolder, - stashContentFolder, -} from "./helpers.js" -import { - UPSTREAM_NAME, - QUARTZ_SOURCE_BRANCH, - ORIGIN_NAME, - version, - fp, - cacheFile, - cwd, -} from "./constants.js" - -/** - * Handles `npx quartz create` - * @param {*} argv arguments for `create` - */ -export async function handleCreate(argv) { - console.log() - intro(chalk.bgGreen.black(` Quartz v${version} `)) - const contentFolder = path.join(cwd, argv.directory) - let setupStrategy = argv.strategy?.toLowerCase() - let linkResolutionStrategy = argv.links?.toLowerCase() - const sourceDirectory = argv.source - - // If all cmd arguments were provided, check if theyre valid - if (setupStrategy && linkResolutionStrategy) { - // If setup isn't, "new", source argument is required - if (setupStrategy !== "new") { - // Error handling - if (!sourceDirectory) { - outro( - chalk.red( - `Setup strategies (arg '${chalk.yellow( - `-${CreateArgv.strategy.alias[0]}`, - )}') other than '${chalk.yellow( - "new", - )}' require content folder argument ('${chalk.yellow( - `-${CreateArgv.source.alias[0]}`, - )}') to be set`, - ), - ) - process.exit(1) - } else { - if (!fs.existsSync(sourceDirectory)) { - outro( - chalk.red( - `Input directory to copy/symlink 'content' from not found ('${chalk.yellow( - sourceDirectory, - )}', invalid argument "${chalk.yellow(`-${CreateArgv.source.alias[0]}`)})`, - ), - ) - process.exit(1) - } else if (!fs.lstatSync(sourceDirectory).isDirectory()) { - outro( - chalk.red( - `Source directory to copy/symlink 'content' from is not a directory (found file at '${chalk.yellow( - sourceDirectory, - )}', invalid argument ${chalk.yellow(`-${CreateArgv.source.alias[0]}`)}")`, - ), - ) - process.exit(1) - } - } - } - } - - // Use cli process if cmd args werent provided - if (!setupStrategy) { - setupStrategy = exitIfCancel( - await select({ - message: `Choose how to initialize the content in \`${contentFolder}\``, - options: [ - { value: "new", label: "Empty Quartz" }, - { value: "copy", label: "Copy an existing folder", hint: "overwrites `content`" }, - { - value: "symlink", - label: "Symlink an existing folder", - hint: "don't select this unless you know what you are doing!", - }, - ], - }), - ) - } - - async function rmContentFolder() { - const contentStat = await fs.promises.lstat(contentFolder) - if (contentStat.isSymbolicLink()) { - await fs.promises.unlink(contentFolder) - } else { - await rimraf(contentFolder) - } - } - - await fs.promises.unlink(path.join(contentFolder, ".gitkeep")) - if (setupStrategy === "copy" || setupStrategy === "symlink") { - let originalFolder = sourceDirectory - - // If input directory was not passed, use cli - if (!sourceDirectory) { - originalFolder = escapePath( - exitIfCancel( - await text({ - message: "Enter the full path to existing content folder", - placeholder: - "On most terminal emulators, you can drag and drop a folder into the window and it will paste the full path", - validate(fp) { - const fullPath = escapePath(fp) - if (!fs.existsSync(fullPath)) { - return "The given path doesn't exist" - } else if (!fs.lstatSync(fullPath).isDirectory()) { - return "The given path is not a folder" - } - }, - }), - ), - ) - } - - await rmContentFolder() - if (setupStrategy === "copy") { - await fs.promises.cp(originalFolder, contentFolder, { - recursive: true, - preserveTimestamps: true, - }) - } else if (setupStrategy === "symlink") { - await fs.promises.symlink(originalFolder, contentFolder, "dir") - } - } else if (setupStrategy === "new") { - await fs.promises.writeFile( - path.join(contentFolder, "index.md"), - `--- -title: Welcome to Quartz ---- - -This is a blank Quartz installation. -See the [documentation](https://quartz.jzhao.xyz) for how to get started. -`, - ) - } - - // Use cli process if cmd args werent provided - if (!linkResolutionStrategy) { - // get a preferred link resolution strategy - linkResolutionStrategy = exitIfCancel( - await select({ - message: `Choose how Quartz should resolve links in your content. You can change this later in \`quartz.config.ts\`.`, - options: [ - { - value: "absolute", - label: "Treat links as absolute path", - hint: "for content made for Quartz 3 and Hugo", - }, - { - value: "shortest", - label: "Treat links as shortest path", - hint: "for most Obsidian vaults", - }, - { - value: "relative", - label: "Treat links as relative paths", - hint: "for just normal Markdown files", - }, - ], - }), - ) - } - - // now, do config changes - const configFilePath = path.join(cwd, "quartz.config.ts") - let configContent = await fs.promises.readFile(configFilePath, { encoding: "utf-8" }) - configContent = configContent.replace( - /markdownLinkResolution: '(.+)'/, - `markdownLinkResolution: '${linkResolutionStrategy}'`, - ) - await fs.promises.writeFile(configFilePath, configContent) - - outro(`You're all set! Not sure what to do next? Try: - ā€¢ Customizing Quartz a bit more by editing \`quartz.config.ts\` - ā€¢ Running \`npx quartz build --serve\` to preview your Quartz locally - ā€¢ Hosting your Quartz online (see: https://quartz.jzhao.xyz/hosting) -`) -} - -/** - * Handles `npx quartz build` - * @param {*} argv arguments for `build` - */ -export async function handleBuild(argv) { - console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`)) - const ctx = await esbuild.context({ - entryPoints: [fp], - outfile: cacheFile, - bundle: true, - keepNames: true, - minifyWhitespace: true, - minifySyntax: true, - platform: "node", - format: "esm", - jsx: "automatic", - jsxImportSource: "preact", - packages: "external", - metafile: true, - sourcemap: true, - sourcesContent: false, - plugins: [ - sassPlugin({ - type: "css-text", - cssImports: true, - }), - { - name: "inline-script-loader", - setup(build) { - build.onLoad({ filter: /\.inline\.(ts|js)$/ }, async (args) => { - let text = await promises.readFile(args.path, "utf8") - - // remove default exports that we manually inserted - text = text.replace("export default", "") - text = text.replace("export", "") - - const sourcefile = path.relative(path.resolve("."), args.path) - const resolveDir = path.dirname(sourcefile) - const transpiled = await esbuild.build({ - stdin: { - contents: text, - loader: "ts", - resolveDir, - sourcefile, - }, - write: false, - bundle: true, - platform: "browser", - format: "esm", - }) - const rawMod = transpiled.outputFiles[0].text - return { - contents: rawMod, - loader: "text", - } - }) - }, - }, - ], - }) - - const buildMutex = new Mutex() - let lastBuildMs = 0 - let cleanupBuild = null - const build = async (clientRefresh) => { - const buildStart = new Date().getTime() - lastBuildMs = buildStart - const release = await buildMutex.acquire() - if (lastBuildMs > buildStart) { - release() - return - } - - if (cleanupBuild) { - await cleanupBuild() - console.log(chalk.yellow("Detected a source code change, doing a hard rebuild...")) - } - - const result = await ctx.rebuild().catch((err) => { - console.error(`${chalk.red("Couldn't parse Quartz configuration:")} ${fp}`) - console.log(`Reason: ${chalk.grey(err)}`) - process.exit(1) - }) - release() - - if (argv.bundleInfo) { - const outputFileName = "quartz/.quartz-cache/transpiled-build.mjs" - const meta = result.metafile.outputs[outputFileName] - console.log( - `Successfully transpiled ${Object.keys(meta.inputs).length} files (${prettyBytes( - meta.bytes, - )})`, - ) - console.log(await esbuild.analyzeMetafile(result.metafile, { color: true })) - } - - // bypass module cache - // https://github.com/nodejs/modules/issues/307 - const { default: buildQuartz } = await import(`../../${cacheFile}?update=${randomUUID()}`) - // ^ this import is relative, so base "cacheFile" path can't be used - - cleanupBuild = await buildQuartz(argv, buildMutex, clientRefresh) - clientRefresh() - } - - if (argv.serve) { - const connections = [] - const clientRefresh = () => connections.forEach((conn) => conn.send("rebuild")) - - if (argv.baseDir !== "" && !argv.baseDir.startsWith("/")) { - argv.baseDir = "/" + argv.baseDir - } - - await build(clientRefresh) - const server = http.createServer(async (req, res) => { - if (argv.baseDir && !req.url?.startsWith(argv.baseDir)) { - console.log( - chalk.red( - `[404] ${req.url} (warning: link outside of site, this is likely a Quartz bug)`, - ), - ) - res.writeHead(404) - res.end() - return - } - - // strip baseDir prefix - req.url = req.url?.slice(argv.baseDir.length) - - const serve = async () => { - const release = await buildMutex.acquire() - await serveHandler(req, res, { - public: argv.output, - directoryListing: false, - headers: [ - { - source: "**/*.html", - headers: [{ key: "Content-Disposition", value: "inline" }], - }, - ], - }) - const status = res.statusCode - const statusString = - status >= 200 && status < 300 ? chalk.green(`[${status}]`) : chalk.red(`[${status}]`) - console.log(statusString + chalk.grey(` ${argv.baseDir}${req.url}`)) - release() - } - - const redirect = (newFp) => { - newFp = argv.baseDir + newFp - res.writeHead(302, { - Location: newFp, - }) - console.log(chalk.yellow("[302]") + chalk.grey(` ${argv.baseDir}${req.url} -> ${newFp}`)) - res.end() - } - - let fp = req.url?.split("?")[0] ?? "/" - - // handle redirects - if (fp.endsWith("/")) { - // /trailing/ - // does /trailing/index.html exist? if so, serve it - const indexFp = path.posix.join(fp, "index.html") - if (fs.existsSync(path.posix.join(argv.output, indexFp))) { - req.url = fp - return serve() - } - - // does /trailing.html exist? if so, redirect to /trailing - let base = fp.slice(0, -1) - if (path.extname(base) === "") { - base += ".html" - } - if (fs.existsSync(path.posix.join(argv.output, base))) { - return redirect(fp.slice(0, -1)) - } - } else { - // /regular - // does /regular.html exist? if so, serve it - let base = fp - if (path.extname(base) === "") { - base += ".html" - } - if (fs.existsSync(path.posix.join(argv.output, base))) { - req.url = fp - return serve() - } - - // does /regular/index.html exist? if so, redirect to /regular/ - let indexFp = path.posix.join(fp, "index.html") - if (fs.existsSync(path.posix.join(argv.output, indexFp))) { - return redirect(fp + "/") - } - } - - return serve() - }) - server.listen(argv.port) - const wss = new WebSocketServer({ port: argv.wsPort }) - wss.on("connection", (ws) => connections.push(ws)) - console.log( - chalk.cyan( - `Started a Quartz server listening at http://localhost:${argv.port}${argv.baseDir}`, - ), - ) - console.log("hint: exit with ctrl+c") - chokidar - .watch(["**/*.ts", "**/*.tsx", "**/*.scss", "package.json"], { - ignoreInitial: true, - }) - .on("all", async () => { - build(clientRefresh) - }) - } else { - await build(() => {}) - ctx.dispose() - } -} - -/** - * Handles `npx quartz update` - * @param {*} argv arguments for `update` - */ -export async function handleUpdate(argv) { - const contentFolder = path.join(cwd, argv.directory) - console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`)) - console.log("Backing up your content") - execSync( - `git remote show upstream || git remote add upstream https://github.com/jackyzha0/quartz.git`, - ) - await stashContentFolder(contentFolder) - console.log( - "Pulling updates... you may need to resolve some `git` conflicts if you've made changes to components or plugins.", - ) - gitPull(UPSTREAM_NAME, QUARTZ_SOURCE_BRANCH) - await popContentFolder(contentFolder) - console.log("Ensuring dependencies are up to date") - spawnSync("npm", ["i"], { stdio: "inherit" }) - console.log(chalk.green("Done!")) -} - -/** - * Handles `npx quartz restore` - * @param {*} argv arguments for `restore` - */ -export async function handleRestore(argv) { - const contentFolder = path.join(cwd, argv.directory) - await popContentFolder(contentFolder) -} - -/** - * Handles `npx quartz sync` - * @param {*} argv arguments for `sync` - */ -export async function handleSync(argv) { - const contentFolder = path.join(cwd, argv.directory) - console.log(chalk.bgGreen.black(`\n Quartz v${version} \n`)) - console.log("Backing up your content") - - if (argv.commit) { - const contentStat = await fs.promises.lstat(contentFolder) - if (contentStat.isSymbolicLink()) { - const linkTarg = await fs.promises.readlink(contentFolder) - console.log(chalk.yellow("Detected symlink, trying to dereference before committing")) - - // stash symlink file - await stashContentFolder(contentFolder) - - // follow symlink and copy content - await fs.promises.cp(linkTarg, contentFolder, { - recursive: true, - preserveTimestamps: true, - }) - } - - const currentTimestamp = new Date().toLocaleString("en-US", { - dateStyle: "medium", - timeStyle: "short", - }) - spawnSync("git", ["add", "."], { stdio: "inherit" }) - spawnSync("git", ["commit", "-m", `Quartz sync: ${currentTimestamp}`], { stdio: "inherit" }) - - if (contentStat.isSymbolicLink()) { - // put symlink back - await popContentFolder(contentFolder) - } - } - - await stashContentFolder(contentFolder) - - if (argv.pull) { - console.log( - "Pulling updates from your repository. You may need to resolve some `git` conflicts if you've made changes to components or plugins.", - ) - gitPull(ORIGIN_NAME, QUARTZ_SOURCE_BRANCH) - } - - await popContentFolder(contentFolder) - if (argv.push) { - console.log("Pushing your changes") - spawnSync("git", ["push", "-f", ORIGIN_NAME, QUARTZ_SOURCE_BRANCH], { stdio: "inherit" }) - } - - console.log(chalk.green("Done!")) -} diff --git a/quartz/cli/helpers.js b/quartz/cli/helpers.js deleted file mode 100644 index b07d19e..0000000 --- a/quartz/cli/helpers.js +++ /dev/null @@ -1,52 +0,0 @@ -import { isCancel, outro } from "@clack/prompts" -import chalk from "chalk" -import { contentCacheFolder } from "./constants.js" -import { spawnSync } from "child_process" -import fs from "fs" - -export function escapePath(fp) { - return fp - .replace(/\\ /g, " ") // unescape spaces - .replace(/^".*"$/, "$1") - .replace(/^'.*"$/, "$1") - .trim() -} - -export function exitIfCancel(val) { - if (isCancel(val)) { - outro(chalk.red("Exiting")) - process.exit(0) - } else { - return val - } -} - -export async function stashContentFolder(contentFolder) { - await fs.promises.rm(contentCacheFolder, { force: true, recursive: true }) - await fs.promises.cp(contentFolder, contentCacheFolder, { - force: true, - recursive: true, - verbatimSymlinks: true, - preserveTimestamps: true, - }) - await fs.promises.rm(contentFolder, { force: true, recursive: true }) -} - -export function gitPull(origin, branch) { - const flags = ["--no-rebase", "--autostash", "-s", "recursive", "-X", "ours", "--no-edit"] - const out = spawnSync("git", ["pull", ...flags, origin, branch], { stdio: "inherit" }) - if (out.stderr) { - throw new Error(`Error while pulling updates: ${out.stderr}`) - } -} - -export async function popContentFolder(contentFolder) { - await fs.promises.rm(contentFolder, { force: true, recursive: true }) - await fs.promises.cp(contentCacheFolder, contentFolder, { - force: true, - recursive: true, - verbatimSymlinks: true, - preserveTimestamps: true, - }) - await fs.promises.rm(contentCacheFolder, { force: true, recursive: true }) -} diff --git a/quartz/components/ArticleTitle.tsx b/quartz/components/ArticleTitle.tsx deleted file mode 100644 index b8d58c6..0000000 --- a/quartz/components/ArticleTitle.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" - -function ArticleTitle({ fileData }: QuartzComponentProps) { - const title = fileData.frontmatter?.title - if (title) { - return

{title}

- } else { - return null - } -} -ArticleTitle.css = ` -.article-title { - margin: 2rem 0 0 0; -} -` - -export default (() => ArticleTitle) satisfies QuartzComponentConstructor diff --git a/quartz/components/Backlinks.tsx b/quartz/components/Backlinks.tsx deleted file mode 100644 index e88966b..0000000 --- a/quartz/components/Backlinks.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" -import style from "./styles/backlinks.scss" -import { resolveRelative, simplifySlug } from "../util/path" - -function Backlinks({ fileData, allFiles }: QuartzComponentProps) { - const slug = simplifySlug(fileData.slug!) - const backlinkFiles = allFiles.filter((file) => file.links?.includes(slug)) - return ( - - ) -} - -Backlinks.css = style -export default (() => Backlinks) satisfies QuartzComponentConstructor diff --git a/quartz/components/Body.tsx b/quartz/components/Body.tsx deleted file mode 100644 index fbb8572..0000000 --- a/quartz/components/Body.tsx +++ /dev/null @@ -1,13 +0,0 @@ -// @ts-ignore -import clipboardScript from "./scripts/clipboard.inline" -import clipboardStyle from "./styles/clipboard.scss" -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" - -function Body({ children }: QuartzComponentProps) { - return
{children}
-} - -Body.afterDOMLoaded = clipboardScript -Body.css = clipboardStyle - -export default (() => Body) satisfies QuartzComponentConstructor diff --git a/quartz/components/ContentMeta.tsx b/quartz/components/ContentMeta.tsx deleted file mode 100644 index 3e1b701..0000000 --- a/quartz/components/ContentMeta.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { formatDate, getDate } from "./Date" -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" -import readingTime from "reading-time" - -export default (() => { - function ContentMetadata({ cfg, fileData }: QuartzComponentProps) { - const text = fileData.text - if (text) { - const segments: string[] = [] - const { text: timeTaken, words: _words } = readingTime(text) - - if (fileData.dates) { - segments.push(formatDate(getDate(cfg, fileData)!)) - } - - segments.push(timeTaken) - return - } else { - return null - } - } - - ContentMetadata.css = ` - .content-meta { - margin-top: 0; - color: var(--gray); - } - ` - return ContentMetadata -}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Darkmode.tsx b/quartz/components/Darkmode.tsx deleted file mode 100644 index afbf2bd..0000000 --- a/quartz/components/Darkmode.tsx +++ /dev/null @@ -1,51 +0,0 @@ -// @ts-ignore: this is safe, we don't want to actually make darkmode.inline.ts a module as -// modules are automatically deferred and we don't want that to happen for critical beforeDOMLoads -// see: https://v8.dev/features/modules#defer -import darkmodeScript from "./scripts/darkmode.inline" -import styles from "./styles/darkmode.scss" -import { QuartzComponentConstructor } from "./types" - -function Darkmode() { - return ( -
- - - -
- ) -} - -Darkmode.beforeDOMLoaded = darkmodeScript -Darkmode.css = styles - -export default (() => Darkmode) satisfies QuartzComponentConstructor diff --git a/quartz/components/Date.tsx b/quartz/components/Date.tsx deleted file mode 100644 index 8713cfd..0000000 --- a/quartz/components/Date.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { GlobalConfiguration } from "../cfg" -import { QuartzPluginData } from "../plugins/vfile" - -interface Props { - date: Date -} - -export type ValidDateType = keyof Required["dates"] - -export function getDate(cfg: GlobalConfiguration, data: QuartzPluginData): Date | undefined { - if (!cfg.defaultDateType) { - throw new Error( - `Field 'defaultDateType' was not set in the configuration object of quartz.config.ts. See https://quartz.jzhao.xyz/configuration#general-configuration for more details.`, - ) - } - return data.dates?.[cfg.defaultDateType] -} - -export function formatDate(d: Date): string { - return d.toLocaleDateString("en-US", { - year: "numeric", - month: "short", - day: "2-digit", - }) -} - -export function Date({ date }: Props) { - return <>{formatDate(date)} -} diff --git a/quartz/components/DesktopOnly.tsx b/quartz/components/DesktopOnly.tsx deleted file mode 100644 index a11f23f..0000000 --- a/quartz/components/DesktopOnly.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" - -export default ((component?: QuartzComponent) => { - if (component) { - const Component = component - function DesktopOnly(props: QuartzComponentProps) { - return - } - - DesktopOnly.displayName = component.displayName - DesktopOnly.afterDOMLoaded = component?.afterDOMLoaded - DesktopOnly.beforeDOMLoaded = component?.beforeDOMLoaded - DesktopOnly.css = component?.css - return DesktopOnly - } else { - return () => <> - } -}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Explorer.tsx b/quartz/components/Explorer.tsx deleted file mode 100644 index 8597075..0000000 --- a/quartz/components/Explorer.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" -import explorerStyle from "./styles/explorer.scss" - -// @ts-ignore -import script from "./scripts/explorer.inline" -import { ExplorerNode, FileNode, Options } from "./ExplorerNode" - -// Options interface defined in `ExplorerNode` to avoid circular dependency -const defaultOptions = { - title: "Explorer", - folderClickBehavior: "collapse", - folderDefaultState: "collapsed", - useSavedState: true, - // Sort order: folders first, then files. Sort folders and files alphabetically - sortFn: (a, b) => { - if ((!a.file && !b.file) || (a.file && b.file)) { - return a.name.localeCompare(b.name) - } - if (a.file && !b.file) { - return 1 - } else { - return -1 - } - }, - order: ["filter", "map", "sort"], -} satisfies Options - -export default ((userOpts?: Partial) => { - function Explorer({ allFiles, displayClass, fileData }: QuartzComponentProps) { - // Parse config - const opts: Options = { ...defaultOptions, ...userOpts } - - // Construct tree from allFiles - const fileTree = new FileNode("") - allFiles.forEach((file) => fileTree.add(file, 1)) - - /** - * Keys of this object must match corresponding function name of `FileNode`, - * while values must be the argument that will be passed to the function. - * - * e.g. entry for FileNode.sort: `sort: opts.sortFn` (value is sort function from options) - */ - const functions = { - map: opts.mapFn, - sort: opts.sortFn, - filter: opts.filterFn, - } - - // Execute all functions (sort, filter, map) that were provided (if none were provided, only default "sort" is applied) - if (opts.order) { - // Order is important, use loop with index instead of order.map() - for (let i = 0; i < opts.order.length; i++) { - const functionName = opts.order[i] - if (functions[functionName]) { - // for every entry in order, call matching function in FileNode and pass matching argument - // e.g. i = 0; functionName = "filter" - // converted to: (if opts.filterFn) => fileTree.filter(opts.filterFn) - - // @ts-ignore - // typescript cant statically check these dynamic references, so manually make sure reference is valid and ignore warning - fileTree[functionName].call(fileTree, functions[functionName]) - } - } - } - - // Get all folders of tree. Initialize with collapsed state - const folders = fileTree.getFolderPaths(opts.folderDefaultState === "collapsed") - - // Stringify to pass json tree as data attribute ([data-tree]) - const jsonTree = JSON.stringify(folders) - - return ( -
- -
-
    - -
    -
-
-
- ) - } - Explorer.css = explorerStyle - Explorer.afterDOMLoaded = script - return Explorer -}) satisfies QuartzComponentConstructor diff --git a/quartz/components/ExplorerNode.tsx b/quartz/components/ExplorerNode.tsx deleted file mode 100644 index fd0c082..0000000 --- a/quartz/components/ExplorerNode.tsx +++ /dev/null @@ -1,215 +0,0 @@ -// @ts-ignore -import { QuartzPluginData } from "../plugins/vfile" -import { resolveRelative } from "../util/path" - -type OrderEntries = "sort" | "filter" | "map" - -export interface Options { - title: string - folderDefaultState: "collapsed" | "open" - folderClickBehavior: "collapse" | "link" - useSavedState: boolean - sortFn: (a: FileNode, b: FileNode) => number - filterFn?: (node: FileNode) => boolean - mapFn?: (node: FileNode) => void - order?: OrderEntries[] -} - -type DataWrapper = { - file: QuartzPluginData - path: string[] -} - -export type FolderState = { - path: string - collapsed: boolean -} - -// Structure to add all files into a tree -export class FileNode { - children: FileNode[] - name: string - file: QuartzPluginData | null - depth: number - - constructor(name: string, file?: QuartzPluginData, depth?: number) { - this.children = [] - this.name = name - this.file = file ? structuredClone(file) : null - this.depth = depth ?? 0 - } - - private insert(file: DataWrapper) { - if (file.path.length === 1) { - this.children.push(new FileNode(file.file.frontmatter!.title, file.file, this.depth + 1)) - } else { - const next = file.path[0] - file.path = file.path.splice(1) - for (const child of this.children) { - if (child.name === next) { - child.insert(file) - return - } - } - - const newChild = new FileNode(next, undefined, this.depth + 1) - newChild.insert(file) - this.children.push(newChild) - } - } - - // Add new file to tree - add(file: QuartzPluginData, splice: number = 0) { - this.insert({ file, path: file.filePath!.split("/").splice(splice) }) - } - - // Print tree structure (for debugging) - print(depth: number = 0) { - let folderChar = "" - if (!this.file) folderChar = "|" - console.log("-".repeat(depth), folderChar, this.name, this.depth) - this.children.forEach((e) => e.print(depth + 1)) - } - - /** - * Filter FileNode tree. Behaves similar to `Array.prototype.filter()`, but modifies tree in place - * @param filterFn function to filter tree with - */ - filter(filterFn: (node: FileNode) => boolean) { - this.children = this.children.filter(filterFn) - this.children.forEach((child) => child.filter(filterFn)) - } - - /** - * Filter FileNode tree. Behaves similar to `Array.prototype.map()`, but modifies tree in place - * @param mapFn function to use for mapping over tree - */ - map(mapFn: (node: FileNode) => void) { - mapFn(this) - - this.children.forEach((child) => child.map(mapFn)) - } - - /** - * Get folder representation with state of tree. - * Intended to only be called on root node before changes to the tree are made - * @param collapsed default state of folders (collapsed by default or not) - * @returns array containing folder state for tree - */ - getFolderPaths(collapsed: boolean): FolderState[] { - const folderPaths: FolderState[] = [] - - const traverse = (node: FileNode, currentPath: string) => { - if (!node.file) { - const folderPath = currentPath + (currentPath ? "/" : "") + node.name - if (folderPath !== "") { - folderPaths.push({ path: folderPath, collapsed }) - } - node.children.forEach((child) => traverse(child, folderPath)) - } - } - - traverse(this, "") - - return folderPaths - } - - // Sort order: folders first, then files. Sort folders and files alphabetically - /** - * Sorts tree according to sort/compare function - * @param sortFn compare function used for `.sort()`, also used recursively for children - */ - sort(sortFn: (a: FileNode, b: FileNode) => number) { - this.children = this.children.sort(sortFn) - this.children.forEach((e) => e.sort(sortFn)) - } -} - -type ExplorerNodeProps = { - node: FileNode - opts: Options - fileData: QuartzPluginData - fullPath?: string -} - -export function ExplorerNode({ node, opts, fullPath, fileData }: ExplorerNodeProps) { - // Get options - const folderBehavior = opts.folderClickBehavior - const isDefaultOpen = opts.folderDefaultState === "open" - - // Calculate current folderPath - let pathOld = fullPath ? fullPath : "" - let folderPath = "" - if (node.name !== "") { - folderPath = `${pathOld}/${node.name}` - } - - return ( -
- {node.file ? ( - // Single file node -
  • - - {node.name} - -
  • - ) : ( -
    - {node.name !== "" && ( - // Node with entire folder - // Render svg button + folder name, then children - - )} - {/* Recursively render children of folder */} -
    -
      - {node.children.map((childNode, i) => ( - - ))} -
    -
    -
    - )} -
    - ) -} diff --git a/quartz/components/Footer.tsx b/quartz/components/Footer.tsx deleted file mode 100644 index f33617e..0000000 --- a/quartz/components/Footer.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { QuartzComponentConstructor } from "./types" -import style from "./styles/footer.scss" -import { version } from "../../package.json" - -interface Options { - links: Record -} - -export default ((opts?: Options) => { - function Footer() { - const year = new Date().getFullYear() - const links = opts?.links ?? [] - return ( -
    -
    -

    - Created with Quartz v{version}, Ā© {year} -

    -
      - {Object.entries(links).map(([text, link]) => ( -
    • - {text} -
    • - ))} -
    -
    - ) - } - - Footer.css = style - return Footer -}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Graph.tsx b/quartz/components/Graph.tsx deleted file mode 100644 index 1b8071b..0000000 --- a/quartz/components/Graph.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { QuartzComponentConstructor } from "./types" -// @ts-ignore -import script from "./scripts/graph.inline" -import style from "./styles/graph.scss" - -export interface D3Config { - drag: boolean - zoom: boolean - depth: number - scale: number - repelForce: number - centerForce: number - linkDistance: number - fontSize: number - opacityScale: number - removeTags: string[] - showTags: boolean -} - -interface GraphOptions { - localGraph: Partial | undefined - globalGraph: Partial | undefined -} - -const defaultOptions: GraphOptions = { - localGraph: { - drag: true, - zoom: true, - depth: 1, - scale: 1.1, - repelForce: 0.5, - centerForce: 0.3, - linkDistance: 30, - fontSize: 0.6, - opacityScale: 1, - showTags: true, - removeTags: [], - }, - globalGraph: { - drag: true, - zoom: true, - depth: -1, - scale: 0.9, - repelForce: 0.5, - centerForce: 0.3, - linkDistance: 30, - fontSize: 0.6, - opacityScale: 1, - showTags: true, - removeTags: [], - }, -} - -export default ((opts?: GraphOptions) => { - function Graph() { - const localGraph = { ...defaultOptions.localGraph, ...opts?.localGraph } - const globalGraph = { ...defaultOptions.globalGraph, ...opts?.globalGraph } - return ( -
    -

    Graph View

    -
    -
    - - - -
    -
    -
    -
    -
    - ) - } - - Graph.css = style - Graph.afterDOMLoaded = script - - return Graph -}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Head.tsx b/quartz/components/Head.tsx deleted file mode 100644 index 2bf2638..0000000 --- a/quartz/components/Head.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { FullSlug, _stripSlashes, joinSegments, pathToRoot } from "../util/path" -import { JSResourceToScriptElement } from "../util/resources" -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" - -export default (() => { - function Head({ cfg, fileData, externalResources }: QuartzComponentProps) { - const title = fileData.frontmatter?.title ?? "Untitled" - const description = fileData.description?.trim() ?? "No description provided" - const { css, js } = externalResources - - const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) - const path = url.pathname as FullSlug - const baseDir = fileData.slug === "404" ? path : pathToRoot(fileData.slug!) - - const iconPath = joinSegments(baseDir, "static/icon.png") - const ogImagePath = `https://${cfg.baseUrl}/static/og-image.png` - - return ( - - {title} - - - - - {cfg.baseUrl && } - - - - - - - - {css.map((href) => ( - - ))} - {js - .filter((resource) => resource.loadTime === "beforeDOMReady") - .map((res) => JSResourceToScriptElement(res, true))} - - ) - } - - return Head -}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Header.tsx b/quartz/components/Header.tsx deleted file mode 100644 index 5281f72..0000000 --- a/quartz/components/Header.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" - -function Header({ children }: QuartzComponentProps) { - return children.length > 0 ?
    {children}
    : null -} - -Header.css = ` -header { - display: flex; - flex-direction: row; - align-items: center; - margin: 2rem 0; - gap: 1.5rem; -} - -header h1 { - margin: 0; - flex: auto; -} -` - -export default (() => Header) satisfies QuartzComponentConstructor diff --git a/quartz/components/MobileOnly.tsx b/quartz/components/MobileOnly.tsx deleted file mode 100644 index 5a19095..0000000 --- a/quartz/components/MobileOnly.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { QuartzComponent, QuartzComponentConstructor, QuartzComponentProps } from "./types" - -export default ((component?: QuartzComponent) => { - if (component) { - const Component = component - function MobileOnly(props: QuartzComponentProps) { - return - } - - MobileOnly.displayName = component.displayName - MobileOnly.afterDOMLoaded = component?.afterDOMLoaded - MobileOnly.beforeDOMLoaded = component?.beforeDOMLoaded - MobileOnly.css = component?.css - return MobileOnly - } else { - return () => <> - } -}) satisfies QuartzComponentConstructor diff --git a/quartz/components/PageList.tsx b/quartz/components/PageList.tsx deleted file mode 100644 index eb34f02..0000000 --- a/quartz/components/PageList.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { FullSlug, resolveRelative } from "../util/path" -import { QuartzPluginData } from "../plugins/vfile" -import { Date, getDate } from "./Date" -import { QuartzComponentProps } from "./types" -import { GlobalConfiguration } from "../cfg" - -export function byDateAndAlphabetical( - cfg: GlobalConfiguration, -): (f1: QuartzPluginData, f2: QuartzPluginData) => number { - return (f1, f2) => { - if (f1.dates && f2.dates) { - // sort descending - return getDate(cfg, f2)!.getTime() - getDate(cfg, f1)!.getTime() - } else if (f1.dates && !f2.dates) { - // prioritize files with dates - return -1 - } else if (!f1.dates && f2.dates) { - return 1 - } - - // otherwise, sort lexographically by title - const f1Title = f1.frontmatter?.title.toLowerCase() ?? "" - const f2Title = f2.frontmatter?.title.toLowerCase() ?? "" - return f1Title.localeCompare(f2Title) - } -} - -type Props = { - limit?: number -} & QuartzComponentProps - -export function PageList({ cfg, fileData, allFiles, limit }: Props) { - let list = allFiles.sort(byDateAndAlphabetical(cfg)) - if (limit) { - list = list.slice(0, limit) - } - - return ( -
      - {list.map((page) => { - const title = page.frontmatter?.title - const tags = page.frontmatter?.tags ?? [] - - return ( -
    • -
      - {page.dates && ( -

      - -

      - )} - - -
      -
    • - ) - })} -
    - ) -} - -PageList.css = ` -.section h3 { - margin: 0; -} - -.section > .tags { - margin: 0; -} -` diff --git a/quartz/components/PageTitle.tsx b/quartz/components/PageTitle.tsx deleted file mode 100644 index c327547..0000000 --- a/quartz/components/PageTitle.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { pathToRoot } from "../util/path" -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" - -function PageTitle({ fileData, cfg }: QuartzComponentProps) { - const title = cfg?.pageTitle ?? "Untitled Quartz" - const baseDir = pathToRoot(fileData.slug!) - return ( -

    - {title} -

    - ) -} - -PageTitle.css = ` -.page-title { - margin: 0; -} -` - -export default (() => PageTitle) satisfies QuartzComponentConstructor diff --git a/quartz/components/RecentNotes.tsx b/quartz/components/RecentNotes.tsx deleted file mode 100644 index cb14b33..0000000 --- a/quartz/components/RecentNotes.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" -import { FullSlug, SimpleSlug, resolveRelative } from "../util/path" -import { QuartzPluginData } from "../plugins/vfile" -import { byDateAndAlphabetical } from "./PageList" -import style from "./styles/recentNotes.scss" -import { Date, getDate } from "./Date" -import { GlobalConfiguration } from "../cfg" - -interface Options { - title: string - limit: number - linkToMore: SimpleSlug | false - filter: (f: QuartzPluginData) => boolean - sort: (f1: QuartzPluginData, f2: QuartzPluginData) => number -} - -const defaultOptions = (cfg: GlobalConfiguration): Options => ({ - title: "Recent Notes", - limit: 3, - linkToMore: false, - filter: () => true, - sort: byDateAndAlphabetical(cfg), -}) - -export default ((userOpts?: Partial) => { - function RecentNotes(props: QuartzComponentProps) { - const { allFiles, fileData, displayClass, cfg } = props - const opts = { ...defaultOptions(cfg), ...userOpts } - const pages = allFiles.filter(opts.filter).sort(opts.sort) - const remaining = Math.max(0, pages.length - opts.limit) - return ( -
    -

    {opts.title}

    -
      - {pages.slice(0, opts.limit).map((page) => { - const title = page.frontmatter?.title - const tags = page.frontmatter?.tags ?? [] - - return ( -
    • -
      - - {page.dates && ( -

      - -

      - )} - -
      -
    • - ) - })} -
    - {opts.linkToMore && remaining > 0 && ( -

    - See {remaining} more ā†’ -

    - )} -
    - ) - } - - RecentNotes.css = style - return RecentNotes -}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Search.tsx b/quartz/components/Search.tsx deleted file mode 100644 index bd9aa69..0000000 --- a/quartz/components/Search.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { QuartzComponentConstructor } from "./types" -import style from "./styles/search.scss" -// @ts-ignore -import script from "./scripts/search.inline" - -export default (() => { - function Search() { - return ( - - ) - } - - Search.afterDOMLoaded = script - Search.css = style - - return Search -}) satisfies QuartzComponentConstructor diff --git a/quartz/components/Spacer.tsx b/quartz/components/Spacer.tsx deleted file mode 100644 index b9d5bb6..0000000 --- a/quartz/components/Spacer.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" - -function Spacer({ displayClass }: QuartzComponentProps) { - const className = displayClass ? `spacer ${displayClass}` : "spacer" - return
    -} - -export default (() => Spacer) satisfies QuartzComponentConstructor diff --git a/quartz/components/TableOfContents.tsx b/quartz/components/TableOfContents.tsx deleted file mode 100644 index 4604565..0000000 --- a/quartz/components/TableOfContents.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" -import legacyStyle from "./styles/legacyToc.scss" -import modernStyle from "./styles/toc.scss" - -// @ts-ignore -import script from "./scripts/toc.inline" - -interface Options { - layout: "modern" | "legacy" -} - -const defaultOptions: Options = { - layout: "modern", -} - -function TableOfContents({ fileData, displayClass }: QuartzComponentProps) { - if (!fileData.toc) { - return null - } - - return ( -
    - -
    - -
    -
    - ) -} -TableOfContents.css = modernStyle -TableOfContents.afterDOMLoaded = script - -function LegacyTableOfContents({ fileData }: QuartzComponentProps) { - if (!fileData.toc) { - return null - } - - return ( -
    - -

    Table of Contents

    -
    - -
    - ) -} -LegacyTableOfContents.css = legacyStyle - -export default ((opts?: Partial) => { - const layout = opts?.layout ?? defaultOptions.layout - return layout === "modern" ? TableOfContents : LegacyTableOfContents -}) satisfies QuartzComponentConstructor diff --git a/quartz/components/TagList.tsx b/quartz/components/TagList.tsx deleted file mode 100644 index a4dfac7..0000000 --- a/quartz/components/TagList.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { pathToRoot, slugTag } from "../util/path" -import { QuartzComponentConstructor, QuartzComponentProps } from "./types" - -function TagList({ fileData }: QuartzComponentProps) { - const tags = fileData.frontmatter?.tags - const baseDir = pathToRoot(fileData.slug!) - if (tags && tags.length > 0) { - return ( -
      - {tags.map((tag) => { - const display = `#${tag}` - const linkDest = baseDir + `/tags/${slugTag(tag)}` - return ( -
    • - - {display} - -
    • - ) - })} -
    - ) - } else { - return null - } -} - -TagList.css = ` -.tags { - list-style: none; - display: flex; - padding-left: 0; - gap: 0.4rem; - margin: 1rem 0; -} - -.tags > li { - display: inline-block; - white-space: nowrap; - margin: 0; - overflow-wrap: normal; -} - -a.tag-link { - border-radius: 8px; - background-color: var(--highlight); - padding: 0.2rem 0.4rem; - margin: 0 0.1rem; -} -` - -export default (() => TagList) satisfies QuartzComponentConstructor diff --git a/quartz/components/index.ts b/quartz/components/index.ts deleted file mode 100644 index d7b6a1c..0000000 --- a/quartz/components/index.ts +++ /dev/null @@ -1,43 +0,0 @@ -import Content from "./pages/Content" -import TagContent from "./pages/TagContent" -import FolderContent from "./pages/FolderContent" -import NotFound from "./pages/404" -import ArticleTitle from "./ArticleTitle" -import Darkmode from "./Darkmode" -import Head from "./Head" -import PageTitle from "./PageTitle" -import ContentMeta from "./ContentMeta" -import Spacer from "./Spacer" -import TableOfContents from "./TableOfContents" -import Explorer from "./Explorer" -import TagList from "./TagList" -import Graph from "./Graph" -import Backlinks from "./Backlinks" -import Search from "./Search" -import Footer from "./Footer" -import DesktopOnly from "./DesktopOnly" -import MobileOnly from "./MobileOnly" -import RecentNotes from "./RecentNotes" - -export { - ArticleTitle, - Content, - TagContent, - FolderContent, - Darkmode, - Head, - PageTitle, - ContentMeta, - Spacer, - TableOfContents, - Explorer, - TagList, - Graph, - Backlinks, - Search, - Footer, - DesktopOnly, - MobileOnly, - RecentNotes, - NotFound, -} diff --git a/quartz/components/pages/404.tsx b/quartz/components/pages/404.tsx deleted file mode 100644 index c276f56..0000000 --- a/quartz/components/pages/404.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { QuartzComponentConstructor } from "../types" - -function NotFound() { - return ( -
    -

    404

    -

    Either this page is private or doesn't exist.

    -
    - ) -} - -export default (() => NotFound) satisfies QuartzComponentConstructor diff --git a/quartz/components/pages/Content.tsx b/quartz/components/pages/Content.tsx deleted file mode 100644 index 7490a7e..0000000 --- a/quartz/components/pages/Content.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "../types" -import { Fragment, jsx, jsxs } from "preact/jsx-runtime" -import { toJsxRuntime } from "hast-util-to-jsx-runtime" - -function Content({ tree }: QuartzComponentProps) { - // @ts-ignore (preact makes it angry) - const content = toJsxRuntime(tree, { Fragment, jsx, jsxs, elementAttributeNameCase: "html" }) - return
    {content}
    -} - -export default (() => Content) satisfies QuartzComponentConstructor diff --git a/quartz/components/pages/FolderContent.tsx b/quartz/components/pages/FolderContent.tsx deleted file mode 100644 index a766d4b..0000000 --- a/quartz/components/pages/FolderContent.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "../types" -import { Fragment, jsx, jsxs } from "preact/jsx-runtime" -import { toJsxRuntime } from "hast-util-to-jsx-runtime" -import path from "path" - -import style from "../styles/listPage.scss" -import { PageList } from "../PageList" -import { _stripSlashes, simplifySlug } from "../../util/path" -import { Root } from "hast" -import { pluralize } from "../../util/lang" - -function FolderContent(props: QuartzComponentProps) { - const { tree, fileData, allFiles } = props - const folderSlug = _stripSlashes(simplifySlug(fileData.slug!)) - const allPagesInFolder = allFiles.filter((file) => { - const fileSlug = _stripSlashes(simplifySlug(file.slug!)) - const prefixed = fileSlug.startsWith(folderSlug) && fileSlug !== folderSlug - const folderParts = folderSlug.split(path.posix.sep) - const fileParts = fileSlug.split(path.posix.sep) - const isDirectChild = fileParts.length === folderParts.length + 1 - return prefixed && isDirectChild - }) - - const listProps = { - ...props, - allFiles: allPagesInFolder, - } - - const content = - (tree as Root).children.length === 0 - ? fileData.description - : // @ts-ignore - toJsxRuntime(tree, { Fragment, jsx, jsxs, elementAttributeNameCase: "html" }) - - return ( -
    -
    -

    {content}

    -
    -

    {pluralize(allPagesInFolder.length, "item")} under this folder.

    -
    - -
    -
    - ) -} - -FolderContent.css = style + PageList.css -export default (() => FolderContent) satisfies QuartzComponentConstructor diff --git a/quartz/components/pages/TagContent.tsx b/quartz/components/pages/TagContent.tsx deleted file mode 100644 index 9907e3f..0000000 --- a/quartz/components/pages/TagContent.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import { QuartzComponentConstructor, QuartzComponentProps } from "../types" -import { Fragment, jsx, jsxs } from "preact/jsx-runtime" -import { toJsxRuntime } from "hast-util-to-jsx-runtime" -import style from "../styles/listPage.scss" -import { PageList } from "../PageList" -import { FullSlug, getAllSegmentPrefixes, simplifySlug } from "../../util/path" -import { QuartzPluginData } from "../../plugins/vfile" -import { Root } from "hast" -import { pluralize } from "../../util/lang" - -const numPages = 10 -function TagContent(props: QuartzComponentProps) { - const { tree, fileData, allFiles } = props - const slug = fileData.slug - - if (!(slug?.startsWith("tags/") || slug === "tags")) { - throw new Error(`Component "TagContent" tried to render a non-tag page: ${slug}`) - } - - const tag = simplifySlug(slug.slice("tags/".length) as FullSlug) - const allPagesWithTag = (tag: string) => - allFiles.filter((file) => - (file.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes).includes(tag), - ) - - const content = - (tree as Root).children.length === 0 - ? fileData.description - : // @ts-ignore - toJsxRuntime(tree, { Fragment, jsx, jsxs, elementAttributeNameCase: "html" }) - - if (tag === "") { - const tags = [...new Set(allFiles.flatMap((data) => data.frontmatter?.tags ?? []))] - const tagItemMap: Map = new Map() - for (const tag of tags) { - tagItemMap.set(tag, allPagesWithTag(tag)) - } - - return ( -
    -
    -

    {content}

    -
    -

    Found {tags.length} total tags.

    -
    - {tags.map((tag) => { - const pages = tagItemMap.get(tag)! - const listProps = { - ...props, - allFiles: pages, - } - - const contentPage = allFiles.filter((file) => file.slug === `tags/${tag}`)[0] - const content = contentPage?.description - return ( -
    -

    - - #{tag} - -

    - {content &&

    {content}

    } -

    - {pluralize(pages.length, "item")} with this tag.{" "} - {pages.length > numPages && `Showing first ${numPages}.`} -

    - -
    - ) - })} -
    -
    - ) - } else { - const pages = allPagesWithTag(tag) - const listProps = { - ...props, - allFiles: pages, - } - - return ( -
    -
    {content}
    -

    {pluralize(pages.length, "item")} with this tag.

    -
    - -
    -
    - ) - } -} - -TagContent.css = style + PageList.css -export default (() => TagContent) satisfies QuartzComponentConstructor diff --git a/quartz/components/renderPage.tsx b/quartz/components/renderPage.tsx deleted file mode 100644 index 451813b..0000000 --- a/quartz/components/renderPage.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import { render } from "preact-render-to-string" -import { QuartzComponent, QuartzComponentProps } from "./types" -import HeaderConstructor from "./Header" -import BodyConstructor from "./Body" -import { JSResourceToScriptElement, StaticResources } from "../util/resources" -import { FullSlug, RelativeURL, joinSegments } from "../util/path" -import { visit } from "unist-util-visit" -import { Root, Element } from "hast" - -interface RenderComponents { - head: QuartzComponent - header: QuartzComponent[] - beforeBody: QuartzComponent[] - pageBody: QuartzComponent - left: QuartzComponent[] - right: QuartzComponent[] - footer: QuartzComponent -} - -export function pageResources( - baseDir: FullSlug | RelativeURL, - staticResources: StaticResources, -): StaticResources { - const contentIndexPath = joinSegments(baseDir, "static/contentIndex.json") - const contentIndexScript = `const fetchData = fetch(\`${contentIndexPath}\`).then(data => data.json())` - - return { - css: [joinSegments(baseDir, "index.css"), ...staticResources.css], - js: [ - { - src: joinSegments(baseDir, "prescript.js"), - loadTime: "beforeDOMReady", - contentType: "external", - }, - { - loadTime: "beforeDOMReady", - contentType: "inline", - spaPreserve: true, - script: contentIndexScript, - }, - ...staticResources.js, - { - src: joinSegments(baseDir, "postscript.js"), - loadTime: "afterDOMReady", - moduleType: "module", - contentType: "external", - }, - ], - } -} - -export function renderPage( - slug: FullSlug, - componentData: QuartzComponentProps, - components: RenderComponents, - pageResources: StaticResources, -): string { - // process transcludes in componentData - visit(componentData.tree as Root, "element", (node, _index, _parent) => { - if (node.tagName === "blockquote") { - const classNames = (node.properties?.className ?? []) as string[] - if (classNames.includes("transclude")) { - const inner = node.children[0] as Element - const blockSlug = inner.properties?.["data-slug"] as FullSlug - const blockRef = node.properties!.dataBlock as string - - // TODO: avoid this expensive find operation and construct an index ahead of time - let blockNode = componentData.allFiles.find((f) => f.slug === blockSlug)?.blocks?.[blockRef] - if (blockNode) { - if (blockNode.tagName === "li") { - blockNode = { - type: "element", - tagName: "ul", - children: [blockNode], - } - } - - node.children = [ - blockNode, - { - type: "element", - tagName: "a", - properties: { href: inner.properties?.href, class: ["internal"] }, - children: [{ type: "text", value: `Link to original` }], - }, - ] - } - } - } - }) - - const { - head: Head, - header, - beforeBody, - pageBody: Content, - left, - right, - footer: Footer, - } = components - const Header = HeaderConstructor() - const Body = BodyConstructor() - - const LeftComponent = ( - - ) - - const RightComponent = ( - - ) - - const doc = ( - - - -
    - - {LeftComponent} -
    - - -
    - {RightComponent} - -
    -
    - - {pageResources.js - .filter((resource) => resource.loadTime === "afterDOMReady") - .map((res) => JSResourceToScriptElement(res))} - - ) - - return "\n" + render(doc) -} diff --git a/quartz/components/scripts/callout.inline.ts b/quartz/components/scripts/callout.inline.ts deleted file mode 100644 index d8cf518..0000000 --- a/quartz/components/scripts/callout.inline.ts +++ /dev/null @@ -1,44 +0,0 @@ -function toggleCallout(this: HTMLElement) { - const outerBlock = this.parentElement! - outerBlock.classList.toggle(`is-collapsed`) - const collapsed = outerBlock.classList.contains(`is-collapsed`) - const height = collapsed ? this.scrollHeight : outerBlock.scrollHeight - outerBlock.style.maxHeight = height + `px` - - // walk and adjust height of all parents - let current = outerBlock - let parent = outerBlock.parentElement - while (parent) { - if (!parent.classList.contains(`callout`)) { - return - } - - const collapsed = parent.classList.contains(`is-collapsed`) - const height = collapsed ? parent.scrollHeight : parent.scrollHeight + current.scrollHeight - parent.style.maxHeight = height + `px` - - current = parent - parent = parent.parentElement - } -} - -function setupCallout() { - const collapsible = document.getElementsByClassName( - `callout is-collapsible`, - ) as HTMLCollectionOf - for (const div of collapsible) { - const title = div.firstElementChild - - if (title) { - title.removeEventListener(`click`, toggleCallout) - title.addEventListener(`click`, toggleCallout) - - const collapsed = div.classList.contains(`is-collapsed`) - const height = collapsed ? title.scrollHeight : div.scrollHeight - div.style.maxHeight = height + `px` - } - } -} - -document.addEventListener(`nav`, setupCallout) -window.addEventListener(`resize`, setupCallout) diff --git a/quartz/components/scripts/clipboard.inline.ts b/quartz/components/scripts/clipboard.inline.ts deleted file mode 100644 index c604c9b..0000000 --- a/quartz/components/scripts/clipboard.inline.ts +++ /dev/null @@ -1,33 +0,0 @@ -const svgCopy = - '' -const svgCheck = - '' - -document.addEventListener("nav", () => { - const els = document.getElementsByTagName("pre") - for (let i = 0; i < els.length; i++) { - const codeBlock = els[i].getElementsByTagName("code")[0] - if (codeBlock) { - const source = codeBlock.innerText.replace(/\n\n/g, "\n") - const button = document.createElement("button") - button.className = "clipboard-button" - button.type = "button" - button.innerHTML = svgCopy - button.ariaLabel = "Copy source" - button.addEventListener("click", () => { - navigator.clipboard.writeText(source).then( - () => { - button.blur() - button.innerHTML = svgCheck - setTimeout(() => { - button.innerHTML = svgCopy - button.style.borderColor = "" - }, 2000) - }, - (error) => console.error(error), - ) - }) - els[i].prepend(button) - } - } -}) diff --git a/quartz/components/scripts/darkmode.inline.ts b/quartz/components/scripts/darkmode.inline.ts deleted file mode 100644 index c42a367..0000000 --- a/quartz/components/scripts/darkmode.inline.ts +++ /dev/null @@ -1,32 +0,0 @@ -const userPref = window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark" -const currentTheme = localStorage.getItem("theme") ?? userPref -document.documentElement.setAttribute("saved-theme", currentTheme) - -document.addEventListener("nav", () => { - const switchTheme = (e: any) => { - if (e.target.checked) { - document.documentElement.setAttribute("saved-theme", "dark") - localStorage.setItem("theme", "dark") - } else { - document.documentElement.setAttribute("saved-theme", "light") - localStorage.setItem("theme", "light") - } - } - - // Darkmode toggle - const toggleSwitch = document.querySelector("#darkmode-toggle") as HTMLInputElement - toggleSwitch.removeEventListener("change", switchTheme) - toggleSwitch.addEventListener("change", switchTheme) - if (currentTheme === "dark") { - toggleSwitch.checked = true - } - - // Listen for changes in prefers-color-scheme - const colorSchemeMediaQuery = window.matchMedia("(prefers-color-scheme: dark)") - colorSchemeMediaQuery.addEventListener("change", (e) => { - const newTheme = e.matches ? "dark" : "light" - document.documentElement.setAttribute("saved-theme", newTheme) - localStorage.setItem("theme", newTheme) - toggleSwitch.checked = e.matches - }) -}) diff --git a/quartz/components/scripts/explorer.inline.ts b/quartz/components/scripts/explorer.inline.ts deleted file mode 100644 index 2b7df7d..0000000 --- a/quartz/components/scripts/explorer.inline.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { FolderState } from "../ExplorerNode" - -// Current state of folders -let explorerState: FolderState[] - -const observer = new IntersectionObserver((entries) => { - // If last element is observed, remove gradient of "overflow" class so element is visible - const explorer = document.getElementById("explorer-ul") - for (const entry of entries) { - if (entry.isIntersecting) { - explorer?.classList.add("no-background") - } else { - explorer?.classList.remove("no-background") - } - } -}) - -function toggleExplorer(this: HTMLElement) { - // Toggle collapsed state of entire explorer - this.classList.toggle("collapsed") - const content = this.nextElementSibling as HTMLElement - content.classList.toggle("collapsed") - content.style.maxHeight = content.style.maxHeight === "0px" ? content.scrollHeight + "px" : "0px" -} - -function toggleFolder(evt: MouseEvent) { - evt.stopPropagation() - - // Element that was clicked - const target = evt.target as HTMLElement - - // Check if target was svg icon or button - const isSvg = target.nodeName === "svg" - - // corresponding
      element relative to clicked button/folder - let childFolderContainer: HTMLElement - - //
    • element of folder (stores folder-path dataset) - let currentFolderParent: HTMLElement - - // Get correct relative container and toggle collapsed class - if (isSvg) { - childFolderContainer = target.parentElement?.nextSibling as HTMLElement - currentFolderParent = target.nextElementSibling as HTMLElement - - childFolderContainer.classList.toggle("open") - } else { - childFolderContainer = target.parentElement?.parentElement?.nextElementSibling as HTMLElement - currentFolderParent = target.parentElement as HTMLElement - - childFolderContainer.classList.toggle("open") - } - if (!childFolderContainer) return - - // Collapse folder container - const isCollapsed = childFolderContainer.classList.contains("open") - setFolderState(childFolderContainer, !isCollapsed) - - // Save folder state to localStorage - const clickFolderPath = currentFolderParent.dataset.folderpath as string - - // Remove leading "/" - const fullFolderPath = clickFolderPath.substring(1) - toggleCollapsedByPath(explorerState, fullFolderPath) - - const stringifiedFileTree = JSON.stringify(explorerState) - localStorage.setItem("fileTree", stringifiedFileTree) -} - -function setupExplorer() { - // Set click handler for collapsing entire explorer - const explorer = document.getElementById("explorer") - - // Get folder state from local storage - const storageTree = localStorage.getItem("fileTree") - - // Convert to bool - const useSavedFolderState = explorer?.dataset.savestate === "true" - - if (explorer) { - // Get config - const collapseBehavior = explorer.dataset.behavior - - // Add click handlers for all folders (click handler on folder "label") - if (collapseBehavior === "collapse") { - Array.prototype.forEach.call( - document.getElementsByClassName("folder-button"), - function (item) { - item.removeEventListener("click", toggleFolder) - item.addEventListener("click", toggleFolder) - }, - ) - } - - // Add click handler to main explorer - explorer.removeEventListener("click", toggleExplorer) - explorer.addEventListener("click", toggleExplorer) - } - - // Set up click handlers for each folder (click handler on folder "icon") - Array.prototype.forEach.call(document.getElementsByClassName("folder-icon"), function (item) { - item.removeEventListener("click", toggleFolder) - item.addEventListener("click", toggleFolder) - }) - - if (storageTree && useSavedFolderState) { - // Get state from localStorage and set folder state - explorerState = JSON.parse(storageTree) - explorerState.map((folderUl) => { - // grab
    • element for matching folder path - const folderLi = document.querySelector( - `[data-folderpath='/${folderUl.path}']`, - ) as HTMLElement - - // Get corresponding content
        tag and set state - const folderUL = folderLi.parentElement?.nextElementSibling - if (folderUL) { - setFolderState(folderUL as HTMLElement, folderUl.collapsed) - } - }) - } else { - // If tree is not in localStorage or config is disabled, use tree passed from Explorer as dataset - explorerState = JSON.parse(explorer?.dataset.tree as string) - } -} - -window.addEventListener("resize", setupExplorer) -document.addEventListener("nav", () => { - setupExplorer() - - const explorerContent = document.getElementById("explorer-ul") - // select pseudo element at end of list - const lastItem = document.getElementById("explorer-end") - - observer.disconnect() - observer.observe(lastItem as Element) -}) - -/** - * Toggles the state of a given folder - * @param folderElement
        Element of folder (parent) - * @param collapsed if folder should be set to collapsed or not - */ -function setFolderState(folderElement: HTMLElement, collapsed: boolean) { - if (collapsed) { - folderElement?.classList.remove("open") - } else { - folderElement?.classList.add("open") - } -} - -/** - * Toggles visibility of a folder - * @param array array of FolderState (`fileTree`, either get from local storage or data attribute) - * @param path path to folder (e.g. 'advanced/more/more2') - */ -function toggleCollapsedByPath(array: FolderState[], path: string) { - const entry = array.find((item) => item.path === path) - if (entry) { - entry.collapsed = !entry.collapsed - } -} diff --git a/quartz/components/scripts/graph.inline.ts b/quartz/components/scripts/graph.inline.ts deleted file mode 100644 index 1aff138..0000000 --- a/quartz/components/scripts/graph.inline.ts +++ /dev/null @@ -1,328 +0,0 @@ -import type { ContentDetails } from "../../plugins/emitters/contentIndex" -import * as d3 from "d3" -import { registerEscapeHandler, removeAllChildren } from "./util" -import { FullSlug, SimpleSlug, getFullSlug, resolveRelative, simplifySlug } from "../../util/path" - -type NodeData = { - id: SimpleSlug - text: string - tags: string[] -} & d3.SimulationNodeDatum - -type LinkData = { - source: SimpleSlug - target: SimpleSlug -} - -const localStorageKey = "graph-visited" -function getVisited(): Set { - return new Set(JSON.parse(localStorage.getItem(localStorageKey) ?? "[]")) -} - -function addToVisited(slug: SimpleSlug) { - const visited = getVisited() - visited.add(slug) - localStorage.setItem(localStorageKey, JSON.stringify([...visited])) -} - -async function renderGraph(container: string, fullSlug: FullSlug) { - const slug = simplifySlug(fullSlug) - const visited = getVisited() - const graph = document.getElementById(container) - if (!graph) return - removeAllChildren(graph) - - let { - drag: enableDrag, - zoom: enableZoom, - depth, - scale, - repelForce, - centerForce, - linkDistance, - fontSize, - opacityScale, - removeTags, - showTags, - } = JSON.parse(graph.dataset["cfg"]!) - - const data = await fetchData - - const links: LinkData[] = [] - const tags: SimpleSlug[] = [] - - const validLinks = new Set(Object.keys(data).map((slug) => simplifySlug(slug as FullSlug))) - - for (const [src, details] of Object.entries(data)) { - const source = simplifySlug(src as FullSlug) - const outgoing = details.links ?? [] - - for (const dest of outgoing) { - if (validLinks.has(dest)) { - links.push({ source, target: dest }) - } - } - - if (showTags) { - const localTags = details.tags - .filter((tag) => !removeTags.includes(tag)) - .map((tag) => simplifySlug(("tags/" + tag) as FullSlug)) - - tags.push(...localTags.filter((tag) => !tags.includes(tag))) - - for (const tag of localTags) { - links.push({ source, target: tag }) - } - } - } - - const neighbourhood = new Set() - const wl: (SimpleSlug | "__SENTINEL")[] = [slug, "__SENTINEL"] - if (depth >= 0) { - while (depth >= 0 && wl.length > 0) { - // compute neighbours - const cur = wl.shift()! - if (cur === "__SENTINEL") { - depth-- - wl.push("__SENTINEL") - } else { - neighbourhood.add(cur) - const outgoing = links.filter((l) => l.source === cur) - const incoming = links.filter((l) => l.target === cur) - wl.push(...outgoing.map((l) => l.target), ...incoming.map((l) => l.source)) - } - } - } else { - Object.keys(data).forEach((id) => neighbourhood.add(simplifySlug(id as FullSlug))) - if (showTags) tags.forEach((tag) => neighbourhood.add(tag)) - } - - const graphData: { nodes: NodeData[]; links: LinkData[] } = { - nodes: [...neighbourhood].map((url) => { - const text = url.startsWith("tags/") ? "#" + url.substring(5) : data[url]?.title ?? url - return { - id: url, - text: text, - tags: data[url]?.tags ?? [], - } - }), - links: links.filter((l) => neighbourhood.has(l.source) && neighbourhood.has(l.target)), - } - - const simulation: d3.Simulation = d3 - .forceSimulation(graphData.nodes) - .force("charge", d3.forceManyBody().strength(-100 * repelForce)) - .force( - "link", - d3 - .forceLink(graphData.links) - .id((d: any) => d.id) - .distance(linkDistance), - ) - .force("center", d3.forceCenter().strength(centerForce)) - - const height = Math.max(graph.offsetHeight, 250) - const width = graph.offsetWidth - - const svg = d3 - .select("#" + container) - .append("svg") - .attr("width", width) - .attr("height", height) - .attr("viewBox", [-width / 2 / scale, -height / 2 / scale, width / scale, height / scale]) - - // draw links between nodes - const link = svg - .append("g") - .selectAll("line") - .data(graphData.links) - .join("line") - .attr("class", "link") - .attr("stroke", "var(--lightgray)") - .attr("stroke-width", 1) - - // svg groups - const graphNode = svg.append("g").selectAll("g").data(graphData.nodes).enter().append("g") - - // calculate color - const color = (d: NodeData) => { - const isCurrent = d.id === slug - if (isCurrent) { - return "var(--secondary)" - } else if (visited.has(d.id) || d.id.startsWith("tags/")) { - return "var(--tertiary)" - } else { - return "var(--gray)" - } - } - - const drag = (simulation: d3.Simulation) => { - function dragstarted(event: any, d: NodeData) { - if (!event.active) simulation.alphaTarget(1).restart() - d.fx = d.x - d.fy = d.y - } - - function dragged(event: any, d: NodeData) { - d.fx = event.x - d.fy = event.y - } - - function dragended(event: any, d: NodeData) { - if (!event.active) simulation.alphaTarget(0) - d.fx = null - d.fy = null - } - - const noop = () => {} - return d3 - .drag() - .on("start", enableDrag ? dragstarted : noop) - .on("drag", enableDrag ? dragged : noop) - .on("end", enableDrag ? dragended : noop) - } - - function nodeRadius(d: NodeData) { - const numLinks = links.filter((l: any) => l.source.id === d.id || l.target.id === d.id).length - return 2 + Math.sqrt(numLinks) - } - - // draw individual nodes - const node = graphNode - .append("circle") - .attr("class", "node") - .attr("id", (d) => d.id) - .attr("r", nodeRadius) - .attr("fill", color) - .style("cursor", "pointer") - .on("click", (_, d) => { - const targ = resolveRelative(fullSlug, d.id) - window.spaNavigate(new URL(targ, window.location.toString())) - }) - .on("mouseover", function (_, d) { - const neighbours: SimpleSlug[] = data[fullSlug].links ?? [] - const neighbourNodes = d3 - .selectAll(".node") - .filter((d) => neighbours.includes(d.id)) - const currentId = d.id - const linkNodes = d3 - .selectAll(".link") - .filter((d: any) => d.source.id === currentId || d.target.id === currentId) - - // highlight neighbour nodes - neighbourNodes.transition().duration(200).attr("fill", color) - - // highlight links - linkNodes.transition().duration(200).attr("stroke", "var(--gray)").attr("stroke-width", 1) - - const bigFont = fontSize * 1.5 - - // show text for self - const parent = this.parentNode as HTMLElement - d3.select(parent) - .raise() - .select("text") - .transition() - .duration(200) - .attr("opacityOld", d3.select(parent).select("text").style("opacity")) - .style("opacity", 1) - .style("font-size", bigFont + "em") - }) - .on("mouseleave", function (_, d) { - const currentId = d.id - const linkNodes = d3 - .selectAll(".link") - .filter((d: any) => d.source.id === currentId || d.target.id === currentId) - - linkNodes.transition().duration(200).attr("stroke", "var(--lightgray)") - - const parent = this.parentNode as HTMLElement - d3.select(parent) - .select("text") - .transition() - .duration(200) - .style("opacity", d3.select(parent).select("text").attr("opacityOld")) - .style("font-size", fontSize + "em") - }) - // @ts-ignore - .call(drag(simulation)) - - // draw labels - const labels = graphNode - .append("text") - .attr("dx", 0) - .attr("dy", (d) => -nodeRadius(d) + "px") - .attr("text-anchor", "middle") - .text((d) => d.text) - .style("opacity", (opacityScale - 1) / 3.75) - .style("pointer-events", "none") - .style("font-size", fontSize + "em") - .raise() - // @ts-ignore - .call(drag(simulation)) - - // set panning - if (enableZoom) { - svg.call( - d3 - .zoom() - .extent([ - [0, 0], - [width, height], - ]) - .scaleExtent([0.25, 4]) - .on("zoom", ({ transform }) => { - link.attr("transform", transform) - node.attr("transform", transform) - const scale = transform.k * opacityScale - const scaledOpacity = Math.max((scale - 1) / 3.75, 0) - labels.attr("transform", transform).style("opacity", scaledOpacity) - }), - ) - } - - // progress the simulation - simulation.on("tick", () => { - link - .attr("x1", (d: any) => d.source.x) - .attr("y1", (d: any) => d.source.y) - .attr("x2", (d: any) => d.target.x) - .attr("y2", (d: any) => d.target.y) - node.attr("cx", (d: any) => d.x).attr("cy", (d: any) => d.y) - labels.attr("x", (d: any) => d.x).attr("y", (d: any) => d.y) - }) -} - -function renderGlobalGraph() { - const slug = getFullSlug(window) - const container = document.getElementById("global-graph-outer") - const sidebar = container?.closest(".sidebar") as HTMLElement - container?.classList.add("active") - if (sidebar) { - sidebar.style.zIndex = "1" - } - - renderGraph("global-graph-container", slug) - - function hideGlobalGraph() { - container?.classList.remove("active") - const graph = document.getElementById("global-graph-container") - if (sidebar) { - sidebar.style.zIndex = "unset" - } - if (!graph) return - removeAllChildren(graph) - } - - registerEscapeHandler(container, hideGlobalGraph) -} - -document.addEventListener("nav", async (e: unknown) => { - const slug = (e as CustomEventMap["nav"]).detail.url - addToVisited(slug) - await renderGraph("graph-container", slug) - - const containerIcon = document.getElementById("global-graph-icon") - containerIcon?.removeEventListener("click", renderGlobalGraph) - containerIcon?.addEventListener("click", renderGlobalGraph) -}) diff --git a/quartz/components/scripts/plausible.inline.ts b/quartz/components/scripts/plausible.inline.ts deleted file mode 100644 index 704f5d5..0000000 --- a/quartz/components/scripts/plausible.inline.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Plausible from "plausible-tracker" -const { trackPageview } = Plausible() -document.addEventListener("nav", () => trackPageview()) diff --git a/quartz/components/scripts/popover.inline.ts b/quartz/components/scripts/popover.inline.ts deleted file mode 100644 index ed3c925..0000000 --- a/quartz/components/scripts/popover.inline.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { computePosition, flip, inline, shift } from "@floating-ui/dom" - -// from micromorph/src/utils.ts -// https://github.com/natemoo-re/micromorph/blob/main/src/utils.ts#L5 -export function normalizeRelativeURLs(el: Element | Document, base: string | URL) { - const update = (el: Element, attr: string, base: string | URL) => { - el.setAttribute(attr, new URL(el.getAttribute(attr)!, base).pathname) - } - - el.querySelectorAll('[href^="./"], [href^="../"]').forEach((item) => update(item, "href", base)) - - el.querySelectorAll('[src^="./"], [src^="../"]').forEach((item) => update(item, "src", base)) -} - -const p = new DOMParser() -async function mouseEnterHandler( - this: HTMLLinkElement, - { clientX, clientY }: { clientX: number; clientY: number }, -) { - const link = this - async function setPosition(popoverElement: HTMLElement) { - const { x, y } = await computePosition(link, popoverElement, { - middleware: [inline({ x: clientX, y: clientY }), shift(), flip()], - }) - Object.assign(popoverElement.style, { - left: `${x}px`, - top: `${y}px`, - }) - } - - // dont refetch if there's already a popover - if ([...link.children].some((child) => child.classList.contains("popover"))) { - return setPosition(link.lastChild as HTMLElement) - } - - const thisUrl = new URL(document.location.href) - thisUrl.hash = "" - thisUrl.search = "" - const targetUrl = new URL(link.href) - const hash = targetUrl.hash - targetUrl.hash = "" - targetUrl.search = "" - // prevent hover of the same page - if (thisUrl.toString() === targetUrl.toString()) return - - const contents = await fetch(`${targetUrl}`) - .then((res) => res.text()) - .catch((err) => { - console.error(err) - }) - - if (!contents) return - const html = p.parseFromString(contents, "text/html") - normalizeRelativeURLs(html, targetUrl) - const elts = [...html.getElementsByClassName("popover-hint")] - if (elts.length === 0) return - - const popoverElement = document.createElement("div") - popoverElement.classList.add("popover") - const popoverInner = document.createElement("div") - popoverInner.classList.add("popover-inner") - popoverElement.appendChild(popoverInner) - elts.forEach((elt) => popoverInner.appendChild(elt)) - - setPosition(popoverElement) - link.appendChild(popoverElement) - - if (hash !== "") { - const heading = popoverInner.querySelector(hash) as HTMLElement | null - if (heading) { - // leave ~12px of buffer when scrolling to a heading - popoverInner.scroll({ top: heading.offsetTop - 12, behavior: "instant" }) - } - } -} - -document.addEventListener("nav", () => { - const links = [...document.getElementsByClassName("internal")] as HTMLLinkElement[] - for (const link of links) { - link.removeEventListener("mouseenter", mouseEnterHandler) - link.addEventListener("mouseenter", mouseEnterHandler) - } -}) diff --git a/quartz/components/scripts/search.inline.ts b/quartz/components/scripts/search.inline.ts deleted file mode 100644 index a1c3e6c..0000000 --- a/quartz/components/scripts/search.inline.ts +++ /dev/null @@ -1,353 +0,0 @@ -import { Document, SimpleDocumentSearchResultSetUnit } from "flexsearch" -import { ContentDetails } from "../../plugins/emitters/contentIndex" -import { registerEscapeHandler, removeAllChildren } from "./util" -import { FullSlug, resolveRelative } from "../../util/path" - -interface Item { - id: number - slug: FullSlug - title: string - content: string - tags: string[] -} - -let index: Document | undefined = undefined - -// Can be expanded with things like "term" in the future -type SearchType = "basic" | "tags" - -// Current searchType -let searchType: SearchType = "basic" - -const contextWindowWords = 30 -const numSearchResults = 5 -const numTagResults = 3 -function highlight(searchTerm: string, text: string, trim?: boolean) { - // try to highlight longest tokens first - const tokenizedTerms = searchTerm - .split(/\s+/) - .filter((t) => t !== "") - .sort((a, b) => b.length - a.length) - let tokenizedText = text.split(/\s+/).filter((t) => t !== "") - - let startIndex = 0 - let endIndex = tokenizedText.length - 1 - if (trim) { - const includesCheck = (tok: string) => - tokenizedTerms.some((term) => tok.toLowerCase().startsWith(term.toLowerCase())) - const occurencesIndices = tokenizedText.map(includesCheck) - - let bestSum = 0 - let bestIndex = 0 - for (let i = 0; i < Math.max(tokenizedText.length - contextWindowWords, 0); i++) { - const window = occurencesIndices.slice(i, i + contextWindowWords) - const windowSum = window.reduce((total, cur) => total + (cur ? 1 : 0), 0) - if (windowSum >= bestSum) { - bestSum = windowSum - bestIndex = i - } - } - - startIndex = Math.max(bestIndex - contextWindowWords, 0) - endIndex = Math.min(startIndex + 2 * contextWindowWords, tokenizedText.length - 1) - tokenizedText = tokenizedText.slice(startIndex, endIndex) - } - - const slice = tokenizedText - .map((tok) => { - // see if this tok is prefixed by any search terms - for (const searchTok of tokenizedTerms) { - if (tok.toLowerCase().includes(searchTok.toLowerCase())) { - const regex = new RegExp(searchTok.toLowerCase(), "gi") - return tok.replace(regex, `$&`) - } - } - return tok - }) - .join(" ") - - return `${startIndex === 0 ? "" : "..."}${slice}${ - endIndex === tokenizedText.length - 1 ? "" : "..." - }` -} - -const encoder = (str: string) => str.toLowerCase().split(/([^a-z]|[^\x00-\x7F])/) -let prevShortcutHandler: ((e: HTMLElementEventMap["keydown"]) => void) | undefined = undefined -document.addEventListener("nav", async (e: unknown) => { - const currentSlug = (e as CustomEventMap["nav"]).detail.url - - const data = await fetchData - const container = document.getElementById("search-container") - const sidebar = container?.closest(".sidebar") as HTMLElement - const searchIcon = document.getElementById("search-icon") - const searchBar = document.getElementById("search-bar") as HTMLInputElement | null - const results = document.getElementById("results-container") - const resultCards = document.getElementsByClassName("result-card") - const idDataMap = Object.keys(data) as FullSlug[] - - function hideSearch() { - container?.classList.remove("active") - if (searchBar) { - searchBar.value = "" // clear the input when we dismiss the search - } - if (sidebar) { - sidebar.style.zIndex = "unset" - } - if (results) { - removeAllChildren(results) - } - - searchType = "basic" // reset search type after closing - } - - function showSearch(searchTypeNew: SearchType) { - searchType = searchTypeNew - if (sidebar) { - sidebar.style.zIndex = "1" - } - container?.classList.add("active") - searchBar?.focus() - } - - function shortcutHandler(e: HTMLElementEventMap["keydown"]) { - if (e.key === "k" && (e.ctrlKey || e.metaKey) && !e.shiftKey) { - e.preventDefault() - const searchBarOpen = container?.classList.contains("active") - searchBarOpen ? hideSearch() : showSearch("basic") - } else if (e.shiftKey && (e.ctrlKey || e.metaKey) && e.key.toLowerCase() === "k") { - // Hotkey to open tag search - e.preventDefault() - const searchBarOpen = container?.classList.contains("active") - searchBarOpen ? hideSearch() : showSearch("tags") - - // add "#" prefix for tag search - if (searchBar) searchBar.value = "#" - } else if (e.key === "Enter") { - // If result has focus, navigate to that one, otherwise pick first result - if (results?.contains(document.activeElement)) { - const active = document.activeElement as HTMLInputElement - active.click() - } else { - const anchor = document.getElementsByClassName("result-card")[0] as HTMLInputElement | null - anchor?.click() - } - } else if (e.key === "ArrowDown") { - e.preventDefault() - // When first pressing ArrowDown, results wont contain the active element, so focus first element - if (!results?.contains(document.activeElement)) { - const firstResult = resultCards[0] as HTMLInputElement | null - firstResult?.focus() - } else { - // If an element in results-container already has focus, focus next one - const nextResult = document.activeElement?.nextElementSibling as HTMLInputElement | null - nextResult?.focus() - } - } else if (e.key === "ArrowUp") { - e.preventDefault() - if (results?.contains(document.activeElement)) { - // If an element in results-container already has focus, focus previous one - const prevResult = document.activeElement?.previousElementSibling as HTMLInputElement | null - prevResult?.focus() - } - } - } - - function trimContent(content: string) { - // works without escaping html like in `description.ts` - const sentences = content.replace(/\s+/g, " ").split(".") - let finalDesc = "" - let sentenceIdx = 0 - - // Roughly estimate characters by (words * 5). Matches description length in `description.ts`. - const len = contextWindowWords * 5 - while (finalDesc.length < len) { - const sentence = sentences[sentenceIdx] - if (!sentence) break - finalDesc += sentence + "." - sentenceIdx++ - } - - // If more content would be available, indicate it by finishing with "..." - if (finalDesc.length < content.length) { - finalDesc += ".." - } - - return finalDesc - } - - const formatForDisplay = (term: string, id: number) => { - const slug = idDataMap[id] - return { - id, - slug, - title: searchType === "tags" ? data[slug].title : highlight(term, data[slug].title ?? ""), - // if searchType is tag, display context from start of file and trim, otherwise use regular highlight - content: - searchType === "tags" - ? trimContent(data[slug].content) - : highlight(term, data[slug].content ?? "", true), - tags: highlightTags(term, data[slug].tags), - } - } - - function highlightTags(term: string, tags: string[]) { - if (tags && searchType === "tags") { - // Find matching tags - const termLower = term.toLowerCase() - let matching = tags.filter((str) => str.includes(termLower)) - - // Substract matching from original tags, then push difference - if (matching.length > 0) { - let difference = tags.filter((x) => !matching.includes(x)) - - // Convert to html (cant be done later as matches/term dont get passed to `resultToHTML`) - matching = matching.map((tag) => `
      • #${tag}

      • `) - difference = difference.map((tag) => `
      • #${tag}

      • `) - matching.push(...difference) - } - - // Only allow max of `numTagResults` in preview - if (tags.length > numTagResults) { - matching.splice(numTagResults) - } - - return matching - } else { - return [] - } - } - - const resultToHTML = ({ slug, title, content, tags }: Item) => { - const htmlTags = tags.length > 0 ? `
          ${tags.join("")}
        ` : `` - const button = document.createElement("button") - button.classList.add("result-card") - button.id = slug - button.innerHTML = `

        ${title}

        ${htmlTags}

        ${content}

        ` - button.addEventListener("click", () => { - const targ = resolveRelative(currentSlug, slug) - window.spaNavigate(new URL(targ, window.location.toString())) - hideSearch() - }) - return button - } - - function displayResults(finalResults: Item[]) { - if (!results) return - - removeAllChildren(results) - if (finalResults.length === 0) { - results.innerHTML = `` - } else { - results.append(...finalResults.map(resultToHTML)) - } - } - - async function onType(e: HTMLElementEventMap["input"]) { - let term = (e.target as HTMLInputElement).value - let searchResults: SimpleDocumentSearchResultSetUnit[] - - if (term.toLowerCase().startsWith("#")) { - searchType = "tags" - } else { - searchType = "basic" - } - - switch (searchType) { - case "tags": { - term = term.substring(1) - searchResults = - (await index?.searchAsync({ query: term, limit: numSearchResults, index: ["tags"] })) ?? - [] - break - } - case "basic": - default: { - searchResults = - (await index?.searchAsync({ - query: term, - limit: numSearchResults, - index: ["title", "content"], - })) ?? [] - } - } - - const getByField = (field: string): number[] => { - const results = searchResults.filter((x) => x.field === field) - return results.length === 0 ? [] : ([...results[0].result] as number[]) - } - - // order titles ahead of content - const allIds: Set = new Set([ - ...getByField("title"), - ...getByField("content"), - ...getByField("tags"), - ]) - const finalResults = [...allIds].map((id) => formatForDisplay(term, id)) - displayResults(finalResults) - } - - if (prevShortcutHandler) { - document.removeEventListener("keydown", prevShortcutHandler) - } - - document.addEventListener("keydown", shortcutHandler) - prevShortcutHandler = shortcutHandler - searchIcon?.removeEventListener("click", () => showSearch("basic")) - searchIcon?.addEventListener("click", () => showSearch("basic")) - searchBar?.removeEventListener("input", onType) - searchBar?.addEventListener("input", onType) - - // setup index if it hasn't been already - if (!index) { - index = new Document({ - cache: true, - charset: "latin:extra", - optimize: true, - encode: encoder, - document: { - id: "id", - index: [ - { - field: "title", - tokenize: "reverse", - }, - { - field: "content", - tokenize: "reverse", - }, - { - field: "tags", - tokenize: "reverse", - }, - ], - }, - }) - - fillDocument(index, data) - } - - // register handlers - registerEscapeHandler(container, hideSearch) -}) - -/** - * Fills flexsearch document with data - * @param index index to fill - * @param data data to fill index with - */ -async function fillDocument(index: Document, data: any) { - let id = 0 - for (const [slug, fileData] of Object.entries(data)) { - await index.addAsync(id, { - id, - slug: slug as FullSlug, - title: fileData.title, - content: fileData.content, - tags: fileData.tags, - }) - id++ - } -} diff --git a/quartz/components/scripts/spa.inline.ts b/quartz/components/scripts/spa.inline.ts deleted file mode 100644 index bd22608..0000000 --- a/quartz/components/scripts/spa.inline.ts +++ /dev/null @@ -1,155 +0,0 @@ -import micromorph from "micromorph" -import { FullSlug, RelativeURL, getFullSlug } from "../../util/path" - -// adapted from `micromorph` -// https://github.com/natemoo-re/micromorph - -const NODE_TYPE_ELEMENT = 1 -let announcer = document.createElement("route-announcer") -const isElement = (target: EventTarget | null): target is Element => - (target as Node)?.nodeType === NODE_TYPE_ELEMENT -const isLocalUrl = (href: string) => { - try { - const url = new URL(href) - if (window.location.origin === url.origin) { - return true - } - } catch (e) {} - return false -} - -const getOpts = ({ target }: Event): { url: URL; scroll?: boolean } | undefined => { - if (!isElement(target)) return - const a = target.closest("a") - if (!a) return - if ("routerIgnore" in a.dataset) return - const { href } = a - if (!isLocalUrl(href)) return - return { url: new URL(href), scroll: "routerNoscroll" in a.dataset ? false : undefined } -} - -function notifyNav(url: FullSlug) { - const event: CustomEventMap["nav"] = new CustomEvent("nav", { detail: { url } }) - document.dispatchEvent(event) -} - -let p: DOMParser -async function navigate(url: URL, isBack: boolean = false) { - p = p || new DOMParser() - const contents = await fetch(`${url}`) - .then((res) => res.text()) - .catch(() => { - window.location.assign(url) - }) - - if (!contents) return - - const html = p.parseFromString(contents, "text/html") - let title = html.querySelector("title")?.textContent - if (title) { - document.title = title - } else { - const h1 = document.querySelector("h1") - title = h1?.innerText ?? h1?.textContent ?? url.pathname - } - if (announcer.textContent !== title) { - announcer.textContent = title - } - announcer.dataset.persist = "" - html.body.appendChild(announcer) - - // morph body - micromorph(document.body, html.body) - - // scroll into place and add history - if (!isBack) { - if (url.hash) { - const el = document.getElementById(decodeURIComponent(url.hash.substring(1))) - el?.scrollIntoView() - } else { - window.scrollTo({ top: 0 }) - } - } - - // now, patch head - const elementsToRemove = document.head.querySelectorAll(":not([spa-preserve])") - elementsToRemove.forEach((el) => el.remove()) - const elementsToAdd = html.head.querySelectorAll(":not([spa-preserve])") - elementsToAdd.forEach((el) => document.head.appendChild(el)) - - // delay setting the url until now - // at this point everything is loaded so changing the url should resolve to the correct addresses - if (!isBack) { - history.pushState({}, "", url) - } - notifyNav(getFullSlug(window)) - delete announcer.dataset.persist -} - -window.spaNavigate = navigate - -function createRouter() { - if (typeof window !== "undefined") { - window.addEventListener("click", async (event) => { - const { url } = getOpts(event) ?? {} - if (!url) return - event.preventDefault() - try { - navigate(url, false) - } catch (e) { - window.location.assign(url) - } - }) - - window.addEventListener("popstate", (event) => { - const { url } = getOpts(event) ?? {} - if (window.location.hash && window.location.pathname === url?.pathname) return - try { - navigate(new URL(window.location.toString()), true) - } catch (e) { - window.location.reload() - } - return - }) - } - - return new (class Router { - go(pathname: RelativeURL) { - const url = new URL(pathname, window.location.toString()) - return navigate(url, false) - } - - back() { - return window.history.back() - } - - forward() { - return window.history.forward() - } - })() -} - -createRouter() -notifyNav(getFullSlug(window)) - -if (!customElements.get("route-announcer")) { - const attrs = { - "aria-live": "assertive", - "aria-atomic": "true", - style: - "position: absolute; left: 0; top: 0; clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; white-space: nowrap; width: 1px; height: 1px", - } - customElements.define( - "route-announcer", - class RouteAnnouncer extends HTMLElement { - constructor() { - super() - } - connectedCallback() { - for (const [key, value] of Object.entries(attrs)) { - this.setAttribute(key, value) - } - } - }, - ) -} diff --git a/quartz/components/scripts/toc.inline.ts b/quartz/components/scripts/toc.inline.ts deleted file mode 100644 index f33d8f5..0000000 --- a/quartz/components/scripts/toc.inline.ts +++ /dev/null @@ -1,42 +0,0 @@ -const bufferPx = 150 -const observer = new IntersectionObserver((entries) => { - for (const entry of entries) { - const slug = entry.target.id - const tocEntryElement = document.querySelector(`a[data-for="${slug}"]`) - const windowHeight = entry.rootBounds?.height - if (windowHeight && tocEntryElement) { - if (entry.boundingClientRect.y < windowHeight) { - tocEntryElement.classList.add("in-view") - } else { - tocEntryElement.classList.remove("in-view") - } - } - } -}) - -function toggleToc(this: HTMLElement) { - this.classList.toggle("collapsed") - const content = this.nextElementSibling as HTMLElement - content.classList.toggle("collapsed") - content.style.maxHeight = content.style.maxHeight === "0px" ? content.scrollHeight + "px" : "0px" -} - -function setupToc() { - const toc = document.getElementById("toc") - if (toc) { - const content = toc.nextElementSibling as HTMLElement - content.style.maxHeight = content.scrollHeight + "px" - toc.removeEventListener("click", toggleToc) - toc.addEventListener("click", toggleToc) - } -} - -window.addEventListener("resize", setupToc) -document.addEventListener("nav", () => { - setupToc() - - // update toc entry highlighting - observer.disconnect() - const headers = document.querySelectorAll("h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]") - headers.forEach((header) => observer.observe(header)) -}) diff --git a/quartz/components/scripts/util.ts b/quartz/components/scripts/util.ts deleted file mode 100644 index 5fcabad..0000000 --- a/quartz/components/scripts/util.ts +++ /dev/null @@ -1,25 +0,0 @@ -export function registerEscapeHandler(outsideContainer: HTMLElement | null, cb: () => void) { - if (!outsideContainer) return - function click(this: HTMLElement, e: HTMLElementEventMap["click"]) { - if (e.target !== this) return - e.preventDefault() - cb() - } - - function esc(e: HTMLElementEventMap["keydown"]) { - if (!e.key.startsWith("Esc")) return - e.preventDefault() - cb() - } - - outsideContainer?.removeEventListener("click", click) - outsideContainer?.addEventListener("click", click) - document.removeEventListener("keydown", esc) - document.addEventListener("keydown", esc) -} - -export function removeAllChildren(node: HTMLElement) { - while (node.firstChild) { - node.removeChild(node.firstChild) - } -} diff --git a/quartz/components/styles/backlinks.scss b/quartz/components/styles/backlinks.scss deleted file mode 100644 index 04302f2..0000000 --- a/quartz/components/styles/backlinks.scss +++ /dev/null @@ -1,20 +0,0 @@ -.backlinks { - position: relative; - - & > h3 { - font-size: 1rem; - margin: 0; - } - - & > ul { - list-style: none; - padding: 0; - margin: 0.5rem 0; - - & > li { - & > a { - background-color: transparent; - } - } - } -} diff --git a/quartz/components/styles/clipboard.scss b/quartz/components/styles/clipboard.scss deleted file mode 100644 index a585c7b..0000000 --- a/quartz/components/styles/clipboard.scss +++ /dev/null @@ -1,36 +0,0 @@ -.clipboard-button { - position: absolute; - display: flex; - float: right; - right: 0; - padding: 0.4rem; - margin: -0.2rem 0.3rem; - color: var(--gray); - border-color: var(--dark); - background-color: var(--light); - border: 1px solid; - border-radius: 5px; - opacity: 0; - transition: 0.2s; - - & > svg { - fill: var(--light); - filter: contrast(0.3); - } - - &:hover { - cursor: pointer; - border-color: var(--secondary); - } - - &:focus { - outline: 0; - } -} - -pre { - &:hover > .clipboard-button { - opacity: 1; - transition: 0.2s; - } -} diff --git a/quartz/components/styles/darkmode.scss b/quartz/components/styles/darkmode.scss deleted file mode 100644 index 348c6f7..0000000 --- a/quartz/components/styles/darkmode.scss +++ /dev/null @@ -1,48 +0,0 @@ -.darkmode { - position: relative; - width: 20px; - height: 20px; - margin: 0 10px; - - & > .toggle { - display: none; - box-sizing: border-box; - } - - & svg { - cursor: pointer; - opacity: 0; - position: absolute; - width: 20px; - height: 20px; - top: calc(50% - 10px); - fill: var(--darkgray); - transition: opacity 0.1s ease; - } -} - -:root[saved-theme="dark"] { - color-scheme: dark; -} - -:root[saved-theme="light"] { - color-scheme: light; -} - -:root[saved-theme="dark"] .toggle ~ label { - & > #dayIcon { - opacity: 0; - } - & > #nightIcon { - opacity: 1; - } -} - -:root .toggle ~ label { - & > #dayIcon { - opacity: 1; - } - & > #nightIcon { - opacity: 0; - } -} diff --git a/quartz/components/styles/explorer.scss b/quartz/components/styles/explorer.scss deleted file mode 100644 index 776a5ae..0000000 --- a/quartz/components/styles/explorer.scss +++ /dev/null @@ -1,142 +0,0 @@ -button#explorer { - background-color: transparent; - border: none; - text-align: left; - cursor: pointer; - padding: 0; - color: var(--dark); - display: flex; - align-items: center; - - & h3 { - font-size: 1rem; - display: inline-block; - margin: 0; - } - - & .fold { - margin-left: 0.5rem; - transition: transform 0.3s ease; - opacity: 0.8; - } - - &.collapsed .fold { - transform: rotateZ(-90deg); - } -} - -.folder-outer { - display: grid; - grid-template-rows: 0fr; - transition: grid-template-rows 0.3s ease-in-out; -} - -.folder-outer.open { - grid-template-rows: 1fr; -} - -.folder-outer > ul { - overflow: hidden; -} - -#explorer-content { - list-style: none; - overflow: hidden; - max-height: none; - transition: max-height 0.35s ease; - margin-top: 0.5rem; - - &.collapsed > .overflow::after { - opacity: 0; - } - - & ul { - list-style: none; - margin: 0.08rem 0; - padding: 0; - transition: - max-height 0.35s ease, - transform 0.35s ease, - opacity 0.2s ease; - & div > li > a { - color: var(--dark); - opacity: 0.75; - pointer-events: all; - } - } -} - -svg { - pointer-events: all; - - & > polyline { - pointer-events: none; - } -} - -.folder-container { - flex-direction: row; - display: flex; - align-items: center; - user-select: none; - - & li > a { - // other selector is more specific, needs important - color: var(--secondary) !important; - opacity: 1 !important; - font-size: 1.05rem !important; - } - - & li > a:hover { - // other selector is more specific, needs important - color: var(--tertiary) !important; - } - - & li > button { - color: var(--dark); - background-color: transparent; - border: none; - text-align: left; - cursor: pointer; - padding-left: 0; - padding-right: 0; - display: flex; - align-items: center; - - & h3 { - font-size: 0.95rem; - display: inline-block; - color: var(--secondary); - font-weight: 600; - margin: 0; - line-height: 1.5rem; - font-weight: bold; - pointer-events: none; - } - } -} - -.folder-icon { - margin-right: 5px; - color: var(--secondary); - cursor: pointer; - transition: transform 0.3s ease; - backface-visibility: visible; -} - -div:has(> .folder-outer:not(.open)) > .folder-container > svg { - transform: rotate(-90deg); -} - -.folder-icon:hover { - color: var(--tertiary); -} - -.no-background::after { - background: none !important; -} - -#explorer-end { - // needs height so IntersectionObserver gets triggered - height: 1px; -} diff --git a/quartz/components/styles/footer.scss b/quartz/components/styles/footer.scss deleted file mode 100644 index 9c8dbf8..0000000 --- a/quartz/components/styles/footer.scss +++ /dev/null @@ -1,15 +0,0 @@ -footer { - text-align: left; - margin-bottom: 4rem; - opacity: 0.7; - - & ul { - list-style: none; - margin: 0; - padding: 0; - display: flex; - flex-direction: row; - gap: 1rem; - margin-top: -1rem; - } -} diff --git a/quartz/components/styles/graph.scss b/quartz/components/styles/graph.scss deleted file mode 100644 index 3deaa1f..0000000 --- a/quartz/components/styles/graph.scss +++ /dev/null @@ -1,70 +0,0 @@ -@use "../../styles/variables.scss" as *; - -.graph { - & > h3 { - font-size: 1rem; - margin: 0; - } - - & > .graph-outer { - border-radius: 5px; - border: 1px solid var(--lightgray); - box-sizing: border-box; - height: 250px; - margin: 0.5em 0; - position: relative; - overflow: hidden; - - & > #global-graph-icon { - color: var(--dark); - opacity: 0.5; - width: 18px; - height: 18px; - position: absolute; - padding: 0.2rem; - margin: 0.3rem; - top: 0; - right: 0; - border-radius: 4px; - background-color: transparent; - transition: background-color 0.5s ease; - cursor: pointer; - &:hover { - background-color: var(--lightgray); - } - } - } - - & > #global-graph-outer { - position: fixed; - z-index: 9999; - left: 0; - top: 0; - width: 100vw; - height: 100%; - backdrop-filter: blur(4px); - display: none; - overflow: hidden; - - &.active { - display: inline-block; - } - - & > #global-graph-container { - border: 1px solid var(--lightgray); - background-color: var(--light); - border-radius: 5px; - box-sizing: border-box; - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - height: 60vh; - width: 50vw; - - @media all and (max-width: $fullPageWidth) { - width: 90%; - } - } - } -} diff --git a/quartz/components/styles/legacyToc.scss b/quartz/components/styles/legacyToc.scss deleted file mode 100644 index 7a98f34..0000000 --- a/quartz/components/styles/legacyToc.scss +++ /dev/null @@ -1,27 +0,0 @@ -details#toc { - & summary { - cursor: pointer; - - &::marker { - color: var(--dark); - } - - & > * { - padding-left: 0.25rem; - display: inline-block; - margin: 0; - } - } - - & ul { - list-style: none; - margin: 0.5rem 1.25rem; - padding: 0; - } - - @for $i from 1 through 6 { - & .depth-#{$i} { - padding-left: calc(1rem * #{$i}); - } - } -} diff --git a/quartz/components/styles/listPage.scss b/quartz/components/styles/listPage.scss deleted file mode 100644 index 7105a1e..0000000 --- a/quartz/components/styles/listPage.scss +++ /dev/null @@ -1,45 +0,0 @@ -@use "../../styles/variables.scss" as *; - -ul.section-ul { - list-style: none; - margin-top: 2em; - padding-left: 0; -} - -li.section-li { - margin-bottom: 1em; - - & > .section { - display: grid; - grid-template-columns: 6em 3fr 1fr; - - @media all and (max-width: $mobileBreakpoint) { - & > .tags { - display: none; - } - } - - & > .tags { - justify-self: end; - margin-left: 1rem; - } - - & > .desc > h3 > a { - background-color: transparent; - } - - & > .meta { - margin: 0; - flex-basis: 6em; - opacity: 0.6; - } - } -} - -// modifications in popover context -.popover .section { - grid-template-columns: 6em 1fr !important; - & > .tags { - display: none; - } -} diff --git a/quartz/components/styles/popover.scss b/quartz/components/styles/popover.scss deleted file mode 100644 index fae0e12..0000000 --- a/quartz/components/styles/popover.scss +++ /dev/null @@ -1,60 +0,0 @@ -@use "../../styles/variables.scss" as *; - -@keyframes dropin { - 0% { - opacity: 0; - visibility: hidden; - } - 1% { - opacity: 0; - } - 100% { - opacity: 1; - visibility: visible; - } -} - -.popover { - z-index: 999; - position: absolute; - overflow: visible; - padding: 1rem; - - & > .popover-inner { - position: relative; - width: 30rem; - max-height: 20rem; - padding: 0 1rem 1rem 1rem; - font-weight: initial; - line-height: normal; - font-size: initial; - font-family: var(--bodyFont); - border: 1px solid var(--lightgray); - background-color: var(--light); - border-radius: 5px; - box-shadow: 6px 6px 36px 0 rgba(0, 0, 0, 0.25); - overflow: auto; - white-space: normal; - } - - h1 { - font-size: 1.5rem; - } - - visibility: hidden; - opacity: 0; - transition: - opacity 0.3s ease, - visibility 0.3s ease; - - @media all and (max-width: $mobileBreakpoint) { - display: none !important; - } -} - -a:hover .popover, -.popover:hover { - animation: dropin 0.3s ease; - animation-fill-mode: forwards; - animation-delay: 0.2s; -} diff --git a/quartz/components/styles/recentNotes.scss b/quartz/components/styles/recentNotes.scss deleted file mode 100644 index 7267671..0000000 --- a/quartz/components/styles/recentNotes.scss +++ /dev/null @@ -1,24 +0,0 @@ -.recent-notes { - & > h3 { - margin: 0.5rem 0 0 0; - font-size: 1rem; - } - - & > ul.recent-ul { - list-style: none; - margin-top: 1rem; - padding-left: 0; - - & > li { - margin: 1rem 0; - .section > .desc > h3 > a { - background-color: transparent; - } - - .section > .meta { - margin: 0 0 0.5rem 0; - opacity: 0.6; - } - } - } -} diff --git a/quartz/components/styles/search.scss b/quartz/components/styles/search.scss deleted file mode 100644 index 66f809f..0000000 --- a/quartz/components/styles/search.scss +++ /dev/null @@ -1,178 +0,0 @@ -@use "../../styles/variables.scss" as *; - -.search { - min-width: fit-content; - max-width: 14rem; - flex-grow: 0.3; - - & > #search-icon { - background-color: var(--lightgray); - border-radius: 4px; - height: 2rem; - display: flex; - align-items: center; - cursor: pointer; - white-space: nowrap; - - & > div { - flex-grow: 1; - } - - & > p { - display: inline; - padding: 0 1rem; - } - - & svg { - cursor: pointer; - width: 18px; - min-width: 18px; - margin: 0 0.5rem; - - .search-path { - stroke: var(--darkgray); - stroke-width: 2px; - transition: stroke 0.5s ease; - } - } - } - - & > #search-container { - position: fixed; - contain: layout; - z-index: 999; - left: 0; - top: 0; - width: 100vw; - height: 100vh; - overflow-y: auto; - display: none; - backdrop-filter: blur(4px); - - &.active { - display: inline-block; - } - - & > #search-space { - width: 50%; - margin-top: 15vh; - margin-left: auto; - margin-right: auto; - - @media all and (max-width: $fullPageWidth) { - width: 90%; - } - - & > * { - width: 100%; - border-radius: 5px; - background: var(--light); - box-shadow: - 0 14px 50px rgba(27, 33, 48, 0.12), - 0 10px 30px rgba(27, 33, 48, 0.16); - margin-bottom: 2em; - } - - & > input { - box-sizing: border-box; - padding: 0.5em 1em; - font-family: var(--bodyFont); - color: var(--dark); - font-size: 1.1em; - border: 1px solid var(--lightgray); - - &:focus { - outline: none; - } - } - - & > #results-container { - & .result-card { - padding: 1em; - cursor: pointer; - transition: background 0.2s ease; - border: 1px solid var(--lightgray); - border-bottom: none; - width: 100%; - - // normalize button props - font-family: inherit; - font-size: 100%; - line-height: 1.15; - margin: 0; - text-transform: none; - text-align: left; - background: var(--light); - outline: none; - - & .highlight { - color: var(--secondary); - font-weight: 700; - } - - &:hover, - &:focus { - background: var(--lightgray); - } - - &:first-of-type { - border-top-left-radius: 5px; - border-top-right-radius: 5px; - } - - &:last-of-type { - border-bottom-left-radius: 5px; - border-bottom-right-radius: 5px; - border-bottom: 1px solid var(--lightgray); - } - - & > h3 { - margin: 0; - } - - & > ul > li { - margin: 0; - display: inline-block; - white-space: nowrap; - margin: 0; - overflow-wrap: normal; - } - - & > ul { - list-style: none; - display: flex; - padding-left: 0; - gap: 0.4rem; - margin: 0; - margin-top: 0.45rem; - // Offset border radius - margin-left: -2px; - overflow: hidden; - background-clip: border-box; - } - - & > ul > li > p { - border-radius: 8px; - background-color: var(--highlight); - overflow: hidden; - background-clip: border-box; - padding: 0.03rem 0.4rem; - margin: 0; - color: var(--secondary); - opacity: 0.85; - } - - & > ul > li > .match-tag { - color: var(--tertiary); - font-weight: bold; - opacity: 1; - } - - & > p { - margin-bottom: 0; - } - } - } - } - } -} diff --git a/quartz/components/styles/toc.scss b/quartz/components/styles/toc.scss deleted file mode 100644 index 3fac443..0000000 --- a/quartz/components/styles/toc.scss +++ /dev/null @@ -1,59 +0,0 @@ -button#toc { - background-color: transparent; - border: none; - text-align: left; - cursor: pointer; - padding: 0; - color: var(--dark); - display: flex; - align-items: center; - - & h3 { - font-size: 1rem; - display: inline-block; - margin: 0; - } - - & .fold { - margin-left: 0.5rem; - transition: transform 0.3s ease; - opacity: 0.8; - } - - &.collapsed .fold { - transform: rotateZ(-90deg); - } -} - -#toc-content { - list-style: none; - overflow: hidden; - max-height: none; - transition: max-height 0.5s ease; - - &.collapsed > .overflow::after { - opacity: 0; - } - - & ul { - list-style: none; - margin: 0.5rem 0; - padding: 0; - & > li > a { - color: var(--dark); - opacity: 0.35; - transition: - 0.5s ease opacity, - 0.3s ease color; - &.in-view { - opacity: 0.75; - } - } - } - - @for $i from 0 through 6 { - & .depth-#{$i} { - padding-left: calc(1rem * #{$i}); - } - } -} diff --git a/quartz/components/types.ts b/quartz/components/types.ts deleted file mode 100644 index fd9574f..0000000 --- a/quartz/components/types.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { ComponentType, JSX } from "preact" -import { StaticResources } from "../util/resources" -import { QuartzPluginData } from "../plugins/vfile" -import { GlobalConfiguration } from "../cfg" -import { Node } from "hast" - -export type QuartzComponentProps = { - externalResources: StaticResources - fileData: QuartzPluginData - cfg: GlobalConfiguration - children: (QuartzComponent | JSX.Element)[] - tree: Node - allFiles: QuartzPluginData[] - displayClass?: "mobile-only" | "desktop-only" -} & JSX.IntrinsicAttributes & { - [key: string]: any - } - -export type QuartzComponent = ComponentType & { - css?: string - beforeDOMLoaded?: string - afterDOMLoaded?: string -} - -export type QuartzComponentConstructor = ( - opts: Options, -) => QuartzComponent diff --git a/quartz/plugins/emitters/404.tsx b/quartz/plugins/emitters/404.tsx deleted file mode 100644 index cd079a0..0000000 --- a/quartz/plugins/emitters/404.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { QuartzEmitterPlugin } from "../types" -import { QuartzComponentProps } from "../../components/types" -import BodyConstructor from "../../components/Body" -import { pageResources, renderPage } from "../../components/renderPage" -import { FullPageLayout } from "../../cfg" -import { FilePath, FullSlug } from "../../util/path" -import { sharedPageComponents } from "../../../quartz.layout" -import { NotFound } from "../../components" -import { defaultProcessedContent } from "../vfile" - -export const NotFoundPage: QuartzEmitterPlugin = () => { - const opts: FullPageLayout = { - ...sharedPageComponents, - pageBody: NotFound(), - beforeBody: [], - left: [], - right: [], - } - - const { head: Head, pageBody, footer: Footer } = opts - const Body = BodyConstructor() - - return { - name: "404Page", - getQuartzComponents() { - return [Head, Body, pageBody, Footer] - }, - async emit(ctx, _content, resources, emit): Promise { - const cfg = ctx.cfg.configuration - const slug = "404" as FullSlug - - const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) - const path = url.pathname as FullSlug - const externalResources = pageResources(path, resources) - const [tree, vfile] = defaultProcessedContent({ - slug, - text: "Not Found", - description: "Not Found", - frontmatter: { title: "Not Found", tags: [] }, - }) - const componentData: QuartzComponentProps = { - fileData: vfile.data, - externalResources, - cfg, - children: [], - tree, - allFiles: [], - } - - return [ - await emit({ - content: renderPage(slug, componentData, opts, externalResources), - slug, - ext: ".html", - }), - ] - }, - } -} diff --git a/quartz/plugins/emitters/aliases.ts b/quartz/plugins/emitters/aliases.ts deleted file mode 100644 index 942412e..0000000 --- a/quartz/plugins/emitters/aliases.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { FilePath, FullSlug, resolveRelative, simplifySlug } from "../../util/path" -import { QuartzEmitterPlugin } from "../types" -import path from "path" - -export const AliasRedirects: QuartzEmitterPlugin = () => ({ - name: "AliasRedirects", - getQuartzComponents() { - return [] - }, - async emit({ argv }, content, _resources, emit): Promise { - const fps: FilePath[] = [] - - for (const [_tree, file] of content) { - const ogSlug = simplifySlug(file.data.slug!) - const dir = path.posix.relative(argv.directory, path.dirname(file.data.filePath!)) - - let aliases: FullSlug[] = file.data.frontmatter?.aliases ?? file.data.frontmatter?.alias ?? [] - if (typeof aliases === "string") { - aliases = [aliases] - } - - const slugs: FullSlug[] = aliases.map((alias) => path.posix.join(dir, alias) as FullSlug) - const permalink = file.data.frontmatter?.permalink - if (typeof permalink === "string") { - slugs.push(permalink as FullSlug) - } - - for (const slug of slugs) { - const redirUrl = resolveRelative(slug, file.data.slug!) - const fp = await emit({ - content: ` - - - - ${ogSlug} - - - - - - - `, - slug, - ext: ".html", - }) - - fps.push(fp) - } - } - return fps - }, -}) diff --git a/quartz/plugins/emitters/assets.ts b/quartz/plugins/emitters/assets.ts deleted file mode 100644 index edc22d9..0000000 --- a/quartz/plugins/emitters/assets.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { FilePath, joinSegments, slugifyFilePath } from "../../util/path" -import { QuartzEmitterPlugin } from "../types" -import path from "path" -import fs from "fs" -import { glob } from "../../util/glob" - -export const Assets: QuartzEmitterPlugin = () => { - return { - name: "Assets", - getQuartzComponents() { - return [] - }, - async emit({ argv, cfg }, _content, _resources, _emit): Promise { - // glob all non MD/MDX/HTML files in content folder and copy it over - const assetsPath = argv.output - const fps = await glob("**", argv.directory, ["**/*.md", ...cfg.configuration.ignorePatterns]) - const res: FilePath[] = [] - for (const fp of fps) { - const ext = path.extname(fp) - const src = joinSegments(argv.directory, fp) as FilePath - const name = (slugifyFilePath(fp as FilePath, true) + ext) as FilePath - - const dest = joinSegments(assetsPath, name) as FilePath - const dir = path.dirname(dest) as FilePath - await fs.promises.mkdir(dir, { recursive: true }) // ensure dir exists - await fs.promises.copyFile(src, dest) - res.push(dest) - } - - return res - }, - } -} diff --git a/quartz/plugins/emitters/componentResources.ts b/quartz/plugins/emitters/componentResources.ts deleted file mode 100644 index 1290a35..0000000 --- a/quartz/plugins/emitters/componentResources.ts +++ /dev/null @@ -1,202 +0,0 @@ -import { FilePath, FullSlug } from "../../util/path" -import { QuartzEmitterPlugin } from "../types" - -// @ts-ignore -import spaRouterScript from "../../components/scripts/spa.inline" -// @ts-ignore -import plausibleScript from "../../components/scripts/plausible.inline" -// @ts-ignore -import popoverScript from "../../components/scripts/popover.inline" -import styles from "../../styles/base.scss" -import popoverStyle from "../../components/styles/popover.scss" -import { BuildCtx } from "../../util/ctx" -import { StaticResources } from "../../util/resources" -import { QuartzComponent } from "../../components/types" -import { googleFontHref, joinStyles } from "../../util/theme" -import { Features, transform } from "lightningcss" - -type ComponentResources = { - css: string[] - beforeDOMLoaded: string[] - afterDOMLoaded: string[] -} - -function getComponentResources(ctx: BuildCtx): ComponentResources { - const allComponents: Set = new Set() - for (const emitter of ctx.cfg.plugins.emitters) { - const components = emitter.getQuartzComponents(ctx) - for (const component of components) { - allComponents.add(component) - } - } - - const componentResources = { - css: new Set(), - beforeDOMLoaded: new Set(), - afterDOMLoaded: new Set(), - } - - for (const component of allComponents) { - const { css, beforeDOMLoaded, afterDOMLoaded } = component - if (css) { - componentResources.css.add(css) - } - if (beforeDOMLoaded) { - componentResources.beforeDOMLoaded.add(beforeDOMLoaded) - } - if (afterDOMLoaded) { - componentResources.afterDOMLoaded.add(afterDOMLoaded) - } - } - - return { - css: [...componentResources.css], - beforeDOMLoaded: [...componentResources.beforeDOMLoaded], - afterDOMLoaded: [...componentResources.afterDOMLoaded], - } -} - -function joinScripts(scripts: string[]): string { - // wrap with iife to prevent scope collision - return scripts.map((script) => `(function () {${script}})();`).join("\n") -} - -function addGlobalPageResources( - ctx: BuildCtx, - staticResources: StaticResources, - componentResources: ComponentResources, -) { - const cfg = ctx.cfg.configuration - const reloadScript = ctx.argv.serve - - // popovers - if (cfg.enablePopovers) { - componentResources.afterDOMLoaded.push(popoverScript) - componentResources.css.push(popoverStyle) - } - - if (cfg.analytics?.provider === "google") { - const tagId = cfg.analytics.tagId - staticResources.js.push({ - src: `https://www.googletagmanager.com/gtag/js?id=${tagId}`, - contentType: "external", - loadTime: "afterDOMReady", - }) - componentResources.afterDOMLoaded.push(` - window.dataLayer = window.dataLayer || []; - function gtag() { dataLayer.push(arguments); } - gtag(\`js\`, new Date()); - gtag(\`config\`, \`${tagId}\`, { send_page_view: false }); - - document.addEventListener(\`nav\`, () => { - gtag(\`event\`, \`page_view\`, { - page_title: document.title, - page_location: location.href, - }); - });`) - } else if (cfg.analytics?.provider === "plausible") { - componentResources.afterDOMLoaded.push(plausibleScript) - } else if (cfg.analytics?.provider === "umami") { - componentResources.afterDOMLoaded.push(` - const umamiScript = document.createElement("script") - umamiScript.src = "https://analytics.umami.is/script.js" - umamiScript.setAttribute("data-website-id", "${cfg.analytics.websiteId}") - umamiScript.async = true - - document.head.appendChild(umamiScript) - `) - } - - if (cfg.enableSPA) { - componentResources.afterDOMLoaded.push(spaRouterScript) - } else { - componentResources.afterDOMLoaded.push(` - window.spaNavigate = (url, _) => window.location.assign(url) - const event = new CustomEvent("nav", { detail: { url: document.body.dataset.slug } }) - document.dispatchEvent(event)`) - } - - let wsUrl = `ws://localhost:${ctx.argv.wsPort}` - - if (ctx.argv.remoteDevHost) { - wsUrl = `wss://${ctx.argv.remoteDevHost}:${ctx.argv.wsPort}` - } - - if (reloadScript) { - staticResources.js.push({ - loadTime: "afterDOMReady", - contentType: "inline", - script: ` - const socket = new WebSocket('${wsUrl}') - socket.addEventListener('message', () => document.location.reload()) - `, - }) - } -} - -interface Options { - fontOrigin: "googleFonts" | "local" -} - -const defaultOptions: Options = { - fontOrigin: "googleFonts", -} - -export const ComponentResources: QuartzEmitterPlugin = (opts?: Partial) => { - const { fontOrigin } = { ...defaultOptions, ...opts } - return { - name: "ComponentResources", - getQuartzComponents() { - return [] - }, - async emit(ctx, _content, resources, emit): Promise { - // component specific scripts and styles - const componentResources = getComponentResources(ctx) - // important that this goes *after* component scripts - // as the "nav" event gets triggered here and we should make sure - // that everyone else had the chance to register a listener for it - - if (fontOrigin === "googleFonts") { - resources.css.push(googleFontHref(ctx.cfg.configuration.theme)) - } else if (fontOrigin === "local") { - // let the user do it themselves in css - } - - addGlobalPageResources(ctx, resources, componentResources) - - const stylesheet = joinStyles(ctx.cfg.configuration.theme, styles, ...componentResources.css) - const prescript = joinScripts(componentResources.beforeDOMLoaded) - const postscript = joinScripts(componentResources.afterDOMLoaded) - const fps = await Promise.all([ - emit({ - slug: "index" as FullSlug, - ext: ".css", - content: transform({ - filename: "index.css", - code: Buffer.from(stylesheet), - minify: true, - targets: { - safari: (15 << 16) | (6 << 8), // 15.6 - ios_saf: (15 << 16) | (6 << 8), // 15.6 - edge: 115 << 16, - firefox: 102 << 16, - chrome: 109 << 16, - }, - include: Features.MediaQueries, - }).code.toString(), - }), - emit({ - slug: "prescript" as FullSlug, - ext: ".js", - content: prescript, - }), - emit({ - slug: "postscript" as FullSlug, - ext: ".js", - content: postscript, - }), - ]) - return fps - }, - } -} diff --git a/quartz/plugins/emitters/contentIndex.ts b/quartz/plugins/emitters/contentIndex.ts deleted file mode 100644 index 911173e..0000000 --- a/quartz/plugins/emitters/contentIndex.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { Root } from "hast" -import { GlobalConfiguration } from "../../cfg" -import { getDate } from "../../components/Date" -import { escapeHTML } from "../../util/escape" -import { FilePath, FullSlug, SimpleSlug, simplifySlug } from "../../util/path" -import { QuartzEmitterPlugin } from "../types" -import { toHtml } from "hast-util-to-html" -import path from "path" - -export type ContentIndex = Map -export type ContentDetails = { - title: string - links: SimpleSlug[] - tags: string[] - content: string - richContent?: string - date?: Date - description?: string -} - -interface Options { - enableSiteMap: boolean - enableRSS: boolean - rssLimit?: number - rssFullHtml: boolean - includeEmptyFiles: boolean -} - -const defaultOptions: Options = { - enableSiteMap: true, - enableRSS: true, - rssLimit: 10, - rssFullHtml: false, - includeEmptyFiles: true, -} - -function generateSiteMap(cfg: GlobalConfiguration, idx: ContentIndex): string { - const base = cfg.baseUrl ?? "" - const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => ` - https://${base}/${encodeURI(slug)} - ${content.date?.toISOString()} - ` - const urls = Array.from(idx) - .map(([slug, content]) => createURLEntry(simplifySlug(slug), content)) - .join("") - return `${urls}` -} - -function generateRSSFeed(cfg: GlobalConfiguration, idx: ContentIndex, limit?: number): string { - const base = cfg.baseUrl ?? "" - const root = `https://${base}` - - const createURLEntry = (slug: SimpleSlug, content: ContentDetails): string => ` - ${escapeHTML(content.title)} - ${root}/${encodeURI(slug)} - ${root}/${encodeURI(slug)} - ${content.richContent ?? content.description} - ${content.date?.toUTCString()} - ` - - const items = Array.from(idx) - .map(([slug, content]) => createURLEntry(simplifySlug(slug), content)) - .slice(0, limit ?? idx.size) - .join("") - - return ` - - - ${escapeHTML(cfg.pageTitle)} - ${root} - ${!!limit ? `Last ${limit} notes` : "Recent notes"} on ${ - cfg.pageTitle - } - Quartz -- quartz.jzhao.xyz - ${items} - - ` -} - -export const ContentIndex: QuartzEmitterPlugin> = (opts) => { - opts = { ...defaultOptions, ...opts } - return { - name: "ContentIndex", - async emit(ctx, content, _resources, emit) { - const cfg = ctx.cfg.configuration - const emitted: FilePath[] = [] - const linkIndex: ContentIndex = new Map() - for (const [tree, file] of content) { - const slug = file.data.slug! - const date = getDate(ctx.cfg.configuration, file.data) ?? new Date() - if (opts?.includeEmptyFiles || (file.data.text && file.data.text !== "")) { - linkIndex.set(slug, { - title: file.data.frontmatter?.title!, - links: file.data.links ?? [], - tags: file.data.frontmatter?.tags ?? [], - content: file.data.text ?? "", - richContent: opts?.rssFullHtml - ? escapeHTML(toHtml(tree as Root, { allowDangerousHtml: true })) - : undefined, - date: date, - description: file.data.description ?? "", - }) - } - } - - if (opts?.enableSiteMap) { - emitted.push( - await emit({ - content: generateSiteMap(cfg, linkIndex), - slug: "sitemap" as FullSlug, - ext: ".xml", - }), - ) - } - - if (opts?.enableRSS) { - emitted.push( - await emit({ - content: generateRSSFeed(cfg, linkIndex, opts.rssLimit), - slug: "index" as FullSlug, - ext: ".xml", - }), - ) - } - - const fp = path.join("static", "contentIndex") as FullSlug - const simplifiedIndex = Object.fromEntries( - Array.from(linkIndex).map(([slug, content]) => { - // remove description and from content index as nothing downstream - // actually uses it. we only keep it in the index as we need it - // for the RSS feed - delete content.description - delete content.date - return [slug, content] - }), - ) - - emitted.push( - await emit({ - content: JSON.stringify(simplifiedIndex), - slug: fp, - ext: ".json", - }), - ) - - return emitted - }, - getQuartzComponents: () => [], - } -} diff --git a/quartz/plugins/emitters/contentPage.tsx b/quartz/plugins/emitters/contentPage.tsx deleted file mode 100644 index 4542446..0000000 --- a/quartz/plugins/emitters/contentPage.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { QuartzEmitterPlugin } from "../types" -import { QuartzComponentProps } from "../../components/types" -import HeaderConstructor from "../../components/Header" -import BodyConstructor from "../../components/Body" -import { pageResources, renderPage } from "../../components/renderPage" -import { FullPageLayout } from "../../cfg" -import { FilePath, pathToRoot } from "../../util/path" -import { defaultContentPageLayout, sharedPageComponents } from "../../../quartz.layout" -import { Content } from "../../components" - -export const ContentPage: QuartzEmitterPlugin> = (userOpts) => { - const opts: FullPageLayout = { - ...sharedPageComponents, - ...defaultContentPageLayout, - pageBody: Content(), - ...userOpts, - } - - const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts - const Header = HeaderConstructor() - const Body = BodyConstructor() - - return { - name: "ContentPage", - getQuartzComponents() { - return [Head, Header, Body, ...header, ...beforeBody, pageBody, ...left, ...right, Footer] - }, - async emit(ctx, content, resources, emit): Promise { - const cfg = ctx.cfg.configuration - const fps: FilePath[] = [] - const allFiles = content.map((c) => c[1].data) - for (const [tree, file] of content) { - const slug = file.data.slug! - const externalResources = pageResources(pathToRoot(slug), resources) - const componentData: QuartzComponentProps = { - fileData: file.data, - externalResources, - cfg, - children: [], - tree, - allFiles, - } - - const content = renderPage(slug, componentData, opts, externalResources) - const fp = await emit({ - content, - slug, - ext: ".html", - }) - - fps.push(fp) - } - return fps - }, - } -} diff --git a/quartz/plugins/emitters/folderPage.tsx b/quartz/plugins/emitters/folderPage.tsx deleted file mode 100644 index 8632ece..0000000 --- a/quartz/plugins/emitters/folderPage.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { QuartzEmitterPlugin } from "../types" -import { QuartzComponentProps } from "../../components/types" -import HeaderConstructor from "../../components/Header" -import BodyConstructor from "../../components/Body" -import { pageResources, renderPage } from "../../components/renderPage" -import { ProcessedContent, defaultProcessedContent } from "../vfile" -import { FullPageLayout } from "../../cfg" -import path from "path" -import { - FilePath, - FullSlug, - SimpleSlug, - _stripSlashes, - joinSegments, - pathToRoot, - simplifySlug, -} from "../../util/path" -import { defaultListPageLayout, sharedPageComponents } from "../../../quartz.layout" -import { FolderContent } from "../../components" - -export const FolderPage: QuartzEmitterPlugin = (userOpts) => { - const opts: FullPageLayout = { - ...sharedPageComponents, - ...defaultListPageLayout, - pageBody: FolderContent(), - ...userOpts, - } - - const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts - const Header = HeaderConstructor() - const Body = BodyConstructor() - - return { - name: "FolderPage", - getQuartzComponents() { - return [Head, Header, Body, ...header, ...beforeBody, pageBody, ...left, ...right, Footer] - }, - async emit(ctx, content, resources, emit): Promise { - const fps: FilePath[] = [] - const allFiles = content.map((c) => c[1].data) - const cfg = ctx.cfg.configuration - - const folders: Set = new Set( - allFiles.flatMap((data) => { - const slug = data.slug - const folderName = path.dirname(slug ?? "") as SimpleSlug - if (slug && folderName !== "." && folderName !== "tags") { - return [folderName] - } - return [] - }), - ) - - const folderDescriptions: Record = Object.fromEntries( - [...folders].map((folder) => [ - folder, - defaultProcessedContent({ - slug: joinSegments(folder, "index") as FullSlug, - frontmatter: { title: `Folder: ${folder}`, tags: [] }, - }), - ]), - ) - - for (const [tree, file] of content) { - const slug = _stripSlashes(simplifySlug(file.data.slug!)) as SimpleSlug - if (folders.has(slug)) { - folderDescriptions[slug] = [tree, file] - } - } - - for (const folder of folders) { - const slug = joinSegments(folder, "index") as FullSlug - const externalResources = pageResources(pathToRoot(slug), resources) - const [tree, file] = folderDescriptions[folder] - const componentData: QuartzComponentProps = { - fileData: file.data, - externalResources, - cfg, - children: [], - tree, - allFiles, - } - - const content = renderPage(slug, componentData, opts, externalResources) - const fp = await emit({ - content, - slug, - ext: ".html", - }) - - fps.push(fp) - } - return fps - }, - } -} diff --git a/quartz/plugins/emitters/index.ts b/quartz/plugins/emitters/index.ts deleted file mode 100644 index 99a2c54..0000000 --- a/quartz/plugins/emitters/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -export { ContentPage } from "./contentPage" -export { TagPage } from "./tagPage" -export { FolderPage } from "./folderPage" -export { ContentIndex } from "./contentIndex" -export { AliasRedirects } from "./aliases" -export { Assets } from "./assets" -export { Static } from "./static" -export { ComponentResources } from "./componentResources" -export { NotFoundPage } from "./404" diff --git a/quartz/plugins/emitters/static.ts b/quartz/plugins/emitters/static.ts deleted file mode 100644 index 6f5d19d..0000000 --- a/quartz/plugins/emitters/static.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { FilePath, QUARTZ, joinSegments } from "../../util/path" -import { QuartzEmitterPlugin } from "../types" -import fs from "fs" -import { glob } from "../../util/glob" - -export const Static: QuartzEmitterPlugin = () => ({ - name: "Static", - getQuartzComponents() { - return [] - }, - async emit({ argv, cfg }, _content, _resources, _emit): Promise { - const staticPath = joinSegments(QUARTZ, "static") - const fps = await glob("**", staticPath, cfg.configuration.ignorePatterns) - await fs.promises.cp(staticPath, joinSegments(argv.output, "static"), { recursive: true }) - return fps.map((fp) => joinSegments(argv.output, "static", fp)) as FilePath[] - }, -}) diff --git a/quartz/plugins/emitters/tagPage.tsx b/quartz/plugins/emitters/tagPage.tsx deleted file mode 100644 index 6afde2f..0000000 --- a/quartz/plugins/emitters/tagPage.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import { QuartzEmitterPlugin } from "../types" -import { QuartzComponentProps } from "../../components/types" -import HeaderConstructor from "../../components/Header" -import BodyConstructor from "../../components/Body" -import { pageResources, renderPage } from "../../components/renderPage" -import { ProcessedContent, defaultProcessedContent } from "../vfile" -import { FullPageLayout } from "../../cfg" -import { - FilePath, - FullSlug, - getAllSegmentPrefixes, - joinSegments, - pathToRoot, -} from "../../util/path" -import { defaultListPageLayout, sharedPageComponents } from "../../../quartz.layout" -import { TagContent } from "../../components" - -export const TagPage: QuartzEmitterPlugin = (userOpts) => { - const opts: FullPageLayout = { - ...sharedPageComponents, - ...defaultListPageLayout, - pageBody: TagContent(), - ...userOpts, - } - - const { head: Head, header, beforeBody, pageBody, left, right, footer: Footer } = opts - const Header = HeaderConstructor() - const Body = BodyConstructor() - - return { - name: "TagPage", - getQuartzComponents() { - return [Head, Header, Body, ...header, ...beforeBody, pageBody, ...left, ...right, Footer] - }, - async emit(ctx, content, resources, emit): Promise { - const fps: FilePath[] = [] - const allFiles = content.map((c) => c[1].data) - const cfg = ctx.cfg.configuration - - const tags: Set = new Set( - allFiles.flatMap((data) => data.frontmatter?.tags ?? []).flatMap(getAllSegmentPrefixes), - ) - // add base tag - tags.add("index") - - const tagDescriptions: Record = Object.fromEntries( - [...tags].map((tag) => { - const title = tag === "" ? "Tag Index" : `Tag: #${tag}` - return [ - tag, - defaultProcessedContent({ - slug: joinSegments("tags", tag) as FullSlug, - frontmatter: { title, tags: [] }, - }), - ] - }), - ) - - for (const [tree, file] of content) { - const slug = file.data.slug! - if (slug.startsWith("tags/")) { - const tag = slug.slice("tags/".length) - if (tags.has(tag)) { - tagDescriptions[tag] = [tree, file] - } - } - } - - for (const tag of tags) { - const slug = joinSegments("tags", tag) as FullSlug - const externalResources = pageResources(pathToRoot(slug), resources) - const [tree, file] = tagDescriptions[tag] - const componentData: QuartzComponentProps = { - fileData: file.data, - externalResources, - cfg, - children: [], - tree, - allFiles, - } - - const content = renderPage(slug, componentData, opts, externalResources) - const fp = await emit({ - content, - slug: file.data.slug!, - ext: ".html", - }) - - fps.push(fp) - } - return fps - }, - } -} diff --git a/quartz/plugins/filters/draft.ts b/quartz/plugins/filters/draft.ts deleted file mode 100644 index 65e2d6b..0000000 --- a/quartz/plugins/filters/draft.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { QuartzFilterPlugin } from "../types" - -export const RemoveDrafts: QuartzFilterPlugin<{}> = () => ({ - name: "RemoveDrafts", - shouldPublish(_ctx, [_tree, vfile]) { - const draftFlag: boolean = vfile.data?.frontmatter?.draft ?? false - return !draftFlag - }, -}) diff --git a/quartz/plugins/filters/explicit.ts b/quartz/plugins/filters/explicit.ts deleted file mode 100644 index 30f0b37..0000000 --- a/quartz/plugins/filters/explicit.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { QuartzFilterPlugin } from "../types" - -export const ExplicitPublish: QuartzFilterPlugin = () => ({ - name: "ExplicitPublish", - shouldPublish(_ctx, [_tree, vfile]) { - const publishFlag: boolean = vfile.data?.frontmatter?.publish ?? false - return publishFlag - }, -}) diff --git a/quartz/plugins/filters/index.ts b/quartz/plugins/filters/index.ts deleted file mode 100644 index d937143..0000000 --- a/quartz/plugins/filters/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { RemoveDrafts } from "./draft" -export { ExplicitPublish } from "./explicit" diff --git a/quartz/plugins/index.ts b/quartz/plugins/index.ts deleted file mode 100644 index 9753d2e..0000000 --- a/quartz/plugins/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { StaticResources } from "../util/resources" -import { FilePath, FullSlug } from "../util/path" -import { BuildCtx } from "../util/ctx" - -export function getStaticResourcesFromPlugins(ctx: BuildCtx) { - const staticResources: StaticResources = { - css: [], - js: [], - } - - for (const transformer of ctx.cfg.plugins.transformers) { - const res = transformer.externalResources ? transformer.externalResources(ctx) : {} - if (res?.js) { - staticResources.js.push(...res.js) - } - if (res?.css) { - staticResources.css.push(...res.css) - } - } - - return staticResources -} - -export * from "./transformers" -export * from "./filters" -export * from "./emitters" - -declare module "vfile" { - // inserted in processors.ts - interface DataMap { - slug: FullSlug - filePath: FilePath - } -} diff --git a/quartz/plugins/transformers/description.ts b/quartz/plugins/transformers/description.ts deleted file mode 100644 index 884d5b1..0000000 --- a/quartz/plugins/transformers/description.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { Root as HTMLRoot } from "hast" -import { toString } from "hast-util-to-string" -import { QuartzTransformerPlugin } from "../types" -import { escapeHTML } from "../../util/escape" - -export interface Options { - descriptionLength: number -} - -const defaultOptions: Options = { - descriptionLength: 150, -} - -export const Description: QuartzTransformerPlugin | undefined> = (userOpts) => { - const opts = { ...defaultOptions, ...userOpts } - return { - name: "Description", - htmlPlugins() { - return [ - () => { - return async (tree: HTMLRoot, file) => { - const frontMatterDescription = file.data.frontmatter?.description - const text = escapeHTML(toString(tree)) - - const desc = frontMatterDescription ?? text - const sentences = desc.replace(/\s+/g, " ").split(".") - let finalDesc = "" - let sentenceIdx = 0 - const len = opts.descriptionLength - while (finalDesc.length < len) { - const sentence = sentences[sentenceIdx] - if (!sentence) break - finalDesc += sentence + "." - sentenceIdx++ - } - - file.data.description = finalDesc - file.data.text = text - } - }, - ] - }, - } -} - -declare module "vfile" { - interface DataMap { - description: string - text: string - } -} diff --git a/quartz/plugins/transformers/frontmatter.ts b/quartz/plugins/transformers/frontmatter.ts deleted file mode 100644 index 571aa04..0000000 --- a/quartz/plugins/transformers/frontmatter.ts +++ /dev/null @@ -1,70 +0,0 @@ -import matter from "gray-matter" -import remarkFrontmatter from "remark-frontmatter" -import { QuartzTransformerPlugin } from "../types" -import yaml from "js-yaml" -import toml from "toml" -import { slugTag } from "../../util/path" - -export interface Options { - delims: string | string[] - language: "yaml" | "toml" -} - -const defaultOptions: Options = { - delims: "---", - language: "yaml", -} - -export const FrontMatter: QuartzTransformerPlugin | undefined> = (userOpts) => { - const opts = { ...defaultOptions, ...userOpts } - return { - name: "FrontMatter", - markdownPlugins() { - return [ - [remarkFrontmatter, ["yaml", "toml"]], - () => { - return (_, file) => { - const { data } = matter(file.value, { - ...opts, - engines: { - yaml: (s) => yaml.load(s, { schema: yaml.JSON_SCHEMA }) as object, - toml: (s) => toml.parse(s) as object, - }, - }) - - // tag is an alias for tags - if (data.tag) { - data.tags = data.tag - } - - if (data.tags && !Array.isArray(data.tags)) { - data.tags = data.tags - .toString() - .split(",") - .map((tag: string) => tag.trim()) - } - - // slug them all!! - data.tags = [...new Set(data.tags?.map((tag: string) => slugTag(tag)))] ?? [] - - // fill in frontmatter - file.data.frontmatter = { - title: file.stem ?? "Untitled", - tags: [], - ...data, - } - } - }, - ] - }, - } -} - -declare module "vfile" { - interface DataMap { - frontmatter: { [key: string]: any } & { - title: string - tags: string[] - } - } -} diff --git a/quartz/plugins/transformers/gfm.ts b/quartz/plugins/transformers/gfm.ts deleted file mode 100644 index 62624aa..0000000 --- a/quartz/plugins/transformers/gfm.ts +++ /dev/null @@ -1,46 +0,0 @@ -import remarkGfm from "remark-gfm" -import smartypants from "remark-smartypants" -import { QuartzTransformerPlugin } from "../types" -import rehypeSlug from "rehype-slug" -import rehypeAutolinkHeadings from "rehype-autolink-headings" - -export interface Options { - enableSmartyPants: boolean - linkHeadings: boolean -} - -const defaultOptions: Options = { - enableSmartyPants: true, - linkHeadings: true, -} - -export const GitHubFlavoredMarkdown: QuartzTransformerPlugin | undefined> = ( - userOpts, -) => { - const opts = { ...defaultOptions, ...userOpts } - return { - name: "GitHubFlavoredMarkdown", - markdownPlugins() { - return opts.enableSmartyPants ? [remarkGfm, smartypants] : [remarkGfm] - }, - htmlPlugins() { - if (opts.linkHeadings) { - return [ - rehypeSlug, - [ - rehypeAutolinkHeadings, - { - behavior: "append", - content: { - type: "text", - value: " Ā§", - }, - }, - ], - ] - } else { - return [] - } - }, - } -} diff --git a/quartz/plugins/transformers/index.ts b/quartz/plugins/transformers/index.ts deleted file mode 100644 index e340f10..0000000 --- a/quartz/plugins/transformers/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -export { FrontMatter } from "./frontmatter" -export { GitHubFlavoredMarkdown } from "./gfm" -export { CreatedModifiedDate } from "./lastmod" -export { Latex } from "./latex" -export { Description } from "./description" -export { CrawlLinks } from "./links" -export { ObsidianFlavoredMarkdown } from "./ofm" -export { OxHugoFlavouredMarkdown } from "./oxhugofm" -export { SyntaxHighlighting } from "./syntax" -export { TableOfContents } from "./toc" -export { HardLineBreaks } from "./linebreaks" diff --git a/quartz/plugins/transformers/lastmod.ts b/quartz/plugins/transformers/lastmod.ts deleted file mode 100644 index 015c350..0000000 --- a/quartz/plugins/transformers/lastmod.ts +++ /dev/null @@ -1,76 +0,0 @@ -import fs from "fs" -import path from "path" -import { Repository } from "@napi-rs/simple-git" -import { QuartzTransformerPlugin } from "../types" - -export interface Options { - priority: ("frontmatter" | "git" | "filesystem")[] -} - -const defaultOptions: Options = { - priority: ["frontmatter", "git", "filesystem"], -} - -function coerceDate(d: any): Date { - const dt = new Date(d) - return isNaN(dt.getTime()) ? new Date() : dt -} - -type MaybeDate = undefined | string | number -export const CreatedModifiedDate: QuartzTransformerPlugin | undefined> = ( - userOpts, -) => { - const opts = { ...defaultOptions, ...userOpts } - return { - name: "CreatedModifiedDate", - markdownPlugins() { - return [ - () => { - let repo: Repository | undefined = undefined - return async (_tree, file) => { - let created: MaybeDate = undefined - let modified: MaybeDate = undefined - let published: MaybeDate = undefined - - const fp = path.posix.join(file.cwd, file.data.filePath as string) - for (const source of opts.priority) { - if (source === "filesystem") { - const st = await fs.promises.stat(fp) - created ||= st.birthtimeMs - modified ||= st.mtimeMs - } else if (source === "frontmatter" && file.data.frontmatter) { - created ||= file.data.frontmatter.date - modified ||= file.data.frontmatter.lastmod - modified ||= file.data.frontmatter.updated - modified ||= file.data.frontmatter["last-modified"] - published ||= file.data.frontmatter.publishDate - } else if (source === "git") { - if (!repo) { - repo = new Repository(file.cwd) - } - - modified ||= await repo.getFileLatestModifiedDateAsync(file.data.filePath!) - } - } - - file.data.dates = { - created: coerceDate(created), - modified: coerceDate(modified), - published: coerceDate(published), - } - } - }, - ] - }, - } -} - -declare module "vfile" { - interface DataMap { - dates: { - created: Date - modified: Date - published: Date - } - } -} diff --git a/quartz/plugins/transformers/latex.ts b/quartz/plugins/transformers/latex.ts deleted file mode 100644 index 5c6f767..0000000 --- a/quartz/plugins/transformers/latex.ts +++ /dev/null @@ -1,45 +0,0 @@ -import remarkMath from "remark-math" -import rehypeKatex from "rehype-katex" -import rehypeMathjax from "rehype-mathjax/svg.js" -import { QuartzTransformerPlugin } from "../types" - -interface Options { - renderEngine: "katex" | "mathjax" -} - -export const Latex: QuartzTransformerPlugin = (opts?: Options) => { - const engine = opts?.renderEngine ?? "katex" - return { - name: "Latex", - markdownPlugins() { - return [remarkMath] - }, - htmlPlugins() { - if (engine === "katex") { - return [[rehypeKatex, { output: "html" }]] - } else { - return [rehypeMathjax] - } - }, - externalResources() { - if (engine === "katex") { - return { - css: [ - // base css - "https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css", - ], - js: [ - { - // fix copy behaviour: https://github.com/KaTeX/KaTeX/blob/main/contrib/copy-tex/README.md - src: "https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js", - loadTime: "afterDOMReady", - contentType: "external", - }, - ], - } - } else { - return {} - } - }, - } -} diff --git a/quartz/plugins/transformers/linebreaks.ts b/quartz/plugins/transformers/linebreaks.ts deleted file mode 100644 index a8a066f..0000000 --- a/quartz/plugins/transformers/linebreaks.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { QuartzTransformerPlugin } from "../types" -import remarkBreaks from "remark-breaks" - -export const HardLineBreaks: QuartzTransformerPlugin = () => { - return { - name: "HardLineBreaks", - markdownPlugins() { - return [remarkBreaks] - }, - } -} diff --git a/quartz/plugins/transformers/links.ts b/quartz/plugins/transformers/links.ts deleted file mode 100644 index e050e00..0000000 --- a/quartz/plugins/transformers/links.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { QuartzTransformerPlugin } from "../types" -import { - FullSlug, - RelativeURL, - SimpleSlug, - TransformOptions, - _stripSlashes, - simplifySlug, - splitAnchor, - transformLink, -} from "../../util/path" -import path from "path" -import { visit } from "unist-util-visit" -import isAbsoluteUrl from "is-absolute-url" - -interface Options { - /** How to resolve Markdown paths */ - markdownLinkResolution: TransformOptions["strategy"] - /** Strips folders from a link so that it looks nice */ - prettyLinks: boolean -} - -const defaultOptions: Options = { - markdownLinkResolution: "absolute", - prettyLinks: true, -} - -export const CrawlLinks: QuartzTransformerPlugin | undefined> = (userOpts) => { - const opts = { ...defaultOptions, ...userOpts } - return { - name: "LinkProcessing", - htmlPlugins(ctx) { - return [ - () => { - return (tree, file) => { - const curSlug = simplifySlug(file.data.slug!) - const outgoing: Set = new Set() - - const transformOptions: TransformOptions = { - strategy: opts.markdownLinkResolution, - allSlugs: ctx.allSlugs, - } - - visit(tree, "element", (node, _index, _parent) => { - // rewrite all links - if ( - node.tagName === "a" && - node.properties && - typeof node.properties.href === "string" - ) { - let dest = node.properties.href as RelativeURL - node.properties.className ??= [] - node.properties.className.push(isAbsoluteUrl(dest) ? "external" : "internal") - - // don't process external links or intra-document anchors - const isInternal = !(isAbsoluteUrl(dest) || dest.startsWith("#")) - if (isInternal) { - dest = node.properties.href = transformLink( - file.data.slug!, - dest, - transformOptions, - ) - - // url.resolve is considered legacy - // WHATWG equivalent https://nodejs.dev/en/api/v18/url/#urlresolvefrom-to - const url = new URL(dest, `https://base.com/${curSlug}`) - const canonicalDest = url.pathname - const [destCanonical, _destAnchor] = splitAnchor(canonicalDest) - - // need to decodeURIComponent here as WHATWG URL percent-encodes everything - const simple = decodeURIComponent( - simplifySlug(destCanonical as FullSlug), - ) as SimpleSlug - outgoing.add(simple) - node.properties["data-slug"] = simple - } - - // rewrite link internals if prettylinks is on - if ( - opts.prettyLinks && - isInternal && - node.children.length === 1 && - node.children[0].type === "text" && - !node.children[0].value.startsWith("#") - ) { - node.children[0].value = path.basename(node.children[0].value) - } - } - - // transform all other resources that may use links - if ( - ["img", "video", "audio", "iframe"].includes(node.tagName) && - node.properties && - typeof node.properties.src === "string" - ) { - if (!isAbsoluteUrl(node.properties.src)) { - let dest = node.properties.src as RelativeURL - dest = node.properties.src = transformLink( - file.data.slug!, - dest, - transformOptions, - ) - node.properties.src = dest - } - } - }) - - file.data.links = [...outgoing] - } - }, - ] - }, - } -} - -declare module "vfile" { - interface DataMap { - links: SimpleSlug[] - } -} diff --git a/quartz/plugins/transformers/ofm.ts b/quartz/plugins/transformers/ofm.ts deleted file mode 100644 index 8306f40..0000000 --- a/quartz/plugins/transformers/ofm.ts +++ /dev/null @@ -1,527 +0,0 @@ -import { PluggableList } from "unified" -import { QuartzTransformerPlugin } from "../types" -import { Root, HTML, BlockContent, DefinitionContent, Code, Paragraph } from "mdast" -import { Element, Literal } from "hast" -import { Replace, findAndReplace as mdastFindReplace } from "mdast-util-find-and-replace" -import { slug as slugAnchor } from "github-slugger" -import rehypeRaw from "rehype-raw" -import { visit } from "unist-util-visit" -import path from "path" -import { JSResource } from "../../util/resources" -// @ts-ignore -import calloutScript from "../../components/scripts/callout.inline.ts" -import { FilePath, pathToRoot, slugTag, slugifyFilePath } from "../../util/path" -import { toHast } from "mdast-util-to-hast" -import { toHtml } from "hast-util-to-html" -import { PhrasingContent } from "mdast-util-find-and-replace/lib" - -export interface Options { - comments: boolean - highlight: boolean - wikilinks: boolean - callouts: boolean - mermaid: boolean - parseTags: boolean - parseBlockReferences: boolean - enableInHtmlEmbed: boolean -} - -const defaultOptions: Options = { - comments: true, - highlight: true, - wikilinks: true, - callouts: true, - mermaid: true, - parseTags: true, - parseBlockReferences: true, - enableInHtmlEmbed: false, -} - -const icons = { - infoIcon: ``, - pencilIcon: ``, - clipboardListIcon: ``, - checkCircleIcon: ``, - flameIcon: ``, - checkIcon: ``, - helpCircleIcon: ``, - alertTriangleIcon: ``, - xIcon: ``, - zapIcon: ``, - bugIcon: ``, - listIcon: ``, - quoteIcon: ``, -} - -const callouts = { - note: icons.pencilIcon, - abstract: icons.clipboardListIcon, - info: icons.infoIcon, - todo: icons.checkCircleIcon, - tip: icons.flameIcon, - success: icons.checkIcon, - question: icons.helpCircleIcon, - warning: icons.alertTriangleIcon, - failure: icons.xIcon, - danger: icons.zapIcon, - bug: icons.bugIcon, - example: icons.listIcon, - quote: icons.quoteIcon, -} - -const calloutMapping: Record = { - note: "note", - abstract: "abstract", - summary: "abstract", - tldr: "abstract", - info: "info", - todo: "todo", - tip: "tip", - hint: "tip", - important: "tip", - success: "success", - check: "success", - done: "success", - question: "question", - help: "question", - faq: "question", - warning: "warning", - attention: "warning", - caution: "warning", - failure: "failure", - missing: "failure", - fail: "failure", - danger: "danger", - error: "danger", - bug: "bug", - example: "example", - quote: "quote", - cite: "quote", -} - -function canonicalizeCallout(calloutName: string): keyof typeof callouts { - let callout = calloutName.toLowerCase() as keyof typeof calloutMapping - return calloutMapping[callout] ?? "note" -} - -const capitalize = (s: string): string => { - return s.substring(0, 1).toUpperCase() + s.substring(1) -} - -// !? -> optional embedding -// \[\[ -> open brace -// ([^\[\]\|\#]+) -> one or more non-special characters ([,],|, or #) (name) -// (#[^\[\]\|\#]+)? -> # then one or more non-special characters (heading link) -// (|[^\[\]\|\#]+)? -> | then one or more non-special characters (alias) -const wikilinkRegex = new RegExp(/!?\[\[([^\[\]\|\#]+)?(#[^\[\]\|\#]+)?(\|[^\[\]\|\#]+)?\]\]/, "g") -const highlightRegex = new RegExp(/==([^=]+)==/, "g") -const commentRegex = new RegExp(/%%(.+)%%/, "g") -// from https://github.com/escwxyz/remark-obsidian-callout/blob/main/src/index.ts -const calloutRegex = new RegExp(/^\[\!(\w+)\]([+-]?)/) -const calloutLineRegex = new RegExp(/^> *\[\!\w+\][+-]?.*$/, "gm") -// (?:^| ) -> non-capturing group, tag should start be separated by a space or be the start of the line -// #(...) -> capturing group, tag itself must start with # -// (?:[-_\p{L}])+ -> non-capturing group, non-empty string of (Unicode-aware) alpha-numeric characters, hyphens and/or underscores -// (?:\/[-_\p{L}]+)*) -> non-capturing group, matches an arbitrary number of tag strings separated by "/" -const tagRegex = new RegExp(/(?:^| )#((?:[-_\p{L}\d])+(?:\/[-_\p{L}\d]+)*)/, "gu") -const blockReferenceRegex = new RegExp(/\^([A-Za-z0-9]+)$/, "g") - -export const ObsidianFlavoredMarkdown: QuartzTransformerPlugin | undefined> = ( - userOpts, -) => { - const opts = { ...defaultOptions, ...userOpts } - - const mdastToHtml = (ast: PhrasingContent | Paragraph) => { - const hast = toHast(ast, { allowDangerousHtml: true })! - return toHtml(hast, { allowDangerousHtml: true }) - } - - const findAndReplace = opts.enableInHtmlEmbed - ? (tree: Root, regex: RegExp, replace?: Replace | null | undefined) => { - if (replace) { - visit(tree, "html", (node: HTML) => { - if (typeof replace === "string") { - node.value = node.value.replace(regex, replace) - } else { - node.value = node.value.replaceAll(regex, (substring: string, ...args) => { - const replaceValue = replace(substring, ...args) - if (typeof replaceValue === "string") { - return replaceValue - } else if (Array.isArray(replaceValue)) { - return replaceValue.map(mdastToHtml).join("") - } else if (typeof replaceValue === "object" && replaceValue !== null) { - return mdastToHtml(replaceValue) - } else { - return substring - } - }) - } - }) - } - - mdastFindReplace(tree, regex, replace) - } - : mdastFindReplace - - return { - name: "ObsidianFlavoredMarkdown", - textTransform(_ctx, src) { - // pre-transform blockquotes - if (opts.callouts) { - src = src.toString() - src = src.replaceAll(calloutLineRegex, (value) => { - // force newline after title of callout - return value + "\n> " - }) - } - - // pre-transform wikilinks (fix anchors to things that may contain illegal syntax e.g. codeblocks, latex) - if (opts.wikilinks) { - src = src.toString() - src = src.replaceAll(wikilinkRegex, (value, ...capture) => { - const [rawFp, rawHeader, rawAlias] = capture - const fp = rawFp ?? "" - const anchor = rawHeader?.trim().slice(1) - const displayAnchor = anchor ? `#${slugAnchor(anchor)}` : "" - const displayAlias = rawAlias ?? rawHeader?.replace("#", "|") ?? "" - const embedDisplay = value.startsWith("!") ? "!" : "" - return `${embedDisplay}[[${fp}${displayAnchor}${displayAlias}]]` - }) - } - - return src - }, - markdownPlugins() { - const plugins: PluggableList = [] - if (opts.wikilinks) { - plugins.push(() => { - return (tree: Root, _file) => { - findAndReplace(tree, wikilinkRegex, (value: string, ...capture: string[]) => { - let [rawFp, rawHeader, rawAlias] = capture - const fp = rawFp?.trim() ?? "" - const anchor = rawHeader?.trim() ?? "" - const alias = rawAlias?.slice(1).trim() - - // embed cases - if (value.startsWith("!")) { - const ext: string = path.extname(fp).toLowerCase() - const url = slugifyFilePath(fp as FilePath) - if ([".png", ".jpg", ".jpeg", ".gif", ".bmp", ".svg"].includes(ext)) { - const dims = alias ?? "" - let [width, height] = dims.split("x", 2) - width ||= "auto" - height ||= "auto" - return { - type: "image", - url, - data: { - hProperties: { - width, - height, - }, - }, - } - } else if ([".mp4", ".webm", ".ogv", ".mov", ".mkv"].includes(ext)) { - return { - type: "html", - value: ``, - } - } else if ( - [".mp3", ".webm", ".wav", ".m4a", ".ogg", ".3gp", ".flac"].includes(ext) - ) { - return { - type: "html", - value: ``, - } - } else if ([".pdf"].includes(ext)) { - return { - type: "html", - value: ``, - } - } else if (ext === "") { - const block = anchor.slice(1) - return { - type: "html", - data: { hProperties: { transclude: true } }, - value: `
        Transclude of block ${block}
        `, - } - } - - // otherwise, fall through to regular link - } - - // internal link - const url = fp + anchor - return { - type: "link", - url, - children: [ - { - type: "text", - value: alias ?? fp, - }, - ], - } - }) - } - }) - } - - if (opts.highlight) { - plugins.push(() => { - return (tree: Root, _file) => { - findAndReplace(tree, highlightRegex, (_value: string, ...capture: string[]) => { - const [inner] = capture - return { - type: "html", - value: `${inner}`, - } - }) - } - }) - } - - if (opts.comments) { - plugins.push(() => { - return (tree: Root, _file) => { - findAndReplace(tree, commentRegex, (_value: string, ..._capture: string[]) => { - return { - type: "text", - value: "", - } - }) - } - }) - } - - if (opts.callouts) { - plugins.push(() => { - return (tree: Root, _file) => { - visit(tree, "blockquote", (node) => { - if (node.children.length === 0) { - return - } - - // find first line - const firstChild = node.children[0] - if (firstChild.type !== "paragraph" || firstChild.children[0]?.type !== "text") { - return - } - - const text = firstChild.children[0].value - const restChildren = firstChild.children.slice(1) - const [firstLine, ...remainingLines] = text.split("\n") - const remainingText = remainingLines.join("\n") - - const match = firstLine.match(calloutRegex) - if (match && match.input) { - const [calloutDirective, typeString, collapseChar] = match - const calloutType = canonicalizeCallout( - typeString.toLowerCase() as keyof typeof calloutMapping, - ) - const collapse = collapseChar === "+" || collapseChar === "-" - const defaultState = collapseChar === "-" ? "collapsed" : "expanded" - const titleContent = - match.input.slice(calloutDirective.length).trim() || capitalize(calloutType) - const titleNode: Paragraph = { - type: "paragraph", - children: [{ type: "text", value: titleContent + " " }, ...restChildren], - } - const title = mdastToHtml(titleNode) - - const toggleIcon = ` - - ` - - const titleHtml: HTML = { - type: "html", - value: `
        -
        ${callouts[calloutType]}
        -
        ${title}
        - ${collapse ? toggleIcon : ""} -
        `, - } - - const blockquoteContent: (BlockContent | DefinitionContent)[] = [titleHtml] - if (remainingText.length > 0) { - blockquoteContent.push({ - type: "paragraph", - children: [ - { - type: "text", - value: remainingText, - }, - ], - }) - } - - // replace first line of blockquote with title and rest of the paragraph text - node.children.splice(0, 1, ...blockquoteContent) - - // add properties to base blockquote - node.data = { - hProperties: { - ...(node.data?.hProperties ?? {}), - className: `callout ${collapse ? "is-collapsible" : ""} ${ - defaultState === "collapsed" ? "is-collapsed" : "" - }`, - "data-callout": calloutType, - "data-callout-fold": collapse, - }, - } - } - }) - } - }) - } - - if (opts.mermaid) { - plugins.push(() => { - return (tree: Root, _file) => { - visit(tree, "code", (node: Code) => { - if (node.lang === "mermaid") { - node.data = { - hProperties: { - className: ["mermaid"], - }, - } - } - }) - } - }) - } - - if (opts.parseTags) { - plugins.push(() => { - return (tree: Root, file) => { - const base = pathToRoot(file.data.slug!) - findAndReplace(tree, tagRegex, (_value: string, tag: string) => { - tag = slugTag(tag) - if (file.data.frontmatter && !file.data.frontmatter.tags.includes(tag)) { - file.data.frontmatter.tags.push(tag) - } - - return { - type: "link", - url: base + `/tags/${tag}`, - data: { - hProperties: { - className: ["tag-link"], - }, - }, - children: [ - { - type: "text", - value: `#${tag}`, - }, - ], - } - }) - } - }) - } - return plugins - }, - htmlPlugins() { - const plugins = [rehypeRaw] - - if (opts.parseBlockReferences) { - plugins.push(() => { - const inlineTagTypes = new Set(["p", "li"]) - const blockTagTypes = new Set(["blockquote"]) - return (tree, file) => { - file.data.blocks = {} - - visit(tree, "element", (node, index, parent) => { - if (blockTagTypes.has(node.tagName)) { - const nextChild = parent?.children.at(index! + 2) as Element - if (nextChild && nextChild.tagName === "p") { - const text = nextChild.children.at(0) as Literal - if (text && text.value && text.type === "text") { - const matches = text.value.match(blockReferenceRegex) - if (matches && matches.length >= 1) { - parent!.children.splice(index! + 2, 1) - const block = matches[0].slice(1) - - if (!Object.keys(file.data.blocks!).includes(block)) { - node.properties = { - ...node.properties, - id: block, - } - file.data.blocks![block] = node - } - } - } - } - } else if (inlineTagTypes.has(node.tagName)) { - const last = node.children.at(-1) as Literal - if (last && last.value && typeof last.value === "string") { - const matches = last.value.match(blockReferenceRegex) - if (matches && matches.length >= 1) { - last.value = last.value.slice(0, -matches[0].length) - const block = matches[0].slice(1) - - if (!Object.keys(file.data.blocks!).includes(block)) { - node.properties = { - ...node.properties, - id: block, - } - file.data.blocks![block] = node - } - } - } - } - }) - } - }) - } - - return plugins - }, - externalResources() { - const js: JSResource[] = [] - - if (opts.callouts) { - js.push({ - script: calloutScript, - loadTime: "afterDOMReady", - contentType: "inline", - }) - } - - if (opts.mermaid) { - js.push({ - script: ` - import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs'; - const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark' - mermaid.initialize({ - startOnLoad: false, - securityLevel: 'loose', - theme: darkMode ? 'dark' : 'default' - }); - document.addEventListener('nav', async () => { - await mermaid.run({ - querySelector: '.mermaid' - }) - }); - `, - loadTime: "afterDOMReady", - moduleType: "module", - contentType: "inline", - }) - } - - return { js } - }, - } -} - -declare module "vfile" { - interface DataMap { - blocks: Record - } -} diff --git a/quartz/plugins/transformers/oxhugofm.ts b/quartz/plugins/transformers/oxhugofm.ts deleted file mode 100644 index 0d7b919..0000000 --- a/quartz/plugins/transformers/oxhugofm.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { QuartzTransformerPlugin } from "../types" - -export interface Options { - /** Replace {{ relref }} with quartz wikilinks []() */ - wikilinks: boolean - /** Remove pre-defined anchor (see https://ox-hugo.scripter.co/doc/anchors/) */ - removePredefinedAnchor: boolean - /** Remove hugo shortcode syntax */ - removeHugoShortcode: boolean - /** Replace
        with ![]() */ - replaceFigureWithMdImg: boolean -} - -const defaultOptions: Options = { - wikilinks: true, - removePredefinedAnchor: true, - removeHugoShortcode: true, - replaceFigureWithMdImg: true, -} - -const relrefRegex = new RegExp(/\[([^\]]+)\]\(\{\{< relref "([^"]+)" >\}\}\)/, "g") -const predefinedHeadingIdRegex = new RegExp(/(.*) {#(?:.*)}/, "g") -const hugoShortcodeRegex = new RegExp(/{{(.*)}}/, "g") -const figureTagRegex = new RegExp(/< ?figure src="(.*)" ?>/, "g") - -/** - * ox-hugo is an org exporter backend that exports org files to hugo-compatible - * markdown in an opinionated way. This plugin adds some tweaks to the generated - * markdown to make it compatible with quartz but the list of changes applied it - * is not exhaustive. - * */ -export const OxHugoFlavouredMarkdown: QuartzTransformerPlugin | undefined> = ( - userOpts, -) => { - const opts = { ...defaultOptions, ...userOpts } - return { - name: "OxHugoFlavouredMarkdown", - textTransform(_ctx, src) { - if (opts.wikilinks) { - src = src.toString() - src = src.replaceAll(relrefRegex, (value, ...capture) => { - const [text, link] = capture - return `[${text}](${link})` - }) - } - - if (opts.removePredefinedAnchor) { - src = src.toString() - src = src.replaceAll(predefinedHeadingIdRegex, (value, ...capture) => { - const [headingText] = capture - return headingText - }) - } - - if (opts.removeHugoShortcode) { - src = src.toString() - src = src.replaceAll(hugoShortcodeRegex, (value, ...capture) => { - const [scContent] = capture - return scContent - }) - } - - if (opts.replaceFigureWithMdImg) { - src = src.toString() - src = src.replaceAll(figureTagRegex, (value, ...capture) => { - const [src] = capture - return `![](${src})` - }) - } - return src - }, - } -} diff --git a/quartz/plugins/transformers/syntax.ts b/quartz/plugins/transformers/syntax.ts deleted file mode 100644 index 1766817..0000000 --- a/quartz/plugins/transformers/syntax.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { QuartzTransformerPlugin } from "../types" -import rehypePrettyCode, { Options as CodeOptions } from "rehype-pretty-code" - -export const SyntaxHighlighting: QuartzTransformerPlugin = () => ({ - name: "SyntaxHighlighting", - htmlPlugins() { - return [ - [ - rehypePrettyCode, - { - theme: "css-variables", - } satisfies Partial, - ], - ] - }, -}) diff --git a/quartz/plugins/transformers/toc.ts b/quartz/plugins/transformers/toc.ts deleted file mode 100644 index be006f6..0000000 --- a/quartz/plugins/transformers/toc.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { QuartzTransformerPlugin } from "../types" -import { Root } from "mdast" -import { visit } from "unist-util-visit" -import { toString } from "mdast-util-to-string" -import Slugger from "github-slugger" - -export interface Options { - maxDepth: 1 | 2 | 3 | 4 | 5 | 6 - minEntries: 1 - showByDefault: boolean -} - -const defaultOptions: Options = { - maxDepth: 3, - minEntries: 1, - showByDefault: true, -} - -interface TocEntry { - depth: number - text: string - slug: string // this is just the anchor (#some-slug), not the canonical slug -} - -export const TableOfContents: QuartzTransformerPlugin | undefined> = ( - userOpts, -) => { - const opts = { ...defaultOptions, ...userOpts } - return { - name: "TableOfContents", - markdownPlugins() { - return [ - () => { - return async (tree: Root, file) => { - const display = file.data.frontmatter?.enableToc ?? opts.showByDefault - if (display) { - const slugAnchor = new Slugger() - const toc: TocEntry[] = [] - let highestDepth: number = opts.maxDepth - visit(tree, "heading", (node) => { - if (node.depth <= opts.maxDepth) { - const text = toString(node) - highestDepth = Math.min(highestDepth, node.depth) - toc.push({ - depth: node.depth, - text, - slug: slugAnchor.slug(text), - }) - } - }) - - if (toc.length > opts.minEntries) { - file.data.toc = toc.map((entry) => ({ - ...entry, - depth: entry.depth - highestDepth, - })) - } - } - } - }, - ] - }, - } -} - -declare module "vfile" { - interface DataMap { - toc: TocEntry[] - } -} diff --git a/quartz/plugins/types.ts b/quartz/plugins/types.ts deleted file mode 100644 index eaeb12a..0000000 --- a/quartz/plugins/types.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { PluggableList } from "unified" -import { StaticResources } from "../util/resources" -import { ProcessedContent } from "./vfile" -import { QuartzComponent } from "../components/types" -import { FilePath, FullSlug } from "../util/path" -import { BuildCtx } from "../util/ctx" - -export interface PluginTypes { - transformers: QuartzTransformerPluginInstance[] - filters: QuartzFilterPluginInstance[] - emitters: QuartzEmitterPluginInstance[] -} - -type OptionType = object | undefined -export type QuartzTransformerPlugin = ( - opts?: Options, -) => QuartzTransformerPluginInstance -export type QuartzTransformerPluginInstance = { - name: string - textTransform?: (ctx: BuildCtx, src: string | Buffer) => string | Buffer - markdownPlugins?: (ctx: BuildCtx) => PluggableList - htmlPlugins?: (ctx: BuildCtx) => PluggableList - externalResources?: (ctx: BuildCtx) => Partial -} - -export type QuartzFilterPlugin = ( - opts?: Options, -) => QuartzFilterPluginInstance -export type QuartzFilterPluginInstance = { - name: string - shouldPublish(ctx: BuildCtx, content: ProcessedContent): boolean -} - -export type QuartzEmitterPlugin = ( - opts?: Options, -) => QuartzEmitterPluginInstance -export type QuartzEmitterPluginInstance = { - name: string - emit( - ctx: BuildCtx, - content: ProcessedContent[], - resources: StaticResources, - emitCallback: EmitCallback, - ): Promise - getQuartzComponents(ctx: BuildCtx): QuartzComponent[] -} - -export interface EmitOptions { - slug: FullSlug - ext: `.${string}` | "" - content: string -} - -export type EmitCallback = (data: EmitOptions) => Promise diff --git a/quartz/plugins/vfile.ts b/quartz/plugins/vfile.ts deleted file mode 100644 index 068981a..0000000 --- a/quartz/plugins/vfile.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Node, Parent } from "hast" -import { Data, VFile } from "vfile" - -export type QuartzPluginData = Data -export type ProcessedContent = [Node, VFile] - -export function defaultProcessedContent(vfileData: Partial): ProcessedContent { - const root: Parent = { type: "root", children: [] } - const vfile = new VFile("") - vfile.data = vfileData - return [root, vfile] -} diff --git a/quartz/processors/emit.ts b/quartz/processors/emit.ts deleted file mode 100644 index 3b357aa..0000000 --- a/quartz/processors/emit.ts +++ /dev/null @@ -1,44 +0,0 @@ -import path from "path" -import fs from "fs" -import { PerfTimer } from "../util/perf" -import { getStaticResourcesFromPlugins } from "../plugins" -import { EmitCallback } from "../plugins/types" -import { ProcessedContent } from "../plugins/vfile" -import { FilePath, joinSegments } from "../util/path" -import { QuartzLogger } from "../util/log" -import { trace } from "../util/trace" -import { BuildCtx } from "../util/ctx" - -export async function emitContent(ctx: BuildCtx, content: ProcessedContent[]) { - const { argv, cfg } = ctx - const perf = new PerfTimer() - const log = new QuartzLogger(ctx.argv.verbose) - - log.start(`Emitting output files`) - const emit: EmitCallback = async ({ slug, ext, content }) => { - const pathToPage = joinSegments(argv.output, slug + ext) as FilePath - const dir = path.dirname(pathToPage) - await fs.promises.mkdir(dir, { recursive: true }) - await fs.promises.writeFile(pathToPage, content) - return pathToPage - } - - let emittedFiles = 0 - const staticResources = getStaticResourcesFromPlugins(ctx) - for (const emitter of cfg.plugins.emitters) { - try { - const emitted = await emitter.emit(ctx, content, staticResources, emit) - emittedFiles += emitted.length - - if (ctx.argv.verbose) { - for (const file of emitted) { - console.log(`[emit:${emitter.name}] ${file}`) - } - } - } catch (err) { - trace(`Failed to emit from plugin \`${emitter.name}\``, err as Error) - } - } - - log.end(`Emitted ${emittedFiles} files to \`${argv.output}\` in ${perf.timeSince()}`) -} diff --git a/quartz/processors/filter.ts b/quartz/processors/filter.ts deleted file mode 100644 index b269fb3..0000000 --- a/quartz/processors/filter.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { BuildCtx } from "../util/ctx" -import { PerfTimer } from "../util/perf" -import { ProcessedContent } from "../plugins/vfile" - -export function filterContent(ctx: BuildCtx, content: ProcessedContent[]): ProcessedContent[] { - const { cfg, argv } = ctx - const perf = new PerfTimer() - const initialLength = content.length - for (const plugin of cfg.plugins.filters) { - const updatedContent = content.filter((item) => plugin.shouldPublish(ctx, item)) - - if (argv.verbose) { - const diff = content.filter((x) => !updatedContent.includes(x)) - for (const file of diff) { - console.log(`[filter:${plugin.name}] ${file[1].data.slug}`) - } - } - - content = updatedContent - } - - console.log(`Filtered out ${initialLength - content.length} files in ${perf.timeSince()}`) - return content -} diff --git a/quartz/processors/parse.ts b/quartz/processors/parse.ts deleted file mode 100644 index 29f92fc..0000000 --- a/quartz/processors/parse.ts +++ /dev/null @@ -1,161 +0,0 @@ -import esbuild from "esbuild" -import remarkParse from "remark-parse" -import remarkRehype from "remark-rehype" -import { Processor, unified } from "unified" -import { Root as MDRoot } from "remark-parse/lib" -import { Root as HTMLRoot } from "hast" -import { ProcessedContent } from "../plugins/vfile" -import { PerfTimer } from "../util/perf" -import { read } from "to-vfile" -import { FilePath, QUARTZ, slugifyFilePath } from "../util/path" -import path from "path" -import workerpool, { Promise as WorkerPromise } from "workerpool" -import { QuartzLogger } from "../util/log" -import { trace } from "../util/trace" -import { BuildCtx } from "../util/ctx" - -export type QuartzProcessor = Processor -export function createProcessor(ctx: BuildCtx): QuartzProcessor { - const transformers = ctx.cfg.plugins.transformers - - // base Markdown -> MD AST - let processor = unified().use(remarkParse) - - // MD AST -> MD AST transforms - for (const plugin of transformers.filter((p) => p.markdownPlugins)) { - processor = processor.use(plugin.markdownPlugins!(ctx)) - } - - // MD AST -> HTML AST - processor = processor.use(remarkRehype, { allowDangerousHtml: true }) - - // HTML AST -> HTML AST transforms - for (const plugin of transformers.filter((p) => p.htmlPlugins)) { - processor = processor.use(plugin.htmlPlugins!(ctx)) - } - - return processor -} - -function* chunks(arr: T[], n: number) { - for (let i = 0; i < arr.length; i += n) { - yield arr.slice(i, i + n) - } -} - -async function transpileWorkerScript() { - // transpile worker script - const cacheFile = "./.quartz-cache/transpiled-worker.mjs" - const fp = "./quartz/worker.ts" - return esbuild.build({ - entryPoints: [fp], - outfile: path.join(QUARTZ, cacheFile), - bundle: true, - keepNames: true, - platform: "node", - format: "esm", - packages: "external", - sourcemap: true, - sourcesContent: false, - plugins: [ - { - name: "css-and-scripts-as-text", - setup(build) { - build.onLoad({ filter: /\.scss$/ }, (_) => ({ - contents: "", - loader: "text", - })) - build.onLoad({ filter: /\.inline\.(ts|js)$/ }, (_) => ({ - contents: "", - loader: "text", - })) - }, - }, - ], - }) -} - -export function createFileParser(ctx: BuildCtx, fps: FilePath[]) { - const { argv, cfg } = ctx - return async (processor: QuartzProcessor) => { - const res: ProcessedContent[] = [] - for (const fp of fps) { - try { - const perf = new PerfTimer() - const file = await read(fp) - - // strip leading and trailing whitespace - file.value = file.value.toString().trim() - - // Text -> Text transforms - for (const plugin of cfg.plugins.transformers.filter((p) => p.textTransform)) { - file.value = plugin.textTransform!(ctx, file.value) - } - - // base data properties that plugins may use - file.data.slug = slugifyFilePath(path.posix.relative(argv.directory, file.path) as FilePath) - file.data.filePath = fp - - const ast = processor.parse(file) - const newAst = await processor.run(ast, file) - res.push([newAst, file]) - - if (argv.verbose) { - console.log(`[process] ${fp} -> ${file.data.slug} (${perf.timeSince()})`) - } - } catch (err) { - trace(`\nFailed to process \`${fp}\``, err as Error) - } - } - - return res - } -} - -const clamp = (num: number, min: number, max: number) => - Math.min(Math.max(Math.round(num), min), max) -export async function parseMarkdown(ctx: BuildCtx, fps: FilePath[]): Promise { - const { argv } = ctx - const perf = new PerfTimer() - const log = new QuartzLogger(argv.verbose) - - // rough heuristics: 128 gives enough time for v8 to JIT and optimize parsing code paths - const CHUNK_SIZE = 128 - const concurrency = ctx.argv.concurrency ?? clamp(fps.length / CHUNK_SIZE, 1, 4) - - let res: ProcessedContent[] = [] - log.start(`Parsing input files using ${concurrency} threads`) - if (concurrency === 1) { - try { - const processor = createProcessor(ctx) - const parse = createFileParser(ctx, fps) - res = await parse(processor) - } catch (error) { - log.end() - throw error - } - } else { - await transpileWorkerScript() - const pool = workerpool.pool("./quartz/bootstrap-worker.mjs", { - minWorkers: "max", - maxWorkers: concurrency, - workerType: "thread", - }) - - const childPromises: WorkerPromise[] = [] - for (const chunk of chunks(fps, CHUNK_SIZE)) { - childPromises.push(pool.exec("parseFiles", [argv, chunk, ctx.allSlugs])) - } - - const results: ProcessedContent[][] = await WorkerPromise.all(childPromises).catch((err) => { - const errString = err.toString().slice("Error:".length) - console.error(errString) - process.exit(1) - }) - res = results.flat() - await pool.terminate() - } - - log.end(`Parsed ${res.length} Markdown files in ${perf.timeSince()}`) - return res -} diff --git a/quartz/static/icon.png b/quartz/static/icon.png deleted file mode 100644 index b6656a7..0000000 Binary files a/quartz/static/icon.png and /dev/null differ diff --git a/quartz/static/og-image.png b/quartz/static/og-image.png deleted file mode 100644 index f132145..0000000 Binary files a/quartz/static/og-image.png and /dev/null differ diff --git a/quartz/styles/base.scss b/quartz/styles/base.scss deleted file mode 100644 index c6925fb..0000000 --- a/quartz/styles/base.scss +++ /dev/null @@ -1,478 +0,0 @@ -@use "./custom.scss"; -@use "./syntax.scss"; -@use "./callouts.scss"; -@use "./variables.scss" as *; - -html { - scroll-behavior: smooth; - -webkit-text-size-adjust: none; - text-size-adjust: none; - overflow-x: hidden; - width: 100vw; -} - -body, -section { - margin: 0; - max-width: 100%; - box-sizing: border-box; - background-color: var(--light); - font-family: var(--bodyFont); - color: var(--darkgray); -} - -.text-highlight { - background-color: #fff23688; - padding: 0 0.1rem; - border-radius: 5px; -} - -::selection { - background: color-mix(in srgb, var(--tertiary) 75%, transparent); - color: var(--darkgray); -} - -p, -ul, -text, -a, -tr, -td, -li, -ol, -ul, -.katex, -.math { - color: var(--darkgray); - fill: var(--darkgray); - overflow-wrap: anywhere; - hyphens: auto; -} - -.math { - &.math-display { - text-align: center; - } -} - -a { - font-weight: 600; - text-decoration: none; - transition: color 0.2s ease; - color: var(--secondary); - - &:hover { - color: var(--tertiary) !important; - } - - &.internal { - text-decoration: none; - background-color: var(--highlight); - padding: 0 0.1rem; - border-radius: 5px; - } -} - -.desktop-only { - display: initial; - @media all and (max-width: $fullPageWidth) { - display: none; - } -} - -.mobile-only { - display: none; - @media all and (max-width: $fullPageWidth) { - display: initial; - } -} - -.page { - @media all and (max-width: $fullPageWidth) { - margin: 0 auto; - padding: 0 1rem; - max-width: $pageWidth; - } - - & article { - & > h1 { - font-size: 2rem; - } - - & li:has(> input[type="checkbox"]) { - list-style-type: none; - padding-left: 0; - } - - & li:has(> input[type="checkbox"]:checked) { - text-decoration: line-through; - text-decoration-color: var(--gray); - color: var(--gray); - } - - & li > * { - margin-top: 0; - margin-bottom: 0; - } - - p > strong { - color: var(--dark); - } - } - - & > #quartz-body { - width: 100%; - display: flex; - @media all and (max-width: $fullPageWidth) { - flex-direction: column; - } - - & .sidebar { - flex: 1; - display: flex; - flex-direction: column; - gap: 2rem; - top: 0; - width: $sidePanelWidth; - margin-top: $topSpacing; - box-sizing: border-box; - padding: 0 4rem; - position: fixed; - @media all and (max-width: $fullPageWidth) { - position: initial; - flex-direction: row; - padding: 0; - width: initial; - margin-top: 2rem; - } - } - - & .sidebar.left { - left: calc(calc(100vw - $pageWidth) / 2 - $sidePanelWidth); - @media all and (max-width: $fullPageWidth) { - gap: 0; - align-items: center; - } - } - - & .sidebar.right { - right: calc(calc(100vw - $pageWidth) / 2 - $sidePanelWidth); - & > * { - @media all and (max-width: $fullPageWidth) { - flex: 1; - } - } - } - } - - & .page-header { - width: $pageWidth; - margin: $topSpacing auto 0 auto; - @media all and (max-width: $fullPageWidth) { - width: initial; - margin-top: 2rem; - } - } - - & .center, - & footer { - margin-left: auto; - margin-right: auto; - width: $pageWidth; - @media all and (max-width: $fullPageWidth) { - width: initial; - margin-left: 0; - margin-right: 0; - } - } -} - -.footnotes { - margin-top: 2rem; - border-top: 1px solid var(--lightgray); -} - -input[type="checkbox"] { - transform: translateY(2px); - color: var(--secondary); - border: 1px solid var(--lightgray); - border-radius: 3px; - background-color: var(--light); - position: relative; - margin-inline-end: 0.2rem; - margin-inline-start: -1.4rem; - appearance: none; - width: 16px; - height: 16px; - - &:checked { - border-color: var(--secondary); - background-color: var(--secondary); - - &::after { - content: ""; - position: absolute; - left: 4px; - top: 1px; - width: 4px; - height: 8px; - display: block; - border: solid var(--light); - border-width: 0 2px 2px 0; - transform: rotate(45deg); - } - } -} - -blockquote { - margin: 1rem 0; - border-left: 3px solid var(--secondary); - padding-left: 1rem; - transition: border-color 0.2s ease; -} - -h1, -h2, -h3, -h4, -h5, -h6, -thead { - font-family: var(--headerFont); - color: var(--dark); - font-weight: revert; - margin-bottom: 0; - - article > & > a { - color: var(--dark); - &.internal { - background-color: transparent; - } - } -} - -h1, -h2, -h3, -h4, -h5, -h6 { - &[id] > a[href^="#"] { - margin: 0 0.5rem; - opacity: 0; - transition: opacity 0.2s ease; - transform: translateY(-0.1rem); - display: inline-block; - font-family: var(--codeFont); - user-select: none; - } - - &[id]:hover > a { - opacity: 1; - } -} - -// typography improvements -h1 { - font-size: 1.75rem; - margin-top: 2.25rem; - margin-bottom: 1rem; -} - -h2 { - font-size: 1.4rem; - margin-top: 1.9rem; - margin-bottom: 1rem; -} - -h3 { - font-size: 1.12rem; - margin-top: 1.62rem; - margin-bottom: 1rem; -} - -h4, -h5, -h6 { - font-size: 1rem; - margin-top: 1.5rem; - margin-bottom: 1rem; -} - -div[data-rehype-pretty-code-fragment] { - line-height: 1.6rem; - position: relative; - - & > div[data-rehype-pretty-code-title] { - font-family: var(--codeFont); - font-size: 0.9rem; - padding: 0.1rem 0.5rem; - border: 1px solid var(--lightgray); - width: max-content; - border-radius: 5px; - margin-bottom: -0.5rem; - color: var(--darkgray); - } - - & > pre { - padding: 0.5rem 0; - } -} - -pre { - font-family: var(--codeFont); - padding: 0.5rem; - border-radius: 5px; - overflow-x: auto; - border: 1px solid var(--lightgray); - - &:has(> code.mermaid) { - border: none; - } - - & > code { - background: none; - padding: 0; - font-size: 0.85rem; - counter-reset: line; - counter-increment: line 0; - display: grid; - - & [data-highlighted-chars] { - background-color: var(--highlight); - border-radius: 5px; - } - - & > [data-line] { - padding: 0 0.25rem; - box-sizing: border-box; - border-left: 3px solid transparent; - - &[data-highlighted-line] { - background-color: var(--highlight); - border-left: 3px solid var(--secondary); - } - - &::before { - content: counter(line); - counter-increment: line; - width: 1rem; - margin-right: 1rem; - display: inline-block; - text-align: right; - color: rgba(115, 138, 148, 0.6); - } - } - - &[data-line-numbers-max-digits="2"] > [data-line]::before { - width: 2rem; - } - - &[data-line-numbers-max-digits="3"] > [data-line]::before { - width: 3rem; - } - } -} - -code { - font-size: 0.9em; - color: var(--dark); - font-family: var(--codeFont); - border-radius: 5px; - padding: 0.1rem 0.2rem; - background: var(--lightgray); -} - -tbody, -li, -p { - line-height: 1.6rem; -} - -table { - margin: 1rem; - padding: 1.5rem; - border-collapse: collapse; - & > * { - line-height: 2rem; - } -} - -th { - text-align: left; - padding: 0.4rem 1rem; - border-bottom: 2px solid var(--gray); -} - -td { - padding: 0.2rem 1rem; -} - -tr { - border-bottom: 1px solid var(--lightgray); - &:last-child { - border-bottom: none; - } -} - -img { - max-width: 100%; - border-radius: 5px; - margin: 1rem 0; -} - -p > img + em { - display: block; - transform: translateY(-1rem); -} - -hr { - width: 100%; - margin: 2rem auto; - height: 1px; - border: none; - background-color: var(--lightgray); -} - -audio, -video { - width: 100%; - border-radius: 5px; -} - -.spacer { - flex: 1 1 auto; -} - -ul.overflow, -ol.overflow { - max-height: 300; - overflow-y: auto; - - // clearfix - content: ""; - clear: both; - - & > li:last-of-type { - margin-bottom: 30px; - } - - &:after { - pointer-events: none; - content: ""; - width: 100%; - height: 50px; - position: absolute; - left: 0; - bottom: 0; - opacity: 1; - transition: opacity 0.3s ease; - background: linear-gradient(transparent 0px, var(--light)); - } -} - -.transclude { - ul { - padding-left: 1rem; - } -} diff --git a/quartz/styles/callouts.scss b/quartz/styles/callouts.scss deleted file mode 100644 index 703bd67..0000000 --- a/quartz/styles/callouts.scss +++ /dev/null @@ -1,111 +0,0 @@ -@use "sass:color"; - -.callout { - border: 1px solid var(--border); - background-color: var(--bg); - border-radius: 5px; - padding: 0 1rem; - overflow-y: hidden; - transition: max-height 0.3s ease; - box-sizing: border-box; - - & > *:nth-child(2) { - margin-top: 0; - } - - &[data-callout="note"] { - --color: #448aff; - --border: #448aff44; - --bg: #448aff10; - } - - &[data-callout="abstract"] { - --color: #00b0ff; - --border: #00b0ff44; - --bg: #00b0ff10; - } - - &[data-callout="info"], - &[data-callout="todo"] { - --color: #00b8d4; - --border: #00b8d444; - --bg: #00b8d410; - } - - &[data-callout="tip"] { - --color: #00bfa5; - --border: #00bfa544; - --bg: #00bfa510; - } - - &[data-callout="success"] { - --color: #09ad7a; - --border: #09ad7144; - --bg: #09ad7110; - } - - &[data-callout="question"] { - --color: #dba642; - --border: #dba64244; - --bg: #dba64210; - } - - &[data-callout="warning"] { - --color: #db8942; - --border: #db894244; - --bg: #db894210; - } - - &[data-callout="failure"], - &[data-callout="danger"], - &[data-callout="bug"] { - --color: #db4242; - --border: #db424244; - --bg: #db424210; - } - - &[data-callout="example"] { - --color: #7a43b5; - --border: #7a43b544; - --bg: #7a43b510; - } - - &[data-callout="quote"] { - --color: var(--secondary); - --border: var(--lightgray); - } - - &.is-collapsed > .callout-title > .fold { - transform: rotateZ(-90deg); - } -} - -.callout-title { - display: flex; - gap: 5px; - padding: 1rem 0; - color: var(--color); - - & .fold { - margin-left: 0.5rem; - transition: transform 0.3s ease; - opacity: 0.8; - cursor: pointer; - } - - & > .callout-title-inner > p { - color: var(--color); - margin: 0; - } -} - -.callout-icon { - width: 18px; - height: 18px; - flex: 0 0 18px; - padding-top: 4px; -} - -.callout-title-inner { - font-weight: 700; -} diff --git a/quartz/styles/custom.scss b/quartz/styles/custom.scss deleted file mode 100644 index b908314..0000000 --- a/quartz/styles/custom.scss +++ /dev/null @@ -1 +0,0 @@ -// put your custom CSS here! diff --git a/quartz/styles/syntax.scss b/quartz/styles/syntax.scss deleted file mode 100644 index 623ee6f..0000000 --- a/quartz/styles/syntax.scss +++ /dev/null @@ -1,29 +0,0 @@ -// npx convert-sh-theme https://raw.githubusercontent.com/shikijs/shiki/main/packages/shiki/themes/github-light.json -:root { - --shiki-color-text: #24292e; - --shiki-color-background: #f8f8f8; - --shiki-token-constant: #005cc5; - --shiki-token-string: #032f62; - --shiki-token-comment: #6a737d; - --shiki-token-keyword: #d73a49; - --shiki-token-parameter: #24292e; - --shiki-token-function: #24292e; - --shiki-token-string-expression: #22863a; - --shiki-token-punctuation: #24292e; - --shiki-token-link: #24292e; -} - -// npx convert-sh-theme https://raw.githubusercontent.com/shikijs/shiki/main/packages/shiki/themes/github-dark.json -[saved-theme="dark"] { - --shiki-color-text: #e1e4e8 !important; - --shiki-color-background: #24292e !important; - --shiki-token-constant: #79b8ff !important; - --shiki-token-string: #9ecbff !important; - --shiki-token-comment: #6a737d !important; - --shiki-token-keyword: #f97583 !important; - --shiki-token-parameter: #e1e4e8 !important; - --shiki-token-function: #e1e4e8 !important; - --shiki-token-string-expression: #85e89d !important; - --shiki-token-punctuation: #e1e4e8 !important; - --shiki-token-link: #e1e4e8 !important; -} diff --git a/quartz/styles/variables.scss b/quartz/styles/variables.scss deleted file mode 100644 index 30004aa..0000000 --- a/quartz/styles/variables.scss +++ /dev/null @@ -1,6 +0,0 @@ -$pageWidth: 750px; -$mobileBreakpoint: 600px; -$tabletBreakpoint: 1200px; -$sidePanelWidth: 380px; -$topSpacing: 6rem; -$fullPageWidth: $pageWidth + 2 * $sidePanelWidth; diff --git a/quartz/util/ctx.ts b/quartz/util/ctx.ts deleted file mode 100644 index 13e0bf8..0000000 --- a/quartz/util/ctx.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { QuartzConfig } from "../cfg" -import { FullSlug } from "./path" - -export interface Argv { - directory: string - verbose: boolean - output: string - serve: boolean - port: number - wsPort: number - remoteDevHost?: string - concurrency?: number -} - -export interface BuildCtx { - argv: Argv - cfg: QuartzConfig - allSlugs: FullSlug[] -} diff --git a/quartz/util/escape.ts b/quartz/util/escape.ts deleted file mode 100644 index 197558c..0000000 --- a/quartz/util/escape.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const escapeHTML = (unsafe: string) => { - return unsafe - .replaceAll("&", "&") - .replaceAll("<", "<") - .replaceAll(">", ">") - .replaceAll('"', """) - .replaceAll("'", "'") -} diff --git a/quartz/util/glob.ts b/quartz/util/glob.ts deleted file mode 100644 index 7a71160..0000000 --- a/quartz/util/glob.ts +++ /dev/null @@ -1,22 +0,0 @@ -import path from "path" -import { FilePath } from "./path" -import { globby } from "globby" - -export function toPosixPath(fp: string): string { - return fp.split(path.sep).join("/") -} - -export async function glob( - pattern: string, - cwd: string, - ignorePatterns: string[], -): Promise { - const fps = ( - await globby(pattern, { - cwd, - ignore: ignorePatterns, - gitignore: true, - }) - ).map(toPosixPath) - return fps as FilePath[] -} diff --git a/quartz/util/lang.ts b/quartz/util/lang.ts deleted file mode 100644 index eb03a24..0000000 --- a/quartz/util/lang.ts +++ /dev/null @@ -1,7 +0,0 @@ -export function pluralize(count: number, s: string): string { - if (count === 1) { - return `1 ${s}` - } else { - return `${count} ${s}s` - } -} diff --git a/quartz/util/log.ts b/quartz/util/log.ts deleted file mode 100644 index 773945c..0000000 --- a/quartz/util/log.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Spinner } from "cli-spinner" - -export class QuartzLogger { - verbose: boolean - spinner: Spinner | undefined - constructor(verbose: boolean) { - this.verbose = verbose - } - - start(text: string) { - if (this.verbose) { - console.log(text) - } else { - this.spinner = new Spinner(`%s ${text}`) - this.spinner.setSpinnerString(18) - this.spinner.start() - } - } - - end(text?: string) { - if (!this.verbose) { - this.spinner!.stop(true) - } - if (text) { - console.log(text) - } - } -} diff --git a/quartz/util/path.test.ts b/quartz/util/path.test.ts deleted file mode 100644 index 8bbb58d..0000000 --- a/quartz/util/path.test.ts +++ /dev/null @@ -1,278 +0,0 @@ -import test, { describe } from "node:test" -import * as path from "./path" -import assert from "node:assert" -import { FullSlug, TransformOptions } from "./path" - -describe("typeguards", () => { - test("isSimpleSlug", () => { - assert(path.isSimpleSlug("")) - assert(path.isSimpleSlug("abc")) - assert(path.isSimpleSlug("abc/")) - assert(path.isSimpleSlug("notindex")) - assert(path.isSimpleSlug("notindex/def")) - - assert(!path.isSimpleSlug("//")) - assert(!path.isSimpleSlug("index")) - assert(!path.isSimpleSlug("https://example.com")) - assert(!path.isSimpleSlug("/abc")) - assert(!path.isSimpleSlug("abc/index")) - assert(!path.isSimpleSlug("abc#anchor")) - assert(!path.isSimpleSlug("abc?query=1")) - assert(!path.isSimpleSlug("index.md")) - assert(!path.isSimpleSlug("index.html")) - }) - - test("isRelativeURL", () => { - assert(path.isRelativeURL(".")) - assert(path.isRelativeURL("..")) - assert(path.isRelativeURL("./abc/def")) - assert(path.isRelativeURL("./abc/def#an-anchor")) - assert(path.isRelativeURL("./abc/def?query=1#an-anchor")) - assert(path.isRelativeURL("../abc/def")) - assert(path.isRelativeURL("./abc/def.pdf")) - - assert(!path.isRelativeURL("abc")) - assert(!path.isRelativeURL("/abc/def")) - assert(!path.isRelativeURL("")) - assert(!path.isRelativeURL("./abc/def.html")) - assert(!path.isRelativeURL("./abc/def.md")) - }) - - test("isFullSlug", () => { - assert(path.isFullSlug("index")) - assert(path.isFullSlug("abc/def")) - assert(path.isFullSlug("html.energy")) - assert(path.isFullSlug("test.pdf")) - - assert(!path.isFullSlug(".")) - assert(!path.isFullSlug("./abc/def")) - assert(!path.isFullSlug("../abc/def")) - assert(!path.isFullSlug("abc/def#anchor")) - assert(!path.isFullSlug("abc/def?query=1")) - assert(!path.isFullSlug("note with spaces")) - }) - - test("isFilePath", () => { - assert(path.isFilePath("content/index.md")) - assert(path.isFilePath("content/test.png")) - assert(!path.isFilePath("../test.pdf")) - assert(!path.isFilePath("content/test")) - assert(!path.isFilePath("./content/test")) - }) -}) - -describe("transforms", () => { - function asserts( - pairs: [string, string][], - transform: (inp: Inp) => Out, - checkPre: (x: any) => x is Inp, - checkPost: (x: any) => x is Out, - ) { - for (const [inp, expected] of pairs) { - assert(checkPre(inp), `${inp} wasn't the expected input type`) - const actual = transform(inp) - assert.strictEqual( - actual, - expected, - `after transforming ${inp}, '${actual}' was not '${expected}'`, - ) - assert(checkPost(actual), `${actual} wasn't the expected output type`) - } - } - - test("simplifySlug", () => { - asserts( - [ - ["index", ""], - ["abc", "abc"], - ["abc/index", "abc/"], - ["abc/def", "abc/def"], - ], - path.simplifySlug, - path.isFullSlug, - path.isSimpleSlug, - ) - }) - - test("slugifyFilePath", () => { - asserts( - [ - ["content/index.md", "content/index"], - ["content/index.html", "content/index"], - ["content/_index.md", "content/index"], - ["/content/index.md", "content/index"], - ["content/cool.png", "content/cool.png"], - ["index.md", "index"], - ["test.mp4", "test.mp4"], - ["note with spaces.md", "note-with-spaces"], - ], - path.slugifyFilePath, - path.isFilePath, - path.isFullSlug, - ) - }) - - test("transformInternalLink", () => { - asserts( - [ - ["", "."], - [".", "."], - ["./", "./"], - ["./index", "./"], - ["./index#abc", "./#abc"], - ["./index.html", "./"], - ["./index.md", "./"], - ["./index.css", "./index.css"], - ["content", "./content"], - ["content/test.md", "./content/test"], - ["content/test.pdf", "./content/test.pdf"], - ["./content/test.md", "./content/test"], - ["../content/test.md", "../content/test"], - ["tags/", "./tags/"], - ["/tags/", "./tags/"], - ["content/with spaces", "./content/with-spaces"], - ["content/with spaces/index", "./content/with-spaces/"], - ["content/with spaces#and Anchor!", "./content/with-spaces#and-anchor"], - ], - path.transformInternalLink, - (_x: string): _x is string => true, - path.isRelativeURL, - ) - }) - - test("pathToRoot", () => { - asserts( - [ - ["index", "."], - ["abc", "."], - ["abc/def", ".."], - ["abc/def/ghi", "../.."], - ["abc/def/index", "../.."], - ], - path.pathToRoot, - path.isFullSlug, - path.isRelativeURL, - ) - }) -}) - -describe("link strategies", () => { - const allSlugs = [ - "a/b/c", - "a/b/d", - "a/b/index", - "e/f", - "e/g/h", - "index", - "a/test.png", - ] as FullSlug[] - - describe("absolute", () => { - const opts: TransformOptions = { - strategy: "absolute", - allSlugs, - } - - test("from a/b/c", () => { - const cur = "a/b/c" as FullSlug - assert.strictEqual(path.transformLink(cur, "a/b/d", opts), "../../a/b/d") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../a/b/") - assert.strictEqual(path.transformLink(cur, "e/f", opts), "../../e/f") - assert.strictEqual(path.transformLink(cur, "e/g/h", opts), "../../e/g/h") - assert.strictEqual(path.transformLink(cur, "index", opts), "../../") - assert.strictEqual(path.transformLink(cur, "index.png", opts), "../../index.png") - assert.strictEqual(path.transformLink(cur, "index#abc", opts), "../../#abc") - assert.strictEqual(path.transformLink(cur, "tag/test", opts), "../../tag/test") - assert.strictEqual(path.transformLink(cur, "a/b/c#test", opts), "../../a/b/c#test") - assert.strictEqual(path.transformLink(cur, "a/test.png", opts), "../../a/test.png") - }) - - test("from a/b/index", () => { - const cur = "a/b/index" as FullSlug - assert.strictEqual(path.transformLink(cur, "a/b/d", opts), "../../a/b/d") - assert.strictEqual(path.transformLink(cur, "a/b", opts), "../../a/b") - assert.strictEqual(path.transformLink(cur, "index", opts), "../../") - }) - - test("from index", () => { - const cur = "index" as FullSlug - assert.strictEqual(path.transformLink(cur, "index", opts), "./") - assert.strictEqual(path.transformLink(cur, "a/b/c", opts), "./a/b/c") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b/") - }) - }) - - describe("shortest", () => { - const opts: TransformOptions = { - strategy: "shortest", - allSlugs, - } - - test("from a/b/c", () => { - const cur = "a/b/c" as FullSlug - assert.strictEqual(path.transformLink(cur, "d", opts), "../../a/b/d") - assert.strictEqual(path.transformLink(cur, "h", opts), "../../e/g/h") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../a/b/") - assert.strictEqual(path.transformLink(cur, "a/b/index.png", opts), "../../a/b/index.png") - assert.strictEqual(path.transformLink(cur, "a/b/index#abc", opts), "../../a/b/#abc") - assert.strictEqual(path.transformLink(cur, "index", opts), "../../") - assert.strictEqual(path.transformLink(cur, "index.png", opts), "../../index.png") - assert.strictEqual(path.transformLink(cur, "test.png", opts), "../../a/test.png") - assert.strictEqual(path.transformLink(cur, "index#abc", opts), "../../#abc") - }) - - test("from a/b/index", () => { - const cur = "a/b/index" as FullSlug - assert.strictEqual(path.transformLink(cur, "d", opts), "../../a/b/d") - assert.strictEqual(path.transformLink(cur, "h", opts), "../../e/g/h") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "../../a/b/") - assert.strictEqual(path.transformLink(cur, "index", opts), "../../") - }) - - test("from index", () => { - const cur = "index" as FullSlug - assert.strictEqual(path.transformLink(cur, "d", opts), "./a/b/d") - assert.strictEqual(path.transformLink(cur, "h", opts), "./e/g/h") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b/") - assert.strictEqual(path.transformLink(cur, "index", opts), "./") - }) - }) - - describe("relative", () => { - const opts: TransformOptions = { - strategy: "relative", - allSlugs, - } - - test("from a/b/c", () => { - const cur = "a/b/c" as FullSlug - assert.strictEqual(path.transformLink(cur, "d", opts), "./d") - assert.strictEqual(path.transformLink(cur, "index", opts), "./") - assert.strictEqual(path.transformLink(cur, "../../../index", opts), "../../../") - assert.strictEqual(path.transformLink(cur, "../../../index.png", opts), "../../../index.png") - assert.strictEqual(path.transformLink(cur, "../../../index#abc", opts), "../../../#abc") - assert.strictEqual(path.transformLink(cur, "../../../", opts), "../../../") - assert.strictEqual( - path.transformLink(cur, "../../../a/test.png", opts), - "../../../a/test.png", - ) - assert.strictEqual(path.transformLink(cur, "../../../e/g/h", opts), "../../../e/g/h") - assert.strictEqual(path.transformLink(cur, "../../../e/g/h", opts), "../../../e/g/h") - assert.strictEqual(path.transformLink(cur, "../../../e/g/h#abc", opts), "../../../e/g/h#abc") - }) - - test("from a/b/index", () => { - const cur = "a/b/index" as FullSlug - assert.strictEqual(path.transformLink(cur, "../../index", opts), "../../") - assert.strictEqual(path.transformLink(cur, "../../", opts), "../../") - assert.strictEqual(path.transformLink(cur, "../../e/g/h", opts), "../../e/g/h") - assert.strictEqual(path.transformLink(cur, "c", opts), "./c") - }) - - test("from index", () => { - const cur = "index" as FullSlug - assert.strictEqual(path.transformLink(cur, "e/g/h", opts), "./e/g/h") - assert.strictEqual(path.transformLink(cur, "a/b/index", opts), "./a/b/") - }) - }) -}) diff --git a/quartz/util/path.ts b/quartz/util/path.ts deleted file mode 100644 index 173eb2e..0000000 --- a/quartz/util/path.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { slug } from "github-slugger" -// this file must be isomorphic so it can't use node libs (e.g. path) - -export const QUARTZ = "quartz" - -/// Utility type to simulate nominal types in TypeScript -type SlugLike = string & { __brand: T } - -/** Cannot be relative and must have a file extension. */ -export type FilePath = SlugLike<"filepath"> -export function isFilePath(s: string): s is FilePath { - const validStart = !s.startsWith(".") - return validStart && _hasFileExtension(s) -} - -/** Cannot be relative and may not have leading or trailing slashes. It can have `index` as it's last segment. Use this wherever possible is it's the most 'general' interpretation of a slug. */ -export type FullSlug = SlugLike<"full"> -export function isFullSlug(s: string): s is FullSlug { - const validStart = !(s.startsWith(".") || s.startsWith("/")) - const validEnding = !s.endsWith("/") - return validStart && validEnding && !_containsForbiddenCharacters(s) -} - -/** Shouldn't be a relative path and shouldn't have `/index` as an ending or a file extension. It _can_ however have a trailing slash to indicate a folder path. */ -export type SimpleSlug = SlugLike<"simple"> -export function isSimpleSlug(s: string): s is SimpleSlug { - const validStart = !(s.startsWith(".") || s.startsWith("/")) - const validEnding = !(s.endsWith("/index") || s === "index") - return validStart && !_containsForbiddenCharacters(s) && validEnding && !_hasFileExtension(s) -} - -/** Can be found on `href`s but can also be constructed for client-side navigation (e.g. search and graph) */ -export type RelativeURL = SlugLike<"relative"> -export function isRelativeURL(s: string): s is RelativeURL { - const validStart = /^\.{1,2}/.test(s) - const validEnding = !(s.endsWith("/index") || s === "index") - return validStart && validEnding && ![".md", ".html"].includes(_getFileExtension(s) ?? "") -} - -export function getFullSlug(window: Window): FullSlug { - const res = window.document.body.dataset.slug! as FullSlug - return res -} - -export function slugifyFilePath(fp: FilePath, excludeExt?: boolean): FullSlug { - fp = _stripSlashes(fp) as FilePath - let ext = _getFileExtension(fp) - const withoutFileExt = fp.replace(new RegExp(ext + "$"), "") - if (excludeExt || [".md", ".html", undefined].includes(ext)) { - ext = "" - } - - let slug = withoutFileExt - .split("/") - .map((segment) => segment.replace(/\s/g, "-").replace(/%/g, "-percent").replace(/\?/g, "-q")) // slugify all segments - .join("/") // always use / as sep - .replace(/\/$/, "") // remove trailing slash - - // treat _index as index - if (_endsWith(slug, "_index")) { - slug = slug.replace(/_index$/, "index") - } - - return (slug + ext) as FullSlug -} - -export function simplifySlug(fp: FullSlug): SimpleSlug { - return _stripSlashes(_trimSuffix(fp, "index"), true) as SimpleSlug -} - -export function transformInternalLink(link: string): RelativeURL { - let [fplike, anchor] = splitAnchor(decodeURI(link)) - - const folderPath = _isFolderPath(fplike) - let segments = fplike.split("/").filter((x) => x.length > 0) - let prefix = segments.filter(_isRelativeSegment).join("/") - let fp = segments.filter((seg) => !_isRelativeSegment(seg) && seg !== "").join("/") - - // manually add ext here as we want to not strip 'index' if it has an extension - const simpleSlug = simplifySlug(slugifyFilePath(fp as FilePath)) - const joined = joinSegments(_stripSlashes(prefix), _stripSlashes(simpleSlug)) - const trail = folderPath ? "/" : "" - const res = (_addRelativeToStart(joined) + trail + anchor) as RelativeURL - return res -} - -// resolve /a/b/c to ../.. -export function pathToRoot(slug: FullSlug): RelativeURL { - let rootPath = slug - .split("/") - .filter((x) => x !== "") - .slice(0, -1) - .map((_) => "..") - .join("/") - - if (rootPath.length === 0) { - rootPath = "." - } - - return rootPath as RelativeURL -} - -export function resolveRelative(current: FullSlug, target: FullSlug | SimpleSlug): RelativeURL { - const res = joinSegments(pathToRoot(current), simplifySlug(target as FullSlug)) as RelativeURL - return res -} - -export function splitAnchor(link: string): [string, string] { - let [fp, anchor] = link.split("#", 2) - anchor = anchor === undefined ? "" : "#" + slugAnchor(anchor) - return [fp, anchor] -} - -export function slugAnchor(anchor: string) { - return slug(anchor) -} - -export function slugTag(tag: string) { - return tag - .split("/") - .map((tagSegment) => slug(tagSegment)) - .join("/") -} - -export function joinSegments(...args: string[]): string { - return args - .filter((segment) => segment !== "") - .join("/") - .replace(/\/\/+/g, "/") -} - -export function getAllSegmentPrefixes(tags: string): string[] { - const segments = tags.split("/") - const results: string[] = [] - for (let i = 0; i < segments.length; i++) { - results.push(segments.slice(0, i + 1).join("/")) - } - return results -} - -export interface TransformOptions { - strategy: "absolute" | "relative" | "shortest" - allSlugs: FullSlug[] -} - -export function transformLink(src: FullSlug, target: string, opts: TransformOptions): RelativeURL { - let targetSlug = transformInternalLink(target) - - if (opts.strategy === "relative") { - return targetSlug as RelativeURL - } else { - const folderTail = _isFolderPath(targetSlug) ? "/" : "" - const canonicalSlug = _stripSlashes(targetSlug.slice(".".length)) - let [targetCanonical, targetAnchor] = splitAnchor(canonicalSlug) - - if (opts.strategy === "shortest") { - // if the file name is unique, then it's just the filename - const matchingFileNames = opts.allSlugs.filter((slug) => { - const parts = slug.split("/") - const fileName = parts.at(-1) - return targetCanonical === fileName - }) - - // only match, just use it - if (matchingFileNames.length === 1) { - const targetSlug = matchingFileNames[0] - return (resolveRelative(src, targetSlug) + targetAnchor) as RelativeURL - } - } - - // if it's not unique, then it's the absolute path from the vault root - return (joinSegments(pathToRoot(src), canonicalSlug) + folderTail) as RelativeURL - } -} - -function _isFolderPath(fplike: string): boolean { - return ( - fplike.endsWith("/") || - _endsWith(fplike, "index") || - _endsWith(fplike, "index.md") || - _endsWith(fplike, "index.html") - ) -} - -function _endsWith(s: string, suffix: string): boolean { - return s === suffix || s.endsWith("/" + suffix) -} - -function _trimSuffix(s: string, suffix: string): string { - if (_endsWith(s, suffix)) { - s = s.slice(0, -suffix.length) - } - return s -} - -function _containsForbiddenCharacters(s: string): boolean { - return s.includes(" ") || s.includes("#") || s.includes("?") -} - -function _hasFileExtension(s: string): boolean { - return _getFileExtension(s) !== undefined -} - -function _getFileExtension(s: string): string | undefined { - return s.match(/\.[A-Za-z0-9]+$/)?.[0] -} - -function _isRelativeSegment(s: string): boolean { - return /^\.{0,2}$/.test(s) -} - -export function _stripSlashes(s: string, onlyStripPrefix?: boolean): string { - if (s.startsWith("/")) { - s = s.substring(1) - } - - if (!onlyStripPrefix && s.endsWith("/")) { - s = s.slice(0, -1) - } - - return s -} - -function _addRelativeToStart(s: string): string { - if (s === "") { - s = "." - } - - if (!s.startsWith(".")) { - s = joinSegments(".", s) - } - - return s -} diff --git a/quartz/util/perf.ts b/quartz/util/perf.ts deleted file mode 100644 index ba34ddb..0000000 --- a/quartz/util/perf.ts +++ /dev/null @@ -1,19 +0,0 @@ -import chalk from "chalk" -import pretty from "pretty-time" - -export class PerfTimer { - evts: { [key: string]: [number, number] } - - constructor() { - this.evts = {} - this.addEvent("start") - } - - addEvent(evtName: string) { - this.evts[evtName] = process.hrtime() - } - - timeSince(evtName?: string): string { - return chalk.yellow(pretty(process.hrtime(this.evts[evtName ?? "start"]))) - } -} diff --git a/quartz/util/resources.tsx b/quartz/util/resources.tsx deleted file mode 100644 index a185733..0000000 --- a/quartz/util/resources.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { randomUUID } from "crypto" -import { JSX } from "preact/jsx-runtime" - -export type JSResource = { - loadTime: "beforeDOMReady" | "afterDOMReady" - moduleType?: "module" - spaPreserve?: boolean -} & ( - | { - src: string - contentType: "external" - } - | { - script: string - contentType: "inline" - } -) - -export function JSResourceToScriptElement(resource: JSResource, preserve?: boolean): JSX.Element { - const scriptType = resource.moduleType ?? "application/javascript" - const spaPreserve = preserve ?? resource.spaPreserve - if (resource.contentType === "external") { - return ( - - ) - } -} - -export interface StaticResources { - css: string[] - js: JSResource[] -} diff --git a/quartz/util/sourcemap.ts b/quartz/util/sourcemap.ts deleted file mode 100644 index d3b9cf7..0000000 --- a/quartz/util/sourcemap.ts +++ /dev/null @@ -1,18 +0,0 @@ -import fs from "fs" -import sourceMapSupport from "source-map-support" -import { fileURLToPath } from "url" - -export const options: sourceMapSupport.Options = { - // source map hack to get around query param - // import cache busting - retrieveSourceMap(source) { - if (source.includes(".quartz-cache")) { - let realSource = fileURLToPath(source.split("?", 2)[0] + ".map") - return { - map: fs.readFileSync(realSource, "utf8"), - } - } else { - return null - } - }, -} diff --git a/quartz/util/theme.ts b/quartz/util/theme.ts deleted file mode 100644 index 47951c4..0000000 --- a/quartz/util/theme.ts +++ /dev/null @@ -1,63 +0,0 @@ -export interface ColorScheme { - light: string - lightgray: string - gray: string - darkgray: string - dark: string - secondary: string - tertiary: string - highlight: string -} - -export interface Theme { - typography: { - header: string - body: string - code: string - } - colors: { - lightMode: ColorScheme - darkMode: ColorScheme - } -} - -const DEFAULT_SANS_SERIF = - '-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif' -const DEFAULT_MONO = "ui-monospace, SFMono-Regular, SF Mono, Menlo, monospace" - -export function googleFontHref(theme: Theme) { - const { code, header, body } = theme.typography - return `https://fonts.googleapis.com/css2?family=${code}&family=${header}:wght@400;700&family=${body}:ital,wght@0,400;0,600;1,400;1,600&display=swap` -} - -export function joinStyles(theme: Theme, ...stylesheet: string[]) { - return ` -${stylesheet.join("\n\n")} - -:root { - --light: ${theme.colors.lightMode.light}; - --lightgray: ${theme.colors.lightMode.lightgray}; - --gray: ${theme.colors.lightMode.gray}; - --darkgray: ${theme.colors.lightMode.darkgray}; - --dark: ${theme.colors.lightMode.dark}; - --secondary: ${theme.colors.lightMode.secondary}; - --tertiary: ${theme.colors.lightMode.tertiary}; - --highlight: ${theme.colors.lightMode.highlight}; - - --headerFont: "${theme.typography.header}", ${DEFAULT_SANS_SERIF}; - --bodyFont: "${theme.typography.body}", ${DEFAULT_SANS_SERIF}; - --codeFont: "${theme.typography.code}", ${DEFAULT_MONO}; -} - -:root[saved-theme="dark"] { - --light: ${theme.colors.darkMode.light}; - --lightgray: ${theme.colors.darkMode.lightgray}; - --gray: ${theme.colors.darkMode.gray}; - --darkgray: ${theme.colors.darkMode.darkgray}; - --dark: ${theme.colors.darkMode.dark}; - --secondary: ${theme.colors.darkMode.secondary}; - --tertiary: ${theme.colors.darkMode.tertiary}; - --highlight: ${theme.colors.darkMode.highlight}; -} -` -} diff --git a/quartz/util/trace.ts b/quartz/util/trace.ts deleted file mode 100644 index c7f3cc3..0000000 --- a/quartz/util/trace.ts +++ /dev/null @@ -1,47 +0,0 @@ -import chalk from "chalk" -import process from "process" -import { isMainThread } from "workerpool" - -const rootFile = /.*at file:/ -export function trace(msg: string, err: Error) { - const stack = err.stack - - const lines: string[] = [] - - lines.push("") - lines.push( - "\n" + - chalk.bgRed.black.bold(" ERROR ") + - "\n" + - chalk.red(` ${msg}`) + - (err.message.length > 0 ? `: ${err.message}` : ""), - ) - - if (!stack) { - return - } - - let reachedEndOfLegibleTrace = false - for (const line of stack.split("\n").slice(1)) { - if (reachedEndOfLegibleTrace) { - break - } - - if (!line.includes("node_modules")) { - lines.push(` ${line}`) - if (rootFile.test(line)) { - reachedEndOfLegibleTrace = true - } - } - } - - const traceMsg = lines.join("\n") - if (!isMainThread) { - // gather lines and throw - throw new Error(traceMsg) - } else { - // print and exit - console.error(traceMsg) - process.exit(1) - } -} diff --git a/quartz/worker.ts b/quartz/worker.ts deleted file mode 100644 index b92bdac..0000000 --- a/quartz/worker.ts +++ /dev/null @@ -1,19 +0,0 @@ -import sourceMapSupport from "source-map-support" -sourceMapSupport.install(options) -import cfg from "../quartz.config" -import { Argv, BuildCtx } from "./util/ctx" -import { FilePath, FullSlug } from "./util/path" -import { createFileParser, createProcessor } from "./processors/parse" -import { options } from "./util/sourcemap" - -// only called from worker thread -export async function parseFiles(argv: Argv, fps: FilePath[], allSlugs: FullSlug[]) { - const ctx: BuildCtx = { - cfg, - argv, - allSlugs, - } - const processor = createProcessor(ctx) - const parse = createFileParser(ctx, fps) - return parse(processor) -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 784ab23..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "lib": ["esnext", "DOM", "DOM.Iterable"], - "experimentalDecorators": true, - "module": "esnext", - "target": "esnext", - "moduleResolution": "node", - "strict": true, - "incremental": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "esModuleInterop": true, - "jsx": "react-jsx", - "jsxImportSource": "preact" - }, - "include": ["**/*.ts", "**/*.tsx", "./package.json"], - "exclude": ["build/**/*.d.ts"] -} diff --git a/content/ASCN/Images.md b/www/ASCN/Images.md similarity index 100% rename from content/ASCN/Images.md rename to www/ASCN/Images.md diff --git a/content/ASCN/T - Aula 1.md b/www/ASCN/T - Aula 1.md similarity index 100% rename from content/ASCN/T - Aula 1.md rename to www/ASCN/T - Aula 1.md diff --git a/content/ASCN/T - Aula 2.md b/www/ASCN/T - Aula 2.md similarity index 100% rename from content/ASCN/T - Aula 2.md rename to www/ASCN/T - Aula 2.md diff --git a/content/CP/PL - Aula 2.md b/www/CP/PL - Aula 2.md similarity index 100% rename from content/CP/PL - Aula 2.md rename to www/CP/PL - Aula 2.md diff --git a/content/CP/T - Aula 2 - 19 Setembro.md b/www/CP/T - Aula 2 - 19 Setembro.md similarity index 100% rename from content/CP/T - Aula 2 - 19 Setembro.md rename to www/CP/T - Aula 2 - 19 Setembro.md diff --git a/content/DAA/PL - Aula 1.md b/www/DAA/PL - Aula 1.md similarity index 100% rename from content/DAA/PL - Aula 1.md rename to www/DAA/PL - Aula 1.md diff --git a/content/DAA/T - Aula 1.md b/www/DAA/T - Aula 1.md similarity index 100% rename from content/DAA/T - Aula 1.md rename to www/DAA/T - Aula 1.md diff --git a/content/DAA/T - Aula 2.md b/www/DAA/T - Aula 2.md similarity index 100% rename from content/DAA/T - Aula 2.md rename to www/DAA/T - Aula 2.md diff --git a/content/Excalidraw/ASCN/Monolithic system.excalidraw.md b/www/Excalidraw/ASCN/Monolithic system.excalidraw.md similarity index 100% rename from content/Excalidraw/ASCN/Monolithic system.excalidraw.md rename to www/Excalidraw/ASCN/Monolithic system.excalidraw.md diff --git a/content/Excalidraw/ASCN/Partitioning.excalidraw.md b/www/Excalidraw/ASCN/Partitioning.excalidraw.md similarity index 100% rename from content/Excalidraw/ASCN/Partitioning.excalidraw.md rename to www/Excalidraw/ASCN/Partitioning.excalidraw.md diff --git a/content/Excalidraw/ASCN/Replication.excalidraw.md b/www/Excalidraw/ASCN/Replication.excalidraw.md similarity index 100% rename from content/Excalidraw/ASCN/Replication.excalidraw.md rename to www/Excalidraw/ASCN/Replication.excalidraw.md diff --git a/content/Excalidraw/ASCN/SOA.excalidraw.md b/www/Excalidraw/ASCN/SOA.excalidraw.md similarity index 100% rename from content/Excalidraw/ASCN/SOA.excalidraw.md rename to www/Excalidraw/ASCN/SOA.excalidraw.md diff --git a/content/Excalidraw/ASCN/bus.excalidraw.md b/www/Excalidraw/ASCN/bus.excalidraw.md similarity index 100% rename from content/Excalidraw/ASCN/bus.excalidraw.md rename to www/Excalidraw/ASCN/bus.excalidraw.md diff --git a/content/Excalidraw/ASCN/client-server.excalidraw.md b/www/Excalidraw/ASCN/client-server.excalidraw.md similarity index 100% rename from content/Excalidraw/ASCN/client-server.excalidraw.md rename to www/Excalidraw/ASCN/client-server.excalidraw.md diff --git a/content/Excalidraw/ASCN/master.excalidraw.md b/www/Excalidraw/ASCN/master.excalidraw.md similarity index 100% rename from content/Excalidraw/ASCN/master.excalidraw.md rename to www/Excalidraw/ASCN/master.excalidraw.md diff --git a/content/Excalidraw/ASCN/multi-tier.excalidraw.md b/www/Excalidraw/ASCN/multi-tier.excalidraw.md similarity index 100% rename from content/Excalidraw/ASCN/multi-tier.excalidraw.md rename to www/Excalidraw/ASCN/multi-tier.excalidraw.md diff --git a/content/Excalidraw/ASCN/proxy.excalidraw.md b/www/Excalidraw/ASCN/proxy.excalidraw.md similarity index 100% rename from content/Excalidraw/ASCN/proxy.excalidraw.md rename to www/Excalidraw/ASCN/proxy.excalidraw.md diff --git a/content/Excalidraw/ASCN/server-group.excalidraw.md b/www/Excalidraw/ASCN/server-group.excalidraw.md similarity index 100% rename from content/Excalidraw/ASCN/server-group.excalidraw.md rename to www/Excalidraw/ASCN/server-group.excalidraw.md diff --git a/content/Excalidraw/MFES/Ficha1_ex2.excalidraw.md b/www/Excalidraw/MFES/Ficha1_ex2.excalidraw.md similarity index 93% rename from content/Excalidraw/MFES/Ficha1_ex2.excalidraw.md rename to www/Excalidraw/MFES/Ficha1_ex2.excalidraw.md index 51fc70f..d08143e 100644 --- a/content/Excalidraw/MFES/Ficha1_ex2.excalidraw.md +++ b/www/Excalidraw/MFES/Ficha1_ex2.excalidraw.md @@ -18,8 +18,8 @@ tags: [excalidraw] "elements": [ { "type": "rectangle", - "version": 174, - "versionNonce": 852774011, + "version": 179, + "versionNonce": 311889653, "isDeleted": false, "id": "SoGlR6ppyIv8Kz6e82yM4", "fillStyle": "hachure", @@ -41,14 +41,14 @@ tags: [excalidraw] "type": 3 }, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false }, { "type": "freedraw", - "version": 189, - "versionNonce": 1287720117, + "version": 194, + "versionNonce": 1365067483, "isDeleted": false, "id": "Nj0ORMi-9n7Ya5SW2N5OB", "fillStyle": "hachure", @@ -68,7 +68,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -345,8 +345,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 153, - "versionNonce": 623576347, + "version": 158, + "versionNonce": 1931700309, "isDeleted": false, "id": "bP0r5j93YKnJucyZn37Q1", "fillStyle": "hachure", @@ -366,7 +366,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -463,8 +463,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 192, - "versionNonce": 1523035669, + "version": 197, + "versionNonce": 1365619579, "isDeleted": false, "id": "AZw81volxje6uSfngV95n", "fillStyle": "hachure", @@ -484,7 +484,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -776,8 +776,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 141, - "versionNonce": 1499572667, + "version": 146, + "versionNonce": 664638901, "isDeleted": false, "id": "b8q21pj0VIc5b8YQ6ZY-F", "fillStyle": "hachure", @@ -797,7 +797,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -829,8 +829,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 161, - "versionNonce": 640885621, + "version": 166, + "versionNonce": 1526172699, "isDeleted": false, "id": "xvHvkA1CIRAOtpEIbz6rW", "fillStyle": "hachure", @@ -850,7 +850,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -987,8 +987,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 152, - "versionNonce": 1687861851, + "version": 157, + "versionNonce": 455808789, "isDeleted": false, "id": "paIAFeg1ZtfLLxoXbd26K", "fillStyle": "hachure", @@ -1008,7 +1008,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -1100,8 +1100,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 151, - "versionNonce": 1397288149, + "version": 156, + "versionNonce": 1376080059, "isDeleted": false, "id": "U3X7Nb6aTPvTuPgXEFoqb", "fillStyle": "hachure", @@ -1121,7 +1121,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -1208,8 +1208,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 178, - "versionNonce": 329823995, + "version": 183, + "versionNonce": 943811701, "isDeleted": false, "id": "voztVitMAR1rGkuPmk4d6", "fillStyle": "hachure", @@ -1229,7 +1229,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -1456,8 +1456,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 140, - "versionNonce": 1637780021, + "version": 145, + "versionNonce": 2016510299, "isDeleted": false, "id": "ch-DF9DOmQUGAo7oLLn7F", "fillStyle": "hachure", @@ -1477,7 +1477,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -1509,8 +1509,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 160, - "versionNonce": 1963859867, + "version": 165, + "versionNonce": 2124813781, "isDeleted": false, "id": "Qn7Iug0U07TNgOQ2SnODb", "fillStyle": "hachure", @@ -1530,7 +1530,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060335, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -1667,8 +1667,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 153, - "versionNonce": 1108966293, + "version": 158, + "versionNonce": 919510523, "isDeleted": false, "id": "YgV_2iAJfUhaTf2xSRn72", "fillStyle": "hachure", @@ -1688,7 +1688,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -1790,8 +1790,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 159, - "versionNonce": 587035707, + "version": 164, + "versionNonce": 1500418869, "isDeleted": false, "id": "gg9-lldN1aJ6_hYInkyCh", "fillStyle": "hachure", @@ -1811,7 +1811,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -1943,8 +1943,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 192, - "versionNonce": 753877237, + "version": 197, + "versionNonce": 685713051, "isDeleted": false, "id": "MWw5V3B_WBPBp0dez1Y1Z", "fillStyle": "hachure", @@ -1964,7 +1964,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338566, "link": null, "locked": false, "points": [ @@ -2136,8 +2136,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 213, - "versionNonce": 1297691867, + "version": 218, + "versionNonce": 889218197, "isDeleted": false, "id": "ejGYaWzyjRgvyV_pmFsEt", "fillStyle": "hachure", @@ -2157,7 +2157,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -2434,8 +2434,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 186, - "versionNonce": 933583445, + "version": 191, + "versionNonce": 1695914811, "isDeleted": false, "id": "pL8JD4xL5OZwwi7JJSIuN", "fillStyle": "hachure", @@ -2455,7 +2455,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -2597,8 +2597,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 150, - "versionNonce": 62120315, + "version": 155, + "versionNonce": 1427180021, "isDeleted": false, "id": "2qbkHjI7n-bwr48p91IPp", "fillStyle": "hachure", @@ -2618,7 +2618,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -2760,8 +2760,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 194, - "versionNonce": 722552757, + "version": 199, + "versionNonce": 131365851, "isDeleted": false, "id": "uums-WNITW_ECcZTwxrou", "fillStyle": "hachure", @@ -2781,7 +2781,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -2963,8 +2963,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 271, - "versionNonce": 1062205979, + "version": 276, + "versionNonce": 1789264725, "isDeleted": false, "id": "2tatdSswHqQAqAwvI_4vz", "fillStyle": "hachure", @@ -2984,7 +2984,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -3106,8 +3106,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 283, - "versionNonce": 425232661, + "version": 288, + "versionNonce": 2100185211, "isDeleted": false, "id": "8SJiVoJv_ET6b0n5xKJbg", "fillStyle": "hachure", @@ -3127,7 +3127,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -3309,8 +3309,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 287, - "versionNonce": 757071547, + "version": 292, + "versionNonce": 1779749045, "isDeleted": false, "id": "dkfaLwBppsaVAZFC0i8YD", "fillStyle": "hachure", @@ -3330,7 +3330,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -3532,8 +3532,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 286, - "versionNonce": 871407221, + "version": 291, + "versionNonce": 182812955, "isDeleted": false, "id": "228DabfD1CwpOWrWTGsFK", "fillStyle": "hachure", @@ -3553,7 +3553,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -3750,8 +3750,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 285, - "versionNonce": 935751515, + "version": 290, + "versionNonce": 553841173, "isDeleted": false, "id": "ps3f1oX5P5nkZ2QkQpLj2", "fillStyle": "hachure", @@ -3771,7 +3771,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -3963,8 +3963,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 280, - "versionNonce": 1637812181, + "version": 285, + "versionNonce": 443327931, "isDeleted": false, "id": "CkS0Cohv7E9v_KB110RvM", "fillStyle": "hachure", @@ -3984,7 +3984,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -4146,8 +4146,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 286, - "versionNonce": 1368771579, + "version": 291, + "versionNonce": 208004981, "isDeleted": false, "id": "O95n2PGNInyDC5ZzC3qvc", "fillStyle": "hachure", @@ -4167,7 +4167,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -4364,8 +4364,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 169, - "versionNonce": 343491893, + "version": 174, + "versionNonce": 1122383451, "isDeleted": false, "id": "1RwtinvjT7TV_AWMWEn0n", "fillStyle": "hachure", @@ -4385,7 +4385,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -4622,8 +4622,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 144, - "versionNonce": 2123404443, + "version": 149, + "versionNonce": 1854091477, "isDeleted": false, "id": "l08e1a_enZ70A6b3xE1iP", "fillStyle": "hachure", @@ -4643,7 +4643,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -4755,8 +4755,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 138, - "versionNonce": 1608832661, + "version": 143, + "versionNonce": 321172219, "isDeleted": false, "id": "wThwU-UQ8PtxDj1qUAso1", "fillStyle": "hachure", @@ -4776,7 +4776,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -4858,8 +4858,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 131, - "versionNonce": 510216507, + "version": 136, + "versionNonce": 619728437, "isDeleted": false, "id": "lOwKa_mZXN_QZcUmMDFFc", "fillStyle": "hachure", @@ -4879,7 +4879,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -4921,8 +4921,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 160, - "versionNonce": 1318534133, + "version": 165, + "versionNonce": 464165787, "isDeleted": false, "id": "axqZ6cktx76QajgETI01l", "fillStyle": "hachure", @@ -4942,7 +4942,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060336, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -5134,8 +5134,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 131, - "versionNonce": 1988258267, + "version": 136, + "versionNonce": 1049804693, "isDeleted": false, "id": "R849u8ATzUSkfgnFOfIjQ", "fillStyle": "hachure", @@ -5155,7 +5155,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -5197,8 +5197,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 161, - "versionNonce": 2023093589, + "version": 166, + "versionNonce": 950693947, "isDeleted": false, "id": "J5kIsbMS02WwCr0nYC1Ej", "fillStyle": "hachure", @@ -5218,7 +5218,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -5415,8 +5415,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 136, - "versionNonce": 2079225467, + "version": 141, + "versionNonce": 1369441525, "isDeleted": false, "id": "UOFE-s621GTdTHR9KN053", "fillStyle": "hachure", @@ -5436,7 +5436,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -5508,8 +5508,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 161, - "versionNonce": 1496744629, + "version": 166, + "versionNonce": 470200539, "isDeleted": false, "id": "Cdk0hLNM7UmX-cI_PzeSS", "fillStyle": "hachure", @@ -5529,7 +5529,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338567, "link": null, "locked": false, "points": [ @@ -5726,8 +5726,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 147, - "versionNonce": 1567616795, + "version": 152, + "versionNonce": 295542357, "isDeleted": false, "id": "YzaeQBSwJKa7uhCjkzG6f", "fillStyle": "hachure", @@ -5747,7 +5747,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -5874,8 +5874,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 152, - "versionNonce": 1696490517, + "version": 157, + "versionNonce": 391241083, "isDeleted": false, "id": "n9whqldbEtuf6Y47Nf56t", "fillStyle": "hachure", @@ -5895,7 +5895,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -6047,8 +6047,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 163, - "versionNonce": 1299796923, + "version": 168, + "versionNonce": 627116981, "isDeleted": false, "id": "Y0PHlNxJHvG6X8N7YCXJF", "fillStyle": "hachure", @@ -6068,7 +6068,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -6270,8 +6270,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 161, - "versionNonce": 1615010165, + "version": 166, + "versionNonce": 634287643, "isDeleted": false, "id": "g6OaNBnWKRGzOUvA1yoRv", "fillStyle": "hachure", @@ -6291,7 +6291,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -6488,8 +6488,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 146, - "versionNonce": 204285019, + "version": 151, + "versionNonce": 1024445717, "isDeleted": false, "id": "EpzwyqeWDEEqSsWJa5rwq", "fillStyle": "hachure", @@ -6509,7 +6509,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -6631,8 +6631,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 154, - "versionNonce": 1944724181, + "version": 159, + "versionNonce": 913242811, "isDeleted": false, "id": "Vb42d262k93WZxDsQ9HDC", "fillStyle": "hachure", @@ -6652,7 +6652,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -6809,8 +6809,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 185, - "versionNonce": 828236027, + "version": 190, + "versionNonce": 1746887285, "isDeleted": false, "id": "HlTKuhOerhg_U_lxtdMKw", "fillStyle": "hachure", @@ -6830,7 +6830,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -7147,8 +7147,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 169, - "versionNonce": 78184501, + "version": 174, + "versionNonce": 903211867, "isDeleted": false, "id": "I317qDX6YJdzvUt5YTLws", "fillStyle": "hachure", @@ -7168,7 +7168,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -7405,8 +7405,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 172, - "versionNonce": 915278235, + "version": 177, + "versionNonce": 727010261, "isDeleted": false, "id": "8NvifwGOfZFLXc0P85QcW", "fillStyle": "hachure", @@ -7426,7 +7426,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -7678,8 +7678,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 155, - "versionNonce": 1214591381, + "version": 160, + "versionNonce": 1482016763, "isDeleted": false, "id": "vsrguExyvSPVohRauzSAs", "fillStyle": "hachure", @@ -7699,7 +7699,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -7861,8 +7861,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 160, - "versionNonce": 1089478203, + "version": 165, + "versionNonce": 1455884597, "isDeleted": false, "id": "PRlG0l90drKs5LX43hDS9", "fillStyle": "hachure", @@ -7882,7 +7882,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -8074,8 +8074,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 175, - "versionNonce": 475281141, + "version": 180, + "versionNonce": 603000987, "isDeleted": false, "id": "a9UvSoPvUyS-3srS2g5Mk", "fillStyle": "hachure", @@ -8095,7 +8095,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -8362,8 +8362,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 179, - "versionNonce": 728145627, + "version": 184, + "versionNonce": 467278485, "isDeleted": false, "id": "CkdrGSBVCgsmy0AMTDNO7", "fillStyle": "hachure", @@ -8383,7 +8383,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -8670,8 +8670,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 163, - "versionNonce": 452694101, + "version": 168, + "versionNonce": 978994491, "isDeleted": false, "id": "6sD1GujQeAx5Pdg6QDIwa", "fillStyle": "hachure", @@ -8691,7 +8691,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -8898,8 +8898,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 179, - "versionNonce": 1350830971, + "version": 184, + "versionNonce": 1665400821, "isDeleted": false, "id": "HzMvmwSxEs4M4n3lt9g12", "fillStyle": "hachure", @@ -8919,7 +8919,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -9206,8 +9206,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 139, - "versionNonce": 1915796917, + "version": 144, + "versionNonce": 1660151259, "isDeleted": false, "id": "NsvUuPYBT3cpqbumhK2aU", "fillStyle": "hachure", @@ -9227,7 +9227,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -9314,8 +9314,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 134, - "versionNonce": 344646683, + "version": 139, + "versionNonce": 1661614421, "isDeleted": false, "id": "CVc-FLKtGg-4nQFdB0E0M", "fillStyle": "hachure", @@ -9335,7 +9335,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060337, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -9392,8 +9392,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 167, - "versionNonce": 2031697685, + "version": 172, + "versionNonce": 1422946939, "isDeleted": false, "id": "f3r7xPZewkSDo88OT_cIT", "fillStyle": "hachure", @@ -9413,7 +9413,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -9640,8 +9640,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 181, - "versionNonce": 795715771, + "version": 186, + "versionNonce": 1954694837, "isDeleted": false, "id": "x-qj5e4BeMvS6BJNJwdmB", "fillStyle": "hachure", @@ -9661,7 +9661,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -9958,8 +9958,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 146, - "versionNonce": 103453813, + "version": 151, + "versionNonce": 1085434651, "isDeleted": false, "id": "zbSsSoMODDp5u4oVToeW3", "fillStyle": "hachure", @@ -9979,7 +9979,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338568, "link": null, "locked": false, "points": [ @@ -10101,8 +10101,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 149, - "versionNonce": 919525723, + "version": 154, + "versionNonce": 709994517, "isDeleted": false, "id": "NaU0ZXMvtYu-88DmnhwqP", "fillStyle": "hachure", @@ -10122,7 +10122,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -10269,8 +10269,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 171, - "versionNonce": 86654421, + "version": 176, + "versionNonce": 453791675, "isDeleted": false, "id": "lnVx_kntsmrYEjME5hkyj", "fillStyle": "hachure", @@ -10290,7 +10290,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -10547,8 +10547,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 200, - "versionNonce": 1744893435, + "version": 205, + "versionNonce": 644734325, "isDeleted": false, "id": "xxSFGPmskm5SZ823UcqJJ", "fillStyle": "hachure", @@ -10568,7 +10568,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -10860,8 +10860,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 207, - "versionNonce": 1294842677, + "version": 212, + "versionNonce": 637575259, "isDeleted": false, "id": "aLsxogB-6aCngkiklCUtD", "fillStyle": "hachure", @@ -10881,7 +10881,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -11208,8 +11208,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 195, - "versionNonce": 839286427, + "version": 200, + "versionNonce": 807167701, "isDeleted": false, "id": "P0mYApGNCnGAN-DRwJd4j", "fillStyle": "hachure", @@ -11229,7 +11229,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -11496,8 +11496,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 182, - "versionNonce": 916098197, + "version": 187, + "versionNonce": 996269307, "isDeleted": false, "id": "nLIGnVhfQAumLumhrWJQP", "fillStyle": "hachure", @@ -11517,7 +11517,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -11719,8 +11719,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 201, - "versionNonce": 2140271419, + "version": 206, + "versionNonce": 166904885, "isDeleted": false, "id": "RgKp36Atd_43bHge4ju5X", "fillStyle": "hachure", @@ -11740,7 +11740,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -12037,8 +12037,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 154, - "versionNonce": 1898328565, + "version": 159, + "versionNonce": 1454540187, "isDeleted": false, "id": "CU45qqcQ3lH-svt092a5M", "fillStyle": "hachure", @@ -12058,7 +12058,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -12120,8 +12120,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 189, - "versionNonce": 1090900955, + "version": 194, + "versionNonce": 131495317, "isDeleted": false, "id": "GWW6VPMACniRgmcmMD2bX", "fillStyle": "hachure", @@ -12141,7 +12141,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -12378,8 +12378,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 175, - "versionNonce": 433466197, + "version": 180, + "versionNonce": 1596267067, "isDeleted": false, "id": "Y_NDb8YW_fJeZxLiQkXDk", "fillStyle": "hachure", @@ -12399,7 +12399,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -12566,8 +12566,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 194, - "versionNonce": 913612923, + "version": 199, + "versionNonce": 1694300917, "isDeleted": false, "id": "1NlPSu5ae57Sh8UNPekvb", "fillStyle": "hachure", @@ -12587,7 +12587,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -12849,8 +12849,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 178, - "versionNonce": 285210805, + "version": 183, + "versionNonce": 832314075, "isDeleted": false, "id": "O4Qg832wExXcfd6TQ6sWZ", "fillStyle": "hachure", @@ -12870,7 +12870,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -13067,8 +13067,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 197, - "versionNonce": 2040584475, + "version": 202, + "versionNonce": 1508627541, "isDeleted": false, "id": "gJg2hG0XQVkK33GbizGd3", "fillStyle": "hachure", @@ -13088,7 +13088,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -13380,8 +13380,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 160, - "versionNonce": 273226261, + "version": 165, + "versionNonce": 1789527931, "isDeleted": false, "id": "A0gzDWndBJYo2LtdAJ3by", "fillStyle": "hachure", @@ -13401,7 +13401,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -13508,8 +13508,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 172, - "versionNonce": 1207762363, + "version": 177, + "versionNonce": 1920500149, "isDeleted": false, "id": "pO9G_cw3LeZtLrw2jw-FH", "fillStyle": "hachure", @@ -13529,7 +13529,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -13696,8 +13696,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 198, - "versionNonce": 10948469, + "version": 203, + "versionNonce": 1888575515, "isDeleted": false, "id": "WIvPIWXs1VjTqc13muf9n", "fillStyle": "hachure", @@ -13717,7 +13717,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -14014,8 +14014,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 203, - "versionNonce": 212569691, + "version": 208, + "versionNonce": 600343317, "isDeleted": false, "id": "f6s9bmUr_r4JYKJy9QD8_", "fillStyle": "hachure", @@ -14035,7 +14035,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -14267,8 +14267,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 161, - "versionNonce": 274684117, + "version": 166, + "versionNonce": 1027908795, "isDeleted": false, "id": "AxUguUNA9cMWSLaQ3oSfY", "fillStyle": "hachure", @@ -14288,7 +14288,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060338, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -14310,8 +14310,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 204, - "versionNonce": 712968955, + "version": 209, + "versionNonce": 575756405, "isDeleted": false, "id": "UXVeqJJkF_HJKFiztWwYA", "fillStyle": "hachure", @@ -14331,7 +14331,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -14568,8 +14568,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 178, - "versionNonce": 151483957, + "version": 183, + "versionNonce": 1751536987, "isDeleted": false, "id": "OgoOawrQ2yTSsy8P8WCgU", "fillStyle": "hachure", @@ -14589,7 +14589,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -14696,8 +14696,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 519, - "versionNonce": 100266907, + "version": 524, + "versionNonce": 2010677717, "isDeleted": false, "id": "tZGoGNZA_hgrBeo3ngRrs", "fillStyle": "hachure", @@ -14717,7 +14717,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338569, "link": null, "locked": false, "points": [ @@ -14944,8 +14944,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 354, - "versionNonce": 1703208853, + "version": 359, + "versionNonce": 1900605947, "isDeleted": false, "id": "RP97w4yyTkPTkpk07Cdc1", "fillStyle": "hachure", @@ -14965,7 +14965,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -15222,8 +15222,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 513, - "versionNonce": 1330563131, + "version": 518, + "versionNonce": 1500741429, "isDeleted": false, "id": "FHI60wOZoJNvK4nercug-", "fillStyle": "hachure", @@ -15243,7 +15243,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -15435,8 +15435,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 370, - "versionNonce": 671952117, + "version": 375, + "versionNonce": 1223621275, "isDeleted": false, "id": "d2Nx6m1EiGSr6nv2laSAp", "fillStyle": "hachure", @@ -15456,7 +15456,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -15838,8 +15838,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 354, - "versionNonce": 207620315, + "version": 359, + "versionNonce": 1032310933, "isDeleted": false, "id": "-btGIWopV-0L2ngwAsT7B", "fillStyle": "hachure", @@ -15859,7 +15859,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -16091,8 +16091,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 312, - "versionNonce": 1881523797, + "version": 317, + "versionNonce": 470478651, "isDeleted": false, "id": "uLCnCcS9QqWGGOMp5z1rs", "fillStyle": "hachure", @@ -16112,7 +16112,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -16204,8 +16204,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 361, - "versionNonce": 1656763771, + "version": 366, + "versionNonce": 835384821, "isDeleted": false, "id": "rudnYm_3rQmid3PvGAOba", "fillStyle": "hachure", @@ -16225,7 +16225,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -16317,8 +16317,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 504, - "versionNonce": 1352938421, + "version": 509, + "versionNonce": 1560235995, "isDeleted": false, "id": "LpQHc_XHHcnzhicAfJI3N", "fillStyle": "hachure", @@ -16338,7 +16338,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -16490,8 +16490,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 493, - "versionNonce": 565300763, + "version": 498, + "versionNonce": 1900179285, "isDeleted": false, "id": "L_wr9gfspI7MYb7ClCw1n", "fillStyle": "hachure", @@ -16511,7 +16511,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -16608,8 +16608,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 484, - "versionNonce": 1705899285, + "version": 489, + "versionNonce": 232692859, "isDeleted": false, "id": "YTBq9l5LwJECAL0boxNR-", "fillStyle": "hachure", @@ -16629,7 +16629,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -16676,8 +16676,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 550, - "versionNonce": 203903675, + "version": 555, + "versionNonce": 977517749, "isDeleted": false, "id": "pJl5eR1yDcACHl3jTGENd", "fillStyle": "hachure", @@ -16697,7 +16697,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -17079,8 +17079,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 508, - "versionNonce": 716737141, + "version": 513, + "versionNonce": 1248548123, "isDeleted": false, "id": "Lk-Z9zXM2uwHaCSzp0PgI", "fillStyle": "hachure", @@ -17100,7 +17100,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -17267,8 +17267,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 339, - "versionNonce": 1656963931, + "version": 344, + "versionNonce": 1685347861, "isDeleted": false, "id": "juX19X4i0lkbBj-yr-NNs", "fillStyle": "hachure", @@ -17288,7 +17288,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -17565,8 +17565,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 449, - "versionNonce": 277443541, + "version": 454, + "versionNonce": 303561147, "isDeleted": false, "id": "bODEdIIuMxdTb2rcO9l8-", "fillStyle": "hachure", @@ -17586,7 +17586,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -17908,8 +17908,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 484, - "versionNonce": 769138683, + "version": 489, + "versionNonce": 919196533, "isDeleted": false, "id": "3wAEML0ryfvoTPM1v23TF", "fillStyle": "hachure", @@ -17929,7 +17929,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -18131,8 +18131,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 372, - "versionNonce": 1396060469, + "version": 377, + "versionNonce": 1376193115, "isDeleted": false, "id": "pcwmH928coIfGtis4Ahiu", "fillStyle": "hachure", @@ -18152,7 +18152,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -18429,8 +18429,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 376, - "versionNonce": 1198024859, + "version": 381, + "versionNonce": 2106170581, "isDeleted": false, "id": "5NpKODSJAJGYDZmDJYLsk", "fillStyle": "hachure", @@ -18450,7 +18450,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -18557,8 +18557,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 454, - "versionNonce": 270811797, + "version": 459, + "versionNonce": 789251835, "isDeleted": false, "id": "qVjRi2P-CVqPW2k0C2xpA", "fillStyle": "hachure", @@ -18578,7 +18578,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -18625,8 +18625,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 404, - "versionNonce": 623287611, + "version": 409, + "versionNonce": 1615411765, "isDeleted": false, "id": "KiLwOagRsQ04fJZBVPHVm", "fillStyle": "hachure", @@ -18646,7 +18646,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060339, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -18928,8 +18928,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 481, - "versionNonce": 470362101, + "version": 486, + "versionNonce": 262565787, "isDeleted": false, "id": "k4jgNdjfJBSCpzUp-9W0p", "fillStyle": "hachure", @@ -18949,7 +18949,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -19136,8 +19136,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 440, - "versionNonce": 1651850715, + "version": 445, + "versionNonce": 2012097429, "isDeleted": false, "id": "93q3zvA5TLortAJjL0m2M", "fillStyle": "hachure", @@ -19157,7 +19157,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -19289,8 +19289,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 446, - "versionNonce": 418013525, + "version": 451, + "versionNonce": 1712047163, "isDeleted": false, "id": "2KgyFO5kFJOEXcp6uXM3f", "fillStyle": "hachure", @@ -19310,7 +19310,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -19442,8 +19442,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 484, - "versionNonce": 174508667, + "version": 489, + "versionNonce": 615379189, "isDeleted": false, "id": "4NLxt0N9Qcb-HDzDsMgKg", "fillStyle": "hachure", @@ -19463,7 +19463,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338570, "link": null, "locked": false, "points": [ @@ -19670,8 +19670,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 370, - "versionNonce": 1276997301, + "version": 375, + "versionNonce": 975013083, "isDeleted": false, "id": "KU5Lu6-mUoUAr0TfGmdwj", "fillStyle": "hachure", @@ -19691,7 +19691,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -19818,8 +19818,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 340, - "versionNonce": 566084379, + "version": 345, + "versionNonce": 604899925, "isDeleted": false, "id": "fqhOK9BDEP00vD_66s9EQ", "fillStyle": "hachure", @@ -19839,7 +19839,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -20046,8 +20046,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 318, - "versionNonce": 877121557, + "version": 323, + "versionNonce": 1936601467, "isDeleted": false, "id": "uwS9kGAplhjlkbwZ-DcA_", "fillStyle": "hachure", @@ -20067,7 +20067,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -20344,8 +20344,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 388, - "versionNonce": 1894557627, + "version": 393, + "versionNonce": 1726216117, "isDeleted": false, "id": "-luPwZmFOzM3VWVjdD9zj", "fillStyle": "hachure", @@ -20365,7 +20365,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -20812,8 +20812,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 345, - "versionNonce": 1600062837, + "version": 350, + "versionNonce": 1665157659, "isDeleted": false, "id": "PQ4BxDDImFtaUXncYE5De", "fillStyle": "hachure", @@ -20833,7 +20833,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -21065,8 +21065,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 335, - "versionNonce": 236320859, + "version": 340, + "versionNonce": 659896597, "isDeleted": false, "id": "4NLlXbdIOvL55SWivitY_", "fillStyle": "hachure", @@ -21086,7 +21086,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -21268,8 +21268,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 178, - "versionNonce": 11046613, + "version": 183, + "versionNonce": 243683003, "isDeleted": false, "id": "DrBxhqeLjzRpxMHD0WllE", "fillStyle": "hachure", @@ -21289,7 +21289,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -21641,8 +21641,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 133, - "versionNonce": 655111419, + "version": 138, + "versionNonce": 1054297717, "isDeleted": false, "id": "38Ayc1j_1NOoHCpc0dNWb", "fillStyle": "hachure", @@ -21662,7 +21662,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -21789,8 +21789,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 144, - "versionNonce": 1186589749, + "version": 149, + "versionNonce": 937607003, "isDeleted": false, "id": "K9t3QSc3mbaNZxRkNRp5d", "fillStyle": "hachure", @@ -21810,7 +21810,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -21992,8 +21992,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 152, - "versionNonce": 189914523, + "version": 157, + "versionNonce": 1009760213, "isDeleted": false, "id": "WnTPLT_qjV0A7XaN8Mqkn", "fillStyle": "hachure", @@ -22013,7 +22013,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -22235,8 +22235,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 188, - "versionNonce": 1903730069, + "version": 193, + "versionNonce": 698883067, "isDeleted": false, "id": "Oj3-5fhXsfUNV6HRD4epb", "fillStyle": "hachure", @@ -22256,7 +22256,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -22663,8 +22663,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 148, - "versionNonce": 1981379131, + "version": 153, + "versionNonce": 963900725, "isDeleted": false, "id": "t3nnNoSEJ5NMK1NBWR2Cd", "fillStyle": "hachure", @@ -22684,7 +22684,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -22891,8 +22891,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 157, - "versionNonce": 672801525, + "version": 162, + "versionNonce": 1071178907, "isDeleted": false, "id": "3-mXfHqoOVAKtFA8M_cOL", "fillStyle": "hachure", @@ -22912,7 +22912,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -23164,8 +23164,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 179, - "versionNonce": 407204571, + "version": 184, + "versionNonce": 1913226901, "isDeleted": false, "id": "Y5Bksb1mQihyBR0dkALvE", "fillStyle": "hachure", @@ -23185,7 +23185,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -23552,8 +23552,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 158, - "versionNonce": 254016597, + "version": 163, + "versionNonce": 841455931, "isDeleted": false, "id": "EXH05pEAt6uag-qYm6QKY", "fillStyle": "hachure", @@ -23573,7 +23573,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -23835,8 +23835,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 151, - "versionNonce": 1651007355, + "version": 156, + "versionNonce": 413527029, "isDeleted": false, "id": "9ilCubbGKhZfv-6pjFcCp", "fillStyle": "hachure", @@ -23856,7 +23856,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060340, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -24083,8 +24083,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 147, - "versionNonce": 510372277, + "version": 152, + "versionNonce": 502708699, "isDeleted": false, "id": "ml21GRakc90s3QmcA_Fmr", "fillStyle": "hachure", @@ -24104,7 +24104,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -24311,8 +24311,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 160, - "versionNonce": 247773211, + "version": 165, + "versionNonce": 1833870677, "isDeleted": false, "id": "ZYO5ot-8DeiR18X7FbRfA", "fillStyle": "hachure", @@ -24332,7 +24332,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -24604,8 +24604,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 169, - "versionNonce": 924232469, + "version": 174, + "versionNonce": 1347995259, "isDeleted": false, "id": "d1nJDAIxw9L0YpfcXEzbb", "fillStyle": "hachure", @@ -24625,7 +24625,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -24942,8 +24942,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 166, - "versionNonce": 1800207547, + "version": 171, + "versionNonce": 324612789, "isDeleted": false, "id": "G_JLt1C1O6bTYhQx1kt8g", "fillStyle": "hachure", @@ -24963,7 +24963,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -25265,8 +25265,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 124, - "versionNonce": 2040168565, + "version": 129, + "versionNonce": 1343242011, "isDeleted": false, "id": "v6CB2yzT2PBvngcG7ePAu", "fillStyle": "hachure", @@ -25286,7 +25286,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -25378,8 +25378,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 129, - "versionNonce": 1671671131, + "version": 134, + "versionNonce": 661328917, "isDeleted": false, "id": "JyDT1p-cMLsSEo8d_Jp35", "fillStyle": "hachure", @@ -25399,7 +25399,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338571, "link": null, "locked": false, "points": [ @@ -25516,8 +25516,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 120, - "versionNonce": 1539090901, + "version": 125, + "versionNonce": 663724987, "isDeleted": false, "id": "H7wLJS65Ar7VDRoIfuXNJ", "fillStyle": "hachure", @@ -25537,7 +25537,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -25609,8 +25609,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 165, - "versionNonce": 1260079611, + "version": 170, + "versionNonce": 360302965, "isDeleted": false, "id": "OzWtswMhCaFnmo8Ero2MN", "fillStyle": "hachure", @@ -25630,7 +25630,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -25927,8 +25927,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 160, - "versionNonce": 2123540277, + "version": 165, + "versionNonce": 1861842011, "isDeleted": false, "id": "B6Lg4yJvtFuOAKVFs68_W", "fillStyle": "hachure", @@ -25948,7 +25948,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -26220,8 +26220,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 161, - "versionNonce": 1723224731, + "version": 166, + "versionNonce": 785044181, "isDeleted": false, "id": "FmeSIZb89APuXGz3p9KCW", "fillStyle": "hachure", @@ -26241,7 +26241,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -26528,8 +26528,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 169, - "versionNonce": 1149368469, + "version": 174, + "versionNonce": 371208443, "isDeleted": false, "id": "k1eLr-YjBsMHIenCboTEl", "fillStyle": "hachure", @@ -26549,7 +26549,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -26876,8 +26876,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 141, - "versionNonce": 925321019, + "version": 146, + "versionNonce": 2146676789, "isDeleted": false, "id": "CNoc4dLTqRBkjW8xltSiH", "fillStyle": "hachure", @@ -26897,7 +26897,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -27084,8 +27084,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 125, - "versionNonce": 658513397, + "version": 130, + "versionNonce": 1854298523, "isDeleted": false, "id": "nPAeWrTbWStUpO9_GiCqR", "fillStyle": "hachure", @@ -27105,7 +27105,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -27212,8 +27212,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 154, - "versionNonce": 47228891, + "version": 159, + "versionNonce": 1725555093, "isDeleted": false, "id": "hXPaqRiNzKOKhf1I5v3Ds", "fillStyle": "hachure", @@ -27233,7 +27233,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -27485,8 +27485,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 161, - "versionNonce": 1305646933, + "version": 166, + "versionNonce": 1969122875, "isDeleted": false, "id": "Gx6-JDxiobBLoHHxlJ1uv", "fillStyle": "hachure", @@ -27506,7 +27506,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -27793,8 +27793,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 145, - "versionNonce": 533001339, + "version": 150, + "versionNonce": 1756554997, "isDeleted": false, "id": "3WOJ2orr7scKyuBQTuEMh", "fillStyle": "hachure", @@ -27814,7 +27814,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -28021,8 +28021,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 137, - "versionNonce": 1653531829, + "version": 142, + "versionNonce": 1569386203, "isDeleted": false, "id": "0oRwVHeocwOPWPf2idYiC", "fillStyle": "hachure", @@ -28042,7 +28042,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -28209,8 +28209,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 161, - "versionNonce": 2110172443, + "version": 166, + "versionNonce": 1208238165, "isDeleted": false, "id": "ZopdLZaER3pIqcuFCi4is", "fillStyle": "hachure", @@ -28230,7 +28230,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -28517,8 +28517,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 165, - "versionNonce": 689604117, + "version": 170, + "versionNonce": 1503550331, "isDeleted": false, "id": "clCTd4B5bsnCgLBwGjf5a", "fillStyle": "hachure", @@ -28538,7 +28538,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -28845,8 +28845,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 159, - "versionNonce": 1883787707, + "version": 164, + "versionNonce": 1520659893, "isDeleted": false, "id": "G8rJJoT4LgIqt6qVBLPZE", "fillStyle": "hachure", @@ -28866,7 +28866,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -29143,8 +29143,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 125, - "versionNonce": 1416297333, + "version": 130, + "versionNonce": 635122715, "isDeleted": false, "id": "p3C6KIeWM-C0qbRhLN8pc", "fillStyle": "hachure", @@ -29164,7 +29164,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -29281,8 +29281,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 130, - "versionNonce": 946627163, + "version": 135, + "versionNonce": 532016917, "isDeleted": false, "id": "GCNFrNewo1kwiEIP3YeK9", "fillStyle": "hachure", @@ -29302,7 +29302,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060341, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -29459,8 +29459,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 118, - "versionNonce": 482723029, + "version": 123, + "versionNonce": 1379137723, "isDeleted": false, "id": "RPxEvk2oPjTV-Y7AzNPun", "fillStyle": "hachure", @@ -29480,7 +29480,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -29577,8 +29577,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 145, - "versionNonce": 1325752059, + "version": 150, + "versionNonce": 363938933, "isDeleted": false, "id": "dxiiaRIAC8dJZxdWuxMSP", "fillStyle": "hachure", @@ -29598,7 +29598,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -29835,8 +29835,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 143, - "versionNonce": 364929589, + "version": 148, + "versionNonce": 1279994203, "isDeleted": false, "id": "woA6_Ur0NUtQrkGOOY389", "fillStyle": "hachure", @@ -29856,7 +29856,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -30083,8 +30083,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 113, - "versionNonce": 1855309723, + "version": 118, + "versionNonce": 1348136405, "isDeleted": false, "id": "VhJUYzZdm8F--9YrUvOsl", "fillStyle": "hachure", @@ -30104,7 +30104,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -30181,8 +30181,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 144, - "versionNonce": 1145066389, + "version": 149, + "versionNonce": 695420411, "isDeleted": false, "id": "rFIav4o15qhF8tMTvU1aK", "fillStyle": "hachure", @@ -30202,7 +30202,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -30434,8 +30434,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 155, - "versionNonce": 1565531195, + "version": 160, + "versionNonce": 1321757493, "isDeleted": false, "id": "-vDVD_JC4u43Og7I5DSyR", "fillStyle": "hachure", @@ -30455,7 +30455,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -30752,8 +30752,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 150, - "versionNonce": 1954224373, + "version": 155, + "versionNonce": 816762523, "isDeleted": false, "id": "Rirgoe-hy_KX1WrugnpPQ", "fillStyle": "hachure", @@ -30773,7 +30773,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338572, "link": null, "locked": false, "points": [ @@ -31045,8 +31045,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 137, - "versionNonce": 1997987035, + "version": 142, + "versionNonce": 291454101, "isDeleted": false, "id": "iG3xDLD4eUj7u2Y3pytcC", "fillStyle": "hachure", @@ -31066,7 +31066,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -31273,8 +31273,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 159, - "versionNonce": 1341534805, + "version": 164, + "versionNonce": 615531323, "isDeleted": false, "id": "xcPAi5PyH33CMITlABF4X", "fillStyle": "hachure", @@ -31294,7 +31294,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -31611,8 +31611,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 135, - "versionNonce": 2004650363, + "version": 140, + "versionNonce": 1876222453, "isDeleted": false, "id": "DoQDJ6JDucIqInfHMXjCF", "fillStyle": "hachure", @@ -31632,7 +31632,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -31829,8 +31829,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 150, - "versionNonce": 864493493, + "version": 155, + "versionNonce": 1306141659, "isDeleted": false, "id": "hvg-mv4UNb5c0jpo3yFlM", "fillStyle": "hachure", @@ -31850,7 +31850,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -32122,8 +32122,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 120, - "versionNonce": 63152667, + "version": 125, + "versionNonce": 791599957, "isDeleted": false, "id": "lxCOvU8GsTXEeLr7kGDGK", "fillStyle": "hachure", @@ -32143,7 +32143,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -32265,8 +32265,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 132, - "versionNonce": 1163092245, + "version": 137, + "versionNonce": 1144975483, "isDeleted": false, "id": "XPQwexh3uu8U5TXpm4und", "fillStyle": "hachure", @@ -32286,7 +32286,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -32468,8 +32468,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 150, - "versionNonce": 1960748731, + "version": 155, + "versionNonce": 1472374965, "isDeleted": false, "id": "5QQX1qPBaNEtCF13GaB7q", "fillStyle": "hachure", @@ -32489,7 +32489,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -32761,8 +32761,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 321, - "versionNonce": 1255175797, + "version": 326, + "versionNonce": 2040604955, "isDeleted": false, "id": "xZ-lHW89b4cCwVeTfJBfO", "fillStyle": "hachure", @@ -32782,7 +32782,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -33089,8 +33089,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 279, - "versionNonce": 1634735963, + "version": 284, + "versionNonce": 1261816341, "isDeleted": false, "id": "f60kA5sgjY0xl4v4Pw3-p", "fillStyle": "hachure", @@ -33110,7 +33110,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -33207,8 +33207,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 111, - "versionNonce": 1053024213, + "version": 116, + "versionNonce": 57888187, "isDeleted": false, "id": "WjzKASOZoIkrcow6khQx_", "fillStyle": "hachure", @@ -33228,7 +33228,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -33310,8 +33310,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 116, - "versionNonce": 1741321211, + "version": 121, + "versionNonce": 444448629, "isDeleted": false, "id": "wG83MLfnUxet_k21VhgKd", "fillStyle": "hachure", @@ -33331,7 +33331,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -33438,8 +33438,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 114, - "versionNonce": 658709813, + "version": 119, + "versionNonce": 618126939, "isDeleted": false, "id": "ARxQ2K1SFsRAuNu_pr-EH", "fillStyle": "hachure", @@ -33459,7 +33459,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -33556,8 +33556,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 113, - "versionNonce": 938491035, + "version": 118, + "versionNonce": 467667157, "isDeleted": false, "id": "tR_RQwVYKQlTz900nWvgr", "fillStyle": "hachure", @@ -33577,7 +33577,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -33679,8 +33679,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 112, - "versionNonce": 733195925, + "version": 117, + "versionNonce": 413227771, "isDeleted": false, "id": "MX294UMSceYlx1i0Z1h4A", "fillStyle": "hachure", @@ -33700,7 +33700,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060342, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -33797,8 +33797,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 113, - "versionNonce": 1569976635, + "version": 118, + "versionNonce": 1089611317, "isDeleted": false, "id": "u914aI8q6zB5rCMKWtm1z", "fillStyle": "hachure", @@ -33818,7 +33818,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060343, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -33920,8 +33920,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 295, - "versionNonce": 1791693813, + "version": 300, + "versionNonce": 458376091, "isDeleted": false, "id": "kYQe51_qyglYnuCkiR-YG", "fillStyle": "hachure", @@ -33941,7 +33941,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060343, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -34143,8 +34143,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 304, - "versionNonce": 1243091419, + "version": 309, + "versionNonce": 748263317, "isDeleted": false, "id": "3IRMq38oArCeb4Vq1QwPp", "fillStyle": "hachure", @@ -34164,7 +34164,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060343, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -34411,8 +34411,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 342, - "versionNonce": 277794133, + "version": 347, + "versionNonce": 891099195, "isDeleted": false, "id": "I-xZbyPIpvB_h6xmGSwcL", "fillStyle": "hachure", @@ -34432,7 +34432,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060343, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -34869,8 +34869,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 287, - "versionNonce": 512695931, + "version": 292, + "versionNonce": 151772405, "isDeleted": false, "id": "z4BbqO-8GCSAntQOeedj-", "fillStyle": "hachure", @@ -34890,7 +34890,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060343, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -35047,8 +35047,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 291, - "versionNonce": 743725749, + "version": 296, + "versionNonce": 1139038427, "isDeleted": false, "id": "34prVaOK8ZTVZBkSE41vX", "fillStyle": "hachure", @@ -35068,7 +35068,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060343, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -35250,8 +35250,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 259, - "versionNonce": 178022485, + "version": 264, + "versionNonce": 500069973, "isDeleted": false, "id": "tXeswFhYZ55GabotpYClv", "fillStyle": "hachure", @@ -35271,7 +35271,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060343, + "updated": 1695723338573, "link": null, "locked": false, "points": [ @@ -35408,8 +35408,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 281, - "versionNonce": 1241297787, + "version": 286, + "versionNonce": 1161463163, "isDeleted": false, "id": "Nh7YbacRkdXVZu5MSj2Sc", "fillStyle": "hachure", @@ -35429,7 +35429,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060343, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -35676,8 +35676,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 274, - "versionNonce": 1744213429, + "version": 279, + "versionNonce": 632742837, "isDeleted": false, "id": "xCK-ZaglorAVWPo1pjNxE", "fillStyle": "hachure", @@ -35697,7 +35697,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -35909,8 +35909,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 264, - "versionNonce": 682527771, + "version": 269, + "versionNonce": 1617042971, "isDeleted": false, "id": "kvTLwVWFqPxYVLNxGmvAI", "fillStyle": "hachure", @@ -35930,7 +35930,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -36087,8 +36087,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 257, - "versionNonce": 1751389973, + "version": 262, + "versionNonce": 1693099285, "isDeleted": false, "id": "RB65M_zLAOMkxjnN-Ke4N", "fillStyle": "hachure", @@ -36108,7 +36108,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -36235,8 +36235,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 271, - "versionNonce": 1356615867, + "version": 276, + "versionNonce": 810394299, "isDeleted": false, "id": "jDGWnUHWGuay17zDgpqvT", "fillStyle": "hachure", @@ -36256,7 +36256,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -36453,8 +36453,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 260, - "versionNonce": 1985637493, + "version": 265, + "versionNonce": 2128558709, "isDeleted": false, "id": "C4-DYQiaH3hEnQ9UdcrXd", "fillStyle": "hachure", @@ -36474,7 +36474,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -36611,8 +36611,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 536, - "versionNonce": 69763419, + "version": 541, + "versionNonce": 1302303579, "isDeleted": false, "id": "yEZDzxUIiBneb8jS0HUh5", "fillStyle": "hachure", @@ -36632,7 +36632,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -36864,8 +36864,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 530, - "versionNonce": 625447733, + "version": 535, + "versionNonce": 207234005, "isDeleted": false, "id": "vQBbc6ZmGM3LAQD9gAX75", "fillStyle": "hachure", @@ -36885,7 +36885,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -37127,8 +37127,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 512, - "versionNonce": 1662396059, + "version": 517, + "versionNonce": 413822971, "isDeleted": false, "id": "yqFjG6HsEFuZ2-8N8hVdK", "fillStyle": "hachure", @@ -37148,7 +37148,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -37295,8 +37295,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 503, - "versionNonce": 498689173, + "version": 508, + "versionNonce": 1903223093, "isDeleted": false, "id": "FnQuRLQu1sRR1s4TckbKO", "fillStyle": "hachure", @@ -37316,7 +37316,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -37423,8 +37423,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 504, - "versionNonce": 1080859451, + "version": 509, + "versionNonce": 1131460763, "isDeleted": false, "id": "BoWWkYh8SNq7EWP0A6FFp", "fillStyle": "hachure", @@ -37444,7 +37444,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -37556,8 +37556,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 516, - "versionNonce": 1051331061, + "version": 521, + "versionNonce": 1938354837, "isDeleted": false, "id": "4JZQritcOp8MPE7wdIIHx", "fillStyle": "hachure", @@ -37577,7 +37577,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060344, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -37744,8 +37744,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 266, - "versionNonce": 668808795, + "version": 271, + "versionNonce": 463793467, "isDeleted": false, "id": "b0QyMWxWkDrThMnGaR-X4", "fillStyle": "hachure", @@ -37765,7 +37765,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -37937,8 +37937,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 262, - "versionNonce": 947663061, + "version": 267, + "versionNonce": 257415157, "isDeleted": false, "id": "AqqTrbLEVg6Dm2knjPVVR", "fillStyle": "hachure", @@ -37958,7 +37958,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -38110,8 +38110,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 260, - "versionNonce": 1094431483, + "version": 265, + "versionNonce": 346656219, "isDeleted": false, "id": "KWQ1nsR63uSaKH1YWQ5U8", "fillStyle": "hachure", @@ -38131,7 +38131,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -38278,8 +38278,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 317, - "versionNonce": 1204375093, + "version": 322, + "versionNonce": 249762133, "isDeleted": false, "id": "HSJN26nCgtKwe5mnCZr15", "fillStyle": "hachure", @@ -38299,7 +38299,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -38726,8 +38726,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 299, - "versionNonce": 1860279195, + "version": 304, + "versionNonce": 294722171, "isDeleted": false, "id": "Vz96UDcSIkhJocmPwD2Ej", "fillStyle": "hachure", @@ -38747,7 +38747,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -39089,8 +39089,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 277, - "versionNonce": 1300082907, + "version": 282, + "versionNonce": 1602231989, "isDeleted": false, "id": "sOiyaxACAnA5otsKZhzTc", "fillStyle": "hachure", @@ -39110,7 +39110,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -39357,8 +39357,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 276, - "versionNonce": 387358293, + "version": 281, + "versionNonce": 1864241947, "isDeleted": false, "id": "7l7Qt_9PF5ki3vIWTDKsi", "fillStyle": "hachure", @@ -39378,7 +39378,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -39620,8 +39620,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 278, - "versionNonce": 32038267, + "version": 283, + "versionNonce": 668237845, "isDeleted": false, "id": "MelfMc05uZyuIz4mLeRPr", "fillStyle": "hachure", @@ -39641,7 +39641,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -39893,8 +39893,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 240, - "versionNonce": 330959797, + "version": 245, + "versionNonce": 1304623035, "isDeleted": false, "id": "UVP6fpygDM7PasPQzLHLD", "fillStyle": "hachure", @@ -39914,7 +39914,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338574, "link": null, "locked": false, "points": [ @@ -39971,8 +39971,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 288, - "versionNonce": 629503515, + "version": 293, + "versionNonce": 500544885, "isDeleted": false, "id": "dEjtRZLrozr_S4g3TsbwC", "fillStyle": "hachure", @@ -39992,7 +39992,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -40104,8 +40104,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 530, - "versionNonce": 2018037013, + "version": 535, + "versionNonce": 463620187, "isDeleted": false, "id": "7bihDT0Za0L1j3pWTKj5y", "fillStyle": "hachure", @@ -40125,7 +40125,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -40427,8 +40427,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 519, - "versionNonce": 658897595, + "version": 524, + "versionNonce": 482950869, "isDeleted": false, "id": "feHNWrgY644SArXRPTjH6", "fillStyle": "hachure", @@ -40448,7 +40448,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -40695,8 +40695,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 532, - "versionNonce": 1412981365, + "version": 537, + "versionNonce": 1586398459, "isDeleted": false, "id": "dJKFBEo0UgGZdEMT32Fbm", "fillStyle": "hachure", @@ -40716,7 +40716,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -41028,8 +41028,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 248, - "versionNonce": 743328725, + "version": 253, + "versionNonce": 2068094005, "isDeleted": false, "id": "ccoo5GAN5VnmKd7JFiB93", "fillStyle": "hachure", @@ -41049,7 +41049,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -41156,8 +41156,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 501, - "versionNonce": 1064093691, + "version": 506, + "versionNonce": 1040854427, "isDeleted": false, "id": "llrQwwl2vBwbkN2UbSSeL", "fillStyle": "hachure", @@ -41177,7 +41177,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -41334,8 +41334,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 269, - "versionNonce": 1352665397, + "version": 274, + "versionNonce": 556617109, "isDeleted": false, "id": "k_oMTLlItXVAFoW9ttEPL", "fillStyle": "hachure", @@ -41355,7 +41355,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -41722,8 +41722,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 237, - "versionNonce": 271061147, + "version": 242, + "versionNonce": 1296548411, "isDeleted": false, "id": "bjDN4TBNJ_04Alzw-JMNq", "fillStyle": "hachure", @@ -41743,7 +41743,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -41950,8 +41950,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 227, - "versionNonce": 1922243221, + "version": 232, + "versionNonce": 1572393717, "isDeleted": false, "id": "lvbLcFiZvT6ZHj7deRT_b", "fillStyle": "hachure", @@ -41971,7 +41971,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060345, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -42128,8 +42128,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 259, - "versionNonce": 129058107, + "version": 264, + "versionNonce": 355058395, "isDeleted": false, "id": "nTFwVbzjwvYTbhVie4Sgd", "fillStyle": "hachure", @@ -42149,7 +42149,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -42466,8 +42466,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 227, - "versionNonce": 2061303797, + "version": 232, + "versionNonce": 2104274005, "isDeleted": false, "id": "NdQCqpRZ59ptY2gTU-Mj9", "fillStyle": "hachure", @@ -42487,7 +42487,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -42639,8 +42639,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 187, - "versionNonce": 1746233045, + "version": 192, + "versionNonce": 1581428603, "isDeleted": false, "id": "clwn49SGG7B_xlVvSdy28", "fillStyle": "hachure", @@ -42660,7 +42660,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -42837,8 +42837,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 206, - "versionNonce": 1534647547, + "version": 211, + "versionNonce": 538859957, "isDeleted": false, "id": "tZbW6uwP7-xbgIwpBmZb1", "fillStyle": "hachure", @@ -42858,7 +42858,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -43135,8 +43135,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 191, - "versionNonce": 1523303477, + "version": 196, + "versionNonce": 987039771, "isDeleted": false, "id": "wgyFP3Pkijr_pDLzZxVsz", "fillStyle": "hachure", @@ -43156,7 +43156,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -43358,8 +43358,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 205, - "versionNonce": 1542030747, + "version": 210, + "versionNonce": 1324571413, "isDeleted": false, "id": "pNKWuXSmOkY51IcMOvvav", "fillStyle": "hachure", @@ -43379,7 +43379,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -43651,8 +43651,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 165, - "versionNonce": 1435465109, + "version": 170, + "versionNonce": 1356025019, "isDeleted": false, "id": "ieffaREbDUiiActlOP7jS", "fillStyle": "hachure", @@ -43672,7 +43672,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -43744,8 +43744,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 160, - "versionNonce": 628890171, + "version": 165, + "versionNonce": 1382101109, "isDeleted": false, "id": "GOdGhvg2UmnKJw6TleIwU", "fillStyle": "hachure", @@ -43765,7 +43765,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -43807,8 +43807,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 196, - "versionNonce": 328596213, + "version": 201, + "versionNonce": 1675623771, "isDeleted": false, "id": "e6HE_XwcmiGuMKK1oRtkq", "fillStyle": "hachure", @@ -43828,7 +43828,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -44055,8 +44055,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 183, - "versionNonce": 353573595, + "version": 188, + "versionNonce": 1210931669, "isDeleted": false, "id": "dk9GV5JhJzE6LchFJvdX6", "fillStyle": "hachure", @@ -44076,7 +44076,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -44238,8 +44238,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 176, - "versionNonce": 1298453589, + "version": 181, + "versionNonce": 525179387, "isDeleted": false, "id": "d7apKS-xd2CKfAhp-kh-r", "fillStyle": "hachure", @@ -44259,7 +44259,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -44386,8 +44386,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 170, - "versionNonce": 1195444091, + "version": 175, + "versionNonce": 2037208885, "isDeleted": false, "id": "ABB8OnjHjNUSf2-nJXcHj", "fillStyle": "hachure", @@ -44407,7 +44407,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060346, + "updated": 1695723338575, "link": null, "locked": false, "points": [ @@ -44504,8 +44504,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 191, - "versionNonce": 248611253, + "version": 196, + "versionNonce": 538878619, "isDeleted": false, "id": "mN8toH4pf7YcvWTcngehq", "fillStyle": "hachure", @@ -44525,7 +44525,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -44727,8 +44727,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 255, - "versionNonce": 575168539, + "version": 260, + "versionNonce": 1887873173, "isDeleted": false, "id": "T2scAbnr8YzTlsyP-iI9R", "fillStyle": "hachure", @@ -44748,7 +44748,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -44950,8 +44950,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 264, - "versionNonce": 1291944725, + "version": 269, + "versionNonce": 1057331003, "isDeleted": false, "id": "U8h3MJjFhQppP6y0otxc_", "fillStyle": "hachure", @@ -44971,7 +44971,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -45218,8 +45218,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 255, - "versionNonce": 538682555, + "version": 260, + "versionNonce": 1328467445, "isDeleted": false, "id": "VZQX991uQEcB8w0izfGqV", "fillStyle": "hachure", @@ -45239,7 +45239,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -45441,8 +45441,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 245, - "versionNonce": 1013602421, + "version": 250, + "versionNonce": 442824667, "isDeleted": false, "id": "YLFES3jnprkgqwKC71bNx", "fillStyle": "hachure", @@ -45462,7 +45462,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -45614,8 +45614,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 244, - "versionNonce": 1482511707, + "version": 249, + "versionNonce": 1684752213, "isDeleted": false, "id": "IVWHE0OuceLRiv9gIirPL", "fillStyle": "hachure", @@ -45635,7 +45635,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -45782,8 +45782,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 228, - "versionNonce": 1725006293, + "version": 233, + "versionNonce": 1615807611, "isDeleted": false, "id": "zl0RjwReqibcNC5uyit_T", "fillStyle": "hachure", @@ -45803,7 +45803,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -45870,8 +45870,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 247, - "versionNonce": 1247801851, + "version": 252, + "versionNonce": 43095221, "isDeleted": false, "id": "WdKzjTcThpUwcDd38XCKV", "fillStyle": "hachure", @@ -45891,7 +45891,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -46053,8 +46053,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 252, - "versionNonce": 21790517, + "version": 257, + "versionNonce": 1485241627, "isDeleted": false, "id": "gVxg_MOT7VT6qVpG8UwyZ", "fillStyle": "hachure", @@ -46074,7 +46074,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -46261,8 +46261,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 268, - "versionNonce": 1730542235, + "version": 273, + "versionNonce": 356988437, "isDeleted": false, "id": "Wn7z9re5EjN34igLvlD2k", "fillStyle": "hachure", @@ -46282,7 +46282,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -46549,8 +46549,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 266, - "versionNonce": 37802133, + "version": 271, + "versionNonce": 780050875, "isDeleted": false, "id": "Np3_RRwPSZWLZCQWNRlgE", "fillStyle": "hachure", @@ -46570,7 +46570,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -46827,8 +46827,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 243, - "versionNonce": 1533144891, + "version": 248, + "versionNonce": 2004986741, "isDeleted": false, "id": "QdLLgwGJ-2VfavLergWX9", "fillStyle": "hachure", @@ -46848,7 +46848,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -46990,8 +46990,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 242, - "versionNonce": 427184091, + "version": 247, + "versionNonce": 2069410395, "isDeleted": false, "id": "D-ISKefrOIOHDH5ph5kpC", "fillStyle": "hachure", @@ -47011,7 +47011,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -47153,8 +47153,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 267, - "versionNonce": 465268565, + "version": 272, + "versionNonce": 159806677, "isDeleted": false, "id": "JWjZljtUHp_kOhTb7jaTx", "fillStyle": "hachure", @@ -47174,7 +47174,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -47441,8 +47441,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 282, - "versionNonce": 594910331, + "version": 287, + "versionNonce": 266841851, "isDeleted": false, "id": "5d21Tn20RJCt0sjA-EsWH", "fillStyle": "hachure", @@ -47462,7 +47462,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -47804,8 +47804,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 263, - "versionNonce": 765246645, + "version": 268, + "versionNonce": 116068917, "isDeleted": false, "id": "C5aRWaKrCWSQN7L0fwp-o", "fillStyle": "hachure", @@ -47825,7 +47825,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -48072,8 +48072,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 257, - "versionNonce": 354571547, + "version": 262, + "versionNonce": 2125338523, "isDeleted": false, "id": "FypBOe7f9n9mVyJg2LX0t", "fillStyle": "hachure", @@ -48093,7 +48093,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -48310,8 +48310,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 248, - "versionNonce": 78470677, + "version": 253, + "versionNonce": 479527829, "isDeleted": false, "id": "Pd-jZnQ7VpflduqbjAEpi", "fillStyle": "hachure", @@ -48331,7 +48331,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -48503,8 +48503,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 253, - "versionNonce": 1844378043, + "version": 258, + "versionNonce": 1709075515, "isDeleted": false, "id": "3oqte3wdfklDMOwg9oo5L", "fillStyle": "hachure", @@ -48524,7 +48524,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -48721,8 +48721,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 266, - "versionNonce": 1742918517, + "version": 271, + "versionNonce": 1052362997, "isDeleted": false, "id": "Se_rTgWlDIp7mNu45FhYy", "fillStyle": "hachure", @@ -48742,7 +48742,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -49004,8 +49004,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 262, - "versionNonce": 452856411, + "version": 267, + "versionNonce": 2036018395, "isDeleted": false, "id": "eUEpp9F7quQWLUxBObIiU", "fillStyle": "hachure", @@ -49025,7 +49025,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060347, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -49267,8 +49267,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 268, - "versionNonce": 595762389, + "version": 273, + "versionNonce": 1054794325, "isDeleted": false, "id": "cnY7CwIodPlA3fc9z_fNG", "fillStyle": "hachure", @@ -49288,7 +49288,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -49560,8 +49560,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 261, - "versionNonce": 1092749051, + "version": 266, + "versionNonce": 1287051643, "isDeleted": false, "id": "KSLyaN6j0Pw6ZDg5GXzLx", "fillStyle": "hachure", @@ -49581,7 +49581,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -49818,8 +49818,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 266, - "versionNonce": 1596078645, + "version": 271, + "versionNonce": 567922613, "isDeleted": false, "id": "cnJUWS1SitOk-bCZYe88G", "fillStyle": "hachure", @@ -49839,7 +49839,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338576, "link": null, "locked": false, "points": [ @@ -50101,8 +50101,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 229, - "versionNonce": 1188917147, + "version": 234, + "versionNonce": 1563685403, "isDeleted": false, "id": "qYzZuAl2_5Th9JTXGvmJh", "fillStyle": "hachure", @@ -50122,7 +50122,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -50199,8 +50199,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 227, - "versionNonce": 866593685, + "version": 232, + "versionNonce": 902828309, "isDeleted": false, "id": "b3zGQNaX-0DZJE9i9W643", "fillStyle": "hachure", @@ -50220,7 +50220,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -50282,8 +50282,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 259, - "versionNonce": 509789243, + "version": 264, + "versionNonce": 1539634875, "isDeleted": false, "id": "-7_T6esGxkTUMrzkJ7Zwo", "fillStyle": "hachure", @@ -50303,7 +50303,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -50530,8 +50530,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 247, - "versionNonce": 21426421, + "version": 252, + "versionNonce": 1748444789, "isDeleted": false, "id": "MlzGadxeRcwqz958vor_0", "fillStyle": "hachure", @@ -50551,7 +50551,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -50718,8 +50718,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 240, - "versionNonce": 1335133403, + "version": 245, + "versionNonce": 923559771, "isDeleted": false, "id": "0jrpX5Bvsa6QkhFHngiTd", "fillStyle": "hachure", @@ -50739,7 +50739,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -50871,8 +50871,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 255, - "versionNonce": 92736085, + "version": 260, + "versionNonce": 1540657109, "isDeleted": false, "id": "4AFcQAJchmP5BpeQL5f8c", "fillStyle": "hachure", @@ -50892,7 +50892,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -50999,8 +50999,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 260, - "versionNonce": 1107636603, + "version": 265, + "versionNonce": 1700578299, "isDeleted": false, "id": "JMUq82HBv6Av7B9A-8Asz", "fillStyle": "hachure", @@ -51020,7 +51020,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -51252,8 +51252,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 238, - "versionNonce": 1190611483, + "version": 243, + "versionNonce": 1052626229, "isDeleted": false, "id": "GD_um6RO2xoho8s3tv5lc", "fillStyle": "hachure", @@ -51273,7 +51273,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -51400,8 +51400,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 237, - "versionNonce": 1049508117, + "version": 242, + "versionNonce": 1857588379, "isDeleted": false, "id": "HGX9snTeiHkYuc9mmU2Ha", "fillStyle": "hachure", @@ -51421,7 +51421,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -51543,8 +51543,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 220, - "versionNonce": 1667059387, + "version": 225, + "versionNonce": 1616404117, "isDeleted": false, "id": "h5h4BXwYFWIPsP_ydTL0m", "fillStyle": "hachure", @@ -51564,7 +51564,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -51831,8 +51831,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 228, - "versionNonce": 116412021, + "version": 233, + "versionNonce": 919748923, "isDeleted": false, "id": "_oyqUHkdFHvCqaQBzRGAU", "fillStyle": "hachure", @@ -51852,7 +51852,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -51929,8 +51929,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 230, - "versionNonce": 1507442523, + "version": 235, + "versionNonce": 123323381, "isDeleted": false, "id": "qujv1QEEqBgjS-5z77IUY", "fillStyle": "hachure", @@ -51950,7 +51950,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -52037,8 +52037,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 229, - "versionNonce": 422098901, + "version": 234, + "versionNonce": 118251995, "isDeleted": false, "id": "Io8Pk1kdUvZ5bmg0wbUfx", "fillStyle": "hachure", @@ -52058,7 +52058,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -52140,8 +52140,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 273, - "versionNonce": 1958681595, + "version": 278, + "versionNonce": 130514261, "isDeleted": false, "id": "pAhZ9CFHYMCZ49bqmMPg4", "fillStyle": "hachure", @@ -52161,7 +52161,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -52463,8 +52463,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 235, - "versionNonce": 256701749, + "version": 240, + "versionNonce": 1484353147, "isDeleted": false, "id": "0ovsa8epJmoQ7JPgooanH", "fillStyle": "hachure", @@ -52484,7 +52484,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -52596,8 +52596,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 248, - "versionNonce": 269477019, + "version": 253, + "versionNonce": 418843317, "isDeleted": false, "id": "lw3fpZnwnwfFxVhU9gnl9", "fillStyle": "hachure", @@ -52617,7 +52617,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -52794,8 +52794,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 264, - "versionNonce": 616728213, + "version": 269, + "versionNonce": 1574692635, "isDeleted": false, "id": "SiK8evbWyTm3Nxc0SJ3td", "fillStyle": "hachure", @@ -52815,7 +52815,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -53072,8 +53072,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 253, - "versionNonce": 1669241147, + "version": 258, + "versionNonce": 1804463125, "isDeleted": false, "id": "wnJ26-k1fRBYsmV0brU4x", "fillStyle": "hachure", @@ -53093,7 +53093,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -53295,8 +53295,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 269, - "versionNonce": 205450229, + "version": 274, + "versionNonce": 1302743995, "isDeleted": false, "id": "EIJ4pEHMjPF3CksWxP7Y7", "fillStyle": "hachure", @@ -53316,7 +53316,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060348, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -53598,8 +53598,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 247, - "versionNonce": 96970069, + "version": 252, + "versionNonce": 2139201909, "isDeleted": false, "id": "o7ph-PG0rOIfpwITM9-ai", "fillStyle": "hachure", @@ -53619,7 +53619,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -53796,8 +53796,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 244, - "versionNonce": 1475331707, + "version": 249, + "versionNonce": 1811618907, "isDeleted": false, "id": "FlYpQWrqlonYunHHkUEJJ", "fillStyle": "hachure", @@ -53817,7 +53817,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -53979,8 +53979,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 264, - "versionNonce": 884093621, + "version": 269, + "versionNonce": 974629589, "isDeleted": false, "id": "Dc10jRPvpkHMAWuMh9ADA", "fillStyle": "hachure", @@ -54000,7 +54000,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -54262,8 +54262,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 273, - "versionNonce": 1288126235, + "version": 278, + "versionNonce": 1420613883, "isDeleted": false, "id": "q08i6TaZw4oouWOW23jYS", "fillStyle": "hachure", @@ -54283,7 +54283,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -54590,8 +54590,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 265, - "versionNonce": 899945493, + "version": 270, + "versionNonce": 1004898357, "isDeleted": false, "id": "i_232LybzG7cFEWGgHLlH", "fillStyle": "hachure", @@ -54611,7 +54611,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338577, "link": null, "locked": false, "points": [ @@ -54878,8 +54878,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 234, - "versionNonce": 1969660859, + "version": 239, + "versionNonce": 87949723, "isDeleted": false, "id": "tHq5PDXWvM1G4diZecHkC", "fillStyle": "hachure", @@ -54899,7 +54899,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -55011,8 +55011,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 300, - "versionNonce": 1955776885, + "version": 305, + "versionNonce": 1993390485, "isDeleted": false, "id": "d4Ykock3HMGwmg8-lH0wy", "fillStyle": "hachure", @@ -55032,7 +55032,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -55474,8 +55474,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 296, - "versionNonce": 439824635, + "version": 301, + "versionNonce": 652285499, "isDeleted": false, "id": "vw0UbX_Gu9CymVTfrBQth", "fillStyle": "hachure", @@ -55495,7 +55495,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -55517,8 +55517,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 313, - "versionNonce": 751611957, + "version": 318, + "versionNonce": 68075253, "isDeleted": false, "id": "xuwZaTU1KrytnOVYePi8I", "fillStyle": "hachure", @@ -55538,7 +55538,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -55645,8 +55645,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 313, - "versionNonce": 1472027035, + "version": 318, + "versionNonce": 410556123, "isDeleted": false, "id": "MkRf7cQ0LPjAyzA-fw8sb", "fillStyle": "hachure", @@ -55666,7 +55666,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -55773,8 +55773,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 261, - "versionNonce": 278061461, + "version": 266, + "versionNonce": 975509589, "isDeleted": false, "id": "libBe57dhDASbOqw4UZ_z", "fillStyle": "hachure", @@ -55794,7 +55794,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -55961,8 +55961,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 306, - "versionNonce": 531983931, + "version": 311, + "versionNonce": 949420923, "isDeleted": false, "id": "CTLWsj-hqc6y_xK-qbBgv", "fillStyle": "hachure", @@ -55982,7 +55982,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -56054,8 +56054,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 312, - "versionNonce": 1934354165, + "version": 317, + "versionNonce": 48842165, "isDeleted": false, "id": "pq4Ykl3_WXCwYaFpjgO--", "fillStyle": "hachure", @@ -56075,7 +56075,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -56177,8 +56177,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 328, - "versionNonce": 620883675, + "version": 333, + "versionNonce": 1870584859, "isDeleted": false, "id": "ftCRv5owpMpHOuCf-97cW", "fillStyle": "hachure", @@ -56198,7 +56198,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -56375,8 +56375,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 304, - "versionNonce": 394084437, + "version": 309, + "versionNonce": 1904264981, "isDeleted": false, "id": "jJ9ud5uHIbxlgDzo48_6c", "fillStyle": "hachure", @@ -56396,7 +56396,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -56458,8 +56458,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 309, - "versionNonce": 439704443, + "version": 314, + "versionNonce": 2032312507, "isDeleted": false, "id": "a6xQ1JwTDsEgvD_sxccKn", "fillStyle": "hachure", @@ -56479,7 +56479,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -56561,8 +56561,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 311, - "versionNonce": 1392274869, + "version": 316, + "versionNonce": 409017461, "isDeleted": false, "id": "d397NwIyxUFNGL5XieZf6", "fillStyle": "hachure", @@ -56582,7 +56582,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -56679,8 +56679,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 341, - "versionNonce": 420149435, + "version": 346, + "versionNonce": 1864683867, "isDeleted": false, "id": "rTUOz4QhmLE78c-H_FXTl", "fillStyle": "hachure", @@ -56700,7 +56700,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060349, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -56957,8 +56957,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 340, - "versionNonce": 1386310453, + "version": 345, + "versionNonce": 525321685, "isDeleted": false, "id": "wLlPv58yJjmvZSZAb9Uj-", "fillStyle": "hachure", @@ -56978,7 +56978,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -57250,8 +57250,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 301, - "versionNonce": 853921435, + "version": 306, + "versionNonce": 316141051, "isDeleted": false, "id": "Dr3s50fI-EEhX9LIduE6M", "fillStyle": "hachure", @@ -57271,7 +57271,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -57348,8 +57348,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 303, - "versionNonce": 840449173, + "version": 308, + "versionNonce": 425870133, "isDeleted": false, "id": "RgU8bPLx4PQ2d8rYJJKdA", "fillStyle": "hachure", @@ -57369,7 +57369,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -57456,8 +57456,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 305, - "versionNonce": 1208435515, + "version": 310, + "versionNonce": 1463711387, "isDeleted": false, "id": "Pr1qXNcfQ-cFpWTi9AVu-", "fillStyle": "hachure", @@ -57477,7 +57477,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -57574,8 +57574,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 339, - "versionNonce": 292413941, + "version": 344, + "versionNonce": 452859029, "isDeleted": false, "id": "xsJg2bAyARPB6T4EqHa_m", "fillStyle": "hachure", @@ -57595,7 +57595,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -57862,8 +57862,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 333, - "versionNonce": 1850811355, + "version": 338, + "versionNonce": 722135867, "isDeleted": false, "id": "t9LFKW2T0XRaJKMwy_YtB", "fillStyle": "hachure", @@ -57883,7 +57883,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -58120,8 +58120,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 344, - "versionNonce": 900193109, + "version": 349, + "versionNonce": 265861621, "isDeleted": false, "id": "VzpozFCzFM-h3AFwhPYZB", "fillStyle": "hachure", @@ -58141,7 +58141,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -58433,8 +58433,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 339, - "versionNonce": 1037430907, + "version": 344, + "versionNonce": 44026843, "isDeleted": false, "id": "NqUNsKeCYlWPsYy3jaZhK", "fillStyle": "hachure", @@ -58454,7 +58454,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -58721,8 +58721,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 59, - "versionNonce": 676866331, + "version": 64, + "versionNonce": 1358410581, "isDeleted": false, "id": "RSdUnCEaSDYQQWGPW7HtR", "fillStyle": "hachure", @@ -58742,7 +58742,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -58829,8 +58829,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 76, - "versionNonce": 664190837, + "version": 81, + "versionNonce": 571447419, "isDeleted": false, "id": "7Ie4Jg2ZoHQao7yEqEJkX", "fillStyle": "hachure", @@ -58850,7 +58850,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -59027,8 +59027,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 95, - "versionNonce": 1372511835, + "version": 100, + "versionNonce": 2058387637, "isDeleted": false, "id": "zY1xjH9HIweaWRLkLn4ty", "fillStyle": "hachure", @@ -59048,7 +59048,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -59325,8 +59325,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 76, - "versionNonce": 500762837, + "version": 81, + "versionNonce": 656199963, "isDeleted": false, "id": "fXgDXX3F89aM589gupYpZ", "fillStyle": "hachure", @@ -59346,7 +59346,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -59528,8 +59528,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 71, - "versionNonce": 246962939, + "version": 76, + "versionNonce": 44605973, "isDeleted": false, "id": "o4uun5zAoUS3RyFljmURT", "fillStyle": "hachure", @@ -59549,7 +59549,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -59706,8 +59706,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 63, - "versionNonce": 466298421, + "version": 68, + "versionNonce": 1396307387, "isDeleted": false, "id": "Kiskxy5ENLKkm17K44gRX", "fillStyle": "hachure", @@ -59727,7 +59727,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -59844,8 +59844,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 78, - "versionNonce": 914965403, + "version": 83, + "versionNonce": 232101749, "isDeleted": false, "id": "Qc7-Z_TaxZMLasz-uLM2k", "fillStyle": "hachure", @@ -59865,7 +59865,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338578, "link": null, "locked": false, "points": [ @@ -60057,8 +60057,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 71, - "versionNonce": 1146263445, + "version": 76, + "versionNonce": 361334363, "isDeleted": false, "id": "nBj8WYlh08YwQgx9vx2IG", "fillStyle": "hachure", @@ -60078,7 +60078,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -60235,8 +60235,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 92, - "versionNonce": 1366562875, + "version": 97, + "versionNonce": 108847317, "isDeleted": false, "id": "Nj52Pq4N2c7xVJ_O6TAnN", "fillStyle": "hachure", @@ -60256,7 +60256,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -60518,8 +60518,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 98, - "versionNonce": 1101323509, + "version": 103, + "versionNonce": 1423835899, "isDeleted": false, "id": "9lfocEMoZvzH5F94yXIhM", "fillStyle": "hachure", @@ -60539,7 +60539,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060350, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -60831,8 +60831,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 94, - "versionNonce": 1029396699, + "version": 99, + "versionNonce": 1916010037, "isDeleted": false, "id": "U4tPvO7HmozrfLfMMr9HW", "fillStyle": "hachure", @@ -60852,7 +60852,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -61124,8 +61124,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 57, - "versionNonce": 1531410005, + "version": 62, + "versionNonce": 2042227611, "isDeleted": false, "id": "6kRkMCfld8SzPCn-0wl5g", "fillStyle": "hachure", @@ -61145,7 +61145,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -61232,8 +61232,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 50, - "versionNonce": 2010219899, + "version": 55, + "versionNonce": 132149141, "isDeleted": false, "id": "-jQ0KL_6W1ir87nOAvwQR", "fillStyle": "hachure", @@ -61253,7 +61253,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -61300,8 +61300,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 84, - "versionNonce": 1276109749, + "version": 89, + "versionNonce": 944750651, "isDeleted": false, "id": "apyS_ZpWOl25tlVA4B9QC", "fillStyle": "hachure", @@ -61321,7 +61321,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -61543,8 +61543,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 79, - "versionNonce": 672734747, + "version": 84, + "versionNonce": 95925493, "isDeleted": false, "id": "S0XCLMB5JEZ2Gfdp9xuzH", "fillStyle": "hachure", @@ -61564,7 +61564,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -61761,8 +61761,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 85, - "versionNonce": 1478731029, + "version": 90, + "versionNonce": 444727515, "isDeleted": false, "id": "P-vXA9duBFbluNTeomw9w", "fillStyle": "hachure", @@ -61782,7 +61782,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -62009,8 +62009,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 67, - "versionNonce": 1764008635, + "version": 72, + "versionNonce": 1195331157, "isDeleted": false, "id": "0agii9e-99OIDeOdRRjpC", "fillStyle": "hachure", @@ -62030,7 +62030,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -62162,8 +62162,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 59, - "versionNonce": 586693237, + "version": 64, + "versionNonce": 1239625083, "isDeleted": false, "id": "jxyF7cegrluJT1QOe8myj", "fillStyle": "hachure", @@ -62183,7 +62183,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -62280,8 +62280,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 64, - "versionNonce": 1402377051, + "version": 69, + "versionNonce": 458013621, "isDeleted": false, "id": "xMsDb-UIdcn_nuM5Fyb9p", "fillStyle": "hachure", @@ -62301,7 +62301,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -62423,8 +62423,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 69, - "versionNonce": 1163076565, + "version": 74, + "versionNonce": 431343131, "isDeleted": false, "id": "5sqoz70j3vk0sMh1_Tc_i", "fillStyle": "hachure", @@ -62444,7 +62444,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -62591,8 +62591,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 48, - "versionNonce": 1203859451, + "version": 53, + "versionNonce": 1510309141, "isDeleted": false, "id": "CpMCfzSeblT8C-YnoM_TD", "fillStyle": "hachure", @@ -62612,7 +62612,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -62649,8 +62649,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 50, - "versionNonce": 592044341, + "version": 55, + "versionNonce": 1357662907, "isDeleted": false, "id": "WgS36G9BWA2-1h15zBv6v", "fillStyle": "hachure", @@ -62670,7 +62670,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -62717,8 +62717,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 60, - "versionNonce": 821816635, + "version": 65, + "versionNonce": 987697781, "isDeleted": false, "id": "58wKrRR308hq6rWREqqkR", "fillStyle": "hachure", @@ -62738,7 +62738,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -62850,8 +62850,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 135, - "versionNonce": 1557733045, + "version": 140, + "versionNonce": 875117403, "isDeleted": false, "id": "4rGRyW9NGLLhiWKR4QjaK", "fillStyle": "hachure", @@ -62871,7 +62871,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -62993,8 +62993,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 133, - "versionNonce": 1339364123, + "version": 138, + "versionNonce": 1788804053, "isDeleted": false, "id": "sGJS76kKy37fob7ktNOR_", "fillStyle": "hachure", @@ -63014,7 +63014,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -63126,8 +63126,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 138, - "versionNonce": 302874645, + "version": 143, + "versionNonce": 1337923579, "isDeleted": false, "id": "qph15qKmi8rySYi6Bh5yN", "fillStyle": "hachure", @@ -63147,7 +63147,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -63284,8 +63284,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 128, - "versionNonce": 2140796859, + "version": 133, + "versionNonce": 1633335605, "isDeleted": false, "id": "uWKcOIfY_cQWP94Vy75t-", "fillStyle": "hachure", @@ -63305,7 +63305,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -63392,8 +63392,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 130, - "versionNonce": 1492039029, + "version": 135, + "versionNonce": 28336283, "isDeleted": false, "id": "1p232uRozTmJIE-k1JDhk", "fillStyle": "hachure", @@ -63413,7 +63413,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -63510,8 +63510,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 143, - "versionNonce": 2056865883, + "version": 148, + "versionNonce": 2021116565, "isDeleted": false, "id": "EIkcB8r5QAkjHkyfw6pqm", "fillStyle": "hachure", @@ -63531,7 +63531,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -63693,8 +63693,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 123, - "versionNonce": 214056661, + "version": 128, + "versionNonce": 1135580475, "isDeleted": false, "id": "aGiFubNcWs3xKNH5Pabs0", "fillStyle": "hachure", @@ -63714,7 +63714,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -63776,8 +63776,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 124, - "versionNonce": 1185252603, + "version": 129, + "versionNonce": 1084993525, "isDeleted": false, "id": "DlFIjsRih5qDnglBwrNMj", "fillStyle": "hachure", @@ -63797,7 +63797,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -63859,8 +63859,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 126, - "versionNonce": 69049397, + "version": 131, + "versionNonce": 891237851, "isDeleted": false, "id": "cBGE8pDwkeVfBqoV_WMFi", "fillStyle": "hachure", @@ -63880,7 +63880,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060351, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -63957,8 +63957,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 132, - "versionNonce": 1146213109, + "version": 137, + "versionNonce": 402385237, "isDeleted": false, "id": "AlKeCkfrLwvZyA6lB3bz-", "fillStyle": "hachure", @@ -63978,7 +63978,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -64100,8 +64100,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 135, - "versionNonce": 1084277467, + "version": 140, + "versionNonce": 1695662715, "isDeleted": false, "id": "EjlTBy3SbWlryrZO1hvoA", "fillStyle": "hachure", @@ -64121,7 +64121,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -64258,8 +64258,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 151, - "versionNonce": 686140501, + "version": 156, + "versionNonce": 2143155893, "isDeleted": false, "id": "GxtKdvgR9636IjxLI4ZiA", "fillStyle": "hachure", @@ -64279,7 +64279,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -64496,8 +64496,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 122, - "versionNonce": 47820667, + "version": 127, + "versionNonce": 1548335899, "isDeleted": false, "id": "JfKQonJBd-_pQVmOGPUXS", "fillStyle": "hachure", @@ -64517,7 +64517,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338579, "link": null, "locked": false, "points": [ @@ -64589,8 +64589,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 119, - "versionNonce": 1953978805, + "version": 124, + "versionNonce": 848779285, "isDeleted": false, "id": "to0LRAvOSWljtNuTQtizP", "fillStyle": "hachure", @@ -64610,7 +64610,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -64667,8 +64667,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 124, - "versionNonce": 881592347, + "version": 129, + "versionNonce": 1731829691, "isDeleted": false, "id": "Rzg9DY7PLpUOQmnwB-l0c", "fillStyle": "hachure", @@ -64688,7 +64688,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -64770,8 +64770,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 146, - "versionNonce": 808213269, + "version": 151, + "versionNonce": 2055048565, "isDeleted": false, "id": "6TD2QAMKhBv1cHbON7tvz", "fillStyle": "hachure", @@ -64791,7 +64791,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -64983,8 +64983,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 130, - "versionNonce": 2074758331, + "version": 135, + "versionNonce": 537129051, "isDeleted": false, "id": "FvCFHPFFlNszNCaw_aTr8", "fillStyle": "hachure", @@ -65004,7 +65004,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -65116,8 +65116,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 135, - "versionNonce": 611987573, + "version": 140, + "versionNonce": 1186338517, "isDeleted": false, "id": "kbrox9Ze0OwjNdjE7xNb4", "fillStyle": "hachure", @@ -65137,7 +65137,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -65274,8 +65274,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 151, - "versionNonce": 467074395, + "version": 156, + "versionNonce": 947596539, "isDeleted": false, "id": "9WldtgqDZdFEVShP05Ans", "fillStyle": "hachure", @@ -65295,7 +65295,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -65512,8 +65512,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 158, - "versionNonce": 1864784341, + "version": 163, + "versionNonce": 30831669, "isDeleted": false, "id": "xIi0EDYFuyOmDvKQQJ1ZF", "fillStyle": "hachure", @@ -65533,7 +65533,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -65785,8 +65785,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 122, - "versionNonce": 1080334843, + "version": 127, + "versionNonce": 69326235, "isDeleted": false, "id": "ZumMnuAAMk07-npsrJHFk", "fillStyle": "hachure", @@ -65806,7 +65806,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -65873,8 +65873,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 122, - "versionNonce": 1497782069, + "version": 127, + "versionNonce": 667166101, "isDeleted": false, "id": "vrWpeowmRiH18PFuT_iiJ", "fillStyle": "hachure", @@ -65894,7 +65894,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -65966,8 +65966,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 159, - "versionNonce": 1832888469, + "version": 164, + "versionNonce": 1110075963, "isDeleted": false, "id": "4rnUG4g4oDsw7k2Osb1_z", "fillStyle": "hachure", @@ -65987,7 +65987,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -66249,8 +66249,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 122, - "versionNonce": 1180473147, + "version": 127, + "versionNonce": 464825077, "isDeleted": false, "id": "KvKR5pS6ICmWO4dT8o4T2", "fillStyle": "hachure", @@ -66270,7 +66270,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -66347,8 +66347,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 123, - "versionNonce": 1189365589, + "version": 128, + "versionNonce": 662137563, "isDeleted": false, "id": "aye9WGeuDIpZmipU2coMe", "fillStyle": "hachure", @@ -66368,7 +66368,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -66460,8 +66460,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 126, - "versionNonce": 1038500987, + "version": 131, + "versionNonce": 1043170389, "isDeleted": false, "id": "0Fpr1Djq-pVWQbGoz7ocM", "fillStyle": "hachure", @@ -66481,7 +66481,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -66588,8 +66588,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 118, - "versionNonce": 770348213, + "version": 123, + "versionNonce": 681269115, "isDeleted": false, "id": "G_5XhR0tsnMjCx4eKwqMI", "fillStyle": "hachure", @@ -66609,7 +66609,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -66671,8 +66671,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 62, - "versionNonce": 1799224603, + "version": 67, + "versionNonce": 1124348341, "isDeleted": false, "id": "hGiZYLrnAlgecjobAsew2", "fillStyle": "hachure", @@ -66692,7 +66692,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -66859,8 +66859,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 86, - "versionNonce": 1837118997, + "version": 91, + "versionNonce": 64532507, "isDeleted": false, "id": "LnT-hOaDtPw43e7D1Tp4F", "fillStyle": "hachure", @@ -66880,7 +66880,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -67167,8 +67167,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 55, - "versionNonce": 1381343675, + "version": 60, + "versionNonce": 1197355797, "isDeleted": false, "id": "b-5mreN_Mw-nMY8HR41k8", "fillStyle": "hachure", @@ -67188,7 +67188,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -67320,8 +67320,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 60, - "versionNonce": 1620749173, + "version": 65, + "versionNonce": 186774715, "isDeleted": false, "id": "aCQ15Sm7g1i8sWRuulpiN", "fillStyle": "hachure", @@ -67341,7 +67341,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -67493,8 +67493,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 70, - "versionNonce": 206549595, + "version": 75, + "versionNonce": 665913461, "isDeleted": false, "id": "bRJnAlFETmVVRqBEUqavb", "fillStyle": "hachure", @@ -67514,7 +67514,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -67721,8 +67721,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 91, - "versionNonce": 1057581339, + "version": 96, + "versionNonce": 773432667, "isDeleted": false, "id": "s3wZUK4zf7B1ook2o-t5w", "fillStyle": "hachure", @@ -67742,7 +67742,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723116889, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -67899,8 +67899,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 112, - "versionNonce": 1909689787, + "version": 117, + "versionNonce": 365048277, "isDeleted": false, "id": "stU4nrrGafHLoHYjg3nyK", "fillStyle": "hachure", @@ -67920,7 +67920,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723116889, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -68182,8 +68182,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 120, - "versionNonce": 1563434587, + "version": 125, + "versionNonce": 1142047227, "isDeleted": false, "id": "AZ9Ye_0BhR1wNuwUPZML4", "fillStyle": "hachure", @@ -68203,7 +68203,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723116889, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -68505,8 +68505,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 112, - "versionNonce": 468818683, + "version": 117, + "versionNonce": 1856450357, "isDeleted": false, "id": "2zDoqgww-CbuPyJN8PtxW", "fillStyle": "hachure", @@ -68526,7 +68526,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723116889, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -68793,8 +68793,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 64, - "versionNonce": 1456614619, + "version": 69, + "versionNonce": 370035355, "isDeleted": false, "id": "bmvgfbnzmWtCeoNqh0uuX", "fillStyle": "hachure", @@ -68814,7 +68814,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060352, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -68996,8 +68996,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 95, - "versionNonce": 1482154581, + "version": 100, + "versionNonce": 1355120789, "isDeleted": false, "id": "b9rHSwgKPaFVMOgDCs6CK", "fillStyle": "hachure", @@ -69017,7 +69017,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -69154,8 +69154,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 84, - "versionNonce": 1666046331, + "version": 89, + "versionNonce": 683687739, "isDeleted": false, "id": "pszR1DRokPFXgNQAz3B3_", "fillStyle": "hachure", @@ -69175,7 +69175,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -69257,8 +69257,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 239, - "versionNonce": 607309749, + "version": 244, + "versionNonce": 1909630453, "isDeleted": false, "id": "DzCEZtKzdLkrqNtrU18wj", "fillStyle": "hachure", @@ -69278,7 +69278,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -69530,8 +69530,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 152, - "versionNonce": 149615131, + "version": 157, + "versionNonce": 1183490011, "isDeleted": false, "id": "m8b2xXcyTPVdZTf7D_m4_", "fillStyle": "hachure", @@ -69551,7 +69551,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -69743,8 +69743,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 148, - "versionNonce": 84480277, + "version": 153, + "versionNonce": 886316885, "isDeleted": false, "id": "OqeqrqgDcZRAbUYP08fKV", "fillStyle": "hachure", @@ -69764,7 +69764,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -69936,8 +69936,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 132, - "versionNonce": 2023487163, + "version": 137, + "versionNonce": 1233120379, "isDeleted": false, "id": "S0lL591dEL_ixJMUaq7Nx", "fillStyle": "hachure", @@ -69957,7 +69957,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338580, "link": null, "locked": false, "points": [ @@ -70049,8 +70049,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 137, - "versionNonce": 1750083189, + "version": 142, + "versionNonce": 2059445, "isDeleted": false, "id": "id0kiUNlYHrqeepAAboNJ", "fillStyle": "hachure", @@ -70070,7 +70070,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -70187,8 +70187,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 177, - "versionNonce": 553871195, + "version": 182, + "versionNonce": 627221787, "isDeleted": false, "id": "ho7FwTWo2pwu5UBdqHUzv", "fillStyle": "hachure", @@ -70208,7 +70208,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -70525,8 +70525,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 152, - "versionNonce": 1892519893, + "version": 157, + "versionNonce": 1398410773, "isDeleted": false, "id": "FA9W_MnDbjvwVA9Ks6E8h", "fillStyle": "hachure", @@ -70546,7 +70546,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -70738,8 +70738,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 154, - "versionNonce": 854770677, + "version": 159, + "versionNonce": 832915899, "isDeleted": false, "id": "TRP86YUSznsWZhqQcTH2C", "fillStyle": "hachure", @@ -70759,7 +70759,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -70986,8 +70986,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 142, - "versionNonce": 1032020443, + "version": 147, + "versionNonce": 494502773, "isDeleted": false, "id": "03xlL49gA6i-xrWVPo7r1", "fillStyle": "hachure", @@ -71007,7 +71007,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -71174,8 +71174,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 229, - "versionNonce": 1480621397, + "version": 234, + "versionNonce": 862607963, "isDeleted": false, "id": "dWWYx9Z0mkfdLywsw_kfu", "fillStyle": "hachure", @@ -71195,7 +71195,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -71302,8 +71302,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 148, - "versionNonce": 672165499, + "version": 153, + "versionNonce": 1388530901, "isDeleted": false, "id": "SCgH-j9iUrh8Bo7zhnzMt", "fillStyle": "hachure", @@ -71323,7 +71323,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -71400,8 +71400,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 245, - "versionNonce": 1917848245, + "version": 250, + "versionNonce": 662984443, "isDeleted": false, "id": "24M5TnYretdagCz6xTcYA", "fillStyle": "hachure", @@ -71421,7 +71421,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -71608,8 +71608,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 219, - "versionNonce": 580052763, + "version": 224, + "versionNonce": 1120725557, "isDeleted": false, "id": "-d8ZHmrcfUE8RFH3l9rzu", "fillStyle": "hachure", @@ -71629,7 +71629,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -71686,8 +71686,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 242, - "versionNonce": 835120149, + "version": 247, + "versionNonce": 1282785179, "isDeleted": false, "id": "YBgh3NRXDeO3Rz93SjIyr", "fillStyle": "hachure", @@ -71707,7 +71707,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -71879,8 +71879,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 236, - "versionNonce": 1669155771, + "version": 241, + "versionNonce": 779869077, "isDeleted": false, "id": "oh6im-JdfYfJv2ehaSi_y", "fillStyle": "hachure", @@ -71900,7 +71900,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -72037,8 +72037,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 258, - "versionNonce": 913637787, + "version": 263, + "versionNonce": 1819350075, "isDeleted": false, "id": "KuWmq2tePRIxbjGybbm1j", "fillStyle": "hachure", @@ -72058,7 +72058,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -72335,8 +72335,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 214, - "versionNonce": 1485420949, + "version": 219, + "versionNonce": 503685365, "isDeleted": false, "id": "LCQ79iGx41-2OAwOB8KMR", "fillStyle": "hachure", @@ -72356,7 +72356,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -72413,8 +72413,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 215, - "versionNonce": 423106107, + "version": 220, + "versionNonce": 1733874907, "isDeleted": false, "id": "9aS7pT3LlPUp4KFJTaXSY", "fillStyle": "hachure", @@ -72434,7 +72434,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -72491,8 +72491,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 245, - "versionNonce": 1185398517, + "version": 250, + "versionNonce": 1995422293, "isDeleted": false, "id": "tRa-cXoidhS0oi8I4a92z", "fillStyle": "hachure", @@ -72512,7 +72512,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -72724,8 +72724,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 251, - "versionNonce": 670013147, + "version": 256, + "versionNonce": 2092925307, "isDeleted": false, "id": "J5Lg8aniGa0rY8LTuoUTo", "fillStyle": "hachure", @@ -72745,7 +72745,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -72987,8 +72987,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 239, - "versionNonce": 1100879957, + "version": 244, + "versionNonce": 1376757685, "isDeleted": false, "id": "j-djedz8-WtWpT9xiNWRu", "fillStyle": "hachure", @@ -73008,7 +73008,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -73190,8 +73190,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 145, - "versionNonce": 1093534587, + "version": 150, + "versionNonce": 1441241627, "isDeleted": false, "id": "pemH5MUiXaF5j7arHdcgH", "fillStyle": "hachure", @@ -73211,7 +73211,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -73418,8 +73418,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 206, - "versionNonce": 859981237, + "version": 211, + "versionNonce": 294316309, "isDeleted": false, "id": "_3cTXibLhi2PRPf9m3mmS", "fillStyle": "hachure", @@ -73439,7 +73439,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -73951,8 +73951,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 152, - "versionNonce": 1295375387, + "version": 157, + "versionNonce": 1338220219, "isDeleted": false, "id": "gA3V-GVPdXVzzZVvkQHXt", "fillStyle": "hachure", @@ -73972,7 +73972,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060353, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -74214,8 +74214,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 136, - "versionNonce": 783927061, + "version": 141, + "versionNonce": 920059509, "isDeleted": false, "id": "Sk7MF8AjtuV5TOMsSyx9h", "fillStyle": "hachure", @@ -74235,7 +74235,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -74397,8 +74397,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 176, - "versionNonce": 133800123, + "version": 181, + "versionNonce": 83234651, "isDeleted": false, "id": "9Gpw_apwYpoESQJI5wjBb", "fillStyle": "hachure", @@ -74418,7 +74418,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -74780,8 +74780,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 112, - "versionNonce": 1182407797, + "version": 117, + "versionNonce": 2025416661, "isDeleted": false, "id": "1MmRqIdPJaSBYrUloH41q", "fillStyle": "hachure", @@ -74801,7 +74801,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -74838,8 +74838,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 177, - "versionNonce": 186372443, + "version": 182, + "versionNonce": 399600635, "isDeleted": false, "id": "6BGhaqX_tsVcVEekHH4Ht", "fillStyle": "hachure", @@ -74859,7 +74859,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -75226,8 +75226,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 80, - "versionNonce": 575194581, + "version": 85, + "versionNonce": 424125749, "isDeleted": false, "id": "wHJFB9rDLwJtgzS3vjeaB", "fillStyle": "hachure", @@ -75247,7 +75247,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -75359,8 +75359,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 119, - "versionNonce": 401534459, + "version": 124, + "versionNonce": 1012413595, "isDeleted": false, "id": "NnkGC37gG_8KzbwYJr-b5", "fillStyle": "hachure", @@ -75380,7 +75380,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -75457,8 +75457,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 138, - "versionNonce": 1429947189, + "version": 143, + "versionNonce": 2078750357, "isDeleted": false, "id": "uBzamP1h46h9x9Wcg1R0A", "fillStyle": "hachure", @@ -75478,7 +75478,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -75650,8 +75650,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 125, - "versionNonce": 561346203, + "version": 130, + "versionNonce": 37546299, "isDeleted": false, "id": "trD2Op9-PFkuH6ZU9tifu", "fillStyle": "hachure", @@ -75671,7 +75671,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -75743,8 +75743,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 136, - "versionNonce": 1941378197, + "version": 141, + "versionNonce": 2068683765, "isDeleted": false, "id": "vBl0O8MU0u_GamG4Pgn_m", "fillStyle": "hachure", @@ -75764,7 +75764,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -75921,8 +75921,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 123, - "versionNonce": 375515963, + "version": 128, + "versionNonce": 1591871963, "isDeleted": false, "id": "7kI6rfVetlYYdJxsuxCXw", "fillStyle": "hachure", @@ -75942,7 +75942,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -76039,8 +76039,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 150, - "versionNonce": 1769060853, + "version": 155, + "versionNonce": 2139116885, "isDeleted": false, "id": "4zDCSRCzHR0dohTPxj2lh", "fillStyle": "hachure", @@ -76060,7 +76060,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -76292,8 +76292,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 139, - "versionNonce": 1796656091, + "version": 144, + "versionNonce": 2002392699, "isDeleted": false, "id": "UJNyiXS-pjJFChshWJNHo", "fillStyle": "hachure", @@ -76313,7 +76313,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -76490,8 +76490,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 159, - "versionNonce": 259044181, + "version": 164, + "versionNonce": 1406460597, "isDeleted": false, "id": "lUOYmENdNwkWan2vZV9Ow", "fillStyle": "hachure", @@ -76511,7 +76511,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -76783,8 +76783,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 144, - "versionNonce": 1671862395, + "version": 149, + "versionNonce": 711429915, "isDeleted": false, "id": "XdoBKIXfYaNis7Ti0nrk5", "fillStyle": "hachure", @@ -76804,7 +76804,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -77006,8 +77006,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 131, - "versionNonce": 34177205, + "version": 136, + "versionNonce": 1022411797, "isDeleted": false, "id": "sPs794uc3eREPN6lKLjN9", "fillStyle": "hachure", @@ -77027,7 +77027,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -77159,8 +77159,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 123, - "versionNonce": 500420891, + "version": 128, + "versionNonce": 1518138299, "isDeleted": false, "id": "PuhjszPhmrC3iDmDJePCv", "fillStyle": "hachure", @@ -77180,7 +77180,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -77277,8 +77277,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 122, - "versionNonce": 920756757, + "version": 127, + "versionNonce": 1321826677, "isDeleted": false, "id": "-v3NG68kQ-Gg0E4gJ6nv3", "fillStyle": "hachure", @@ -77298,7 +77298,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -77390,8 +77390,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 254, - "versionNonce": 1527838139, + "version": 259, + "versionNonce": 2008859739, "isDeleted": false, "id": "562439aoh8XKUzuOSPhkh", "fillStyle": "hachure", @@ -77411,7 +77411,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338581, "link": null, "locked": false, "points": [ @@ -77823,8 +77823,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 250, - "versionNonce": 1391368053, + "version": 255, + "versionNonce": 44335829, "isDeleted": false, "id": "NUSacIhF6hiI2aL863OF5", "fillStyle": "hachure", @@ -77844,7 +77844,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -78081,8 +78081,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 236, - "versionNonce": 176195163, + "version": 241, + "versionNonce": 1241088251, "isDeleted": false, "id": "gnYjTmKaBqG6CwcnO-yQR", "fillStyle": "hachure", @@ -78102,7 +78102,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -78269,8 +78269,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 118, - "versionNonce": 1081467093, + "version": 123, + "versionNonce": 219635765, "isDeleted": false, "id": "BQEQtiyKd0gwGwmPR9HrN", "fillStyle": "hachure", @@ -78290,7 +78290,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -78362,8 +78362,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 260, - "versionNonce": 318046971, + "version": 265, + "versionNonce": 2058725787, "isDeleted": false, "id": "J-4ikJLBG0VWSiIsaF8Ic", "fillStyle": "hachure", @@ -78383,7 +78383,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -78670,8 +78670,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 256, - "versionNonce": 84737589, + "version": 261, + "versionNonce": 1946653077, "isDeleted": false, "id": "qSfvTGMD_WoEblCZnSZFg", "fillStyle": "hachure", @@ -78691,7 +78691,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -78958,8 +78958,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 243, - "versionNonce": 1559292827, + "version": 248, + "versionNonce": 1596177979, "isDeleted": false, "id": "oL19jOYja-D8fui0M7-gh", "fillStyle": "hachure", @@ -78979,7 +78979,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -79181,8 +79181,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 240, - "versionNonce": 1469673365, + "version": 245, + "versionNonce": 1688901365, "isDeleted": false, "id": "NkDsd5BBJDg700_f5V_Hu", "fillStyle": "hachure", @@ -79202,7 +79202,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -79384,8 +79384,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 218, - "versionNonce": 480690235, + "version": 223, + "versionNonce": 36060891, "isDeleted": false, "id": "cyw8sVFO1z0vaDunm68qz", "fillStyle": "hachure", @@ -79405,7 +79405,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -79482,8 +79482,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 220, - "versionNonce": 1985000693, + "version": 225, + "versionNonce": 1233514581, "isDeleted": false, "id": "ftJ0jPlCu8zdGaQAwYGOx", "fillStyle": "hachure", @@ -79503,7 +79503,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -79590,8 +79590,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 174, - "versionNonce": 1543045339, + "version": 179, + "versionNonce": 1850715003, "isDeleted": false, "id": "Sw9ygglqCpSsMewg-lW5D", "fillStyle": "hachure", @@ -79611,7 +79611,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -79748,8 +79748,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 128, - "versionNonce": 1018711637, + "version": 133, + "versionNonce": 544153013, "isDeleted": false, "id": "CsnDDmTEis7w-sAPIiBfn", "fillStyle": "hachure", @@ -79769,7 +79769,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -79891,8 +79891,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 166, - "versionNonce": 1148857723, + "version": 171, + "versionNonce": 937591835, "isDeleted": false, "id": "a0qV53Db-iNT1Msove_cp", "fillStyle": "hachure", @@ -79912,7 +79912,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -80069,8 +80069,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 169, - "versionNonce": 2040904629, + "version": 174, + "versionNonce": 277585685, "isDeleted": false, "id": "CfXeetw96vLYrJ6N0crxz", "fillStyle": "hachure", @@ -80090,7 +80090,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -80262,8 +80262,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 161, - "versionNonce": 694994459, + "version": 166, + "versionNonce": 1188120763, "isDeleted": false, "id": "IULpxtg7XhY8R9HwILwdt", "fillStyle": "hachure", @@ -80283,7 +80283,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -80450,8 +80450,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 124, - "versionNonce": 87981333, + "version": 129, + "versionNonce": 1079047285, "isDeleted": false, "id": "Xb38sFLzvavDKkBJ8BXci", "fillStyle": "hachure", @@ -80471,7 +80471,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -80573,8 +80573,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 124, - "versionNonce": 1371753147, + "version": 129, + "versionNonce": 1623095643, "isDeleted": false, "id": "GXQgxcZ5RbZZhXbnNVZUz", "fillStyle": "hachure", @@ -80594,7 +80594,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -80696,8 +80696,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 143, - "versionNonce": 385356405, + "version": 148, + "versionNonce": 1803853269, "isDeleted": false, "id": "uKclZPQmzQKKVtsL4JH1x", "fillStyle": "hachure", @@ -80717,7 +80717,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -80914,8 +80914,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 142, - "versionNonce": 35666779, + "version": 147, + "versionNonce": 1929156091, "isDeleted": false, "id": "wsShVhLe-HxISDbI7pI2y", "fillStyle": "hachure", @@ -80935,7 +80935,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -81127,8 +81127,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 143, - "versionNonce": 1536687061, + "version": 148, + "versionNonce": 960240437, "isDeleted": false, "id": "fNiNLvplAKPOwq-J4-hf0", "fillStyle": "hachure", @@ -81148,7 +81148,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -81345,8 +81345,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 129, - "versionNonce": 1188435963, + "version": 134, + "versionNonce": 479075995, "isDeleted": false, "id": "wL2yTH51QlA6FaPicH0Vx", "fillStyle": "hachure", @@ -81366,7 +81366,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -81488,8 +81488,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 159, - "versionNonce": 1261680949, + "version": 164, + "versionNonce": 1373432981, "isDeleted": false, "id": "pV39G8_Kbl68Y60PE9FSY", "fillStyle": "hachure", @@ -81509,7 +81509,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -81786,8 +81786,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 119, - "versionNonce": 2112315547, + "version": 124, + "versionNonce": 2015728443, "isDeleted": false, "id": "jWoFYei473GxkrfqDdzOM", "fillStyle": "hachure", @@ -81807,7 +81807,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -81884,8 +81884,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 111, - "versionNonce": 1060162197, + "version": 116, + "versionNonce": 891064821, "isDeleted": false, "id": "C1i0KvRiW4pV19Jb87Mj6", "fillStyle": "hachure", @@ -81905,7 +81905,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -81937,8 +81937,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 151, - "versionNonce": 554079547, + "version": 156, + "versionNonce": 639988699, "isDeleted": false, "id": "Sj-KGtBKnxddCDz3kbbTK", "fillStyle": "hachure", @@ -81958,7 +81958,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -82160,8 +82160,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 253, - "versionNonce": 1212461045, + "version": 258, + "versionNonce": 1342212949, "isDeleted": false, "id": "sv9feB6su87uLubMthMYX", "fillStyle": "hachure", @@ -82181,7 +82181,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -82433,8 +82433,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 241, - "versionNonce": 1148512597, + "version": 246, + "versionNonce": 379601019, "isDeleted": false, "id": "Veit7Cfv3uJIZ3cOf12Vv", "fillStyle": "hachure", @@ -82454,7 +82454,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -82646,8 +82646,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 119, - "versionNonce": 413713019, + "version": 124, + "versionNonce": 1390303413, "isDeleted": false, "id": "ID_E2yP5P0adZD2eTavzZ", "fillStyle": "hachure", @@ -82667,7 +82667,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723060354, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -82749,8 +82749,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 208, - "versionNonce": 122469467, + "version": 213, + "versionNonce": 324565275, "isDeleted": false, "id": "YL5i5E_WlI1LQKSUaBYCC", "fillStyle": "hachure", @@ -82770,7 +82770,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -82962,8 +82962,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 224, - "versionNonce": 1422555387, + "version": 229, + "versionNonce": 1197177365, "isDeleted": false, "id": "cnzu4GYPxgGCJgzLqQGp1", "fillStyle": "hachure", @@ -82983,7 +82983,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -83255,8 +83255,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 182, - "versionNonce": 1890034075, + "version": 187, + "versionNonce": 163618235, "isDeleted": false, "id": "PDwDlQjJFrl8XIXNTf8S9", "fillStyle": "hachure", @@ -83276,7 +83276,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -83338,8 +83338,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 186, - "versionNonce": 873903675, + "version": 191, + "versionNonce": 1718447989, "isDeleted": false, "id": "oR-EMy-dEMrOujUJjVxvK", "fillStyle": "hachure", @@ -83359,7 +83359,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -83441,8 +83441,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 186, - "versionNonce": 771372763, + "version": 191, + "versionNonce": 352005723, "isDeleted": false, "id": "wAY4FEI8Tlu8mdjxGIQxg", "fillStyle": "hachure", @@ -83462,7 +83462,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -83549,8 +83549,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 212, - "versionNonce": 1826923387, + "version": 217, + "versionNonce": 777631957, "isDeleted": false, "id": "JawOALqFb5E-GzUIAEanF", "fillStyle": "hachure", @@ -83570,7 +83570,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -83792,8 +83792,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 188, - "versionNonce": 152599579, + "version": 193, + "versionNonce": 1205512955, "isDeleted": false, "id": "dbKEEn2oFHYeEMg1-auC_", "fillStyle": "hachure", @@ -83813,7 +83813,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -83915,8 +83915,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 213, - "versionNonce": 1854423227, + "version": 218, + "versionNonce": 951440949, "isDeleted": false, "id": "OzPg4lncWsDzGv7aaLUoy", "fillStyle": "hachure", @@ -83936,7 +83936,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -84163,8 +84163,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 198, - "versionNonce": 1725329755, + "version": 203, + "versionNonce": 920753051, "isDeleted": false, "id": "Byzyuf5riVRKGA4lKDAlf", "fillStyle": "hachure", @@ -84184,7 +84184,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -84336,8 +84336,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 226, - "versionNonce": 1666551291, + "version": 231, + "versionNonce": 1348945813, "isDeleted": false, "id": "hBibOq2JgxKQdxH9TUXsR", "fillStyle": "hachure", @@ -84357,7 +84357,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338582, "link": null, "locked": false, "points": [ @@ -84654,8 +84654,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 187, - "versionNonce": 117970587, + "version": 192, + "versionNonce": 1111648315, "isDeleted": false, "id": "kwmKD4qSTdHzj-VxzcjWq", "fillStyle": "hachure", @@ -84675,7 +84675,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -84777,8 +84777,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 189, - "versionNonce": 1889569595, + "version": 194, + "versionNonce": 1201900789, "isDeleted": false, "id": "4umsv04aFABTfNL1_QnTN", "fillStyle": "hachure", @@ -84798,7 +84798,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -84910,8 +84910,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 198, - "versionNonce": 1149332443, + "version": 203, + "versionNonce": 534751451, "isDeleted": false, "id": "Z7b3PLPd-WNmqV35p2NLh", "fillStyle": "hachure", @@ -84931,7 +84931,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -85088,8 +85088,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 223, - "versionNonce": 1992112251, + "version": 228, + "versionNonce": 233842261, "isDeleted": false, "id": "ODGWRQ1RSRVP4l_grjLXb", "fillStyle": "hachure", @@ -85109,7 +85109,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -85391,8 +85391,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 203, - "versionNonce": 1427534107, + "version": 208, + "versionNonce": 625726843, "isDeleted": false, "id": "mgUsc0Vort6YtRypAFj6_", "fillStyle": "hachure", @@ -85412,7 +85412,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -85594,8 +85594,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 223, - "versionNonce": 1358927291, + "version": 228, + "versionNonce": 102929333, "isDeleted": false, "id": "jdDPlu5z5x8B8sJpzRSqc", "fillStyle": "hachure", @@ -85615,7 +85615,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -85892,8 +85892,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 219, - "versionNonce": 161162843, + "version": 224, + "versionNonce": 1372155419, "isDeleted": false, "id": "DTbn51GDzLJ6fI5nTmzfS", "fillStyle": "hachure", @@ -85913,7 +85913,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -86170,8 +86170,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 200, - "versionNonce": 364618491, + "version": 205, + "versionNonce": 476075285, "isDeleted": false, "id": "fWbpLOfQLB4gfR84Kr1FY", "fillStyle": "hachure", @@ -86191,7 +86191,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -86353,8 +86353,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 225, - "versionNonce": 233016219, + "version": 230, + "versionNonce": 407564987, "isDeleted": false, "id": "DlKO3D25oEUij-Lkh9lFg", "fillStyle": "hachure", @@ -86374,7 +86374,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -86661,8 +86661,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 214, - "versionNonce": 1447387195, + "version": 219, + "versionNonce": 471788149, "isDeleted": false, "id": "MORytodaeRVFYr1GW47ZJ", "fillStyle": "hachure", @@ -86682,7 +86682,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -86914,8 +86914,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 223, - "versionNonce": 683909339, + "version": 228, + "versionNonce": 1769136987, "isDeleted": false, "id": "EV1hJzc_Dv0GRxKKC8rX4", "fillStyle": "hachure", @@ -86935,7 +86935,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -87212,8 +87212,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 222, - "versionNonce": 1592839547, + "version": 227, + "versionNonce": 1176753109, "isDeleted": false, "id": "okt6ISaz0T_pORbxNfL4y", "fillStyle": "hachure", @@ -87233,7 +87233,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -87505,8 +87505,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 206, - "versionNonce": 2081383963, + "version": 211, + "versionNonce": 2106834939, "isDeleted": false, "id": "DZOrm-UEVgNoujhfO-mP_", "fillStyle": "hachure", @@ -87526,7 +87526,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -87718,8 +87718,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 217, - "versionNonce": 1997662907, + "version": 222, + "versionNonce": 646222133, "isDeleted": false, "id": "OVJlCJ_YhL2yHt-PCyNtf", "fillStyle": "hachure", @@ -87739,7 +87739,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -87986,8 +87986,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 214, - "versionNonce": 1150999387, + "version": 219, + "versionNonce": 1588594843, "isDeleted": false, "id": "h9ZychqTTsARov51uN5RS", "fillStyle": "hachure", @@ -88007,7 +88007,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -88249,8 +88249,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 222, - "versionNonce": 553433083, + "version": 227, + "versionNonce": 715563669, "isDeleted": false, "id": "tClFc2e5ttVCrmm-JP8xH", "fillStyle": "hachure", @@ -88270,7 +88270,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -88552,8 +88552,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 186, - "versionNonce": 440008859, + "version": 191, + "versionNonce": 846871867, "isDeleted": false, "id": "GTEbj1ug1C1S9WJCOYNc9", "fillStyle": "hachure", @@ -88573,7 +88573,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -88680,8 +88680,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 213, - "versionNonce": 1510290747, + "version": 218, + "versionNonce": 2000652277, "isDeleted": false, "id": "_6ps9sWvAFzCP_t9YSbHU", "fillStyle": "hachure", @@ -88701,7 +88701,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -88943,8 +88943,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 207, - "versionNonce": 801166811, + "version": 212, + "versionNonce": 1146412507, "isDeleted": false, "id": "p2sxgTDyCbFcv0raIKC0D", "fillStyle": "hachure", @@ -88964,7 +88964,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -89181,8 +89181,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 215, - "versionNonce": 1518297723, + "version": 220, + "versionNonce": 2119483733, "isDeleted": false, "id": "mSO54T07Qvj_NevIZkIYf", "fillStyle": "hachure", @@ -89202,7 +89202,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -89459,8 +89459,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 177, - "versionNonce": 318987035, + "version": 182, + "versionNonce": 1330801275, "isDeleted": false, "id": "-5nw7ucwckNg8In_Gj9yY", "fillStyle": "hachure", @@ -89480,7 +89480,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -89547,8 +89547,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 180, - "versionNonce": 1438597051, + "version": 185, + "versionNonce": 1429982901, "isDeleted": false, "id": "OUv6gQLb6Da1nwPo8cRPE", "fillStyle": "hachure", @@ -89568,7 +89568,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -89650,8 +89650,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 183, - "versionNonce": 1825935451, + "version": 188, + "versionNonce": 137716507, "isDeleted": false, "id": "TcnJVwFRJvQX5lxXJsr4w", "fillStyle": "hachure", @@ -89671,7 +89671,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -89768,8 +89768,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 210, - "versionNonce": 974703867, + "version": 215, + "versionNonce": 1251618837, "isDeleted": false, "id": "L8nghNZPufpoverkbHFGK", "fillStyle": "hachure", @@ -89789,7 +89789,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -90021,8 +90021,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 182, - "versionNonce": 1091270043, + "version": 187, + "versionNonce": 1735411643, "isDeleted": false, "id": "HtqVmROhyzWqNFyQagKdF", "fillStyle": "hachure", @@ -90042,7 +90042,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -90154,8 +90154,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 212, - "versionNonce": 1893730875, + "version": 217, + "versionNonce": 1013278069, "isDeleted": false, "id": "bxSMg4By4tcd8TOcg_Qli", "fillStyle": "hachure", @@ -90175,7 +90175,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -90437,8 +90437,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 215, - "versionNonce": 779684571, + "version": 220, + "versionNonce": 858101851, "isDeleted": false, "id": "wsblHxgCzflndihOonAGS", "fillStyle": "hachure", @@ -90458,7 +90458,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -90735,8 +90735,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 192, - "versionNonce": 510195579, + "version": 197, + "versionNonce": 769846997, "isDeleted": false, "id": "f-_Oxt1JjQDtZ-FAUfOzd", "fillStyle": "hachure", @@ -90756,7 +90756,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -90913,8 +90913,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 189, - "versionNonce": 787632155, + "version": 194, + "versionNonce": 1227347195, "isDeleted": false, "id": "V8BEVlkFk61CyyrBL_hr5", "fillStyle": "hachure", @@ -90934,7 +90934,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -91081,8 +91081,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 205, - "versionNonce": 1644663995, + "version": 210, + "versionNonce": 497568821, "isDeleted": false, "id": "VFOy4sqvYsfCiQFklp0WB", "fillStyle": "hachure", @@ -91102,7 +91102,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -91334,8 +91334,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 198, - "versionNonce": 1464550747, + "version": 203, + "versionNonce": 687439259, "isDeleted": false, "id": "45yyiglQvGDHQIqAz7AsC", "fillStyle": "hachure", @@ -91355,7 +91355,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -91557,8 +91557,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 212, - "versionNonce": 370139643, + "version": 217, + "versionNonce": 463142293, "isDeleted": false, "id": "Snm4ZmycC_HnBMi-yts1M", "fillStyle": "hachure", @@ -91578,7 +91578,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -91850,8 +91850,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 180, - "versionNonce": 391637659, + "version": 185, + "versionNonce": 1036849723, "isDeleted": false, "id": "9gEkp99CrbbsJD5v9eN-O", "fillStyle": "hachure", @@ -91871,7 +91871,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -91983,8 +91983,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 185, - "versionNonce": 265674555, + "version": 190, + "versionNonce": 519078645, "isDeleted": false, "id": "owldfHz3aa7CIDkedHo6u", "fillStyle": "hachure", @@ -92004,7 +92004,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -92136,8 +92136,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 191, - "versionNonce": 2045525979, + "version": 196, + "versionNonce": 1753551579, "isDeleted": false, "id": "6sAQwPbW3dCxN-YaHzvfR", "fillStyle": "hachure", @@ -92157,7 +92157,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -92324,8 +92324,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 216, - "versionNonce": 1605209211, + "version": 221, + "versionNonce": 472800341, "isDeleted": false, "id": "6daYrTVCsWRyKTaU0qSLW", "fillStyle": "hachure", @@ -92345,7 +92345,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -92637,8 +92637,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 191, - "versionNonce": 1692157211, + "version": 196, + "versionNonce": 1236533115, "isDeleted": false, "id": "6z67OwrcbfL4QOl-P7ita", "fillStyle": "hachure", @@ -92658,7 +92658,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -92825,8 +92825,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 214, - "versionNonce": 283830715, + "version": 219, + "versionNonce": 1529481653, "isDeleted": false, "id": "oT2UkmLubDP67-l-E0ulk", "fillStyle": "hachure", @@ -92846,7 +92846,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -93128,8 +93128,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 196, - "versionNonce": 1492908635, + "version": 201, + "versionNonce": 1268537371, "isDeleted": false, "id": "jLoDYN7bohjyFxke2sVU4", "fillStyle": "hachure", @@ -93149,7 +93149,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -93341,8 +93341,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 184, - "versionNonce": 1776416507, + "version": 189, + "versionNonce": 218696469, "isDeleted": false, "id": "D2apkycQiqDzIYiR486-P", "fillStyle": "hachure", @@ -93362,7 +93362,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -93504,8 +93504,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 182, - "versionNonce": 840916891, + "version": 187, + "versionNonce": 1815125179, "isDeleted": false, "id": "COEfzF8fzAjD2KRM7zP4e", "fillStyle": "hachure", @@ -93525,7 +93525,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -93672,8 +93672,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 205, - "versionNonce": 736539707, + "version": 210, + "versionNonce": 574677109, "isDeleted": false, "id": "Zn6kjCUDKRoaQvcpYLlqr", "fillStyle": "hachure", @@ -93693,7 +93693,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338583, "link": null, "locked": false, "points": [ @@ -93955,8 +93955,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 183, - "versionNonce": 1729787099, + "version": 188, + "versionNonce": 1192447323, "isDeleted": false, "id": "cot8R_OTH1KI1wdAGD7wc", "fillStyle": "hachure", @@ -93976,7 +93976,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338584, "link": null, "locked": false, "points": [ @@ -94128,8 +94128,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 202, - "versionNonce": 1397563771, + "version": 207, + "versionNonce": 1620511189, "isDeleted": false, "id": "mfiF4qlk9xMfCXgd0NUtG", "fillStyle": "hachure", @@ -94149,7 +94149,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338584, "link": null, "locked": false, "points": [ @@ -94406,8 +94406,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 179, - "versionNonce": 1237400091, + "version": 184, + "versionNonce": 1603725819, "isDeleted": false, "id": "diFezKeQAnza6YHmVl_lb", "fillStyle": "hachure", @@ -94427,7 +94427,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338584, "link": null, "locked": false, "points": [ @@ -94569,8 +94569,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 172, - "versionNonce": 1466515131, + "version": 177, + "versionNonce": 958465845, "isDeleted": false, "id": "BamtnaLz3k8ktW_GOxl5T", "fillStyle": "hachure", @@ -94590,7 +94590,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338584, "link": null, "locked": false, "points": [ @@ -94697,8 +94697,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 211, - "versionNonce": 1189588827, + "version": 216, + "versionNonce": 717091483, "isDeleted": false, "id": "xxBGDyX8bh_mCS8JxY8xi", "fillStyle": "hachure", @@ -94718,7 +94718,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338584, "link": null, "locked": false, "points": [ @@ -95020,8 +95020,8 @@ tags: [excalidraw] }, { "type": "freedraw", - "version": 170, - "versionNonce": 1787759611, + "version": 175, + "versionNonce": 1581537429, "isDeleted": false, "id": "FN6hD8n_UT4XPdtiDzdlQ", "fillStyle": "hachure", @@ -95041,7 +95041,7 @@ tags: [excalidraw] "frameId": null, "roundness": null, "boundElements": [], - "updated": 1695723080933, + "updated": 1695723338584, "link": null, "locked": false, "points": [ @@ -95135,12 +95135,4896 @@ tags: [excalidraw] 0.01269550621509552, 0 ] + }, + { + "id": "-RDNLRKq8vMsUgW6hLG9d", + "type": "freedraw", + "x": -1275.1328280160706, + "y": 217.39451712557332, + "width": 151.42857142857133, + "height": 157.14285714285722, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 69513877, + "version": 41, + "versionNonce": 1497032507, + "isDeleted": true, + "boundElements": null, + "updated": 1695723338584, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -2.8571428571426623, + 2.8571428571428896 + ], + [ + -2.8571428571426623, + 0 + ], + [ + -5.714285714285779, + -2.8571428571428896 + ], + [ + -5.714285714285779, + -5.714285714285779 + ], + [ + -8.571428571428442, + -8.571428571428555 + ], + [ + -8.571428571428442, + -17.14285714285711 + ], + [ + -8.571428571428442, + -25.71428571428578 + ], + [ + -8.571428571428442, + -31.428571428571445 + ], + [ + -8.571428571428442, + -37.14285714285711 + ], + [ + -5.714285714285779, + -54.285714285714334 + ], + [ + 0, + -71.42857142857144 + ], + [ + 11.428571428571558, + -91.42857142857144 + ], + [ + 31.42857142857156, + -117.14285714285711 + ], + [ + 40, + -125.71428571428567 + ], + [ + 48.57142857142867, + -131.42857142857144 + ], + [ + 57.14285714285734, + -140 + ], + [ + 77.14285714285734, + -148.57142857142856 + ], + [ + 102.85714285714289, + -154.28571428571433 + ], + [ + 117.14285714285734, + -151.42857142857144 + ], + [ + 128.57142857142867, + -145.71428571428567 + ], + [ + 134.28571428571422, + -137.1428571428571 + ], + [ + 140, + -125.71428571428567 + ], + [ + 142.8571428571429, + -120 + ], + [ + 142.8571428571429, + -105.71428571428578 + ], + [ + 142.8571428571429, + -94.28571428571433 + ], + [ + 140, + -85.71428571428578 + ], + [ + 137.14285714285734, + -65.71428571428578 + ], + [ + 131.42857142857156, + -54.285714285714334 + ], + [ + 125.71428571428578, + -42.85714285714289 + ], + [ + 122.85714285714289, + -34.285714285714334 + ], + [ + 120, + -28.571428571428555 + ], + [ + 117.14285714285734, + -22.85714285714289 + ], + [ + 114.28571428571422, + -20 + ], + [ + 114.28571428571422, + -20 + ] + ], + "pressures": [ + 0, + 0.20085451006889343, + 0.24376288056373596, + 0.30467689037323, + 0.3335317075252533, + 0.3451285660266876, + 0.366079181432724, + 0.37471580505371094, + 0.3765621483325958, + 0.3770504295825958, + 0.3760738670825958, + 0.37508201599121094, + 0.3807583749294281, + 0.3832303285598755, + 0.382848858833313, + 0.3813687264919281, + 0.3808804452419281, + 0.3790341019630432, + 0.37410545349121094, + 0.37323567271232605, + 0.3699091970920563, + 0.365835040807724, + 0.3676813840866089, + 0.37138932943344116, + 0.3814907968044281, + 0.3948119282722473, + 0.40160220861434937, + 0.4155336916446686, + 0.41985198855400085, + 0.42058441042900085, + 0.40788891911506653, + 0.3610284626483917, + 0.24573129415512085, + 0.08409246802330017, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 114.28571428571422, + -20 + ] + }, + { + "id": "xXCcppCsjnOBlkuk8_eHy", + "type": "freedraw", + "x": -1289.4185423017848, + "y": 185.96594569700187, + "width": 120, + "height": 117.14285714285711, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1363782677, + "version": 28, + "versionNonce": 431390197, + "isDeleted": true, + "boundElements": null, + "updated": 1695723338584, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -2.8571428571428896, + -8.571428571428555 + ], + [ + -8.571428571428442, + -11.428571428571445 + ], + [ + -22.85714285714289, + -17.14285714285711 + ], + [ + -31.42857142857156, + -20 + ], + [ + -42.85714285714289, + -22.85714285714289 + ], + [ + -62.85714285714289, + -22.85714285714289 + ], + [ + -74.28571428571422, + -22.85714285714289 + ], + [ + -82.85714285714289, + -20 + ], + [ + -94.28571428571422, + -11.428571428571445 + ], + [ + -97.14285714285711, + -8.571428571428555 + ], + [ + -108.57142857142844, + 5.714285714285666 + ], + [ + -111.42857142857156, + 17.14285714285711 + ], + [ + -111.42857142857156, + 45.714285714285666 + ], + [ + -108.57142857142844, + 54.285714285714334 + ], + [ + -88.57142857142844, + 80 + ], + [ + -80, + 85.71428571428567 + ], + [ + -54.28571428571422, + 94.28571428571422 + ], + [ + -34.28571428571422, + 94.28571428571422 + ], + [ + -22.85714285714289, + 94.28571428571422 + ], + [ + -5.714285714285779, + 91.42857142857144 + ], + [ + 8.571428571428442, + 85.71428571428567 + ], + [ + 8.571428571428442, + 85.71428571428567 + ] + ], + "pressures": [ + 0, + 0.1914854645729065, + 0.22415503859519958, + 0.27631035447120667, + 0.3140459358692169, + 0.3451285660266876, + 0.37335774302482605, + 0.3834744691848755, + 0.3924773037433624, + 0.40505072474479675, + 0.4120698869228363, + 0.43488213419914246, + 0.44907301664352417, + 0.46596476435661316, + 0.46829938888549805, + 0.4718852639198303, + 0.4721294045448303, + 0.4462348222732544, + 0.3676813840866089, + 0.3024643361568451, + 0.13093766570091248, + 0.013305867090821266, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 8.571428571428442, + 85.71428571428567 + ] + }, + { + "id": "NZWYmiGLzng-tVhbzrEUE", + "type": "freedraw", + "x": -886.5613994446419, + "y": 123.10880283985898, + "width": 82.85714285714289, + "height": 48.571428571428555, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2027936213, + "version": 37, + "versionNonce": 424563221, + "isDeleted": true, + "boundElements": null, + "updated": 1695723341554, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -2.8571428571428896, + 0 + ], + [ + 0, + 0 + ], + [ + 11.428571428571331, + -2.857142857142776 + ], + [ + 17.14285714285711, + -2.857142857142776 + ], + [ + 25.714285714285552, + -5.714285714285666 + ], + [ + 42.85714285714289, + -8.571428571428555 + ], + [ + 51.42857142857133, + -8.571428571428555 + ], + [ + 60, + -11.428571428571445 + ], + [ + 65.71428571428555, + -11.428571428571445 + ], + [ + 68.57142857142844, + -11.428571428571445 + ], + [ + 71.42857142857133, + -14.28571428571422 + ], + [ + 77.14285714285711, + -14.28571428571422 + ], + [ + 80, + -14.28571428571422 + ], + [ + 80, + -11.428571428571445 + ], + [ + 77.14285714285711, + -11.428571428571445 + ], + [ + 77.14285714285711, + -8.571428571428555 + ], + [ + 74.28571428571422, + -5.714285714285666 + ], + [ + 71.42857142857133, + -2.857142857142776 + ], + [ + 68.57142857142844, + -2.857142857142776 + ], + [ + 62.85714285714289, + 2.8571428571428896 + ], + [ + 57.14285714285711, + 5.714285714285779 + ], + [ + 51.42857142857133, + 11.428571428571445 + ], + [ + 42.85714285714289, + 17.142857142857224 + ], + [ + 40, + 20 + ], + [ + 34.28571428571422, + 25.71428571428578 + ], + [ + 31.42857142857133, + 28.571428571428555 + ], + [ + 25.714285714285552, + 31.428571428571445 + ], + [ + 25.714285714285552, + 34.285714285714334 + ], + [ + 22.85714285714289, + 34.285714285714334 + ], + [ + 22.85714285714289, + 34.285714285714334 + ] + ], + "pressures": [ + 0, + 0.22478064894676208, + 0.34413671493530273, + 0.35634392499923706, + 0.35918211936950684, + 0.35991454124450684, + 0.35819026827812195, + 0.35719844698905945, + 0.35893797874450684, + 0.35794612765312195, + 0.35806819796562195, + 0.35930418968200684, + 0.3674372434616089, + 0.40270084142684937, + 0.4325474798679352, + 0.4474708139896393, + 0.4634927809238434, + 0.48273441195487976, + 0.5015945434570312, + 0.5108415484428406, + 0.5297017097473145, + 0.545128583908081, + 0.5546196699142456, + 0.5600365996360779, + 0.5618982315063477, + 0.5626306533813477, + 0.5499351620674133, + 0.5077592134475708, + 0.40357062220573425, + 0.21626611053943634, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 22.85714285714289, + 34.285714285714334 + ] + }, + { + "id": "_eoBsElmTvp0TLANAhNtD", + "type": "freedraw", + "x": -800.8471137303563, + "y": 100.2516599827162, + "width": 8.571428571428669, + "height": 11.428571428571445, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1711424981, + "version": 21, + "versionNonce": 654788027, + "isDeleted": true, + "boundElements": null, + "updated": 1695723341554, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -2.8571428571428896 + ], + [ + 2.8571428571428896, + -5.714285714285779 + ], + [ + 2.8571428571428896, + -8.571428571428555 + ], + [ + 5.714285714285779, + -8.571428571428555 + ], + [ + 5.714285714285779, + -11.428571428571445 + ], + [ + 5.714285714285779, + -8.571428571428555 + ], + [ + 8.571428571428669, + -8.571428571428555 + ], + [ + 5.714285714285779, + -5.714285714285779 + ], + [ + 5.714285714285779, + -2.8571428571428896 + ], + [ + 2.8571428571428896, + -2.8571428571428896 + ], + [ + 2.8571428571428896, + -5.714285714285779 + ], + [ + 2.8571428571428896, + -8.571428571428555 + ], + [ + 0, + 0 + ] + ], + "pressures": [ + 0, + 0.20973525941371918, + 0.2209506332874298, + 0.23439383506774902, + 0.239703968167305, + 0.251773864030838, + 0.28087282180786133, + 0.3025864064693451, + 0.3338979184627533, + 0.3679407835006714, + 0.3797665238380432, + 0.3686732351779938, + 0.13981841504573822, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 2.8571428571428896, + -8.571428571428555 + ] + }, + { + "id": "CQeoEVUS5DRLYGUh4tZ0e", + "type": "freedraw", + "x": -923.704256587499, + "y": 117.39451712557332, + "width": 168.57142857142844, + "height": 145.71428571428567, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1011973077, + "version": 40, + "versionNonce": 608520053, + "isDeleted": true, + "boundElements": null, + "updated": 1695723341554, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -2.8571428571428896, + -2.8571428571428896 + ], + [ + -5.714285714285779, + -5.714285714285779 + ], + [ + -8.571428571428669, + -8.571428571428555 + ], + [ + -11.428571428571558, + -11.428571428571445 + ], + [ + -14.285714285714448, + -11.428571428571445 + ], + [ + -20, + -17.14285714285711 + ], + [ + -25.71428571428578, + -17.14285714285711 + ], + [ + -31.42857142857156, + -20 + ], + [ + -40, + -22.85714285714289 + ], + [ + -48.57142857142867, + -25.714285714285666 + ], + [ + -62.857142857143, + -25.714285714285666 + ], + [ + -71.42857142857156, + -22.85714285714289 + ], + [ + -85.71428571428578, + -22.85714285714289 + ], + [ + -97.14285714285722, + -20 + ], + [ + -111.42857142857156, + -14.285714285714334 + ], + [ + -128.57142857142867, + 0 + ], + [ + -134.28571428571422, + 5.714285714285666 + ], + [ + -142.8571428571429, + 25.714285714285666 + ], + [ + -145.71428571428578, + 42.85714285714289 + ], + [ + -142.8571428571429, + 62.85714285714289 + ], + [ + -140, + 71.42857142857144 + ], + [ + -131.42857142857156, + 88.57142857142856 + ], + [ + -120, + 102.85714285714289 + ], + [ + -102.85714285714312, + 111.42857142857144 + ], + [ + -74.28571428571433, + 120 + ], + [ + -54.28571428571445, + 120 + ], + [ + -34.28571428571445, + 120 + ], + [ + -17.142857142857338, + 117.14285714285711 + ], + [ + -8.571428571428669, + 114.28571428571422 + ], + [ + 5.714285714285552, + 108.57142857142856 + ], + [ + 17.14285714285711, + 102.85714285714289 + ], + [ + 22.857142857142662, + 97.14285714285711 + ], + [ + 22.857142857142662, + 97.14285714285711 + ] + ], + "pressures": [ + 0, + 0.2532539963722229, + 0.29419395327568054, + 0.3607843220233917, + 0.40566110610961914, + 0.4285953938961029, + 0.4630044996738434, + 0.4875410199165344, + 0.5087510347366333, + 0.530083179473877, + 0.5511711239814758, + 0.581750214099884, + 0.6040589213371277, + 0.6272373795509338, + 0.6473487615585327, + 0.6611581444740295, + 0.6702830791473389, + 0.6721293926239014, + 0.6761882901191711, + 0.6758220791816711, + 0.6761882901191711, + 0.6761882901191711, + 0.6758220791816711, + 0.6758220791816711, + 0.6750896573066711, + 0.6711375713348389, + 0.6674448847770691, + 0.6649729013442993, + 0.6277409195899963, + 0.5782864093780518, + 0.3987640142440796, + 0.16311894357204437, + 0.02526894025504589, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 22.857142857142662, + 97.14285714285711 + ] + }, + { + "id": "XfzZAmMORzkSvsb1zQlbx", + "type": "freedraw", + "x": -898.9423518255944, + "y": 157.63261236366853, + "width": 17.14285714285711, + "height": 28.571428571428555, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 839916533, + "version": 30, + "versionNonce": 854410421, + "isDeleted": true, + "boundElements": null, + "updated": 1695723338584, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -2.8571428571428896 + ], + [ + 2.8571428571428896, + -5.714285714285666 + ], + [ + 5.714285714285779, + -8.571428571428555 + ], + [ + 8.571428571428669, + -8.571428571428555 + ], + [ + 11.428571428571331, + -8.571428571428555 + ], + [ + 14.28571428571422, + -5.714285714285666 + ], + [ + 17.14285714285711, + -2.8571428571428896 + ], + [ + 17.14285714285711, + 14.285714285714334 + ], + [ + 11.428571428571331, + 20 + ], + [ + 5.714285714285779, + 5.714285714285666 + ], + [ + 5.714285714285779, + -5.714285714285666 + ], + [ + 8.571428571428669, + -8.571428571428555 + ], + [ + 0, + 0 + ] + ], + "pressures": [ + 0, + 0.1570763736963272, + 0.17792019248008728, + 0.2068970799446106, + 0.22970931231975555, + 0.251041442155838, + 0.27817195653915405, + 0.2996261417865753, + 0.40418097376823425, + 0.4583199918270111, + 0.45548179745674133, + 0.26077669858932495, + 0.003570611122995615, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 8.571428571428669, + -8.571428571428555 + ] + }, + { + "id": "XDp813UdM1wKYzBhi1E-h", + "type": "freedraw", + "x": -908.4661613494038, + "y": 134.7754695065259, + "width": 8.333333333333258, + "height": 11.666666666666657, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2116119157, + "version": 39, + "versionNonce": 590141019, + "isDeleted": true, + "boundElements": null, + "updated": 1695723341554, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 1.6666666666666572 + ], + [ + -1.6666666666666288, + 3.3333333333333144 + ], + [ + -1.6666666666666288, + 5 + ], + [ + -1.6666666666666288, + 6.666666666666657 + ], + [ + -1.6666666666666288, + 8.333333333333314 + ], + [ + 0, + 10 + ], + [ + 0, + 11.666666666666657 + ], + [ + 1.6666666666666288, + 11.666666666666657 + ], + [ + 3.3333333333333712, + 11.666666666666657 + ], + [ + 3.3333333333333712, + 10 + ], + [ + 5, + 8.333333333333314 + ], + [ + 5, + 6.666666666666657 + ], + [ + 5, + 5 + ], + [ + 5, + 3.3333333333333144 + ], + [ + 5, + 1.6666666666666572 + ], + [ + 3.3333333333333712, + 0 + ], + [ + 1.6666666666666288, + 0 + ], + [ + 1.6666666666666288, + 3.3333333333333144 + ], + [ + 1.6666666666666288, + 5 + ], + [ + 1.6666666666666288, + 6.666666666666657 + ], + [ + 1.6666666666666288, + 8.333333333333314 + ], + [ + 3.3333333333333712, + 8.333333333333314 + ], + [ + 5, + 8.333333333333314 + ], + [ + 5, + 6.666666666666657 + ], + [ + 5, + 5 + ], + [ + 5, + 3.3333333333333144 + ], + [ + 6.666666666666629, + 3.3333333333333144 + ], + [ + 6.666666666666629, + 1.6666666666666572 + ], + [ + 5, + 0 + ], + [ + 5, + 1.6666666666666572 + ], + [ + 0, + 0 + ] + ], + "pressures": [ + 0, + 0.19296559691429138, + 0.20221255719661713, + 0.20454718172550201, + 0.2071412205696106, + 0.21774624288082123, + 0.2226749062538147, + 0.2234226018190384, + 0.22601662576198578, + 0.2405584752559662, + 0.24820324778556824, + 0.26300451159477234, + 0.28101015090942383, + 0.30418860912323, + 0.32513922452926636, + 0.34142062067985535, + 0.3532616198062897, + 0.3643549382686615, + 0.3613946735858917, + 0.3626306653022766, + 0.3617608845233917, + 0.35991454124450684, + 0.3626306653022766, + 0.3636224865913391, + 0.3670710325241089, + 0.3668268918991089, + 0.3687953054904938, + 0.3700312674045563, + 0.365102618932724, + 0.29777979850769043, + 0.02847333438694477, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 5, + 1.6666666666666572 + ] + }, + { + "id": "MD8kCbaK3BwDBOExnm9uU", + "type": "freedraw", + "x": -853.4661613494038, + "y": 258.1088028398592, + "width": 6.6666666666667425, + "height": 35, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1114897717, + "version": 36, + "versionNonce": 326537429, + "isDeleted": true, + "boundElements": null, + "updated": 1695723341554, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -1.6666666666667425, + -1.6666666666666856 + ], + [ + 0, + 0 + ], + [ + 0, + 1.6666666666666288 + ], + [ + 0, + 3.3333333333333144 + ], + [ + 0, + 5 + ], + [ + 0, + 8.333333333333314 + ], + [ + 0, + 10 + ], + [ + 0, + 13.333333333333314 + ], + [ + 0, + 16.66666666666663 + ], + [ + 0, + 20 + ], + [ + 0, + 23.333333333333314 + ], + [ + 0, + 26.66666666666663 + ], + [ + 0, + 28.333333333333314 + ], + [ + -1.6666666666667425, + 30 + ], + [ + -1.6666666666667425, + 31.66666666666663 + ], + [ + -1.6666666666667425, + 33.333333333333314 + ], + [ + -3.3333333333333712, + 33.333333333333314 + ], + [ + -5, + 33.333333333333314 + ], + [ + -6.6666666666667425, + 31.66666666666663 + ], + [ + -6.6666666666667425, + 30 + ], + [ + -6.6666666666667425, + 28.333333333333314 + ], + [ + -6.6666666666667425, + 26.66666666666663 + ], + [ + -6.6666666666667425, + 25 + ], + [ + -6.6666666666667425, + 23.333333333333314 + ], + [ + -6.6666666666667425, + 21.66666666666663 + ], + [ + -6.6666666666667425, + 20 + ], + [ + -6.6666666666667425, + 18.333333333333314 + ], + [ + -6.6666666666667425, + 16.66666666666663 + ], + [ + -6.6666666666667425, + 16.66666666666663 + ] + ], + "pressures": [ + 0, + 0.1449912190437317, + 0.19530022144317627, + 0.24339665472507477, + 0.26004424691200256, + 0.2685435116291046, + 0.29616236686706543, + 0.3055466413497925, + 0.32588693499565125, + 0.34190890192985535, + 0.3521476984024048, + 0.35918211936950684, + 0.3664606809616089, + 0.37422752380371094, + 0.3817501962184906, + 0.39099717140197754, + 0.40196841955184937, + 0.42021819949150085, + 0.4464789927005768, + 0.46596476435661316, + 0.47101548314094543, + 0.4728618264198303, + 0.4744640290737152, + 0.4732280373573303, + 0.46904706954956055, + 0.43660640716552734, + 0.33772793412208557, + 0.15609979629516602, + 0.022674906998872757, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + -6.6666666666667425, + 16.66666666666663 + ] + }, + { + "id": "YdbA5UVb84l3N5cVE40Xy", + "type": "freedraw", + "x": -938.4661613494038, + "y": 246.44213617319252, + "width": 186.66666666666663, + "height": 141.66666666666663, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1218128853, + "version": 72, + "versionNonce": 1905742587, + "isDeleted": true, + "boundElements": null, + "updated": 1695723341554, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -3.3333333333333712, + 0 + ], + [ + -6.666666666666629, + 1.6666666666666856 + ], + [ + -8.333333333333371, + 1.6666666666666856 + ], + [ + -11.666666666666629, + 1.6666666666666856 + ], + [ + -16.66666666666663, + 3.333333333333343 + ], + [ + -20, + 3.333333333333343 + ], + [ + -21.66666666666663, + 3.333333333333343 + ], + [ + -26.66666666666663, + 5 + ], + [ + -33.33333333333337, + 6.666666666666686 + ], + [ + -38.33333333333337, + 8.333333333333343 + ], + [ + -45, + 11.666666666666686 + ], + [ + -50, + 13.333333333333314 + ], + [ + -56.66666666666663, + 16.666666666666686 + ], + [ + -63.33333333333337, + 21.666666666666686 + ], + [ + -70, + 26.666666666666686 + ], + [ + -75, + 30 + ], + [ + -78.33333333333326, + 33.333333333333314 + ], + [ + -81.66666666666674, + 36.666666666666686 + ], + [ + -93.33333333333326, + 46.666666666666686 + ], + [ + -101.66666666666674, + 55 + ], + [ + -108.33333333333326, + 65 + ], + [ + -113.33333333333326, + 73.33333333333331 + ], + [ + -115, + 78.33333333333331 + ], + [ + -118.33333333333326, + 86.66666666666669 + ], + [ + -120, + 96.66666666666669 + ], + [ + -118.33333333333326, + 105 + ], + [ + -115, + 113.33333333333331 + ], + [ + -110, + 120 + ], + [ + -103.33333333333326, + 126.66666666666663 + ], + [ + -95, + 131.66666666666663 + ], + [ + -85, + 136.66666666666663 + ], + [ + -80, + 138.33333333333331 + ], + [ + -60, + 140 + ], + [ + -51.66666666666663, + 141.66666666666663 + ], + [ + -45, + 141.66666666666663 + ], + [ + -36.66666666666663, + 141.66666666666663 + ], + [ + -15, + 141.66666666666663 + ], + [ + -8.333333333333371, + 141.66666666666663 + ], + [ + -3.3333333333333712, + 140 + ], + [ + 8.333333333333371, + 138.33333333333331 + ], + [ + 13.333333333333371, + 138.33333333333331 + ], + [ + 23.33333333333337, + 136.66666666666663 + ], + [ + 30, + 133.33333333333331 + ], + [ + 36.66666666666663, + 131.66666666666663 + ], + [ + 41.66666666666663, + 130 + ], + [ + 45, + 128.33333333333331 + ], + [ + 48.33333333333337, + 126.66666666666663 + ], + [ + 50, + 125 + ], + [ + 51.66666666666663, + 125 + ], + [ + 51.66666666666663, + 123.33333333333331 + ], + [ + 53.33333333333337, + 123.33333333333331 + ], + [ + 53.33333333333337, + 121.66666666666663 + ], + [ + 55, + 121.66666666666663 + ], + [ + 55, + 120 + ], + [ + 56.66666666666663, + 120 + ], + [ + 58.33333333333337, + 120 + ], + [ + 58.33333333333337, + 118.33333333333331 + ], + [ + 60, + 118.33333333333331 + ], + [ + 61.66666666666663, + 116.66666666666663 + ], + [ + 63.33333333333326, + 116.66666666666663 + ], + [ + 65, + 115 + ], + [ + 66.66666666666663, + 115 + ], + [ + 66.66666666666663, + 113.33333333333331 + ], + [ + 66.66666666666663, + 111.66666666666669 + ], + [ + 66.66666666666663, + 111.66666666666669 + ] + ], + "pressures": [ + 0, + 0.19777218997478485, + 0.2647287845611572, + 0.2885175943374634, + 0.3351339101791382, + 0.3798886239528656, + 0.3985198736190796, + 0.4142976999282837, + 0.43796443939208984, + 0.45461204648017883, + 0.46706339716911316, + 0.48198673129081726, + 0.49999237060546875, + 0.5130693316459656, + 0.5271229147911072, + 0.5404287576675415, + 0.546349287033081, + 0.5519035458564758, + 0.5574578642845154, + 0.5739681124687195, + 0.5842069387435913, + 0.5922179222106934, + 0.5983825325965881, + 0.6007324457168579, + 0.6022125482559204, + 0.6027008295059204, + 0.6022125482559204, + 0.6018463373184204, + 0.6020904779434204, + 0.6016021966934204, + 0.5992522835731506, + 0.5953001976013184, + 0.5938200950622559, + 0.5940794944763184, + 0.5936980247497559, + 0.5933318138122559, + 0.5922179222106934, + 0.5888914465904236, + 0.5860532522201538, + 0.5810025334358215, + 0.5649805665016174, + 0.5544975996017456, + 0.5271229147911072, + 0.49752041697502136, + 0.46805524826049805, + 0.4448767900466919, + 0.426138699054718, + 0.4161440432071686, + 0.4128175675868988, + 0.4104676842689514, + 0.4104676842689514, + 0.40813305974006653, + 0.40849927067756653, + 0.40640878677368164, + 0.4013427793979645, + 0.3970397412776947, + 0.3948119282722473, + 0.3920958340167999, + 0.39049363136291504, + 0.39087510108947754, + 0.39099717140197754, + 0.3808804452419281, + 0.30394446849823, + 0.2374761551618576, + 0.051407646387815475, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 66.66666666666663, + 111.66666666666669 + ] + }, + { + "id": "w62MjsGsN_yb05JzfbZs2", + "type": "freedraw", + "x": -870.1328280160706, + "y": 356.4421361731925, + "width": 38.33333333333326, + "height": 13.333333333333314, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1491711989, + "version": 49, + "versionNonce": 343387701, + "isDeleted": true, + "boundElements": null, + "updated": 1695723341554, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -1.6666666666666288, + 0 + ], + [ + -3.3333333333332575, + -1.6666666666666856 + ], + [ + -5, + -1.6666666666666856 + ], + [ + -6.666666666666629, + -3.3333333333333144 + ], + [ + -9.999999999999886, + -3.3333333333333144 + ], + [ + -11.666666666666629, + -5 + ], + [ + -13.333333333333258, + -5 + ], + [ + -14.999999999999886, + -5 + ], + [ + -16.66666666666663, + -5 + ], + [ + -18.333333333333258, + -5 + ], + [ + -14.999999999999886, + -5 + ], + [ + -13.333333333333258, + -3.3333333333333144 + ], + [ + -11.666666666666629, + -1.6666666666666856 + ], + [ + -6.666666666666629, + 0 + ], + [ + -5, + 0 + ], + [ + -1.6666666666666288, + 1.6666666666666856 + ], + [ + 1.6666666666667425, + 3.3333333333333144 + ], + [ + 6.6666666666667425, + 5 + ], + [ + 8.333333333333371, + 5 + ], + [ + 15, + 6.666666666666629 + ], + [ + 16.666666666666742, + 8.333333333333314 + ], + [ + 18.33333333333337, + 8.333333333333314 + ], + [ + 20, + 8.333333333333314 + ], + [ + 16.666666666666742, + 8.333333333333314 + ], + [ + 16.666666666666742, + 6.666666666666629 + ], + [ + 11.666666666666742, + 6.666666666666629 + ], + [ + 6.6666666666667425, + 5 + ], + [ + 3.3333333333333712, + 3.3333333333333144 + ], + [ + 0, + 3.3333333333333144 + ], + [ + -1.6666666666666288, + 1.6666666666666856 + ], + [ + -6.666666666666629, + 1.6666666666666856 + ], + [ + -8.333333333333258, + 1.6666666666666856 + ], + [ + -13.333333333333258, + 0 + ], + [ + -14.999999999999886, + 0 + ], + [ + -16.66666666666663, + 0 + ], + [ + -16.66666666666663, + 1.6666666666666856 + ], + [ + -13.333333333333258, + 3.3333333333333144 + ], + [ + -8.333333333333258, + 3.3333333333333144 + ], + [ + -1.6666666666666288, + 5 + ], + [ + 5, + 6.666666666666629 + ], + [ + 0, + 0 + ] + ], + "pressures": [ + 0, + 0.16066224873065948, + 0.20172427594661713, + 0.24080263078212738, + 0.27779048681259155, + 0.32268252968788147, + 0.3613946735858917, + 0.3977721929550171, + 0.42453649640083313, + 0.4408026337623596, + 0.45165178179740906, + 0.46572059392929077, + 0.46805524826049805, + 0.46829938888549805, + 0.46793317794799805, + 0.46817731857299805, + 0.46793317794799805, + 0.46768900752067566, + 0.46732279658317566, + 0.46793317794799805, + 0.46842145919799805, + 0.46842145919799805, + 0.46941328048706055, + 0.4737316071987152, + 0.5089951753616333, + 0.5134355425834656, + 0.5226825475692749, + 0.5268787741661072, + 0.531181812286377, + 0.5325398445129395, + 0.532921314239502, + 0.533043384552002, + 0.5335317254066467, + 0.5348897576332092, + 0.5345235466957092, + 0.5327839851379395, + 0.5271229147911072, + 0.48223087191581726, + 0.37262532114982605, + 0.1723659187555313, + 0.02871747873723507, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 5, + 6.666666666666629 + ] + }, + { + "id": "YLFDMmQH1YvfsIWesBLmo", + "type": "freedraw", + "x": -778.4661613494038, + "y": 453.10880283985915, + "width": 80, + "height": 81.66666666666669, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1291121883, + "version": 88, + "versionNonce": 1143146901, + "isDeleted": true, + "boundElements": null, + "updated": 1695723338254, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.6666666666666288, + 0 + ], + [ + 1.6666666666666288, + -1.6666666666666288 + ], + [ + 3.3333333333332575, + -5 + ], + [ + 1.6666666666666288, + -6.666666666666629 + ], + [ + 1.6666666666666288, + -10 + ], + [ + 0, + -13.333333333333314 + ], + [ + -1.6666666666667425, + -18.333333333333314 + ], + [ + -3.3333333333333712, + -21.66666666666663 + ], + [ + -6.6666666666667425, + -26.66666666666663 + ], + [ + -8.333333333333371, + -30 + ], + [ + -13.333333333333371, + -35 + ], + [ + -18.33333333333337, + -40 + ], + [ + -21.666666666666742, + -41.66666666666663 + ], + [ + -23.33333333333337, + -43.333333333333314 + ], + [ + -30, + -45 + ], + [ + -36.66666666666674, + -45 + ], + [ + -43.33333333333337, + -43.333333333333314 + ], + [ + -50, + -38.333333333333314 + ], + [ + -55, + -30 + ], + [ + -60, + -20 + ], + [ + -63.33333333333337, + -10 + ], + [ + -65, + 1.6666666666666856 + ], + [ + -65, + 11.666666666666686 + ], + [ + -63.33333333333337, + 20 + ], + [ + -60, + 28.33333333333337 + ], + [ + -53.33333333333337, + 35 + ], + [ + -51.66666666666674, + 36.666666666666686 + ], + [ + -45, + 36.666666666666686 + ], + [ + -40, + 36.666666666666686 + ], + [ + -33.33333333333337, + 33.33333333333337 + ], + [ + -26.666666666666742, + 30 + ], + [ + -21.666666666666742, + 23.33333333333337 + ], + [ + -16.666666666666742, + 18.33333333333337 + ], + [ + -15, + 15 + ], + [ + -11.666666666666742, + 8.333333333333371 + ], + [ + -10, + 1.6666666666666856 + ], + [ + -10, + -3.3333333333333144 + ], + [ + -10, + -6.666666666666629 + ], + [ + -10, + -8.333333333333314 + ], + [ + -11.666666666666742, + -10 + ], + [ + -13.333333333333371, + -8.333333333333314 + ], + [ + -13.333333333333371, + -6.666666666666629 + ], + [ + -15, + -6.666666666666629 + ], + [ + -16.666666666666742, + -1.6666666666666288 + ], + [ + -18.33333333333337, + 1.6666666666666856 + ], + [ + -18.33333333333337, + 6.666666666666686 + ], + [ + -18.33333333333337, + 11.666666666666686 + ], + [ + -18.33333333333337, + 15 + ], + [ + -16.666666666666742, + 16.666666666666686 + ], + [ + -15, + 18.33333333333337 + ], + [ + -13.333333333333371, + 20 + ], + [ + -11.666666666666742, + 20 + ], + [ + -10, + 20 + ], + [ + -8.333333333333371, + 18.33333333333337 + ], + [ + -6.6666666666667425, + 16.666666666666686 + ], + [ + -5, + 16.666666666666686 + ], + [ + -3.3333333333333712, + 16.666666666666686 + ], + [ + -5, + 16.666666666666686 + ], + [ + -5, + 18.33333333333337 + ], + [ + -5, + 20 + ], + [ + -5, + 21.666666666666686 + ], + [ + -5, + 23.33333333333337 + ], + [ + -3.3333333333333712, + 23.33333333333337 + ], + [ + -1.6666666666667425, + 21.666666666666686 + ], + [ + 0, + 21.666666666666686 + ], + [ + 1.6666666666666288, + 20 + ], + [ + 1.6666666666666288, + 18.33333333333337 + ], + [ + 3.3333333333332575, + 15 + ], + [ + 3.3333333333332575, + 13.333333333333371 + ], + [ + 3.3333333333332575, + 11.666666666666686 + ], + [ + 3.3333333333332575, + 8.333333333333371 + ], + [ + 5, + 6.666666666666686 + ], + [ + 5, + 5 + ], + [ + 5, + 3.3333333333333712 + ], + [ + 5, + 1.6666666666666856 + ], + [ + 5, + 0 + ], + [ + 6.666666666666629, + -1.6666666666666288 + ], + [ + 8.333333333333258, + -1.6666666666666288 + ], + [ + 8.333333333333258, + -3.3333333333333144 + ], + [ + 10, + -3.3333333333333144 + ], + [ + 11.666666666666629, + -3.3333333333333144 + ], + [ + 13.333333333333258, + -3.3333333333333144 + ], + [ + 15, + -3.3333333333333144 + ], + [ + 15, + -3.3333333333333144 + ] + ], + "pressures": [ + 0, + 0.1597924828529358, + 0.17878995835781097, + 0.1908750981092453, + 0.20196841657161713, + 0.21194781363010406, + 0.21651026606559753, + 0.21541161835193634, + 0.21405355632305145, + 0.21380941569805145, + 0.21441978216171265, + 0.21651026606559753, + 0.21849393844604492, + 0.21971465647220612, + 0.2219424694776535, + 0.2219424694776535, + 0.2226749062538147, + 0.22478064894676208, + 0.22526894509792328, + 0.22674906253814697, + 0.23007553815841675, + 0.23007553815841675, + 0.22871747612953186, + 0.22983138263225555, + 0.23340199887752533, + 0.2369878739118576, + 0.2404364049434662, + 0.24339665472507477, + 0.251041442155838, + 0.2540016770362854, + 0.2523994743824005, + 0.24856947362422943, + 0.24623483419418335, + 0.24487678706645966, + 0.24388495087623596, + 0.24303044378757477, + 0.24412909150123596, + 0.24931715428829193, + 0.2546120285987854, + 0.25893035531044006, + 0.26237887144088745, + 0.2739757299423218, + 0.28026244044303894, + 0.2864271104335785, + 0.2982681095600128, + 0.30676737427711487, + 0.31306934356689453, + 0.3188525140285492, + 0.32256045937538147, + 0.32341498136520386, + 0.32501715421676636, + 0.32513922452926636, + 0.32773327827453613, + 0.329579621553421, + 0.3299610912799835, + 0.3304493725299835, + 0.3345235288143158, + 0.3486991822719574, + 0.3535057604312897, + 0.35609978437423706, + 0.35906004905700684, + 0.35991454124450684, + 0.3628748059272766, + 0.3644770085811615, + 0.35831233859062195, + 0.35585564374923706, + 0.3506675958633423, + 0.3464713394641876, + 0.34229037165641785, + 0.3348897397518158, + 0.329579621553421, + 0.32513922452926636, + 0.32181277871131897, + 0.3192339837551117, + 0.31232166290283203, + 0.30406653881073, + 0.29419395327568054, + 0.2834668457508087, + 0.26373693346977234, + 0.23550774157047272, + 0.2235446721315384, + 0.18408484756946564, + 0.1584344208240509, + 0.027359426021575928, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 15, + -3.3333333333333144 + ] + }, + { + "id": "SYVsog1rRpYwfh0Jg6hbG", + "type": "freedraw", + "x": -755.1328280160706, + "y": 448.10880283985915, + "width": 75, + "height": 18.33333333333337, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1029826203, + "version": 31, + "versionNonce": 1127169403, + "isDeleted": true, + "boundElements": null, + "updated": 1695723337934, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 3.3333333333333712 + ], + [ + 0, + 5 + ], + [ + 1.6666666666667425, + 10 + ], + [ + 1.6666666666667425, + 11.666666666666686 + ], + [ + 3.3333333333333712, + 13.333333333333371 + ], + [ + 6.6666666666667425, + 15 + ], + [ + 8.333333333333371, + 15 + ], + [ + 10, + 15 + ], + [ + 11.666666666666742, + 15 + ], + [ + 15, + 13.333333333333371 + ], + [ + 16.666666666666742, + 11.666666666666686 + ], + [ + 21.666666666666742, + 8.333333333333371 + ], + [ + 25, + 6.666666666666686 + ], + [ + 28.33333333333337, + 5 + ], + [ + 30, + 3.3333333333333712 + ], + [ + 31.666666666666742, + 3.3333333333333712 + ], + [ + 33.33333333333337, + 5 + ], + [ + 35, + 6.666666666666686 + ], + [ + 36.66666666666674, + 11.666666666666686 + ], + [ + 36.66666666666674, + 13.333333333333371 + ], + [ + 38.33333333333337, + 16.666666666666686 + ], + [ + 41.66666666666674, + 18.33333333333337 + ], + [ + 45, + 18.33333333333337 + ], + [ + 46.66666666666674, + 18.33333333333337 + ], + [ + 56.66666666666674, + 15 + ], + [ + 65, + 10 + ], + [ + 75, + 3.3333333333333712 + ], + [ + 75, + 3.3333333333333712 + ] + ], + "pressures": [ + 0, + 0.17114518582820892, + 0.18001067638397217, + 0.21170367300510406, + 0.2226749062538147, + 0.24216067790985107, + 0.2568398714065552, + 0.25980010628700256, + 0.26189059019088745, + 0.26373693346977234, + 0.2657206058502197, + 0.2659647464752197, + 0.2681773006916046, + 0.2718852460384369, + 0.28038454055786133, + 0.2893873453140259, + 0.32367438077926636, + 0.33809414505958557, + 0.3625085949897766, + 0.3817501962184906, + 0.3842069208621979, + 0.38617533445358276, + 0.3843289911746979, + 0.37138932943344116, + 0.3543755114078522, + 0.24315251410007477, + 0.10220492631196976, + 0.0025787746999412775, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 75, + 3.3333333333333712 + ] + }, + { + "id": "1sG-0ERbI19kdhDPqrDyX", + "type": "freedraw", + "x": -928.4661613494038, + "y": 373.10880283985915, + "width": 69.99999999999989, + "height": 63.333333333333314, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 103686037, + "version": 40, + "versionNonce": 447912853, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -1.6666666666666288, + 0 + ], + [ + -1.6666666666666288, + 1.6666666666666856 + ], + [ + 0, + 1.6666666666666856 + ], + [ + 1.6666666666666288, + 0 + ], + [ + 5, + -1.6666666666666288 + ], + [ + 11.666666666666629, + -5 + ], + [ + 18.33333333333337, + -10 + ], + [ + 21.66666666666663, + -11.666666666666629 + ], + [ + 25, + -14.999999999999943 + ], + [ + 33.33333333333337, + -19.999999999999943 + ], + [ + 36.66666666666663, + -21.66666666666663 + ], + [ + 41.66666666666663, + -23.333333333333314 + ], + [ + 48.33333333333337, + -28.333333333333314 + ], + [ + 53.33333333333326, + -29.999999999999943 + ], + [ + 58.33333333333326, + -33.333333333333314 + ], + [ + 63.33333333333326, + -34.99999999999994 + ], + [ + 66.66666666666663, + -36.66666666666663 + ], + [ + 68.33333333333326, + -38.333333333333314 + ], + [ + 68.33333333333326, + -36.66666666666663 + ], + [ + 66.66666666666663, + -33.333333333333314 + ], + [ + 63.33333333333326, + -29.999999999999943 + ], + [ + 58.33333333333326, + -24.999999999999943 + ], + [ + 53.33333333333326, + -18.333333333333314 + ], + [ + 48.33333333333337, + -11.666666666666629 + ], + [ + 43.33333333333337, + -5 + ], + [ + 38.33333333333337, + 1.6666666666666856 + ], + [ + 33.33333333333337, + 6.666666666666686 + ], + [ + 31.66666666666663, + 11.666666666666686 + ], + [ + 28.33333333333337, + 15 + ], + [ + 26.66666666666663, + 18.33333333333337 + ], + [ + 26.66666666666663, + 20 + ], + [ + 26.66666666666663, + 21.666666666666686 + ], + [ + 25, + 23.33333333333337 + ], + [ + 25, + 25 + ], + [ + 25, + 23.33333333333337 + ], + [ + 23.33333333333337, + 21.666666666666686 + ], + [ + 23.33333333333337, + 21.666666666666686 + ] + ], + "pressures": [ + 0, + 0.23327992856502533, + 0.2824902832508087, + 0.40517279505729675, + 0.4250248074531555, + 0.43427175283432007, + 0.43982604146003723, + 0.4458686113357544, + 0.4473487436771393, + 0.4478370249271393, + 0.44881361722946167, + 0.44956129789352417, + 0.44980543851852417, + 0.44919508695602417, + 0.44856947660446167, + 0.45004957914352417, + 0.45351338386535645, + 0.46533912420272827, + 0.4897535741329193, + 0.5193560719490051, + 0.5658350586891174, + 0.5942015647888184, + 0.6194705367088318, + 0.6405584812164307, + 0.6572060585021973, + 0.6686655879020691, + 0.6776683926582336, + 0.6838330626487732, + 0.686549186706543, + 0.6874189376831055, + 0.686427116394043, + 0.686915397644043, + 0.6875410079956055, + 0.6872968673706055, + 0.685694694519043, + 0.6682993769645691, + 0.12219424545764923, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 23.33333333333337, + 21.666666666666686 + ] + }, + { + "id": "7f5KbgMYblkBAItqn9ybo", + "type": "freedraw", + "x": -938.4661613494038, + "y": 393.10880283985915, + "width": 83.33333333333326, + "height": 88.33333333333331, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1310414133, + "version": 38, + "versionNonce": 335959099, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -1.6666666666666288 + ], + [ + -1.6666666666666288, + -1.6666666666666288 + ], + [ + -5, + -1.6666666666666288 + ], + [ + -5, + 0 + ], + [ + -10, + 1.6666666666666856 + ], + [ + -15, + 3.3333333333333712 + ], + [ + -20, + 8.333333333333371 + ], + [ + -25, + 13.333333333333371 + ], + [ + -28.33333333333337, + 20 + ], + [ + -33.33333333333337, + 33.33333333333337 + ], + [ + -36.66666666666663, + 43.33333333333337 + ], + [ + -36.66666666666663, + 53.33333333333337 + ], + [ + -35, + 61.666666666666686 + ], + [ + -31.66666666666663, + 73.33333333333337 + ], + [ + -26.66666666666663, + 80 + ], + [ + -20, + 83.33333333333337 + ], + [ + -13.333333333333371, + 86.66666666666669 + ], + [ + -5, + 86.66666666666669 + ], + [ + 1.6666666666666288, + 86.66666666666669 + ], + [ + 10, + 85 + ], + [ + 18.33333333333337, + 81.66666666666669 + ], + [ + 25, + 78.33333333333337 + ], + [ + 33.33333333333337, + 70 + ], + [ + 36.66666666666663, + 63.33333333333337 + ], + [ + 41.66666666666663, + 56.666666666666686 + ], + [ + 43.33333333333337, + 50 + ], + [ + 45, + 43.33333333333337 + ], + [ + 45, + 38.33333333333337 + ], + [ + 46.66666666666663, + 33.33333333333337 + ], + [ + 46.66666666666663, + 30 + ], + [ + 46.66666666666663, + 23.33333333333337 + ], + [ + 45, + 20 + ], + [ + 45, + 18.33333333333337 + ], + [ + 45, + 16.666666666666686 + ], + [ + 45, + 16.666666666666686 + ] + ], + "pressures": [ + 0, + 0.24943922460079193, + 0.29259175062179565, + 0.3779201805591583, + 0.3956817090511322, + 0.444129079580307, + 0.46720072627067566, + 0.48458075523376465, + 0.5033188462257385, + 0.5215686559677124, + 0.5398184061050415, + 0.545616865158081, + 0.5501793026924133, + 0.5530174970626831, + 0.5601586699485779, + 0.5626306533813477, + 0.5641107559204102, + 0.5635004043579102, + 0.5586785674095154, + 0.5530174970626831, + 0.5495536923408508, + 0.5435263514518738, + 0.537850022315979, + 0.5315632820129395, + 0.5283588767051697, + 0.5245288610458374, + 0.5208361744880676, + 0.5179980397224426, + 0.5115892291069031, + 0.4960402846336365, + 0.4572060704231262, + 0.29727625846862793, + 0.12292668223381042, + 0.052887771278619766, + 0.010345617309212685, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 45, + 16.666666666666686 + ] + }, + { + "id": "82h2-JxcqQqBxM7jbUylo", + "type": "freedraw", + "x": -950.1328280160704, + "y": 374.77546950652584, + "width": 65.00000000000011, + "height": 50, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 576708629, + "version": 32, + "versionNonce": 1432641781, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -1.6666666666667425, + 0 + ], + [ + -5, + -1.6666666666666856 + ], + [ + -8.333333333333371, + -3.3333333333333144 + ], + [ + -11.666666666666742, + -3.3333333333333144 + ], + [ + -13.333333333333371, + -3.3333333333333144 + ], + [ + -20, + -5 + ], + [ + -23.33333333333337, + -6.666666666666686 + ], + [ + -28.33333333333337, + -6.666666666666686 + ], + [ + -36.66666666666674, + -6.666666666666686 + ], + [ + -40, + -5 + ], + [ + -43.33333333333337, + -3.3333333333333144 + ], + [ + -50, + 0 + ], + [ + -53.33333333333337, + 3.3333333333333144 + ], + [ + -58.33333333333337, + 6.666666666666686 + ], + [ + -61.66666666666663, + 15 + ], + [ + -63.33333333333337, + 20 + ], + [ + -65.00000000000011, + 25 + ], + [ + -63.33333333333337, + 30 + ], + [ + -61.66666666666663, + 35 + ], + [ + -58.33333333333337, + 38.333333333333314 + ], + [ + -53.33333333333337, + 41.666666666666686 + ], + [ + -48.33333333333337, + 43.333333333333314 + ], + [ + -41.66666666666674, + 43.333333333333314 + ], + [ + -33.33333333333337, + 43.333333333333314 + ], + [ + -26.666666666666742, + 41.666666666666686 + ], + [ + -23.33333333333337, + 41.666666666666686 + ], + [ + -20, + 40 + ], + [ + -11.666666666666742, + 36.666666666666686 + ], + [ + -11.666666666666742, + 36.666666666666686 + ] + ], + "pressures": [ + 0, + 0.19468985497951508, + 0.24179446697235107, + 0.28075075149536133, + 0.3146715462207794, + 0.32661935687065125, + 0.3510338068008423, + 0.3612726032733917, + 0.3673151731491089, + 0.3774318993091583, + 0.3795223832130432, + 0.3803921639919281, + 0.382116436958313, + 0.381872296333313, + 0.382848858833313, + 0.38791486620903015, + 0.3916075527667999, + 0.3928435146808624, + 0.3967803418636322, + 0.40146487951278687, + 0.40418097376823425, + 0.40393683314323425, + 0.40418097376823425, + 0.4002441465854645, + 0.3777981102466583, + 0.3199664354324341, + 0.2720073163509369, + 0.20134279131889343, + 0.01097123697400093, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + -11.666666666666742, + 36.666666666666686 + ] + }, + { + "id": "Vud6ehTk0gZkecx--gRit", + "type": "freedraw", + "x": -928.4661613494038, + "y": 398.10880283985915, + "width": 38.33333333333337, + "height": 33.33333333333337, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1139698357, + "version": 36, + "versionNonce": 1782977755, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -1.6666666666666288, + 0 + ], + [ + -3.3333333333333712, + 0 + ], + [ + -5, + 1.6666666666666856 + ], + [ + -6.666666666666629, + 3.3333333333333712 + ], + [ + -8.333333333333371, + 3.3333333333333712 + ], + [ + -11.666666666666629, + 6.666666666666686 + ], + [ + -13.333333333333371, + 10 + ], + [ + -15, + 13.333333333333371 + ], + [ + -15, + 16.666666666666686 + ], + [ + -13.333333333333371, + 21.666666666666686 + ], + [ + -11.666666666666629, + 26.666666666666686 + ], + [ + -8.333333333333371, + 28.33333333333337 + ], + [ + -5, + 31.666666666666686 + ], + [ + 0, + 33.33333333333337 + ], + [ + 1.6666666666666288, + 33.33333333333337 + ], + [ + 5, + 33.33333333333337 + ], + [ + 11.666666666666629, + 33.33333333333337 + ], + [ + 15, + 31.666666666666686 + ], + [ + 18.33333333333337, + 30 + ], + [ + 20, + 28.33333333333337 + ], + [ + 21.66666666666663, + 25 + ], + [ + 23.33333333333337, + 23.33333333333337 + ], + [ + 23.33333333333337, + 21.666666666666686 + ], + [ + 23.33333333333337, + 18.33333333333337 + ], + [ + 23.33333333333337, + 15 + ], + [ + 23.33333333333337, + 11.666666666666686 + ], + [ + 21.66666666666663, + 8.333333333333371 + ], + [ + 21.66666666666663, + 6.666666666666686 + ], + [ + 20, + 5 + ], + [ + 20, + 3.3333333333333712 + ], + [ + 18.33333333333337, + 1.6666666666666856 + ], + [ + 18.33333333333337, + 0 + ], + [ + 18.33333333333337, + 0 + ] + ], + "pressures": [ + 0, + 0.16658274829387665, + 0.2523994743824005, + 0.29111161828041077, + 0.32404059171676636, + 0.33833828568458557, + 0.3521476984024048, + 0.3632410168647766, + 0.37199968099594116, + 0.3779201805591583, + 0.382482647895813, + 0.3837186098098755, + 0.382360577583313, + 0.3796444535255432, + 0.37595176696777344, + 0.37323567271232605, + 0.37015336751937866, + 0.365835040807724, + 0.3643549382686615, + 0.3637445569038391, + 0.3617608845233917, + 0.35954833030700684, + 0.35867857933044434, + 0.35843443870544434, + 0.35745784640312195, + 0.3525139093399048, + 0.34290075302124023, + 0.32736706733703613, + 0.3188525140285492, + 0.2981460392475128, + 0.26189059019088745, + 0.1750820130109787, + 0.0787823274731636, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 18.33333333333337, + 0 + ] + }, + { + "id": "QX5bWFINyxaU-dOBb368t", + "type": "freedraw", + "x": -916.7994946827372, + "y": 379.77546950652584, + "width": 8.333333333333371, + "height": 6.666666666666686, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1391032021, + "version": 22, + "versionNonce": 1417050709, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.6666666666667425, + 0 + ], + [ + 3.3333333333333712, + 1.6666666666666856 + ], + [ + 1.6666666666667425, + 3.3333333333333144 + ], + [ + 0, + 5 + ], + [ + -1.6666666666666288, + 5 + ], + [ + -3.3333333333332575, + 6.666666666666686 + ], + [ + -5, + 6.666666666666686 + ], + [ + -5, + 5 + ], + [ + -5, + 3.3333333333333144 + ], + [ + -5, + 1.6666666666666856 + ], + [ + -3.3333333333332575, + 1.6666666666666856 + ], + [ + -3.3333333333332575, + 0 + ], + [ + -1.6666666666666288, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 1.6666666666666856 + ], + [ + 0, + 3.3333333333333144 + ], + [ + -1.6666666666666288, + 3.3333333333333144 + ], + [ + 0, + 0 + ] + ], + "pressures": [ + 0, + 0.1893949806690216, + 0.24586862325668335, + 0.2998703122138977, + 0.30948346853256226, + 0.3136797249317169, + 0.32132449746131897, + 0.32489508390426636, + 0.32501715421676636, + 0.32600900530815125, + 0.32700082659721375, + 0.32637521624565125, + 0.32367438077926636, + 0.32428473234176636, + 0.3318074345588684, + 0.38988327980041504, + 0.4249027371406555, + 0.3854428827762604, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + -1.6666666666666288, + 3.3333333333333144 + ] + }, + { + "id": "ys5eD3PUr9eKOpw3tVrll", + "type": "freedraw", + "x": -936.7994946827372, + "y": 379.77546950652584, + "width": 11.666666666666742, + "height": 8.333333333333314, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 661063605, + "version": 26, + "versionNonce": 805618043, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1.6666666666667425, + -1.6666666666666856 + ], + [ + 3.3333333333333712, + -3.3333333333333144 + ], + [ + 5, + -3.3333333333333144 + ], + [ + 6.6666666666667425, + -5 + ], + [ + 8.333333333333371, + -5 + ], + [ + 10, + -5 + ], + [ + 11.666666666666742, + -5 + ], + [ + 11.666666666666742, + -3.3333333333333144 + ], + [ + 10, + -3.3333333333333144 + ], + [ + 10, + -1.6666666666666856 + ], + [ + 8.333333333333371, + -1.6666666666666856 + ], + [ + 6.6666666666667425, + 0 + ], + [ + 5, + 0 + ], + [ + 3.3333333333333712, + 0 + ], + [ + 1.6666666666667425, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + -1.6666666666666856 + ], + [ + 0, + -3.3333333333333144 + ], + [ + 1.6666666666667425, + -5 + ], + [ + 3.3333333333333712, + -6.666666666666686 + ], + [ + 5, + -8.333333333333314 + ], + [ + 0, + 0 + ] + ], + "pressures": [ + 0, + 0.2233005315065384, + 0.24303044378757477, + 0.2576943635940552, + 0.2691691517829895, + 0.2892652750015259, + 0.3155260682106018, + 0.36015868186950684, + 0.38667887449264526, + 0.41837185621261597, + 0.43327993154525757, + 0.4449988603591919, + 0.4564583897590637, + 0.46620890498161316, + 0.4744640290737152, + 0.4805065989494324, + 0.48409247398376465, + 0.4771801233291626, + 0.4468452036380768, + 0.2652170658111572, + 0.10443274676799774, + 0.0034485389478504658, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 5, + -8.333333333333314 + ] + }, + { + "id": "_DmjgQ2_r3IvFFJWmz4_S", + "type": "freedraw", + "x": -855.1328280160706, + "y": 318.1088028398592, + "width": 1.6666666666666288, + "height": 0, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1587993109, + "version": 6, + "versionNonce": 1354655669, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -1.6666666666666288, + 0 + ], + [ + 0, + 0 + ] + ], + "pressures": [ + 0, + 0.2570840120315552, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + -1.6666666666666288, + 0 + ] + }, + { + "id": "4b7oleuGk0x0uBjsF24tI", + "type": "freedraw", + "x": -905.1328280160704, + "y": 464.77546950652584, + "width": 10, + "height": 81.66666666666669, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 64154869, + "version": 29, + "versionNonce": 1854200347, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -1.6666666666666856 + ], + [ + 0, + -3.3333333333333144 + ], + [ + 0, + -1.6666666666666856 + ], + [ + 0, + 0 + ], + [ + -1.6666666666667425, + 3.3333333333333144 + ], + [ + -1.6666666666667425, + 5 + ], + [ + -1.6666666666667425, + 6.666666666666686 + ], + [ + -1.6666666666667425, + 15 + ], + [ + -3.3333333333333712, + 21.666666666666686 + ], + [ + -3.3333333333333712, + 28.333333333333314 + ], + [ + -3.3333333333333712, + 40 + ], + [ + -5, + 48.33333333333337 + ], + [ + -5, + 53.33333333333337 + ], + [ + -6.6666666666667425, + 60 + ], + [ + -6.6666666666667425, + 66.66666666666663 + ], + [ + -8.333333333333371, + 70 + ], + [ + -8.333333333333371, + 73.33333333333337 + ], + [ + -8.333333333333371, + 75 + ], + [ + -8.333333333333371, + 76.66666666666663 + ], + [ + -8.333333333333371, + 78.33333333333337 + ], + [ + -8.333333333333371, + 76.66666666666663 + ], + [ + -8.333333333333371, + 75 + ], + [ + -10, + 73.33333333333337 + ], + [ + -8.333333333333371, + 73.33333333333337 + ], + [ + -10, + 71.66666666666663 + ], + [ + -10, + 71.66666666666663 + ] + ], + "pressures": [ + 0, + 0.13192950189113617, + 0.18384069204330444, + 0.28149843215942383, + 0.32797741889953613, + 0.3615167438983917, + 0.37175554037094116, + 0.3813687264919281, + 0.4113374650478363, + 0.4298313856124878, + 0.4470893442630768, + 0.46584269404411316, + 0.4734874367713928, + 0.4791485369205475, + 0.48261234164237976, + 0.48383307456970215, + 0.48421454429626465, + 0.48482489585876465, + 0.48531317710876465, + 0.48383307456970215, + 0.48310062289237976, + 0.40405890345573425, + 0.34241244196891785, + 0.32785534858703613, + 0.3150377571582794, + 0.251529723405838, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + -10, + 71.66666666666663 + ] + }, + { + "id": "epKNqBNv8iQdmVEyj4v3_", + "type": "freedraw", + "x": -978.4661613494038, + "y": 449.77546950652584, + "width": 135, + "height": 121.66666666666663, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 1242610549, + "version": 48, + "versionNonce": 1281468693, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 1.6666666666666856 + ], + [ + -1.6666666666666288, + 3.3333333333333144 + ], + [ + -1.6666666666666288, + 5 + ], + [ + -3.3333333333333712, + 8.333333333333314 + ], + [ + -3.3333333333333712, + 10 + ], + [ + -5, + 13.333333333333314 + ], + [ + -8.333333333333371, + 15 + ], + [ + -11.666666666666629, + 18.333333333333314 + ], + [ + -16.66666666666663, + 23.333333333333314 + ], + [ + -21.66666666666663, + 25 + ], + [ + -23.33333333333337, + 26.666666666666686 + ], + [ + -31.666666666666742, + 28.333333333333314 + ], + [ + -36.66666666666674, + 31.666666666666686 + ], + [ + -41.66666666666674, + 33.333333333333314 + ], + [ + -46.66666666666674, + 36.666666666666686 + ], + [ + -51.66666666666674, + 38.333333333333314 + ], + [ + -55, + 40 + ], + [ + -58.33333333333326, + 41.66666666666663 + ], + [ + -60, + 45 + ], + [ + -66.66666666666674, + 48.333333333333314 + ], + [ + -71.66666666666674, + 53.333333333333314 + ], + [ + -76.66666666666674, + 60 + ], + [ + -80, + 66.66666666666663 + ], + [ + -81.66666666666674, + 70 + ], + [ + -85, + 76.66666666666663 + ], + [ + -85, + 85 + ], + [ + -85, + 91.66666666666663 + ], + [ + -81.66666666666674, + 103.33333333333337 + ], + [ + -76.66666666666674, + 108.33333333333337 + ], + [ + -70, + 114.99999999999989 + ], + [ + -61.66666666666674, + 118.33333333333337 + ], + [ + -48.33333333333326, + 121.66666666666663 + ], + [ + -38.33333333333326, + 121.66666666666663 + ], + [ + -26.666666666666742, + 121.66666666666663 + ], + [ + -10, + 118.33333333333337 + ], + [ + 0, + 114.99999999999989 + ], + [ + 10, + 111.66666666666663 + ], + [ + 20, + 108.33333333333337 + ], + [ + 31.66666666666663, + 103.33333333333337 + ], + [ + 38.33333333333337, + 100 + ], + [ + 43.33333333333337, + 95 + ], + [ + 46.66666666666663, + 90 + ], + [ + 50, + 86.66666666666663 + ], + [ + 50, + 83.33333333333337 + ], + [ + 50, + 83.33333333333337 + ] + ], + "pressures": [ + 0, + 0.16472114622592926, + 0.1881590038537979, + 0.21417562663555145, + 0.24895094335079193, + 0.2729839086532593, + 0.2988784611225128, + 0.32379645109176636, + 0.3477073311805725, + 0.3770504295825958, + 0.3854428827762604, + 0.38692301511764526, + 0.3983825445175171, + 0.40505072474479675, + 0.4096131920814514, + 0.4131838083267212, + 0.41713589429855347, + 0.41861599683761597, + 0.42070648074150085, + 0.42317846417427063, + 0.4283512532711029, + 0.43538567423820496, + 0.444007009267807, + 0.45004957914352417, + 0.45215535163879395, + 0.4572060704231262, + 0.460166335105896, + 0.4623788893222809, + 0.4631265699863434, + 0.46398109197616577, + 0.4637369215488434, + 0.4638589918613434, + 0.46398109197616577, + 0.46929121017456055, + 0.4734874367713928, + 0.4753337800502777, + 0.4801403880119324, + 0.48174259066581726, + 0.4786602556705475, + 0.44968336820602417, + 0.3939574360847473, + 0.3142900764942169, + 0.21490806341171265, + 0.07766842097043991, + 0.02539101243019104, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 50, + 83.33333333333337 + ] + }, + { + "id": "wvfcf4lDLfLHdWpcK9_oj", + "type": "freedraw", + "x": -916.7994946827372, + "y": 534.7754695065258, + "width": 33.33333333333326, + "height": 6.666666666666629, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 157837333, + "version": 34, + "versionNonce": 1656282811, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 1.6666666666666288 + ], + [ + 1.6666666666667425, + 1.6666666666666288 + ], + [ + 3.3333333333333712, + 1.6666666666666288 + ], + [ + 5, + 3.3333333333333712 + ], + [ + 8.333333333333371, + 3.3333333333333712 + ], + [ + 10, + 3.3333333333333712 + ], + [ + 13.333333333333371, + 5 + ], + [ + 16.666666666666742, + 5 + ], + [ + 18.33333333333337, + 5 + ], + [ + 20, + 5 + ], + [ + 21.666666666666742, + 5 + ], + [ + 23.33333333333337, + 6.666666666666629 + ], + [ + 25, + 6.666666666666629 + ], + [ + 23.33333333333337, + 6.666666666666629 + ], + [ + 21.666666666666742, + 5 + ], + [ + 20, + 5 + ], + [ + 16.666666666666742, + 5 + ], + [ + 11.666666666666742, + 3.3333333333333712 + ], + [ + 6.6666666666667425, + 3.3333333333333712 + ], + [ + 1.6666666666667425, + 3.3333333333333712 + ], + [ + -3.3333333333332575, + 3.3333333333333712 + ], + [ + -6.666666666666629, + 3.3333333333333712 + ], + [ + -8.333333333333258, + 3.3333333333333712 + ], + [ + -8.333333333333258, + 5 + ], + [ + -6.666666666666629, + 5 + ], + [ + -1.6666666666666288, + 5 + ], + [ + 5, + 5 + ], + [ + 11.666666666666742, + 5 + ], + [ + 18.33333333333337, + 3.3333333333333712 + ], + [ + 21.666666666666742, + 3.3333333333333712 + ], + [ + 21.666666666666742, + 3.3333333333333712 + ] + ], + "pressures": [ + 0, + 0.21886014938354492, + 0.2567177712917328, + 0.29752039909362793, + 0.30443274974823, + 0.30887311697006226, + 0.3149156868457794, + 0.3336537778377533, + 0.3526360094547272, + 0.36028075218200684, + 0.37471580505371094, + 0.3929655849933624, + 0.42009612917900085, + 0.4567177891731262, + 0.46866559982299805, + 0.4766918420791626, + 0.48322269320487976, + 0.4956740736961365, + 0.5087510347366333, + 0.5228046178817749, + 0.5393301248550415, + 0.5474631786346436, + 0.5517814755439758, + 0.5521476864814758, + 0.5500572323799133, + 0.5400625467300415, + 0.46904706954956055, + 0.3604181110858917, + 0.19678035378456116, + 0.04599069058895111, + 0.006027313880622387, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 21.666666666666742, + 3.3333333333333712 + ] + }, + { + "id": "r0QeXEmJiVCTI08tV5YEO", + "type": "freedraw", + "x": -1020.1328280160706, + "y": 571.4421361731925, + "width": 48.33333333333337, + "height": 5, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 2025359733, + "version": 35, + "versionNonce": 1758838389, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + -1.6666666666667425 + ], + [ + 1.6666666666667425, + -1.6666666666667425 + ], + [ + 3.333333333333485, + -1.6666666666667425 + ], + [ + 6.6666666666667425, + 0 + ], + [ + 10, + 0 + ], + [ + 15, + 0 + ], + [ + 21.666666666666742, + 0 + ], + [ + 23.33333333333337, + 0 + ], + [ + 30.000000000000114, + 0 + ], + [ + 35.000000000000114, + 0 + ], + [ + 41.66666666666674, + 0 + ], + [ + 43.33333333333337, + 0 + ], + [ + 45.000000000000114, + 0 + ], + [ + 48.33333333333337, + 0 + ], + [ + 48.33333333333337, + 1.6666666666667425 + ], + [ + 46.66666666666674, + 1.6666666666667425 + ], + [ + 43.33333333333337, + 1.6666666666667425 + ], + [ + 41.66666666666674, + 1.6666666666667425 + ], + [ + 38.33333333333337, + 1.6666666666667425 + ], + [ + 33.33333333333337, + 1.6666666666667425 + ], + [ + 31.666666666666742, + 1.6666666666667425 + ], + [ + 26.666666666666742, + 1.6666666666667425 + ], + [ + 23.33333333333337, + 0 + ], + [ + 18.33333333333337, + 0 + ], + [ + 15, + -1.6666666666667425 + ], + [ + 10, + -1.6666666666667425 + ], + [ + 6.6666666666667425, + -1.6666666666667425 + ], + [ + 5, + -1.6666666666667425 + ], + [ + 5, + -3.3333333333332575 + ], + [ + 6.6666666666667425, + -3.3333333333332575 + ], + [ + 0, + 0 + ] + ], + "pressures": [ + 0, + 0.1588159054517746, + 0.2226749062538147, + 0.2737315893173218, + 0.30406653881073, + 0.32700082659721375, + 0.3496910035610199, + 0.3622644245624542, + 0.3665827512741089, + 0.37447166442871094, + 0.38716715574264526, + 0.4094911217689514, + 0.41750210523605347, + 0.426749050617218, + 0.44992750883102417, + 0.47125962376594543, + 0.5091172456741333, + 0.5197222828865051, + 0.5320515632629395, + 0.5424124598503113, + 0.5521476864814758, + 0.5539940595626831, + 0.5578240752220154, + 0.5674372315406799, + 0.574959933757782, + 0.5777981281280518, + 0.5760738253593445, + 0.537727952003479, + 0.46533912420272827, + 0.1113298237323761, + 0.006027313880622387, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 6.6666666666667425, + -3.3333333333332575 + ] + }, + { + "id": "THyqH5qscQFGHMT_MDFy4", + "type": "freedraw", + "x": -1043.4661613494038, + "y": 553.1088028398592, + "width": 141.66666666666674, + "height": 191.66666666666652, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "roundness": null, + "seed": 47406133, + "version": 51, + "versionNonce": 121851739, + "isDeleted": true, + "boundElements": null, + "updated": 1695723360201, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 0, + 1.666666666666515 + ], + [ + 1.6666666666667425, + 3.3333333333332575 + ], + [ + 1.6666666666667425, + 5 + ], + [ + 1.6666666666667425, + 6.666666666666515 + ], + [ + 1.6666666666667425, + 10 + ], + [ + 0, + 13.333333333333258 + ], + [ + -1.6666666666667425, + 16.666666666666515 + ], + [ + -5, + 20 + ], + [ + -10, + 25 + ], + [ + -15, + 28.333333333333258 + ], + [ + -20, + 31.666666666666515 + ], + [ + -26.666666666666742, + 35 + ], + [ + -33.33333333333326, + 36.666666666666515 + ], + [ + -43.33333333333326, + 41.666666666666515 + ], + [ + -48.33333333333326, + 43.33333333333326 + ], + [ + -55, + 46.666666666666515 + ], + [ + -61.66666666666674, + 51.666666666666515 + ], + [ + -71.66666666666674, + 58.33333333333326 + ], + [ + -78.33333333333326, + 65 + ], + [ + -85, + 71.66666666666652 + ], + [ + -91.66666666666674, + 78.33333333333326 + ], + [ + -98.33333333333326, + 86.66666666666652 + ], + [ + -105, + 95 + ], + [ + -108.33333333333326, + 98.33333333333326 + ], + [ + -110, + 103.33333333333326 + ], + [ + -116.66666666666674, + 118.33333333333326 + ], + [ + -118.33333333333326, + 126.66666666666652 + ], + [ + -120, + 136.66666666666652 + ], + [ + -118.33333333333326, + 145 + ], + [ + -113.33333333333326, + 158.33333333333326 + ], + [ + -108.33333333333326, + 165 + ], + [ + -103.33333333333326, + 171.66666666666652 + ], + [ + -95, + 176.66666666666652 + ], + [ + -88.33333333333326, + 181.66666666666652 + ], + [ + -75, + 186.66666666666652 + ], + [ + -66.66666666666674, + 190 + ], + [ + -58.33333333333326, + 191.66666666666652 + ], + [ + -48.33333333333326, + 191.66666666666652 + ], + [ + -43.33333333333326, + 190 + ], + [ + -31.666666666666742, + 188.33333333333326 + ], + [ + -21.666666666666742, + 185 + ], + [ + -11.666666666666742, + 180 + ], + [ + -3.3333333333332575, + 173.33333333333326 + ], + [ + 5, + 166.66666666666652 + ], + [ + 15, + 160 + ], + [ + 18.333333333333258, + 155 + ], + [ + 21.666666666666742, + 150 + ], + [ + 21.666666666666742, + 150 + ] + ], + "pressures": [ + 0, + 0.14056611061096191, + 0.19444571435451508, + 0.2081330567598343, + 0.23526360094547272, + 0.2718852460384369, + 0.2985122501850128, + 0.32477301359176636, + 0.3510338068008423, + 0.382482647895813, + 0.40146487951278687, + 0.4154116213321686, + 0.4284733235836029, + 0.4468452036380768, + 0.46645304560661316, + 0.4734874367713928, + 0.477546364068985, + 0.4784161150455475, + 0.48421454429626465, + 0.4906233251094818, + 0.49925994873046875, + 0.5075150728225708, + 0.5154039859771729, + 0.5225604772567749, + 0.5252765417098999, + 0.5283588767051697, + 0.5360036492347717, + 0.5399404764175415, + 0.5422903895378113, + 0.5424124598503113, + 0.5448691248893738, + 0.5466086864471436, + 0.5473411083221436, + 0.5478293895721436, + 0.5480735301971436, + 0.5469748973846436, + 0.5430228114128113, + 0.5390859842300415, + 0.5373464822769165, + 0.5355001091957092, + 0.5274891257286072, + 0.5104753375053406, + 0.48334476351737976, + 0.43698787689208984, + 0.3684290945529938, + 0.2390783578157425, + 0.10676737874746323, + 0.004806592129170895, + 0 + ], + "simulatePressure": false, + "lastCommittedPoint": [ + 21.666666666666742, + 150 + ] } ], "appState": { "theme": "light", "viewBackgroundColor": "#ffffff", - "currentItemStrokeColor": "#1971c2", + "currentItemStrokeColor": "#1e1e1e", "currentItemBackgroundColor": "transparent", "currentItemFillStyle": "hachure", "currentItemStrokeWidth": 1, @@ -95152,10 +100036,10 @@ tags: [excalidraw] "currentItemTextAlign": "left", "currentItemStartArrowhead": null, "currentItemEndArrowhead": "arrow", - "scrollX": 2003.704256587499, - "scrollY": 664.0786971601409, + "scrollX": 1516.799494682737, + "scrollY": -38.916094506525894, "zoom": { - "value": 0.35000000000000003 + "value": 0.6000000000000001 }, "currentItemRoundness": "round", "gridSize": null, diff --git a/content/MFES/MFES - UC Details.md b/www/MFES/MFES - UC Details.md similarity index 100% rename from content/MFES/MFES - UC Details.md rename to www/MFES/MFES - UC Details.md diff --git a/content/MFES/PL - Aula 1.md b/www/MFES/PL - Aula 1.md similarity index 100% rename from content/MFES/PL - Aula 1.md rename to www/MFES/PL - Aula 1.md diff --git a/content/MFES/PL - Aula 2.md b/www/MFES/PL - Aula 2.md similarity index 100% rename from content/MFES/PL - Aula 2.md rename to www/MFES/PL - Aula 2.md diff --git a/content/MFES/T - Aula 2.md b/www/MFES/T - Aula 2.md similarity index 100% rename from content/MFES/T - Aula 2.md rename to www/MFES/T - Aula 2.md diff --git a/content/RAS/PL - Aula 1.md b/www/RAS/PL - Aula 1.md similarity index 100% rename from content/RAS/PL - Aula 1.md rename to www/RAS/PL - Aula 1.md diff --git a/content/RAS/T - Aula 1.md b/www/RAS/T - Aula 1.md similarity index 100% rename from content/RAS/T - Aula 1.md rename to www/RAS/T - Aula 1.md diff --git a/content/RAS/T - Aula 2.md b/www/RAS/T - Aula 2.md similarity index 100% rename from content/RAS/T - Aula 2.md rename to www/RAS/T - Aula 2.md diff --git a/content/index.md b/www/index.md similarity index 100% rename from content/index.md rename to www/index.md