oaktree-sapling 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +66 -0
  3. package/ci/run.sh +64 -0
  4. package/dist/cli.cjs +1230 -0
  5. package/package.json +50 -0
  6. package/paper-base.yml +29 -0
  7. package/plugins/gallery.mjs +224 -0
  8. package/templates/instance/brand/brand.yml +15 -0
  9. package/templates/instance/brand/logo.svg +4 -0
  10. package/templates/instance/editions/edition.yml +14 -0
  11. package/templates/instance/journal.yml +58 -0
  12. package/templates/instance/registry/papers.yml +20 -0
  13. package/templates/paper/.github/actions/engine/action.yml +59 -0
  14. package/templates/paper/.github/actions/engine/pins.yml +16 -0
  15. package/templates/paper/.github/workflows/check-post.yml +79 -0
  16. package/templates/paper/.github/workflows/check.yml +72 -0
  17. package/templates/paper/.github/workflows/ci.yml +64 -0
  18. package/templates/paper/.github/workflows/prepare.yml +34 -0
  19. package/templates/paper/.github/workflows/preview-deploy.yml +52 -0
  20. package/templates/paper/.github/workflows/publish.yml +33 -0
  21. package/templates/paper/.github/workflows/version-bump.yml +29 -0
  22. package/templates/paper/CODEOWNERS +9 -0
  23. package/templates/paper/bib.bib +6 -0
  24. package/templates/paper/gitignore +8 -0
  25. package/templates/paper/index.md +12 -0
  26. package/templates/paper/myst.yml +37 -0
  27. package/templates/site/.github/workflows/site.yml +73 -0
  28. package/templates/site/gitignore +5 -0
  29. package/templates/site/myst.yml +32 -0
  30. package/templates/site/package.json +9 -0
  31. package/templates/site/pages/index.md +25 -0
  32. package/templates/typst/LICENSE +21 -0
  33. package/templates/typst/frontmatter.typ +244 -0
  34. package/templates/typst/lapreprint.typ +310 -0
  35. package/templates/typst/template.typ +112 -0
  36. package/templates/typst/template.yml +82 -0
  37. package/typst.version +1 -0
@@ -0,0 +1,64 @@
1
+ name: Paper CI
2
+
3
+ # Stage 1 of the always-split preview (design §6a, dec. 13). Builds on every PR + push
4
+ # with NO secrets and a read-only token, so fork PRs get full validation + a build. The
5
+ # preview DEPLOY happens in preview-deploy.yml (workflow_run, base context) because forks
6
+ # never receive secrets. Pages deploy (push to main) rides here behind a job-scoped token.
7
+
8
+ on:
9
+ pull_request:
10
+ push:
11
+ branches: [main]
12
+ workflow_dispatch:
13
+
14
+ permissions:
15
+ contents: read # the untrusted build job never holds pages/id-token ([R13])
16
+
17
+ concurrency:
18
+ group: ${{ github.event_name == 'pull_request' && format('ci-{0}', github.head_ref) || 'ci-main' }}
19
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
20
+
21
+ jobs:
22
+ build: # NO secrets, read-only token — safe for fork PRs
23
+ runs-on: ubuntu-latest
24
+ steps:
25
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
26
+ - uses: ./.github/actions/engine
27
+ with:
28
+ args: build
29
+ # upload-artifact follows symlinks and stores their TARGET content as a regular file.
30
+ # Author content is untrusted, so a planted symlink (e.g. to .git/config or any
31
+ # runner-readable file) would ride into the artifact and be served on the public preview.
32
+ # Strip symlinks so the artifact carries only files the build actually produced.
33
+ - name: Drop symlinks from the build output
34
+ run: find _build/html -type l -delete
35
+ - name: Stash PR number # workflow_run.pull_requests is EMPTY for forks (§6a)
36
+ if: ${{ github.event_name == 'pull_request' }}
37
+ run: echo "${{ github.event.pull_request.number }}" > _build/html/.pr-number
38
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
39
+ with:
40
+ name: paper-build
41
+ path: _build/html
42
+ if-no-files-found: error
43
+ include-hidden-files: true
44
+
45
+ deploy-pages:
46
+ if: ${{ github.event_name != 'pull_request' }}
47
+ needs: build
48
+ permissions: # deploy perms live HERE, not on the untrusted build job ([R13])
49
+ pages: write
50
+ id-token: write
51
+ environment:
52
+ name: github-pages
53
+ url: ${{ steps.d.outputs.page_url }}
54
+ runs-on: ubuntu-latest
55
+ steps:
56
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
57
+ with:
58
+ name: paper-build
59
+ path: site
60
+ - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
61
+ with:
62
+ path: site
63
+ - id: d
64
+ uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
@@ -0,0 +1,34 @@
1
+ name: Prepare Zenodo deposit
2
+
3
+ # Editor dispatches DOI reservation (design §1d). Reserves/reuses a draft and opens the
4
+ # one-file myst.yml PR writing project.doi/github/date ([R22]) — the CLI opens that PR
5
+ # itself via GH_TOKEN (no peter-evans action; the write is a YAML round-trip, [R3]).
6
+ # `--sandbox` is an explicit human choice here ([R4]); a prod prepare may replace a
7
+ # committed sandbox DOI ([R29]).
8
+ #
9
+ # No `version` input: prepare is version-agnostic — it only reserves the concept DOI. The
10
+ # version is the tag, and it enters the deposit at publish time (publish.yml → `oak release`).
11
+
12
+ on:
13
+ workflow_dispatch:
14
+ inputs:
15
+ sandbox:
16
+ description: "Use the Zenodo sandbox (rehearsal) instead of production"
17
+ type: boolean
18
+ default: true
19
+
20
+ permissions:
21
+ contents: write # commit the DOI PR branch
22
+ pull-requests: write # open the DOI PR
23
+
24
+ jobs:
25
+ prepare:
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
29
+ - uses: ./.github/actions/engine
30
+ with:
31
+ args: deposit prepare ${{ inputs.sandbox && '--sandbox' || '' }}
32
+ env:
33
+ GH_TOKEN: ${{ github.token }}
34
+ ZENODO_TOKEN: ${{ inputs.sandbox && secrets.ZENODO_TOKEN_SANDBOX || secrets.ZENODO_TOKEN }}
@@ -0,0 +1,52 @@
1
+ name: Preview deploy
2
+
3
+ # Stage 2 of the always-split preview (design §6a, dec. 13, [R16]). Runs in BASE-repo
4
+ # context after Paper CI completes, so it holds the preview secret that fork PRs never
5
+ # get. It ONLY downloads Stage 1's inert artifact and deploys it — it never rebuilds fork
6
+ # content (that would reopen the injection hole through the shim's back door). The engine
7
+ # ref + action code come from the BASE default branch (guaranteed by workflow_run).
8
+
9
+ on:
10
+ workflow_run:
11
+ workflows: ["Paper CI"]
12
+ types: [completed]
13
+
14
+ permissions:
15
+ contents: read
16
+ actions: read # download the cross-run artifact
17
+ pull-requests: write # sticky preview comment + new-version reminder ([R16])
18
+
19
+ concurrency:
20
+ # head_branch alone collides across forks (two forks PRing from `main` would cancel each
21
+ # other's previews) — key on head repo too ([R15]).
22
+ group: preview-${{ github.event.workflow_run.head_repository.full_name }}-${{ github.event.workflow_run.head_branch }}
23
+ cancel-in-progress: true
24
+
25
+ jobs:
26
+ deploy:
27
+ if: >-
28
+ ${{ github.event.workflow_run.event == 'pull_request' &&
29
+ github.event.workflow_run.conclusion == 'success' }}
30
+ runs-on: ubuntu-latest
31
+ steps:
32
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 — BASE default branch ⇒ engine ref AND action code from base
33
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
34
+ with:
35
+ name: paper-build
36
+ path: site
37
+ run-id: ${{ github.event.workflow_run.id }}
38
+ github-token: ${{ github.token }}
39
+ # deploys the inert artifact (deletes .pr-number first — [R26]); if no Cloudflare
40
+ # secrets are present, `oak deploy-preview` degrades to an artifact-link comment
41
+ # instead of failing ([R6]). It also posts the new-version reminder here, where it
42
+ # has pull-requests: write (fork Stage-1 runs never do) — [R16].
43
+ - uses: ./.github/actions/engine
44
+ with:
45
+ args: deploy-preview site
46
+ env:
47
+ GH_TOKEN: ${{ github.token }}
48
+ CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
49
+ CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
50
+ # The Paper CI run that holds the paper-build artifact — lets the CLI deep-link the
51
+ # artifact-degrade comment straight to that run (not the whole Actions tab).
52
+ PAPER_BUILD_RUN_ID: ${{ github.event.workflow_run.id }}
@@ -0,0 +1,33 @@
1
+ name: Publish Zenodo deposit
2
+
3
+ # Tag push populates the Zenodo draft (design §1e). `oak release` builds, deposits
4
+ # (env DERIVED from the committed project.doi prefix — kills the awk sniff, [R4]/[R8]),
5
+ # attaches the debug bundle to the tag's GitHub Release ([R24]), and posts the commit
6
+ # comment / failure issue via gh — all behind the version knob. The required-reviewer
7
+ # environment is the human gate before any token-bearing run; the actual public DOI is
8
+ # still minted by a human clicking Publish on Zenodo (design §8). Both tokens are passed;
9
+ # the CLI selects by DOI prefix.
10
+
11
+ on:
12
+ push:
13
+ tags: ["v*"]
14
+
15
+ permissions:
16
+ contents: write # attach the Release bundle + commit comment
17
+ issues: write # open the editor-action issue on failure
18
+
19
+ jobs:
20
+ publish:
21
+ environment: zenodo-publish # required-reviewer gate — provisioned by bootstrap ([R10])
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
25
+ with:
26
+ fetch-depth: 0 # git archive + PR discovery need history
27
+ - uses: ./.github/actions/engine
28
+ with:
29
+ args: release --tag ${{ github.ref_name }}
30
+ env:
31
+ GH_TOKEN: ${{ github.token }}
32
+ ZENODO_TOKEN: ${{ secrets.ZENODO_TOKEN }}
33
+ ZENODO_TOKEN_SANDBOX: ${{ secrets.ZENODO_TOKEN_SANDBOX }}
@@ -0,0 +1,29 @@
1
+ name: Engine version bump
2
+
3
+ # Scheduled logic-ref bump (design §6b-left, dec. 17). Floats
4
+ # project.options.oaktree-sapling.version to the latest engine release and opens a one-line
5
+ # PR. The bump is DATA (myst.yml, not CODEOWNERS-gated), so an editor merges it after the
6
+ # preview build shows the result; it touches no secret. Runs `oak upgrade --version-only`,
7
+ # which reads the engine repo from pins.yml, resolves the latest release, writes myst.yml via
8
+ # a YAML round-trip (never sed), and opens the PR. The frequent logic-ref cadence's automated
9
+ # home; the rare frozen-file resync is the manual `oak upgrade --files-only` path.
10
+
11
+ on:
12
+ schedule:
13
+ - cron: "17 4 * * 1" # weekly, Monday 04:17 UTC
14
+ workflow_dispatch:
15
+
16
+ permissions:
17
+ contents: write # commit the bump branch
18
+ pull-requests: write # open the bump PR
19
+
20
+ jobs:
21
+ bump:
22
+ runs-on: ubuntu-latest
23
+ steps:
24
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
25
+ - uses: ./.github/actions/engine
26
+ with:
27
+ args: upgrade --paper . --version-only --yes
28
+ env:
29
+ GH_TOKEN: ${{ github.token }}
@@ -0,0 +1,9 @@
1
+ # The frozen shim is the trust boundary (design §6a): action.yml runs engine code at a
2
+ # ref, and pins.yml names the engine + instance repos (code-adjacent). Gate everything
3
+ # under .github/ — including pins.yml and CODEOWNERS itself — behind the editors, so an
4
+ # author PR can float the engine *ref* (data) but cannot redirect a token-bearing run to
5
+ # unreviewed code. copier replaces the owner below at bootstrap. NB a personal-account repo
6
+ # (the interim/lab tier) has no org team, so it names the user directly ([R56]); an org
7
+ # tenant uses a team like @your-org/editors.
8
+ /.github/ @pollomarzo
9
+ /CODEOWNERS @pollomarzo
@@ -0,0 +1,6 @@
1
+ @article{example2026,
2
+ title = {An Example Reference},
3
+ author = {Author, Example},
4
+ journal = {Journal of Examples},
5
+ year = {2026}
6
+ }
@@ -0,0 +1,8 @@
1
+ # Engine-generated build config ([R71]). `oak build` composes your myst.yml with the
2
+ # engine/edition/brand chain and writes the result here; your myst.yml is never modified.
3
+ # Not auto-deleted: myst's HTML build process.exit(0)s on success, so no cleanup hook can
4
+ # reliably run. Safe to delete by hand at any time.
5
+ myst.oak.yml
6
+
7
+ # MyST build outputs
8
+ _build/
@@ -0,0 +1,12 @@
1
+ # A Starter Paper
2
+
3
+ +++ {"part": "abstract"}
4
+
5
+ Replace this with your abstract. The `abstract` part is lifted into the site, the merged
6
+ PDF cover page, and the Zenodo deposit description, so keep it self-contained.
7
+
8
+ +++
9
+
10
+ ## Introduction
11
+
12
+ Your paper content goes here. Cite your bibliography like this [@example2026].
@@ -0,0 +1,37 @@
1
+ version: 1
2
+
3
+ # Starter paper — stamped by `oak bootstrap`. NEW-MODEL committed paper: NO `extends:`
4
+ # (compose injects the engine/edition/brand chain at build time), and the single engine
5
+ # coordinate rides myst's untyped `options` passthrough. `oak bootstrap` / `oak upgrade`
6
+ # fill `version`/`edition` below.
7
+ #
8
+ # The `authors:`/`keywords:` templates below are COMMENTED OUT: uncomment and fill them with
9
+ # your real metadata. They show exactly the fields the journal's editorial checks expect
10
+ # (authors + ORCID + CRediT roles, keywords, and an `abstract` part in index.md), so you don't
11
+ # have to guess — but they stay inert until you fill them, so nothing fake ships by accident.
12
+ project:
13
+ # Set a FRESH, UNIQUE id that matches the journal's `id_pattern`. Until you do, the build's
14
+ # pre-flight rejects this placeholder — that safeguard (not a bug) is why a fresh repo is red.
15
+ id: CHANGE-ME-template-placeholder
16
+ title: CHANGE-ME — your paper title
17
+ # authors:
18
+ # - name: Ada Lovelace
19
+ # orcid: 0000-0000-0000-0000 # the journal checks for a valid ORCID
20
+ # affiliations:
21
+ # - Your Institution
22
+ # email: you@example.org
23
+ # corresponding: true # at least one corresponding author
24
+ # roles: # CRediT taxonomy terms
25
+ # - conceptualization
26
+ # - writing - original draft
27
+ # keywords:
28
+ # - keyword one
29
+ # - keyword two
30
+ bibliography:
31
+ - bib.bib
32
+ options:
33
+ # The ONE engine knob (design §6). `oak bootstrap` / `oak upgrade` write these; only the
34
+ # `version` ref floats (a released engine tag — never a branch tip; CI runs releases).
35
+ oaktree-sapling:
36
+ version: CHANGE-ME-engine-version
37
+ edition: CHANGE-ME-edition
@@ -0,0 +1,73 @@
1
+ name: Journal site
2
+
3
+ # Builds + deploys the journal site to GitHub Pages. Plain MyST — no engine, no shim, no
4
+ # secrets ([S1]). The editorial PR that adds a registry entry lands in THIS repo, so it is
5
+ # also the deploy trigger: publish → visible, one act, one repo ([S8]).
6
+ #
7
+ # Actions are pinned by full commit SHA at a close-to-latest major ([R75]) — the same SHAs
8
+ # the frozen paper shim uses.
9
+
10
+ on:
11
+ push:
12
+ branches: [main]
13
+ workflow_dispatch:
14
+
15
+ permissions:
16
+ contents: read
17
+ pages: write
18
+ id-token: write
19
+
20
+ concurrency:
21
+ group: pages
22
+ cancel-in-progress: false
23
+
24
+ jobs:
25
+ build-deploy:
26
+ runs-on: ubuntu-latest
27
+ environment:
28
+ name: github-pages
29
+ url: ${{ steps.d.outputs.page_url }}
30
+ steps:
31
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
32
+ - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
33
+ with:
34
+ node-version: '22'
35
+ # Resolves where Pages actually serves this repo. `base_path` is `/<repo>` for a project
36
+ # site and EMPTY for a user/org site or a custom domain — which is exactly MyST's
37
+ # BASE_URL contract. Without it MyST emits root-absolute asset URLs (`/build/…`) and
38
+ # every image, stylesheet and script 404s on the subpath this tier deploys to. Asking
39
+ # GitHub rather than hardcoding `/<repo>` is what keeps the vanity-URL routes working.
40
+ - id: pages
41
+ uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0
42
+ # Installs BOTH MyST and the gallery plugin's own dependency (js-yaml), which are
43
+ # pinned together in package.json — the one place this site's versions live.
44
+ #
45
+ # The install is not optional: MyST downloads a remote plugin into `_build/cache/`
46
+ # and imports it FROM THERE, so the plugin's bare imports resolve upward from this
47
+ # repo's node_modules. A package fetched by `npx` lands outside that resolution path.
48
+ - run: npm install --no-audit --no-fund
49
+ # `--strict` is LOAD-BEARING, not hygiene. Without it `myst build` logs errors and
50
+ # exits 0 (`cli/options.ts:98-102`), and a remote plugin that fails to load degrades
51
+ # QUIETLY: the page would deploy with `paper-cards` as an unknown directive — no
52
+ # gallery at all — over a perfectly good previous deploy. Only `--strict` catches that.
53
+ # `--strict` catches errors raised while BUILDING a page (a bad DOI, a missing image).
54
+ # It does NOT catch a plugin that never loaded: myst logs "Unknown plugin" and
55
+ # "unknown directive: paper-cards", then exits 0 — and the gallery-less page deploys
56
+ # over a perfectly good one. Verified live, not assumed ([R80]). So we also require a
57
+ # POSITIVE signal: myst prints the plugin's own name when it loads, and that name is
58
+ # ours, not a myst log format we don't control.
59
+ - name: Build (and prove the gallery plugin loaded)
60
+ env:
61
+ BASE_URL: ${{ steps.pages.outputs.base_path }}
62
+ run: |
63
+ set -o pipefail
64
+ npx myst build --html --strict 2>&1 | tee /tmp/myst-build.log
65
+ if ! grep -q "Paper Gallery.*loaded" /tmp/myst-build.log; then
66
+ echo "::error::the gallery plugin did not load — check the pinned plugin URL in myst.yml (a bad tag 404s silently)"
67
+ exit 1
68
+ fi
69
+ - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
70
+ with:
71
+ path: _build/html
72
+ - id: d
73
+ uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0
@@ -0,0 +1,5 @@
1
+ # MyST build outputs
2
+ _build/
3
+
4
+ # Installed by the site workflow so the gallery plugin's `js-yaml` import resolves.
5
+ node_modules/
@@ -0,0 +1,32 @@
1
+ version: 1
2
+
3
+ # The JOURNAL SITE — the page a reader lands on ([S1]/[S8]). It is a plain MyST project
4
+ # living in this instance-config repo: `myst build --html`, no engine, no `oak`. This file
5
+ # and `plugins/gallery.mjs` are the only bytes the engine owns here; everything else in the
6
+ # site scaffold is yours to rewrite. `oak upgrade` does not touch it.
7
+ #
8
+ # THREE PINS live in this repo, all stamped once at bootstrap and all bumped by hand:
9
+ # 1. the gallery plugin URL below (the engine tag),
10
+ # 2. `site.template` below (the theme release this engine version pins),
11
+ # 3. `mystmd` in package.json — beside `js-yaml`, which the gallery plugin imports.
12
+ # Both live there so this site has ONE dependency list; the workflow just installs it.
13
+
14
+ extends:
15
+ # Your journal's brand, right here in this repo. A LOCAL path: no network, no cache
16
+ # staleness, and a single-entry chain has no siblings to race ([R72]).
17
+ - ./brand/brand.yml
18
+
19
+ project:
20
+ title: CHANGE-ME Journal
21
+ plugins:
22
+ # The `paper-cards` directive, pinned to the engine tag this repo was bootstrapped with.
23
+ # Bump the tag to take engine updates. It must be remote because it is CODE — a `.mjs`
24
+ # body cannot be stamped into YAML, and vendoring a copy is exactly the copy-rot the
25
+ # engine exists to kill.
26
+ - STAMPED-AT-BOOTSTRAP
27
+ toc:
28
+ - file: pages/index.md
29
+
30
+ site:
31
+ # The myst-theme fork release this engine version pins (design §7).
32
+ template: STAMPED-AT-BOOTSTRAP
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "journal-site",
3
+ "private": true,
4
+ "description": "The journal site's build toolchain and plugin dependencies. MyST is pinned HERE, not in the workflow, so this file is the one place site versions live.",
5
+ "dependencies": {
6
+ "js-yaml": "^4.1.0",
7
+ "mystmd": "{{myst_version}}"
8
+ }
9
+ }
@@ -0,0 +1,25 @@
1
+ # {{journal_name}}
2
+
3
+ Welcome. Rewrite this paragraph: say what the journal publishes, who it is for, and how to
4
+ submit. This page is yours — the engine stamps it once and never touches it again.
5
+
6
+ ## Papers
7
+
8
+ :::{paper-cards}
9
+ :::
10
+
11
+ <!--
12
+ The `paper-cards` directive above lists EVERY paper in `registry/papers.yml`, in file order.
13
+ That is the right shape for a journal with one edition.
14
+
15
+ When you grow a second edition, split this into per-edition pages: add
16
+ `pages/editions/<edition>.md` with its own title and blurb, filter it with
17
+
18
+ :::{paper-cards}
19
+ :edition: <edition>
20
+ :::
21
+
22
+ and add the file to `toc:` in myst.yml. The edition's display title and blurb live in that
23
+ page, deliberately: `editions/<edition>.yml` is a MyST config layer, so a non-MyST key there
24
+ is silently ignored and misattributed to a paper's generated config ([R79]).
25
+ -->
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023 Rowan Cockett
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.