From 14ccdd62b2f93980c1d226a7a57d043707929497 Mon Sep 17 00:00:00 2001 From: Richard Viney Date: Wed, 29 Apr 2020 18:41:40 +1200 Subject: [PATCH] feat: initial release --- .github/workflows/release.yml | 48 + .github/workflows/test.yml | 34 + .gitignore | 5 + .vscode/extensions.json | 3 + .vscode/launch.json | 13 + .vscode/settings.json | 28 + LICENSE.md | 22 + README.md | 52 + demo/index.css | 80 + demo/index.html | 64 + demo/index.ts | 76 + demo/logo.svg | 1 + eslint.config.mjs | 29 + ies-lights/bollard.ts | 21 + ies-lights/comet.ts | 18 + ies-lights/cylinder-narrow.ts | 21 + ies-lights/cylinder-wide.ts | 21 + ies-lights/defined-spot.ts | 19 + ies-lights/defined.ts | 21 + ies-lights/index.ts | 49 + ies-lights/jellyfish.ts | 85 + ies-lights/medium-scatter.ts | 390 +++ ies-lights/overhead.ts | 29 + ies-lights/parallel-beam.ts | 40 + ies-lights/pear.ts | 29 + ies-lights/round.ts | 41 + ies-lights/scatter-light.ts | 41 + ies-lights/soft-arrow.ts | 19 + ies-lights/star-focused.ts | 53 + ies-lights/three-lobe-umbrella.ts | 21 + ies-lights/three-lobe-vee.ts | 18 + ies-lights/tight-focused.ts | 37 + ies-lights/top-post.ts | 21 + ies-lights/trapezoid.ts | 41 + ies-lights/umbrella.ts | 29 + ies-lights/x-arrow-diffuse.ts | 18 + ies-lights/x-arrow-soft.ts | 18 + ies-lights/x-arrow.ts | 18 + package-lock.json | 4109 +++++++++++++++++++++++++++++ package.json | 39 + src/ies-data.ts | 38 + src/index.ts | 4 + src/parse.ts | 252 ++ src/render.ts | 55 + src/sample.ts | 99 + test/iesna.test.ts | 21 + tsconfig.json | 21 + vendor/iesna-c/ies_read.c | 360 +++ vendor/iesna-c/ies_read.txt | 52 + vendor/iesna-c/iesna.c | 1413 ++++++++++ vendor/iesna-c/iesna.h | 232 ++ vendor/iesna-c/spec.txt | 904 +++++++ vite.config.ts | 11 + 53 files changed, 9183 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 demo/index.css create mode 100644 demo/index.html create mode 100644 demo/index.ts create mode 100644 demo/logo.svg create mode 100644 eslint.config.mjs create mode 100644 ies-lights/bollard.ts create mode 100644 ies-lights/comet.ts create mode 100644 ies-lights/cylinder-narrow.ts create mode 100644 ies-lights/cylinder-wide.ts create mode 100644 ies-lights/defined-spot.ts create mode 100644 ies-lights/defined.ts create mode 100644 ies-lights/index.ts create mode 100644 ies-lights/jellyfish.ts create mode 100644 ies-lights/medium-scatter.ts create mode 100644 ies-lights/overhead.ts create mode 100644 ies-lights/parallel-beam.ts create mode 100644 ies-lights/pear.ts create mode 100644 ies-lights/round.ts create mode 100644 ies-lights/scatter-light.ts create mode 100644 ies-lights/soft-arrow.ts create mode 100644 ies-lights/star-focused.ts create mode 100644 ies-lights/three-lobe-umbrella.ts create mode 100644 ies-lights/three-lobe-vee.ts create mode 100644 ies-lights/tight-focused.ts create mode 100644 ies-lights/top-post.ts create mode 100644 ies-lights/trapezoid.ts create mode 100644 ies-lights/umbrella.ts create mode 100644 ies-lights/x-arrow-diffuse.ts create mode 100644 ies-lights/x-arrow-soft.ts create mode 100644 ies-lights/x-arrow.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/ies-data.ts create mode 100644 src/index.ts create mode 100644 src/parse.ts create mode 100644 src/render.ts create mode 100644 src/sample.ts create mode 100644 test/iesna.test.ts create mode 100644 tsconfig.json create mode 100644 vendor/iesna-c/ies_read.c create mode 100644 vendor/iesna-c/ies_read.txt create mode 100644 vendor/iesna-c/iesna.c create mode 100644 vendor/iesna-c/iesna.h create mode 100644 vendor/iesna-c/spec.txt create mode 100644 vite.config.ts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..33529aa --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,48 @@ +name: Release + +on: + push: + branches: + - main + +jobs: + release: + name: Release + runs-on: ubuntu-24.04 + environment: Publish to NPM + timeout-minutes: 10 + + steps: + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install packages + uses: bahmutov/npm-install@v1 + + - name: Wait for tests to complete + uses: lewagon/wait-on-check-action@v1.3.4 + with: + ref: ${{ github.sha }} + repo-token: ${{ secrets.GITHUB_TOKEN }} + check-regexp: Test + + - name: Build demo app + run: npx vite build + + - name: Deploy demo app to GitHub Pages + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: demo/dist + + - name: Semantic release + uses: cycjimmy/semantic-release-action@v4 + with: + dry_run: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..fc6d924 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,34 @@ +name: Test + +on: + push: + branches: + - main + pull_request: + +jobs: + test: + name: Test + runs-on: ubuntu-24.04 + timeout-minutes: 10 + + steps: + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install packages + uses: bahmutov/npm-install@v1 + + - name: Check code formatting + run: npm run format:check + + - name: Run linters + run: npm run lint + + - name: Run tests + run: npm run test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..895c834 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +/*.tgz +dist +/node_modules +/npm-debug.log diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..1d7ac85 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..7455729 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Run iesna demo", + "runtimeExecutable": "npm", + "runtimeArgs": ["run", "dev"], + "console": "integratedTerminal" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7710f3e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,28 @@ +{ + "editor.rulers": [80], + "editor.tabSize": 2, + + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + }, + + "files.exclude": { + "dist": true, + "node_modules": true + }, + + "[javascript]": { + "editor.formatOnSave": true + }, + "[json]": { + "editor.formatOnSave": true + }, + "[typescript]": { + "editor.formatOnSave": true + }, + "[css]": { + "editor.formatOnSave": true + }, + "javascript.preferences.importModuleSpecifier": "non-relative", + "typescript.preferences.importModuleSpecifier": "non-relative" +} diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..16101e8 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,22 @@ +# The MIT License (MIT) + +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 new file mode 100644 index 0000000..37e516e --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +
+ +

IESNA

+

+ + TypeScript library for parsing and rendering the +
+ IESNA LM-63 Photometric file format +
+
+

+ + [](https://github.com/richard-viney/iesna/releases/latest) + [](https://github.com/semantic-release/semantic-release) + [](https://github.com/richard-viney/iesna/actions/workflows/test.yml) + [](https://opensource.org/license/mit) +
+ +## About + +This project is heavily based on the original publication "Parsing The IESNA +LM-63 Photometric Data File" and its accompanying source code, which can be +found [here](./vendor/iesna-c). + +## Usage + +To render an IES document to an HTML canvas using this library: + +```ts +import * as IESNA from "iesna"; + +IESNA.renderToCanvas({ + iesData: IESNA.parse("IES document goes here"), + canvas: document.getElementsByTagName("canvas")[0], +}); +``` + +In addition to `IESNA.renderToCanvas()`, light sampling can be done using +`IESNA.sample()`. This function takes an IES data object and an x,y,z coordinate +in light space and returns the light intensity at that position. + +```ts +const iesData = IESNA.parse("IES document goes here"); +const intensity = IESNA.sample({ iesData, x, y, z }); +``` + +## Demo + +There is a demo of rendering IES documents in the browser available +[here](https://richard-viney.github.io/iesna). + +To run it locally: `npm install && npm run dev`. diff --git a/demo/index.css b/demo/index.css new file mode 100644 index 0000000..d5927a6 --- /dev/null +++ b/demo/index.css @@ -0,0 +1,80 @@ +html { + --theme-bg-color-0: #24292e; + --theme-border-color-0: #3d4147; + --theme-text-color-default: #dddddd; + --theme-text-color-highlight: #ffffff; +} + +body { + margin: 0; + overflow: hidden; + overscroll-behavior-x: none; + + font-family: sans-serif; + font-size: 14px; + + background-color: var(--theme-bg-color-0); + color: var(--theme-text-color-default); + + display: grid; + grid-template-columns: auto 1fr; + grid-template-areas: + "header header" + "canvas document" + "controls document"; +} + +header { + grid-area: header; + display: flex; + gap: 1em; + align-items: center; + padding: 0.5em 1em; + margin-bottom: 2em; + + border-bottom: 2px solid var(--theme-border-color-0); + + a { + color: inherit; + transition: color 100ms; + + &:hover { + color: var(--theme-text-color-highlight); + } + } +} + +.controls { + padding: 0 2em; + + grid-area: controls; + display: grid; + grid-template-columns: max-content auto; + grid-template-columns: max-content auto; + gap: 1.5em 4em; + align-items: center; + grid-template-areas: + "label0 control0" + "label1 control1" + "label2 control2" + "label3 control3"; +} + +.canvas-container { + grid-area: canvas; + padding: 0 2em 2em 2em; +} + +canvas { + width: 420px; + height: 420px; + + box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px; + border-radius: 4px; +} + +textarea { + grid-area: document; + margin: 0 2em 2em 2em; + resize: none; +} diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..15775ea --- /dev/null +++ b/demo/index.html @@ -0,0 +1,64 @@ + + + + + + + + + + +
+ +

IESNA Demo

+ + + +
+ +
+ +
+ +
+ + + + + + + + +
+ + + + diff --git a/demo/index.ts b/demo/index.ts new file mode 100644 index 0000000..0696887 --- /dev/null +++ b/demo/index.ts @@ -0,0 +1,76 @@ +import IesLights from "../ies-lights"; +import * as IESNA from "../src"; + +class DemoApp { + public run(): void { + this.loadLights(); + this.addEventListeners(); + + this.iesLightTextArea.value = IesLights[0].data; + this.updateCanvas(); + } + + private loadLights(): void { + for (const light of IesLights) { + const option = document.createElement("option"); + option.innerHTML = light.name; + option.value = IesLights.indexOf(light).toString(); + this.iesLightDropdown.appendChild(option); + } + } + + private addEventListeners(): void { + const inputElements = [ + this.iesLightTextArea, + this.distanceSlider, + this.zoomSlider, + this.brightnessSlider, + ]; + + for (const element of inputElements) { + element.oninput = (): void => this.updateCanvas(); + } + + // Refresh everything when a new light is chosen + this.iesLightDropdown.onchange = (): void => { + this.iesLightTextArea.value = + IesLights[this.iesLightDropdown.selectedIndex].data; + this.updateCanvas(); + }; + } + + private updateCanvas(): void { + const iesData = IESNA.parse(this.iesLightTextArea.value); + const brightness = Number(this.brightnessSlider.value); + + IESNA.renderToCanvas({ + iesData, + canvas: this.canvas, + distance: Number(this.distanceSlider.value), + zoom: Number(this.zoomSlider.value), + convertSampleToRGB: (sample): [number, number, number] => [ + sample * brightness, + sample * 0.89 * brightness, + sample * 0.77 * brightness, + ], + }); + } + + private readonly canvas = document.getElementsByTagName("canvas")[0]; + private readonly iesLightDropdown = document.getElementById( + "light", + ) as HTMLSelectElement; + private readonly distanceSlider = document.getElementById( + "distance", + ) as HTMLInputElement; + private readonly zoomSlider = document.getElementById( + "zoom", + ) as HTMLInputElement; + private readonly brightnessSlider = document.getElementById( + "brightness", + ) as HTMLInputElement; + private readonly iesLightTextArea = + document.getElementsByTagName("textarea")[0]; +} + +document.addEventListener("DOMContentLoaded", () => new DemoApp().run()); diff --git a/demo/logo.svg b/demo/logo.svg new file mode 100644 index 0000000..88b62e3 --- /dev/null +++ b/demo/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..65f9295 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,29 @@ +import eslint from "@eslint/js"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.recommendedTypeChecked, + { + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + }, + { + files: ["src/**/*.ts"], + ignores: ["dist/"], + rules: { + // "no-console": "warn", + // "no-unused-vars": "off", + "@typescript-eslint/no-explicit-any": "error", + // "@typescript-eslint/no-unused-vars": [ + // "error", + // { argsIgnorePattern: "^_" }, + // ], + // "@typescript-eslint/no-unsafe-return": "off", + }, + }, +); diff --git a/ies-lights/bollard.ts b/ies-lights/bollard.ts new file mode 100644 index 0000000..9c8a992 --- /dev/null +++ b/ies-lights/bollard.ts @@ -0,0 +1,21 @@ +export default { + name: "Bollard", + data: ` +IESNA:LM-63-2002 +[TEST]BALLABS TEST NO. 14397.0 +[TESTLAB] BUILDING ACOUSTICS & LIGHTING LABORATORIES, INC +[ISSUEDATE] 03-DEC-2008 +[MANUFAC] H.E. WILLIAMS, INC - CARTHAGE, MISSOURI +[LUMINAIRE] 1/100W CLEAR ED17 LAMP 6"DIA 38.25"TALL WHITE BOLLARD +[MORE] 4.5"DIA SPECULAR CONE REFLECTOR w/5.875"TALL ACRYLIC +[MORE] CYLINDER LENS +[LUMCAT] OSA6R-100PSMH120-AC +[LAMPCAT] M90 MH100W/U/PS +TILT=NONE +1 9000 1 35 1 1 1 -0.49 -0.49 0.406 +1 1 100 +0 5 10 15 20 25 30 35 40 45 50 55 60 62.5 65 67.5 70 72.5 75 77.5 80 82.5 85 87.5 90 95 105 115 125 135 145 155 165 175 180 +0 +0.00 12.00 87.00 182.00 167.00 300.00 655.00 944.00 822.00 703.00 614.00 565.00 487.00 438.00 372.00 309.00 262.00 216.00 182.00 142.00 111.00 83.00 61.00 42.00 25.00 19.00 14.00 14.00 15.00 20.00 33.00 36.00 27.00 4.00 0.00 +`, +}; diff --git a/ies-lights/comet.ts b/ies-lights/comet.ts new file mode 100644 index 0000000..ccab660 --- /dev/null +++ b/ies-lights/comet.ts @@ -0,0 +1,18 @@ +export default { + name: "Comet", + data: ` +IESNA:LM-63-1995 +[TEST] INFINITY LIGHTING PHOTOMETRIC REPORT NO. W00006 +[LUMINAIRE] ICEAL8-2X150-FL-CG1 +TILT=NONE +2 11000 1 19 5 1 1 1.375 1.04167 0 +1 1 314 +0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 +0 22.5 45 67.5 90 +9085.62 9033.58 8923.24 8687.43 8145.53 7454.18 6336.9 5050.9 3180.16 2162.21 1292.02 677.24 243.87 48.44 16.1 6.48 6.25 6.99 3.31 +9085.62 8902.2 8825.21 8578.38 8462.81 7787.37 6902.89 5633.64 3822.33 2423.91 1614.81 927.01 382.27 72.18 18.92 8.91 6.41 5.19 2.16 +9085.62 9029.2 9168.27 8989.93 8818.57 8434.18 7791.45 6806.71 5489.39 3939.15 2518.39 1573.92 770.93 308.04 81.18 28.92 14.71 8.88 4.75 +9085.62 9404.94 9244.69 9202.21 9146.45 8779.2 8121.15 7346.47 6513.38 5407.45 3976.98 2453.4 1106.06 428.6 117.57 35.96 12.34 7.19 1.55 +9085.62 9315.27 9317.59 9459.68 9433.84 9128.13 8380.85 7752.85 6655.4 5439.5 3990.21 2472.54 1140.85 377.1 65.79 17.41 9 4.71 2.77 +`, +}; diff --git a/ies-lights/cylinder-narrow.ts b/ies-lights/cylinder-narrow.ts new file mode 100644 index 0000000..dc097fa --- /dev/null +++ b/ies-lights/cylinder-narrow.ts @@ -0,0 +1,21 @@ +export default { + name: "Cylinder narrow", + data: ` +IESNA:LM-63-1995 +[TEST]BALLABS TEST NO. 10974.0 +[MANUFAC] INFINITY LIGHTING INC - CARTHAGE, MISSOURI +[LUMINAIRE] 1/250W HALOGEN CLEAR MINICAN 7.5"DIA RECESSED LUMINAIRE +[LUMINAIRE] FACETED HYDROFORMED SEMI-SPECULAR REFLECTOR +[LUMINAIRE] CLEAR GLASS LENS w/4"DEEPSPUN SPECULAR ALUMINUM CONE +[LUMCAT]CATALOG NO. : TH75-250-T4 NARROW w/SPACER I +[LAMPCAT]LAMP CODE : 250Q/CL/MC (EHT) +TILT=NONE + 1 5000. 1.000000 19 1 1 1 .625 .625 .000 + 1.0000 1.0000 247.0000 + .0 5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 45.0 + 50.0 55.0 60.0 65.0 70.0 75.0 80.0 85.0 90.0 + .0 + 8183. 6729. 4775. 3866. 2714. 1600. 992. 715. 373. 119. + 46. 20. 8. 4. 0. 0. 0. 0. 0. +`, +}; diff --git a/ies-lights/cylinder-wide.ts b/ies-lights/cylinder-wide.ts new file mode 100644 index 0000000..08f862f --- /dev/null +++ b/ies-lights/cylinder-wide.ts @@ -0,0 +1,21 @@ +export default { + name: "Cylinder wide", + data: ` +IESNA:LM-63-1995 +[TEST]BALLABS TEST NO. 10979.0 +[MANUFAC] INFINITY LIGHTING INC - CARTHAGE, MISSOURI +[LUMINAIRE] 1/500W HALOGEN CLEAR MINICAN 7.5"DIA RECESSED LUMINAIRE +[LUMINAIRE] FACETED HYDROFORMED SEMI-SPECULAR REFLECTOR +[LUMINAIRE] CLEAR GLASS LENS w/4"DEEP SPUN SPECULAR ALUMINUM CONE +[LUMCAT]CATALOG NO. : TH75-500-T4 WIDE w/SPACER D +[LAMPCAT]LAMP CODE : 500Q/CL/MC (EVR) +TILT=NONE + 1 10450. 1.000000 19 1 1 1 .625 .625 .000 + 1.0000 1.0000 503.0000 + .0 5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 45.0 + 50.0 55.0 60.0 65.0 70.0 75.0 80.0 85.0 90.0 + .0 + 4612. 5322. 6414. 6917. 6708. 5675. 4019. 2703. 1870. 872. + 169. 42. 9. 0. 0. 0. 0. 0. 0. +`, +}; diff --git a/ies-lights/defined-spot.ts b/ies-lights/defined-spot.ts new file mode 100644 index 0000000..493d4cb --- /dev/null +++ b/ies-lights/defined-spot.ts @@ -0,0 +1,19 @@ +export default { + name: "Defined spot", + data: ` +IESNA:LM-63-1995 +[TEST] 100068_0 BY: ERCO / LUM650 +[DATE]02.12.2004 +[MANUFAC] ERCO Leuchten GmbH +[LUMCAT] 22619000_83670000 +[LUMINAIRE] Lightcast Downlight +[LAMPCAT] HIPAR-L30 35W 30� +TILT=NONE +1 2200 1 19 1 1 2 -.097 0 0 +1.00 1.00 35 +0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 +0 +7399.9 7219.5 6097.7 3707.0 836.0 281.6 239.8 145.2 90.2 46.2 33.0 17.6 12.1 +11.0 9.9 9.0 0.0 0.0 0.0 +`, +}; diff --git a/ies-lights/defined.ts b/ies-lights/defined.ts new file mode 100644 index 0000000..284b714 --- /dev/null +++ b/ies-lights/defined.ts @@ -0,0 +1,21 @@ +export default { + name: "Defined", + data: ` +IESNA91 +[TEST] Test unknown +[MANUFAC] Manufacturing company unknown +TILT=NONE +1 13172.61 1 +37 1 +1 +2 +0 0 0 +1 1 0 +0.00 2.50 5.00 7.50 9.11 10.00 10.80 12.50 15.83 22.50 25.00 27.50 32.50 34.28 35.00 42.50 47.02 47.50 47.81 50.00 50.78 52.50 +55.00 57.50 60.00 62.50 65.00 67.50 70.00 72.50 75.00 77.50 80.00 82.50 85.00 87.50 90.00 +0.00 +8379.00 8409.00 8528.00 8126.65 8500.00 8564.00 8301.00 8158.61 8411.98 8036.59 7865.61 7283.76 5209.38 6038.93 4533.49 3091.00 +3665.38 2996.97 3625.45 2194.62 3170.85 1115.28 651.00 450.00 244.00 102.00 80.00 43.00 5.00 2.00 0.00 0.00 0.00 0.00 0.00 0.00 +0.00 +`, +}; diff --git a/ies-lights/index.ts b/ies-lights/index.ts new file mode 100644 index 0000000..43b393e --- /dev/null +++ b/ies-lights/index.ts @@ -0,0 +1,49 @@ +import bollard from "./bollard"; +import cylinderNarrow from "./cylinder-narrow"; +import cylinderWide from "./cylinder-wide"; +import defined from "./defined"; +import definedSpot from "./defined-spot"; +import jellyfish from "./jellyfish"; +import mediumScatter from "./medium-scatter"; +import overhead from "./overhead"; +import parallelBeam from "./parallel-beam"; +import pear from "./pear"; +import round from "./round"; +import scatterLight from "./scatter-light"; +import softArrow from "./soft-arrow"; +import starFocused from "./star-focused"; +import threeLobeUmbrella from "./three-lobe-umbrella"; +import threeLobeVee from "./three-lobe-vee"; +import tightFocused from "./tight-focused"; +import topPost from "./top-post"; +import trapezoid from "./trapezoid"; +import umbrella from "./umbrella"; +import xArrow from "./x-arrow"; +import xArrowDiffuse from "./x-arrow-diffuse"; +import xArrowSoft from "./x-arrow-soft"; + +export default [ + bollard, + cylinderNarrow, + cylinderWide, + definedSpot, + defined, + jellyfish, + mediumScatter, + overhead, + parallelBeam, + pear, + round, + scatterLight, + softArrow, + starFocused, + threeLobeUmbrella, + threeLobeVee, + tightFocused, + topPost, + trapezoid, + umbrella, + xArrowDiffuse, + xArrowSoft, + xArrow, +]; diff --git a/ies-lights/jellyfish.ts b/ies-lights/jellyfish.ts new file mode 100644 index 0000000..4ffd100 --- /dev/null +++ b/ies-lights/jellyfish.ts @@ -0,0 +1,85 @@ +export default { + name: "Jellyfish", + data: ` +IESNA:LM-63-1995 +[TEST]BALLABS TEST NO. 12788.0 +[MANUFAC] INFINITY LIGHTING INC - CARTHAGE, MISSOURI +[LUMINAIRE] 1/100W ICETRON INDUCTION 20x15"DIRECT AREALIGHT LUMINAIRE +[LUMINAIRE] MIRO4 SPEC ALUM TYPE II OPTICS & CLEAR FLAT GLASS LENS +[LUMINAIRE] BLACK PANEL STREET SIDE SYLVANIA # QT 1x150 ICE/UNV-T +[LUMCAT] ICEAL2-150S-TYPE2/CG1-277 +[LAMPCAT] ICE100/QT150 2PIN +TILT=NONE + 1 11000. 1.000000 25 21 1 1 .938 1.266 .000 + 1.0000 1.0000 140.0000 + .0 5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 45.0 + 50.0 55.0 60.0 62.5 65.0 67.5 70.0 72.5 75.0 77.5 + 80.0 82.5 85.0 87.5 90.0 + .0 5.0 15.0 25.0 35.0 45.0 55.0 65.0 75.0 85.0 + 90.0 95.0 105.0 115.0 125.0 135.0 145.0 155.0 165.0 175.0 + 180.0 + 1789. 1841. 1911. 1979. 2023. 2025. 1994. 1867. 1718. 1551. + 1374. 1208. 990. 808. 637. 469. 347. 202. 89. 18. + 9. 7. 7. 6. 0. + 1789. 1831. 1908. 1969. 2013. 2018. 1983. 1865. 1701. 1548. + 1353. 1193. 981. 842. 661. 503. 352. 172. 68. 19. + 8. 6. 6. 5. 0. + 1789. 1828. 1891. 1939. 1958. 1939. 1908. 1808. 1668. 1559. + 1428. 1300. 1222. 1161. 999. 778. 580. 318. 129. 39. + 10. 7. 7. 4. 0. + 1789. 1818. 1865. 1891. 1942. 1959. 1927. 1843. 1761. 1714. + 1673. 1599. 1445. 1325. 1165. 948. 668. 400. 186. 75. + 30. 9. 7. 2. 0. + 1789. 1811. 1821. 1891. 1941. 1974. 1980. 1943. 1993. 2082. + 1963. 1808. 1621. 1601. 1424. 1166. 829. 487. 279. 152. + 65. 15. 8. 2. 0. + 1789. 1794. 1804. 1893. 1935. 1995. 2020. 2145. 2342. 2221. + 2063. 2135. 2157. 1694. 948. 340. 101. 8. 0. 185. + 94. 32. 9. 0. 0. + 1789. 1775. 1803. 1868. 1931. 1992. 2076. 2357. 2333. 2285. + 2254. 2608. 2375. 2010. 1722. 1448. 981. 661. 376. 244. + 122. 38. 8. 0. 0. + 1789. 1763. 1798. 1839. 1918. 1961. 2151. 2291. 2310. 2263. + 2575. 2700. 2380. 2075. 1792. 1483. 1102. 702. 430. 298. + 192. 67. 11. 2. 0. + 1789. 1746. 1801. 1827. 1871. 1923. 2176. 2119. 2124. 2062. + 2553. 2596. 2201. 1907. 1678. 1368. 1015. 673. 440. 303. + 178. 63. 10. 1. 0. + 1789. 1738. 1788. 1808. 1830. 1895. 2081. 2024. 1953. 1883. + 2313. 2285. 1854. 1661. 1400. 1139. 833. 577. 404. 267. + 157. 54. 12. 1. 0. + 1789. 1735. 1783. 1797. 1812. 1868. 2046. 1983. 1911. 1805. + 2191. 2151. 1759. 1513. 1288. 1033. 802. 568. 386. 243. + 134. 56. 10. 3. 0. + 1789. 1734. 1778. 1786. 1797. 1838. 2016. 1951. 1871. 1766. + 2128. 2078. 1681. 1474. 1248. 1009. 739. 523. 349. 228. + 144. 52. 13. 2. 0. + 1789. 1733. 1774. 1773. 1771. 1777. 1959. 1895. 1811. 1647. + 2034. 1957. 1595. 1293. 1118. 925. 717. 481. 319. 208. + 125. 51. 7. 1. 0. + 1789. 1738. 1763. 1755. 1744. 1704. 1880. 1794. 1752. 1541. + 1772. 1720. 1427. 1191. 1003. 795. 588. 427. 274. 166. + 98. 39. 8. 3. 0. + 1789. 1734. 1744. 1732. 1708. 1647. 1674. 1703. 1620. 1413. + 1325. 1423. 1205. 983. 808. 642. 464. 312. 192. 107. + 57. 18. 8. 3. 0. + 1789. 1735. 1714. 1725. 1673. 1590. 1481. 1511. 1373. 1230. + 982. 993. 902. 771. 626. 456. 300. 187. 112. 60. + 31. 14. 8. 4. 0. + 1789. 1736. 1681. 1700. 1617. 1511. 1381. 1252. 1210. 1043. + 875. 657. 554. 487. 398. 294. 195. 122. 70. 40. + 19. 11. 8. 3. 0. + 1789. 1737. 1666. 1641. 1577. 1471. 1333. 1172. 1015. 890. + 728. 574. 409. 326. 243. 181. 114. 72. 40. 24. + 14. 9. 7. 4. 0. + 1789. 1740. 1679. 1601. 1493. 1388. 1268. 1114. 956. 769. + 624. 481. 347. 267. 201. 141. 85. 41. 25. 16. + 10. 7. 6. 3. 0. + 1789. 1737. 1693. 1616. 1479. 1340. 1187. 1041. 896. 724. + 572. 431. 303. 233. 167. 117. 62. 29. 18. 12. + 9. 6. 6. 4. 1. + 1789. 1742. 1698. 1623. 1491. 1354. 1196. 1040. 894. 722. + 565. 421. 302. 227. 159. 108. 57. 20. 14. 10. + 8. 6. 6. 5. 0. +`, +}; diff --git a/ies-lights/medium-scatter.ts b/ies-lights/medium-scatter.ts new file mode 100644 index 0000000..125923f --- /dev/null +++ b/ies-lights/medium-scatter.ts @@ -0,0 +1,390 @@ +export default { + name: "Medium scatter", + data: ` +IESNA:LM-63-2002 +[TEST] 5890_0 +[TESTLAB] ERCO GmbH +[ISSUEDATE] 02-12-2008 +[MANUFAC] ERCO GmbH +[LUMCAT] 33519000 +[LUMINAIRE] Kubus Floor washlight +[LAMP] HIT-TC-CE 20W +TILT=NONE +1 1615 1 37 73 1 2 0.103 0.059 0 +1.0 1.0 24 +0 2.5 5 7.5 10 12.5 15 17.5 20 22.5 25 27.5 30 +32.5 35 37.5 40 42.5 45 47.5 50 52.5 55 57.5 60 62.5 +65 67.5 70 72.5 75 77.5 80 82.5 85 87.5 90 +0 2.5 5 7.5 10 12.5 15 17.5 20 22.5 25 27.5 30 +32.5 35 37.5 40 42.5 45 47.5 50 52.5 55 57.5 60 62.5 +65 67.5 70 72.5 75 77.5 80 82.5 85 87.5 90 92.5 95 +97.5 100 102.5 105 107.5 110 112.5 115 117.5 120 122.5 125 127.5 +130 132.5 135 137.5 140 142.5 145 147.5 150 152.5 155 157.5 160 +162.5 165 167.5 170 172.5 175 177.5 180 +174.408695 186.514735 207.74714 232.0109 259.393225 290.905105 329.41801 371.299805 413.25912 +451.245535 487.59757 510.86326 514.272525 504.50339 491.06659 481.24739 473.75702 470.79188 +471.491175 465.94688 448.826265 421.89291 385.692685 336.53693 275.843615 220.833485 172.667725 +138.452335 109.86845 87.28106 67.431095 50.761065 36.44086 23.40458 12.382205 3.77264 +0 +174.408695 186.24503 208.21226 231.893005 258.99432 290.456135 328.705795 370.82015 411.190305 +451.636365 486.478375 509.308015 514.198235 503.661975 490.829185 481.08266 472.12264 470.44627 +469.93593 463.828 448.5824 424.378395 389.798015 336.6629 278.547125 220.067975 173.953265 +138.071195 110.2722 87.81078 67.763785 50.964555 36.345575 23.34321 12.27077 3.75649 +0 +174.408695 186.0157 207.63086 230.823875 258.333785 290.4416 328.276205 369.71872 411.584365 +449.65153 484.175385 507.77215 512.935305 503.86708 488.84435 479.21249 469.905245 467.854195 +466.145525 462.72011 447.43575 420.92068 387.178485 339.510145 278.682785 222.855465 176.492045 +140.47916 111.16368 87.650895 68.65688 51.0017 36.442475 23.260845 12.34506 3.72096 +0 +174.408695 185.77345 207.59856 230.94177 258.35478 288.73293 327.291055 368.62052 409.81917 +449.25424 483.86692 504.188465 511.136195 501.5544 486.959645 476.44115 467.35193 462.392265 +461.99982 458.337 441.14371 417.88771 386.903935 340.17714 282.22448 226.653945 178.465575 +140.67942 111.313875 88.38249 68.78285 51.319855 36.348805 23.29153 12.31599 3.74357 +0 +174.408695 185.81867 206.934795 230.462115 258.078615 287.920585 325.67121 366.390205 407.695445 +447.705455 480.947 502.689745 508.27926 499.385455 486.3088 474.42886 464.59028 457.1419 +454.82276 449.010375 435.418535 415.26818 383.87258 338.59121 284.75034 231.444035 182.480465 +144.773445 114.2774 89.45808 68.965345 51.22134 36.58298 23.16556 12.336985 3.74034 +0 +174.408695 185.96079 206.6231 229.86618 257.293725 285.88084 323.179265 363.877265 405.780055 +444.85175 477.25511 499.88772 505.199455 498.019165 484.188305 472.73311 459.288235 450.66575 +446.08238 437.337155 424.565735 406.19834 378.51401 336.5983 285.727415 230.462115 184.02602 +145.044765 114.05776 89.47746 68.874905 51.26979 36.290665 23.170405 12.16418 3.741955 +0 +174.408695 185.080615 205.778455 229.060295 256.58797 284.425725 320.876275 361.193135 402.785845 +439.17018 474.37718 496.98718 502.315065 496.097315 482.618525 467.20335 455.396085 444.68379 +436.20181 425.79475 415.253645 395.80743 367.84209 328.870525 279.27226 228.09291 181.41941 +142.81122 111.34133 88.20161 67.660425 50.496205 35.347505 22.71013 11.8541 3.64667 +0 +174.408695 185.16944 205.778455 228.01862 254.89545 283.282305 317.630125 357.39304 399.119795 +435.883655 468.8991 491.830485 500.61447 494.71003 479.5581 463.735945 448.241635 437.19019 +426.04023 416.629625 404.18282 382.9488 355.27093 319.555205 273.821635 224.84676 178.866095 +142.686865 109.811925 86.98713 66.442715 49.49329 34.44472 22.05767 11.51172 3.596605 +0 +174.408695 184.83352 204.96934 227.102915 252.97683 281.0746 314.581005 353.40722 394.09553 +431.413335 463.55668 487.50713 496.41224 491.533325 477.0064 460.560855 444.61273 429.75796 +418.42389 407.062365 392.67433 372.40285 342.278255 310.327095 271.008305 225.303805 181.03181 +143.474985 111.09908 86.539775 65.80479 49.13476 34.26384 21.964 11.471345 3.561075 +0 +174.408695 184.61388 204.66895 225.662335 251.44581 279.35301 311.732145 348.838385 389.20854 +425.237575 458.577635 478.813585 491.26685 487.78168 473.40172 459.32861 439.76773 423.69848 +410.85277 395.89464 383.12968 362.301025 335.831175 306.092565 270.66108 227.96371 185.74438 +147.867785 115.01707 90.105695 67.922055 50.4203 35.024505 22.307995 11.5957 3.632135 +0 +174.408695 184.3684 203.498075 224.45916 249.356 276.85622 307.88683 344.129045 382.67102 +419.811175 451.79302 472.605525 485.17184 485.580435 472.779945 456.84797 436.20504 418.64999 +402.03487 388.609375 373.25557 354.79612 330.240045 302.678455 272.830025 233.504775 195.090385 +156.071985 121.898585 94.663225 71.05677 52.58117 36.04034 22.97499 11.89609 3.72419 +0 +174.408695 183.685255 202.709955 222.878075 247.94126 274.57907 304.72466 339.216215 376.800495 +412.563055 445.169905 466.672015 479.269015 481.484795 470.04575 454.24782 433.264125 412.986185 +393.296105 376.638995 363.499355 346.72112 324.616615 300.136445 272.33422 237.707005 202.08495 +163.588195 129.40995 100.606425 75.519015 54.960065 37.72317 23.732425 12.249775 3.79525 +0 +174.408695 183.698175 202.34981 221.40681 245.207065 271.96923 300.452985 332.875725 368.97582 +404.827205 436.15659 459.50949 472.34551 475.85652 467.62002 451.28914 430.344205 407.524255 +386.422665 368.55915 352.41238 336.667745 315.92307 294.106035 269.95048 238.42245 206.09338 +169.021055 135.04307 105.23986 79.136615 58.03664 39.594955 24.95175 12.727815 3.94706 +0 +174.408695 183.362255 201.279065 219.593165 242.287145 267.93496 295.45133 326.92445 361.6631 +395.453745 426.23726 450.832095 464.575745 468.219185 463.316045 447.524575 426.09191 402.365945 +381.08832 361.018715 341.90519 325.356285 307.681725 286.76263 266.65265 238.2125 207.50812 +172.196145 141.26728 110.629115 84.08013 61.09545 42.08367 26.23729 13.39481 4.119865 +0 +174.408695 182.945585 200.197015 218.37707 239.758055 264.564455 290.078225 319.84106 353.27156 +386.06898 417.316 440.39112 455.34279 459.488495 455.677095 442.967045 422.369335 397.143035 +372.546585 352.20243 332.633475 315.611375 297.135775 279.874655 259.251105 234.095865 206.73615 +174.828595 144.48113 114.372685 88.81208 64.07997 44.720965 27.60681 14.17001 4.349195 +0 +174.408695 182.40133 199.173105 216.615105 237.471215 259.97624 284.44995 313.453735 345.023755 +376.21748 405.19381 429.769265 445.040705 449.74197 448.03653 438.248015 419.145795 394.97409 +368.08757 345.46465 323.909245 306.0425 286.615665 269.506355 251.515255 229.3946 204.609195 +175.930025 147.56255 118.830085 93.23718 67.569985 48.015565 29.31548 15.28113 4.665735 +0 +174.408695 182.451395 198.15081 214.48169 234.806465 255.9452 279.306175 306.43979 336.45941 +365.60047 394.78998 418.26885 432.44209 438.041295 439.065205 430.508935 413.95034 390.747635 +363.189275 340.133535 317.4444 296.87253 277.213135 258.398385 241.721895 219.583475 196.73607 +172.06856 147.98568 120.060715 95.751735 70.318715 50.02301 30.76898 16.00465 4.92898 +0 +174.408695 182.04603 197.529035 213.217145 232.16594 252.60861 274.01382 299.32733 327.76425 +354.45051 382.578965 404.51228 419.220085 425.17782 426.267945 419.220085 406.04976 384.66716 +358.06488 332.93871 309.041555 288.10631 267.28573 249.26233 230.17626 210.71551 190.364895 +168.20871 144.069305 119.61013 96.11188 71.200505 51.47974 31.6217 16.671645 5.033955 +0 +174.408695 181.676195 196.29679 211.09342 228.63555 248.30625 269.251185 291.64316 317.42825 +343.00016 369.3505 390.43271 404.33786 411.280745 412.42901 407.16734 397.54517 377.446495 +351.0364 325.69705 300.985935 277.3924 255.271745 236.02902 217.516275 197.474125 178.68037 +159.589455 138.03082 116.139495 93.6054 70.66917 51.45713 31.87364 16.852525 5.10986 +0 +174.408695 181.203 194.80453 209.263625 225.701095 244.48516 263.230465 284.5953 308.511835 +332.18612 356.661445 376.949075 388.55931 395.143665 397.201175 392.65172 384.181045 365.81688 +343.747905 317.0568 290.56111 265.281515 241.55878 221.750805 201.70381 181.824775 166.181885 +148.051895 130.196455 109.337115 89.80692 68.093245 49.762995 30.883645 16.37287 4.90314 +0 +174.408695 180.62483 193.659495 207.1076 223.297975 239.993845 257.35671 277.717015 299.85059 +321.383385 343.19719 361.583965 373.266875 379.119635 380.686185 377.17679 368.61083 353.34908 +333.124435 307.584825 281.76259 254.60152 229.619085 208.191265 186.960475 167.83403 150.002815 +133.833435 116.81941 99.475925 82.00324 62.52634 45.954825 28.67594 15.095405 4.54138 +0 +174.408695 180.374505 192.331965 205.481295 219.609315 235.145615 251.65576 271.001845 290.536885 +308.931735 328.68803 345.282155 357.617525 362.75807 362.74838 358.896605 350.485685 338.001735 +321.325245 297.13739 273.072275 245.37664 218.78728 195.72508 173.753005 154.392385 136.343145 +120.936045 104.64231 88.135395 71.281255 56.19877 40.44929 25.74633 13.377045 4.058495 +0 +174.408695 179.880315 191.446945 203.469005 216.81698 231.182405 246.211595 263.30637 280.77744 +297.23752 315.824555 329.794305 340.80699 345.07382 344.1565 340.139995 332.29917 320.785835 +303.54571 282.390825 260.29278 235.429855 208.775895 184.379705 161.83269 142.74985 124.689305 +109.673035 93.229105 78.34365 62.783125 49.036245 35.114945 22.36452 11.571475 3.490015 +0 +174.408695 179.17456 190.038665 201.33236 213.33181 226.71047 240.778735 255.6222 271.670455 +285.772635 302.394215 315.40627 325.062355 328.29397 326.34305 322.249025 313.67822 302.148735 +286.48808 267.7347 245.39602 222.196545 197.21088 173.517215 152.102315 131.985875 113.29548 +97.783405 82.02585 68.332265 54.188095 42.4422 29.99055 19.28956 9.824045 2.989365 +0 +174.408695 178.988835 188.701445 198.966385 210.274615 222.206235 234.903365 248.827895 262.73466 +274.713115 289.40154 300.36416 308.708865 311.65624 308.628115 304.15618 295.365735 283.45188 +267.303495 250.55433 230.18272 207.64055 184.24243 161.705105 141.608045 121.21867 103.57964 +88.16931 72.57164 60.15875 47.1903 36.6605 25.64297 16.55052 8.299485 2.57108 +0 +174.408695 178.69652 187.04284 196.76837 207.15928 217.98301 229.467275 241.17764 253.42257 +263.81348 275.950205 285.804935 291.993615 295.246225 291.547875 285.05719 276.234445 263.970135 +248.47421 231.321295 211.831475 192.180155 170.95421 150.42756 130.877985 111.446305 94.93293 +79.66795 65.967905 54.149335 42.66507 32.902395 22.72951 14.704575 7.33533 0 +0 +174.408695 178.239475 186.19658 194.864285 204.22321 213.691955 223.51923 233.569375 244.72418 +253.19324 263.492095 271.65269 277.710555 277.952805 274.50478 266.75601 256.42324 244.98904 +228.485355 213.30274 193.830685 176.185195 156.010615 137.987215 119.747405 102.363545 86.54785 +72.43275 60.16521 49.04432 38.231895 29.352625 20.40714 13.041125 6.49876 0 +0 +174.408695 177.793735 184.86259 192.27221 200.81556 208.96162 217.803745 225.99018 235.68664 +243.634055 251.5847 258.98463 262.4052 263.482405 259.29148 250.31531 239.044225 227.254725 +210.89639 196.811975 177.61447 159.721885 141.88744 125.748745 109.088405 93.76367 79.11885 +66.058345 54.20909 44.43834 34.35751 26.322885 18.131605 11.510105 5.75909 0 +0 +174.408695 177.590245 183.833835 190.342285 197.826195 204.557515 212.002665 218.966545 228.04123 +234.221835 240.33784 246.4167 249.464205 248.98778 244.144395 236.51675 223.514385 211.553695 +195.529665 180.51178 162.489995 146.727595 129.301745 114.02223 98.658735 85.464185 71.749605 +60.57542 49.116995 40.008395 30.8465 23.545085 16.2469 10.22618 5.11309 0 +0 +174.408695 177.154195 182.46916 188.09905 194.67533 200.503865 206.673165 213.485235 219.71752 +225.174605 229.85972 234.325195 236.8236 236.45215 231.15818 224.464005 210.445805 197.648545 +182.80831 167.0556 149.79448 134.86542 118.41826 104.31608 90.525595 78.009345 66.00505 +55.564075 45.39765 36.684725 28.412695 21.406825 14.77725 9.226495 4.626975 0 +0 +174.408695 176.256255 181.094795 186.272485 191.61006 196.479285 201.770025 207.416065 212.11733 +216.90096 220.187485 223.614515 225.177835 224.51084 220.113195 212.525925 200.513555 186.007625 +172.38833 157.23317 140.03019 126.4222 110.454695 97.357045 84.34499 72.57164 61.1116 +51.357 42.08367 34.126565 26.351955 19.610945 13.566 8.45937 4.23776 0 +0 +174.408695 175.73138 179.76242 184.66233 188.632 192.645275 196.97832 201.495475 204.793305 +209.286235 211.834705 213.62574 214.19422 213.265595 210.22778 203.685415 192.11071 177.603165 +163.5026 151.472465 134.812125 121.074935 105.02345 92.340855 79.721245 69.084855 57.55537 +48.4177 39.81298 32.178875 24.714345 18.496595 12.67775 7.94903 3.96321 0 +0 +174.408695 175.613485 178.6836 182.267285 185.820285 189.315145 192.125245 195.97702 199.305535 +202.393415 204.48807 205.019405 205.41508 205.3634 202.38857 196.944405 185.96402 173.59958 +160.138555 148.16979 132.954875 119.311355 103.600635 90.74685 77.9399 66.67689 55.974285 +46.920595 37.860445 30.55903 23.590305 17.731085 12.2417 7.621185 3.806555 0 +0 +174.408695 175.10799 177.76305 180.836395 183.66103 186.15136 188.46081 191.488935 194.10685 +197.357845 198.94539 199.118195 199.760965 199.518715 196.76514 191.34843 182.335115 171.995885 +160.36627 147.55286 134.4326 120.79231 105.412665 92.05177 79.175375 67.402025 56.626745 +46.99327 38.238355 30.328085 23.34321 17.3451 11.91224 7.437075 3.70804 0 +0 +174.408695 174.828595 176.863495 179.45557 181.78763 183.617425 185.55704 188.145885 190.55708 +193.097475 195.229275 195.63141 196.17405 195.445685 192.54353 189.00022 180.035355 172.041105 +161.233525 149.59099 136.47719 124.091755 109.01896 96.05374 82.159895 70.493135 59.00564 +48.887665 38.78261 31.019305 23.80187 17.391935 12.139955 7.395085 3.74357 0 +0 +174.408695 174.440995 175.96394 178.01822 179.80118 181.82639 183.8839 185.306715 187.88587 +190.261535 193.25413 193.7354 195.287415 193.26059 191.921755 188.149115 180.84447 173.081165 +162.91474 152.118465 140.422635 127.951605 114.760285 101.18621 88.103095 76.126255 62.618395 +51.65093 40.43314 32.382365 23.92784 17.72624 11.936465 7.340175 3.68543 0 +0 +174.408695 174.024325 175.10476 176.50981 178.92585 180.594145 182.984345 184.35871 187.919785 +189.289305 192.222145 193.940505 195.41177 192.7018 192.68888 188.04091 183.685255 172.364105 +164.502285 153.76738 145.487275 132.864435 119.589135 106.14426 95.835715 81.85143 68.9282 +55.98559 43.85694 34.32844 25.424945 18.163905 12.030135 7.330485 3.606295 0 +0 +174.408695 173.61896 174.54274 176.065685 178.006915 179.854475 183.016645 185.05962 188.413975 +189.49764 192.212455 194.786765 194.56874 191.93629 189.91431 183.37356 177.880945 166.09629 +158.64468 150.2596 143.726925 132.08439 121.730625 108.846155 99.198145 83.61501 71.50251 +56.894835 47.311425 35.25868 26.67657 18.37547 12.275615 7.330485 3.61114 0 +0 +174.408695 173.756235 174.45553 175.49882 177.14612 180.154865 183.8839 185.736305 190.18563 +191.53577 191.908835 191.818395 188.56094 185.60872 178.313765 171.340195 161.23837 153.355555 +145.84096 137.832175 129.3292 118.24707 110.286735 99.595435 90.012025 75.26546 66.239225 +53.54371 45.03589 34.38658 26.439165 18.10738 12.74558 7.40962 3.75649 0 +0 +174.408695 173.585045 173.95811 174.99171 177.44005 181.33543 185.490825 187.7922 191.614905 +192.083255 188.82903 186.149745 178.67391 172.028185 160.942825 150.82485 141.67103 133.22135 +124.178965 116.11527 106.610995 96.239465 88.77009 81.032625 71.487975 62.754055 53.984605 +45.586605 38.183445 29.691775 23.7405 17.04794 12.198095 7.2352 3.70804 0 +0 +174.408695 173.265275 173.491375 174.689705 177.935855 182.661345 187.66623 189.744735 192.267365 +190.04674 180.955905 174.47168 164.38762 153.798065 141.520835 131.0411 121.204135 113.80259 +102.489515 94.524335 86.759415 76.943445 68.85391 63.267625 54.02175 49.41577 41.85111 +36.145315 29.59326 24.6126 19.604485 14.759485 10.36184 6.42124 3.254225 0 +0 +174.408695 173.236205 173.774 175.20812 178.942 184.40393 189.163335 190.901075 189.825485 +182.373875 171.369265 160.85723 148.17302 135.180345 123.28264 112.244115 103.4892 95.092815 +85.105655 77.379495 68.810305 63.206255 55.62383 50.347625 43.370825 38.852055 32.621385 +28.745385 23.52086 19.62548 15.68165 12.06728 8.328555 5.35211 2.73258 0 +0 +174.408695 173.239435 173.891895 175.91226 179.90454 185.797675 190.46987 190.14041 185.81544 +173.213595 160.513235 146.33515 132.166755 120.306195 107.38458 97.973975 89.366025 80.89858 +72.179195 66.06642 57.84607 52.87833 46.54107 42.19026 36.4021 32.27416 27.53575 +23.8374 19.94202 16.781465 13.02336 10.105055 7.106 4.59629 0 0 +0 +174.408695 173.20552 173.711015 176.71653 181.104485 187.09452 190.474715 187.0816 178.90647 +164.02909 146.5774 131.882515 118.54423 107.00021 95.40774 86.281375 77.637895 70.993785 +62.77828 57.305045 50.88542 45.589835 40.631785 36.048415 31.555485 27.818375 23.79218 +20.70107 17.61965 14.63836 11.52787 8.880885 6.29204 4.06011 0 0 +0 +174.408695 173.065015 173.988795 177.33023 182.373875 187.4369 188.785425 182.138085 170.57953 +152.97926 133.791445 118.523235 106.14749 95.951995 85.415735 76.97736 69.25443 62.770205 +55.66259 50.52689 44.59661 39.808135 35.03258 31.59263 27.611655 24.178165 20.91748 +18.173595 15.224605 12.766575 10.14543 7.844055 5.5879 3.635365 0 0 +0 +174.408695 172.98911 174.14545 178.15388 182.761475 187.45305 186.065765 176.462975 160.29521 +141.369025 122.00033 107.53639 95.81795 86.152175 77.279365 70.12976 62.579635 56.000125 +49.375395 44.746805 39.41246 35.19731 31.025765 27.695635 24.036045 21.284085 18.52082 +16.057945 13.57246 11.274315 8.977785 6.984875 5.001655 3.33336 0 0 +0 +174.408695 172.806615 174.45876 178.895165 183.724015 187.5984 182.0751 169.398965 150.803855 +130.74071 112.386235 98.88322 87.615365 78.43409 70.72731 64.033135 56.70588 50.386385 +44.19609 39.87435 35.063265 31.368145 27.682715 24.426875 21.60224 19.40907 16.75401 +14.69973 12.391895 10.50719 8.43676 6.535905 4.743255 3.17509 0 0 +0 +174.408695 172.53045 174.86897 179.73335 184.53636 185.84774 177.2947 161.223835 140.929745 +120.923125 103.36 91.22166 80.073315 72.41014 64.588695 58.03018 50.86927 45.45902 +39.9228 35.454095 31.28901 28.050935 24.86131 22.349985 20.00339 18.15906 15.883525 +13.86962 11.888015 9.911255 8.076615 6.232285 4.55753 3.050735 0 0 +0 +174.408695 172.59505 175.206505 180.846085 184.73985 182.926205 171.92967 152.75962 130.564675 +111.436615 95.987525 83.76682 74.78419 67.043495 58.480765 52.46489 45.98874 41.200265 +35.935365 32.256395 28.645255 25.93367 23.283455 21.15973 19.152285 17.159375 15.273055 +13.322135 11.371215 9.52204 7.74554 6.00457 4.429945 2.96837 0 0 +0 +174.408695 172.65319 175.79921 181.81347 184.10354 179.8787 166.0866 144.311555 121.771 +103.31155 89.721325 78.138545 70.134605 61.927175 54.165485 48.031715 41.86403 37.450235 +33.034825 29.79998 26.809 24.56092 22.301535 20.47497 18.580575 16.62158 14.68358 +12.834405 10.964235 9.239415 7.521055 5.8463 4.300745 2.91669 0 0 +0 +174.408695 172.54983 176.288555 182.402945 183.501145 176.62932 159.27776 135.890945 113.87365 +96.914535 83.396985 73.513185 65.93399 57.41325 49.785605 43.77942 38.499985 34.433415 +30.7819 28.15914 25.65266 23.68236 21.48596 19.64809 17.85544 15.990115 14.139325 +12.404815 10.615395 8.90834 7.24166 5.676725 4.207075 2.866625 0 0 +0 +174.408695 172.6112 176.75206 182.687185 182.399715 172.335035 152.725705 128.623445 106.87747 +91.30887 77.97543 69.29642 61.817355 53.01722 45.56561 40.444445 35.609135 32.146575 +29.349395 27.07709 24.817705 22.78119 20.77213 19.09576 17.25466 15.450705 13.606375 +11.907395 10.25848 8.680625 7.12861 5.586285 4.168315 2.84563 0 0 +0 +174.408695 172.65319 177.25271 182.793775 180.37289 168.55432 146.091285 121.685405 100.83414 +86.28945 74.537095 66.0212 57.721715 49.23812 42.501955 37.76193 33.60492 30.625245 +28.325485 26.255055 24.032815 22.38713 20.347385 18.635485 16.61835 14.885455 13.263995 +11.68291 10.13897 8.580495 7.085005 5.54591 4.148935 2.83917 0 0 +0 +174.408695 172.829225 177.63385 182.6565 177.72106 163.88374 140.047955 115.761585 95.45942 +81.27972 71.46698 62.38745 53.858635 46.13732 39.93572 35.57845 32.14173 29.65463 +27.70694 25.53638 23.709815 21.804115 19.872575 18.01694 16.24367 14.659355 13.131565 +11.59893 10.0776 8.538505 7.04786 5.531375 4.148935 2.85855 0 0 +0 +174.408695 172.39802 178.06021 182.82123 175.63448 159.2067 134.075685 110.622655 91.1506 +77.954435 68.312885 58.95719 50.370235 43.374055 37.750625 33.890775 31.080675 29.097455 +26.881675 24.97436 23.196245 21.27924 19.355775 17.68102 16.07248 14.55438 13.054045 +11.542405 10.050145 8.50459 7.03171 5.51361 4.14732 2.86178 0 0 +0 +174.408695 172.6758 178.2637 181.937825 173.00526 154.634635 128.86408 106.006985 87.4684 +75.36236 65.722425 56.02112 47.76201 41.135665 36.129165 32.883015 30.466975 28.41431 +26.435935 24.55446 22.48726 20.64939 19.05054 17.49368 15.99173 14.44456 13.02013 +11.51495 10.02915 8.490055 7.03171 5.51361 4.148935 2.86178 0 0 +0 +174.408695 172.515915 178.862865 181.262755 170.42772 149.673355 123.88019 101.937185 84.398285 +73.20472 63.22402 53.49849 45.563995 39.003865 34.850085 32.140115 29.83228 28.13007 +25.880375 24.04412 21.968845 20.298935 18.78245 17.330565 15.93036 14.43487 13.0492 +11.53433 10.04207 8.49813 7.039785 5.534605 4.15701 2.882775 0 0 +0 +174.408695 172.59182 179.02598 180.31475 167.93739 145.270865 119.443785 98.58606 82.00001 +71.45083 60.47529 51.22457 43.32076 37.60043 33.96345 31.77674 29.41238 27.715015 +25.70111 23.40781 21.67976 20.166505 18.69847 17.31603 15.977195 14.468785 13.070195 +11.55694 10.069525 8.53689 7.065625 5.56529 4.19577 2.908615 0 0 +0 +174.408695 172.767855 179.47818 179.489485 165.471285 141.220445 115.71152 95.709745 79.947345 +69.614575 58.067325 49.042705 41.78974 36.591055 33.50156 31.28578 29.220195 27.495375 +25.211765 23.141335 21.545715 20.10675 18.75338 17.35156 16.03372 14.51562 13.118645 +11.60539 10.11636 8.599875 7.130225 5.625045 4.232915 2.934455 0 0 +0 +174.408695 172.909975 179.447495 178.6513 163.139225 137.88547 112.179515 93.27917 78.199915 +67.78155 56.080875 47.405095 40.680235 35.912755 33.0752 30.867495 28.96341 27.091625 +24.859695 22.966915 21.46335 20.143895 18.813135 17.47753 16.15646 14.64805 13.24623 +11.67968 10.21972 8.680625 7.18029 5.67834 4.278135 2.969985 0 0 +0 +174.408695 173.139305 179.970755 177.85026 160.4341 135.02692 109.924975 91.110225 77.014505 +65.945295 54.485255 46.096945 39.66117 35.463785 32.82972 30.54611 28.787375 26.823535 +24.42526 22.831255 21.458505 20.237565 18.890655 17.64872 16.264665 14.79986 13.338285 +11.797575 10.29401 8.751685 7.23843 5.73325 4.307205 2.995825 0 0 +0 +174.408695 173.071475 180.19847 176.521115 158.25385 132.2362 107.44918 89.33857 75.993825 +64.449805 52.99784 44.927685 38.7923 35.16824 32.744125 30.6527 28.819675 26.41817 +24.320285 22.85548 21.52472 20.32316 19.0247 17.766615 16.35672 14.91291 13.409345 +11.894475 10.373145 8.825975 7.307875 5.76878 4.33466 3.01682 0 0 +0 +174.408695 172.867985 180.46333 175.94456 156.314235 129.686115 105.2657 87.72357 75.150795 +63.254705 51.894795 44.181555 38.31103 35.29098 32.602005 30.88526 28.729235 26.054795 +24.36066 22.966915 21.642615 20.437825 19.152285 17.882895 16.41163 15.00012 13.4691 +11.99622 10.42321 8.88573 7.34502 5.815615 4.36696 3.03297 0 0 +0 +174.408695 172.968115 180.125795 174.931955 154.44568 127.386355 103.58287 86.03751 74.07359 +62.411675 51.384455 43.42735 38.13338 35.23607 32.63592 30.9111 28.44015 26.038645 +24.47371 23.067045 21.771815 20.567025 19.29925 17.957185 16.54406 15.085715 13.56277 +12.09312 10.51042 8.96971 7.391855 5.860835 4.394415 3.05235 0 0 +0 +174.408695 173.28627 180.15971 173.8063 152.98249 125.438665 102.208505 85.024905 73.51157 +61.80282 51.17612 43.06236 38.105925 35.16501 32.92339 30.83035 28.319025 25.980505 +24.517315 23.154255 21.952695 20.641315 19.400995 18.008865 16.661955 15.13901 13.658055 +12.17064 10.60086 9.044 7.472605 5.902825 4.426715 3.07496 0 0 +0 +174.408695 173.00526 180.31475 173.14738 151.5516 123.797825 101.15068 84.252935 72.912405 +61.75114 50.996855 42.608545 37.8233 34.969595 32.74897 30.73668 28.134915 25.88845 +24.568995 23.21724 22.05121 20.757595 19.48659 18.08477 16.72817 15.23591 13.780795 +12.22232 10.670305 9.090835 7.537205 5.93674 4.47032 3.086265 0 0 +0 +174.408695 173.44131 179.99821 172.276895 149.95275 122.51713 100.154225 83.836265 72.550645 +61.232725 50.61087 42.136965 37.55844 34.940525 32.602005 30.79159 28.012175 25.941745 +24.656205 23.286685 22.16426 20.83027 19.578645 18.13322 16.823455 15.31343 13.884155 +12.285305 10.757515 9.161895 7.60665 5.9755 4.488085 3.09757 0 0 +0 +174.408695 173.22813 180.219465 171.378955 148.47341 121.071705 99.278895 83.151505 72.38107 +61.003395 50.43645 41.927015 37.398555 34.830705 32.640765 30.69469 27.97826 25.86261 +24.649745 23.341595 22.18364 20.951395 19.62548 18.26565 16.849295 15.399025 13.9213 +12.36444 10.812425 9.21519 7.634105 6.01103 4.51231 3.11049 0 0 +0 +174.408695 173.55113 180.193625 170.946135 147.2557 119.82331 98.89614 82.822045 71.756065 +60.55281 50.08115 41.755825 37.556825 34.884 32.91047 30.521885 27.805455 25.896525 +24.48986 23.396505 22.188485 21.035375 19.659395 18.28503 16.87998 15.44586 13.96329 +12.39351 10.81404 9.249105 7.653485 6.03364 4.51231 3.12018 0 0 +0 +174.408695 173.139305 180.642595 170.65382 146.259245 118.99643 98.4827 82.53619 71.355545 +60.18136 50.01655 41.97385 37.679565 35.10687 33.060665 30.431445 27.847445 25.91752 +24.43818 23.41427 22.236935 21.05637 19.71592 18.318945 16.942965 15.44909 13.964905 +12.427425 10.835035 9.255565 7.66479 6.038485 4.522 3.121795 0 0 +0 +174.408695 173.50591 180.703965 170.3179 145.79574 118.22123 98.6119 82.14536 70.777375 +59.55151 50.024625 42.02553 37.640805 34.969595 32.83941 30.499275 27.695635 25.873915 +24.50278 23.377125 22.356445 21.09836 19.762755 18.34963 16.942965 15.470085 14.003665 +12.443575 10.86249 9.27656 7.679325 6.06917 4.53815 3.12664 0 0 +0 +174.408695 173.89351 180.962365 169.941605 145.24018 117.70443 98.65389 81.82882 70.26865 +59.369015 50.176435 42.107895 37.73609 34.80325 32.844255 30.525115 27.50668 25.780245 +24.48017 23.40135 22.40651 21.103205 19.80959 18.357705 16.99626 15.50077 14.029505 +12.44842 10.886715 9.30563 7.70678 6.07886 4.54138 3.131485 0 0 +0 +174.408695 173.807915 180.787945 170.032045 145.329005 117.612375 98.72172 81.55104 70.476985 +59.446535 50.31371 41.962545 37.8233 34.859775 32.76512 30.418525 27.43239 25.70434 +24.40911 23.42396 22.333835 21.112895 19.76437 18.377085 17.01887 15.518535 14.00851 +12.462955 10.87541 9.310475 7.705165 6.06917 4.54784 3.131485 0 0 +0 +`, +}; diff --git a/ies-lights/overhead.ts b/ies-lights/overhead.ts new file mode 100644 index 0000000..6585406 --- /dev/null +++ b/ies-lights/overhead.ts @@ -0,0 +1,29 @@ +export default { + name: "Overhead", + data: ` +IESNA:LM-63-1995 +[TEST]BALLABS TEST NO. 14061.0 +[MANUFAC] H.E. WILLIAMS, INC - CARTHAGE, MISSOURI +[LUMINAIRE] 8/54W T5HO LAMP 25x48"CABLE MOUNT LUMINAIRE +[MORE] MIRO4 SPECULAR REFLECTOR w/OPEN BOTTOM +[MORE] 2 UNIVERSAL BALLAST #B454PUNV-E WATTS=432 +[LUMCAT] HL-4-854T5H-MD-EB4/4-BD-UNV +[LAMPCAT] FP54T5HO/835 +TILT=NONE + 8 5000. 1.000000 19 5 1 1 2.083 4.000 .000 + 1.0000 1.0000 432.0000 + .0 5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 45.0 + 50.0 55.0 60.0 65.0 70.0 75.0 80.0 85.0 90.0 + .0 22.5 45.0 67.5 90.0 + 19229. 19192. 19185. 18789. 18134. 17000. 15662. 14433. 13163. 11892. + 10500. 8916. 7319. 5817. 4110. 2580. 1269. 327. 0. + 19229. 19239. 19253. 18898. 18188. 16905. 15184. 13505. 11443. 9375. + 7606. 5721. 4260. 3031. 2007. 1447. 1037. 396. 0. + 19229. 19140. 19267. 18557. 17041. 14788. 12139. 10050. 8097. 6603. + 5311. 4123. 3523. 3004. 2621. 1925. 1106. 368. 0. + 19229. 19168. 19090. 17820. 15280. 12808. 10091. 8466. 6854. 5739. + 4833. 4192. 3919. 3577. 2826. 1898. 1078. 300. 0. + 19229. 19182. 18980. 17451. 14652. 12139. 9613. 8042. 6513. 5624. + 4861. 4328. 4096. 3686. 2812. 1884. 1065. 259. 0. +`, +}; diff --git a/ies-lights/parallel-beam.ts b/ies-lights/parallel-beam.ts new file mode 100644 index 0000000..e8756a1 --- /dev/null +++ b/ies-lights/parallel-beam.ts @@ -0,0 +1,40 @@ +export default { + name: "Parallel beam", + data: ` +IESNA:LM-63-2002 +[TEST] 3907_1 +[TESTLAB] ERCO GmbH +[ISSUEDATE] 02-12-2008 +[MANUFAC] ERCO GmbH +[LUMCAT] 81051000 +[LUMINAIRE] Lightcast Directional luminaire +[LAMP] HIT-CE 70W +TILT=NONE +1 6600 1 19 7 1 2 -0.127 -0.127 0 +1.0 1.0 79 +0 5 10 15 20 25 30 35 40 45 50 55 60 +65 70 75 80 85 90 +0 15 30 45 60 75 90 +11501.82 8886.24 4579.74 2596.836 1430.154 810.546 487.8588 266.8446 163.6338 +108.933 71.247 41.349 20.0178 10.2234 0 0 0 0 +0 +11501.82 8992.5 4689.564 2685.144 1510.806 853.512 524.139 292.0962 171.7056 +113.3682 72.9366 43.0452 20.4006 10.0782 0 0 0 0 +0 +11501.82 9288.84 5057.58 2943.864 1719.432 987.162 595.7424 347.8464 193.71 +120.1464 74.7186 45.5994 22.1232 9.8736 0 0 0 0 +0 +11501.82 9724.44 5794.14 3453.186 2080.782 1230.108 722.238 427.614 235.719 +138.6726 83.4702 49.1502 24.0768 9.207 0 0 0 0 +0 +11501.82 10198.32 7048.8 4538.688 2758.668 1656.402 938.916 532.158 289.707 +157.3836 89.9844 53.1366 24.783 8.1642 0 0 0 0 +0 +11501.82 10580.46 8413.02 6409.458 4582.182 2761.044 1490.742 710.754 335.8674 +173.3754 96.4194 55.9944 26.4858 8.4678 0 0 0 0 +0 +11501.82 10746.12 9057.18 7549.74 6203.736 3923.898 1914.198 784.278 360.2148 +177.9558 99.2772 57.8556 27.5748 8.976 0 0 0 0 +0 +`, +}; diff --git a/ies-lights/pear.ts b/ies-lights/pear.ts new file mode 100644 index 0000000..19bc255 --- /dev/null +++ b/ies-lights/pear.ts @@ -0,0 +1,29 @@ +export default { + name: "Pear", + data: ` +IESNA:LM-63-1995 +[TEST]BALLABS TEST NO. 10495.0 +[MANUFAC] H.E. WILLIAMS, INC - CARTHAGE, MISSOURI +[LUMINAIRE] 1/150W ICETRON LAMP 2x2 DIRECT RECESSED LUMINAIRE +[LUMINAIRE] SPECULAR REFLECTOR w/PRISMATIC ACRYLIC PAT-12 LENS +[LUMINAIRE] SYLVANIA BALLAST #QT1x150/120-240 ICE WATTS=155 +[LUMCAT]CATALOG NO. : MPG-S22-1/150I LER +[LAMPCAT]LAMP CODE : ICE150/835 +TILT=NONE + 1 12000. 1.000000 19 5 1 1 1.688 1.677 .000 + 1.0000 1.0000 155.0000 + .0 5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 45.0 + 50.0 55.0 60.0 65.0 70.0 75.0 80.0 85.0 90.0 + .0 22.5 45.0 67.5 90.0 + 3962. 3933. 3802. 3619. 3384. 3120. 2804. 2463. 2013. 1517. + 1089. 770. 568. 415. 333. 270. 189. 79. 0. + 3962. 3912. 3776. 3603. 3409. 3178. 2885. 2522. 2071. 1569. + 1115. 784. 573. 429. 343. 266. 185. 73. 0. + 3962. 3918. 3798. 3612. 3402. 3195. 2919. 2615. 2199. 1693. + 1203. 843. 601. 449. 337. 265. 179. 85. 0. + 3962. 3901. 3765. 3603. 3418. 3210. 2932. 2592. 2147. 1660. + 1183. 818. 577. 428. 333. 261. 179. 69. 0. + 3962. 3920. 3792. 3613. 3430. 3266. 3056. 2776. 2335. 1816. + 1338. 927. 640. 453. 342. 271. 182. 68. 0. +`, +}; diff --git a/ies-lights/round.ts b/ies-lights/round.ts new file mode 100644 index 0000000..c2d7778 --- /dev/null +++ b/ies-lights/round.ts @@ -0,0 +1,41 @@ +export default { + name: "Round", + data: ` +IESNA:LM-63-1995 +[TEST]BALLABS TEST NO. 11781.0 +[MANUFAC] INFINITY LIGHTING INC - CARTHAGE, MISSOURI +[LUMINAIRE] 8/40W TWINTUBE CF 32"DIA PENDANT MNT AREALIGHT LUMINAIRE +[LUMINAIRE] ANODIZED BRIGHT DIP REFLECTOR w/DROP DISH PRISMATIC LENS +[LUMINAIRE] 4 ADVANCE BALLAST #ICF-2S42-M2-LD WATTS=272 +[LUMCAT] PHLB32-840LTT-120-EB-PM4 +[LAMPCAT] FT40W/2G11/RS/835 +TILT=NONE + 8 3150. 1.000000 37 5 1 1 2.458 2.458 .313 + 1.0000 1.0000 272.0000 + .0 5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 45.0 + 50.0 55.0 60.0 65.0 70.0 75.0 80.0 85.0 90.0 95.0 + 100.0 105.0 110.0 115.0 120.0 125.0 130.0 135.0 140.0 145.0 + 150.0 155.0 160.0 165.0 170.0 175.0 180.0 + .0 22.5 45.0 67.5 90.0 + 5346. 5309. 5200. 5021. 4791. 4524. 4225. 3887. 3570. 3251. + 2952. 2637. 2288. 1840. 1289. 837. 560. 367. 238. 146. + 86. 61. 65. 64. 44. 12. 0. 0. 0. 0. + 0. 0. 0. 0. 0. 0. 0. + 5346. 5298. 5201. 5021. 4794. 4525. 4230. 3922. 3598. 3288. + 2985. 2658. 2288. 1842. 1280. 873. 578. 376. 241. 141. + 82. 60. 67. 66. 44. 14. 0. 0. 0. 0. + 0. 0. 0. 0. 0. 0. 0. + 5346. 5314. 5229. 5080. 4875. 4660. 4405. 4119. 3828. 3552. + 3268. 2963. 2589. 2072. 1460. 1007. 683. 431. 254. 147. + 87. 66. 75. 76. 53. 19. 0. 0. 0. 0. + 0. 0. 0. 0. 0. 0. 0. + 5346. 5313. 5249. 5123. 4942. 4766. 4550. 4324. 4083. 3844. + 3586. 3278. 2878. 2273. 1640. 1110. 753. 462. 269. 153. + 92. 71. 82. 84. 60. 21. 0. 0. 0. 0. + 0. 0. 0. 0. 0. 0. 0. + 5346. 5331. 5272. 5162. 5007. 4849. 4662. 4456. 4248. 4036. + 3771. 3466. 3041. 2443. 1714. 1177. 793. 493. 285. 168. + 96. 71. 83. 85. 58. 20. 0. 0. 0. 0. + 0. 0. 0. 0. 0. 0. 0. +`, +}; diff --git a/ies-lights/scatter-light.ts b/ies-lights/scatter-light.ts new file mode 100644 index 0000000..71b0c4a --- /dev/null +++ b/ies-lights/scatter-light.ts @@ -0,0 +1,41 @@ +export default { + name: "Scatter light", + data: ` +IESNA:LM-63-2002 +[TEST]BALLABS TEST NO. 14353.0 +[TESTLAB] BUILDING ACOUSTICS & LIGHTING LABORATORIES, INC +[ISSUEDATE] 29-DEC-2008 +[MANUFAC] H.E. WILLIAMS, INC - CARTHAGE, MISSOURI +[LUMINAIRE] 1/250W ED28 PS MH LAMP 17x17x10"SQ AREA LUMINAIRE +[MORE] MIRO4 SPECULAR FORWARD THROW DISTRIBUTION REFLECTOR +[MORE] CLEAR FLAT GLASS LENS +[LUMCAT] OER1717-250PSMH120-TFT +[LAMPCAT] M153/E MH250W/H75/P +TILT=NONE +1 22000 1 25 21 1 1 1.11 1.11 0 +1 1 250 +0 5 10 15 20 25 30 35 40 45 50 55 60 62.5 65 67.5 70 72.5 75 77.5 80 82.5 85 87.5 90 +0 5 15 25 35 45 55 65 75 85 90 95 105 115 125 135 145 155 165 175 180 +2698.00 3943.00 5458.00 6672.00 6831.00 7214.00 7080.00 5916.00 5057.00 5401.00 5200.00 3823.00 4642.00 4546.00 3326.00 4307.00 4716.00 3352.00 2186.00 1024.00 164.00 33.00 1.00 0.00 0.00 +2698.00 3973.00 5563.00 7147.00 7067.00 7341.00 7279.00 6574.00 5462.00 5861.00 5381.00 3878.00 4745.00 4638.00 3478.00 4444.00 4903.00 3779.00 2312.00 1321.00 268.00 34.00 0.00 0.00 0.00 +2698.00 4247.00 5895.00 7809.00 7305.00 7481.00 7591.00 7469.00 5914.00 5507.00 5457.00 3972.00 4789.00 4514.00 3983.00 4291.00 4333.00 4226.00 3418.00 1555.00 301.00 33.00 0.00 0.00 0.00 +2698.00 3962.00 5992.00 8215.00 7325.00 7430.00 7666.00 6840.00 5236.00 4909.00 5078.00 4158.00 4647.00 4356.00 4229.00 3282.00 4660.00 3998.00 3538.00 1950.00 464.00 38.00 0.00 0.00 0.00 +2698.00 3718.00 5991.00 8093.00 7644.00 7666.00 7065.00 6385.00 6315.00 4905.00 5666.00 4104.00 4832.00 6475.00 4871.00 2674.00 5890.00 4150.00 5346.00 2833.00 702.00 47.00 1.00 0.00 0.00 +2698.00 3315.00 5882.00 7298.00 8906.00 7613.00 6407.00 6351.00 7849.00 5321.00 7181.00 4739.00 5685.00 4241.00 3129.00 2071.00 3098.00 3571.00 3435.00 2095.00 1203.00 271.00 0.00 0.00 0.00 +2698.00 3110.00 4667.00 6205.00 7897.00 8795.00 6483.00 7120.00 6544.00 5762.00 10333.00 2340.00 3481.00 3706.00 3439.00 2736.00 1690.00 2207.00 2514.00 1436.00 644.00 109.00 0.00 0.00 0.00 +2698.00 2701.00 3758.00 4788.00 6029.00 7687.00 8309.00 7108.00 5106.00 7821.00 3277.00 2142.00 2247.00 2162.00 2026.00 1480.00 1290.00 1412.00 387.00 543.00 182.00 117.00 0.00 0.00 0.00 +2698.00 2771.00 2944.00 4037.00 4601.00 4975.00 5264.00 3669.00 4336.00 7602.00 3156.00 3270.00 2701.00 2160.00 2660.00 1389.00 1533.00 1199.00 1021.00 224.00 180.00 54.00 0.00 0.00 0.00 +2698.00 2732.00 3015.00 3506.00 4038.00 3169.00 3471.00 2415.00 3423.00 7272.00 2935.00 1882.00 1764.00 1895.00 2225.00 1567.00 1584.00 1262.00 703.00 192.00 346.00 47.00 0.00 0.00 0.00 +2698.00 2743.00 3286.00 4036.00 4457.00 3456.00 2094.00 2262.00 4356.00 7484.00 3955.00 1670.00 1163.00 1062.00 943.00 857.00 701.00 465.00 189.00 78.00 56.00 6.00 0.00 0.00 0.00 +2698.00 2918.00 4025.00 5141.00 5140.00 3749.00 2006.00 1904.00 2552.00 2538.00 1859.00 1553.00 1125.00 1073.00 958.00 1141.00 672.00 478.00 182.00 64.00 25.00 0.00 0.00 0.00 0.00 +2698.00 3464.00 4778.00 5035.00 4629.00 3210.00 2471.00 2042.00 3098.00 2579.00 1434.00 1252.00 1146.00 1423.00 982.00 1008.00 1184.00 353.00 97.00 35.00 5.00 0.00 0.00 0.00 0.00 +2698.00 4025.00 4809.00 4376.00 3673.00 2601.00 1992.00 2043.00 1859.00 1968.00 2114.00 1492.00 1216.00 1066.00 686.00 354.00 220.00 95.00 53.00 17.00 4.00 0.00 0.00 0.00 0.00 +2698.00 4236.00 4435.00 3765.00 2559.00 2564.00 1816.00 1794.00 1815.00 1890.00 1660.00 1338.00 687.00 351.00 558.00 101.00 59.00 55.00 61.00 41.00 10.00 0.00 0.00 0.00 0.00 +2698.00 4418.00 4174.00 2760.00 2602.00 2238.00 1959.00 1846.00 1693.00 1664.00 1665.00 796.00 306.00 125.00 94.00 86.00 76.00 72.00 71.00 59.00 36.00 17.00 0.00 0.00 0.00 +2698.00 4391.00 3812.00 2473.00 2438.00 2231.00 2219.00 1983.00 1899.00 1760.00 889.00 331.00 130.00 166.00 309.00 301.00 94.00 58.00 47.00 34.00 21.00 7.00 0.00 0.00 0.00 +2698.00 4257.00 3531.00 2438.00 2319.00 2044.00 2167.00 2131.00 1947.00 1503.00 668.00 224.00 285.00 212.00 105.00 80.00 70.00 65.00 53.00 38.00 25.00 11.00 0.00 0.00 0.00 +2698.00 4110.00 3488.00 2406.00 2227.00 2084.00 2068.00 2015.00 1882.00 1212.00 589.00 195.00 283.00 276.00 162.00 109.00 105.00 90.00 82.00 50.00 35.00 19.00 5.00 0.00 0.00 +2698.00 4024.00 3228.00 2390.00 2172.00 2042.00 2014.00 1959.00 1846.00 1134.00 463.00 188.00 265.00 235.00 153.00 108.00 110.00 90.00 76.00 53.00 38.00 23.00 8.00 0.00 0.00 +2698.00 3931.00 3193.00 2575.00 2140.00 2066.00 1998.00 1956.00 1841.00 1186.00 544.00 205.00 274.00 230.00 167.00 112.00 115.00 93.00 76.00 56.00 41.00 25.00 9.00 0.00 0.00 +`, +}; diff --git a/ies-lights/soft-arrow.ts b/ies-lights/soft-arrow.ts new file mode 100644 index 0000000..f0c7b10 --- /dev/null +++ b/ies-lights/soft-arrow.ts @@ -0,0 +1,19 @@ +export default { + name: "Soft arrow", + data: ` +IESNA91 +[MANUFAC] Halo,Recessed +[LUMCAT] H7t-301 +[LUMINAIRE] Open Trim (75W R-30 Flood) +[LAMP] +[REPORT] +TILT=NONE +1 900.0 1.0 36 1 1 1 0.0 -0.32 0.0 +1.0 1.0 75.0 +0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 17.5 20.0 22.5 25.0 27.5 30.0 32.5 35.0 37.5 40.0 45.0 +50.0 55.0 60.0 65.0 70.0 75.0 80.0 85.0 90.0 +0.0 +1512.0 1516.0 1508.0 1487.0 1453.0 1409.0 1357.0 1294.0 1229.0 1158.0 1085.0 1008.0 934.0 862.0 795.0 727.0 578.0 459.0 368.0 +304.0 256.0 222.0 197.0 177.0 163.0 153.0 141.0 124.0 73.0 28.0 23.0 18.0 13.0 9.0 4.0 1.0 +`, +}; diff --git a/ies-lights/star-focused.ts b/ies-lights/star-focused.ts new file mode 100644 index 0000000..9706be6 --- /dev/null +++ b/ies-lights/star-focused.ts @@ -0,0 +1,53 @@ +export default { + name: "Star focused", + data: ` +IESNA91 +[TEST] NO. 12296 +[MANUFAC]LITHONIA - ESG MODEL HQM LAMPHEAD +[LUMCAT]ELA CDS N0606 +[LUMINAIRE]SPECULAR REFLECTOR WITH TRANSLUCENT PLASTIC LENS +[LAMP]ONE GE#939 INCANDESCENT WEDGE MINIATURE LAMP.. LUMEN RATING = 68 LMS. +[MORE]6 VOLTS DC OPERATING AT .9 AMPS AND 5.4 WATTS +[OTHER]LITHONIA- ESG LIGHTING +[MORE]DECATUR, GA +[OTHER]Version: 4/1/97 - 12:00:00 +TILT=NONE +1 +68 +1 +37 +5 +1 +1 +.33 +.33 +.00 +1 +1 +5.4000 +0,2.5,5,7.5,10,12.5,15,17.5,20,22.5,25,27.5,30,32.5,35,37.5 +40,42.5,45,47.5,50,52.5,55,57.5,60,62.5,65,67.5,70,72.5,75 +77.5,80,82.5,85,87.5,90 +0,22.5,45,67.5,90 +166,160,125,88,53,40,27,19,14,11 +9,7,7,6,6,5,5,5,5,4 +4,4,3,3,3,3,3,2,2,1 +1,1,1,1,0,0,0 +166,158,124,89,59,40,26,18,13,10 +8,7,6,6,5,5,5,5,4,4 +4,4,4,3,3,2,2,2,1,1 +1,1,1,0,0,0,0 +166,153,120,85,56,37,24,17,12,9 +8,7,6,5,5,5,5,4,4,4 +4,4,3,3,3,2,2,2,1,1 +1,1,1,0,0,0,0 +166,148,114,80,52,34,22,15,11,9 +7,6,6,6,5,5,5,4,4,4 +4,4,3,3,3,2,2,2,1,1 +1,1,1,0,0,0,0 +166,142,108,75,49,32,21,15,11,9 +7,6,6,6,5,5,5,5,4,4 +4,4,3,3,3,2,2,2,1,1 +1,1,1,0,0,0,0 +`, +}; diff --git a/ies-lights/three-lobe-umbrella.ts b/ies-lights/three-lobe-umbrella.ts new file mode 100644 index 0000000..5d3b473 --- /dev/null +++ b/ies-lights/three-lobe-umbrella.ts @@ -0,0 +1,21 @@ +export default { + name: "Three lobe umbrella", + data: ` +IESNA:LM-63-1995 +[TEST] 100071_0 BY: ERCO / LUM650 +[DATE]02.12.2004 +[MANUFAC] ERCO Leuchten GmbH +[LUMCAT] 22625000 +[LUMINAIRE] Lightcast Directional luminaire +[LAMPCAT] QPAR30 75W 30� +TILT=NONE +1 1234 1 37 1 1 2 -.097 0 0 +1.00 1.00 75 +0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120 +125 130 135 140 145 150 155 160 165 170 175 180 +0 +2400.1 2237.2 1869.5 1201.9 501.0 362.8 273.9 155.5 125.9 108.6 100.0 86.4 +50.6 28.4 18.5 11.1 10.4 4.9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 +0.0 0.0 0.0 0.0 0.0 0.0 0.0 +`, +}; diff --git a/ies-lights/three-lobe-vee.ts b/ies-lights/three-lobe-vee.ts new file mode 100644 index 0000000..2b2787f --- /dev/null +++ b/ies-lights/three-lobe-vee.ts @@ -0,0 +1,18 @@ +export default { + name: "Three lobe vee", + data: ` +IESNA:LM-63-1995 +[TEST] 100069_0 BY: ERCO / LUM650 +[DATE]02.12.2004 +[MANUFAC] ERCO Leuchten GmbH +[LUMCAT] 22619000_83671000 +[LUMINAIRE] Lightcast Downlight +[LAMPCAT] HIPAR-L30 70W 10� +TILT=NONE +1 4850 1 19 1 1 2 -.097 0 0 +1.00 1.00 70 +0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 +0 +68000 34008 6853 3982 936 582 543 514 349 189 92 58 44 34 0 0 0 0 0 +`, +}; diff --git a/ies-lights/tight-focused.ts b/ies-lights/tight-focused.ts new file mode 100644 index 0000000..2e76443 --- /dev/null +++ b/ies-lights/tight-focused.ts @@ -0,0 +1,37 @@ +export default { + name: "Tight focused", + data: ` +IESNA:LM-63-1995 +[TEST]BALLABS TEST NO. 13700.0 +[MANUFAC] INFINITY LIGHTING INC - CARTHAGE, MISSOURI +[LUMINAIRE] 1/175W CLEAR ED17 MH LAMP 16x16"DIRECT WALL MNT LUMINAIRE +[MORE] SEMI-SPECULAR REFLECTOR SYSTEMS w/BLACK BLADE BAFFLES +[MORE] .1875"THICK CLEAR TEMPERED GLASS LENS +[LUMCAT] WPSQ-MH-175-MED-120 +[LAMPCAT] M57 (M175/U/MED) +TILT=NONE + 1 12800. 1.000000 19 9 1 1 .943 .917 .000 + 1.0000 1.0000 175.0000 + .0 5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 45.0 + 50.0 55.0 60.0 65.0 70.0 75.0 80.0 85.0 90.0 + .0 22.5 45.0 67.5 90.0 112.5 135.0 157.5 180.0 + 25790. 25293. 19946. 12741. 6548. 3620. 2037. 1395. 1016. 765. + 587. 461. 338. 221. 19. 4. 0. 0. 0. + 25790. 24593. 19253. 12080. 6261. 3230. 1942. 1387. 1049. 590. + 231. 107. 49. 29. 9. 0. 0. 0. 0. + 25790. 24242. 18086. 10203. 4745. 2374. 1247. 460. 193. 91. + 54. 35. 10. 3. 2. 0. 0. 0. 0. + 25790. 23677. 17161. 9024. 3716. 1603. 608. 256. 142. 94. + 38. 10. 4. 6. 1. 0. 0. 0. 0. + 25790. 23467. 16339. 7925. 3242. 1304. 490. 249. 131. 90. + 29. 7. 4. 2. 1. 0. 0. 0. 0. + 25790. 22684. 15653. 7409. 3273. 1538. 520. 213. 113. 83. + 31. 7. 3. 4. 0. 0. 0. 0. 0. + 25790. 22633. 16005. 7769. 3449. 2045. 1312. 474. 147. 72. + 54. 45. 8. 2. 2. 0. 0. 0. 0. + 25790. 22392. 15298. 8244. 3996. 2118. 1372. 1090. 986. 833. + 486. 178. 62. 60. 7. 0. 0. 0. 0. + 25790. 23109. 15969. 8525. 3888. 2119. 1337. 1025. 835. 699. + 578. 473. 373. 251. 23. 7. 0. 0. 0. +`, +}; diff --git a/ies-lights/top-post.ts b/ies-lights/top-post.ts new file mode 100644 index 0000000..bd8fd1b --- /dev/null +++ b/ies-lights/top-post.ts @@ -0,0 +1,21 @@ +export default { + name: "Top post", + data: ` +IESNA:LM-63-2002 +[TEST]BALLABS TEST NO. 14501.0 +[TESTLAB] BUILDING ACOUSTICS & LIGHTING LABORATORIES, INC +[ISSUEDATE] 04-MAR-2009 +[MANUFAC] H.E. WILLIAMS, INC - CARTHAGE, MISSOURI +[LUMINAIRE] 1/100W CLEAR ED17PS MH HORIZ LAMP LS SERIES POST LUMINAIRE +[MORE] WHITE TOP REFLECTOR w/FROSTED GLASS CHIMNEY +[MORE] CLEAR ACRYLIC PANELS +[LUMCAT] HLSC15-100PSMH120-BLK +[LAMPCAT] M90 +TILT=NONE +1 9000 1 35 1 1 1 0.885 0.885 0.781 +1 1 100 +0 5 10 15 20 25 30 35 40 45 50 55 60 62.5 65 67.5 70 72.5 75 77.5 80 82.5 85 87.5 90 95 105 115 125 135 145 155 165 175 180 +0 +67.00 113.00 238.00 460.00 973.00 1277.00 1388.00 1425.00 1408.00 1338.00 1199.00 1018.00 700.00 430.00 320.00 335.00 227.00 209.00 154.00 137.00 125.00 109.00 91.00 65.00 46.00 38.00 25.00 18.00 10.00 5.00 3.00 3.00 0.00 0.00 0.00 +`, +}; diff --git a/ies-lights/trapezoid.ts b/ies-lights/trapezoid.ts new file mode 100644 index 0000000..9c759db --- /dev/null +++ b/ies-lights/trapezoid.ts @@ -0,0 +1,41 @@ +export default { + name: "Trapezoid", + data: ` +IESNA:LM-63-2002 +[TEST]BALLABS TEST NO. 14477.0 +[TESTLAB] BUILDING ACOUSTICS & LIGHTING LABORATORIES, INC +[ISSUEDATE] 11-FEB-2009 +[MANUFAC] H.E. WILLIAMS, INC - CARTHAGE, MISSOURI +[LUMINAIRE] 1/400W CLEAR ED37 PS MH 18x17x9"WALL PACK AREA LUMINAIRE +[MORE] HAMMERTONE REFLECTOR w/FLAT CLEAR GLASS LENS +[MORE] +[LUMCAT] WPTZ3-PSMH-400-MED-FD-120 +[LAMPCAT] M155/E MH400W/H75/P +TILT=NONE +1 40000 1 25 21 1 1 1.25 0.687 0 +1 1 400 +0 5 10 15 20 25 30 35 40 45 50 55 60 62.5 65 67.5 70 72.5 75 77.5 80 82.5 85 87.5 90 +0 5 15 25 35 45 55 65 75 85 90 95 105 115 125 135 145 155 165 175 180 +9079.00 7777.00 6697.00 6001.00 5457.00 5017.00 5081.00 5849.00 6929.00 7921.00 7361.00 6753.00 4769.00 2896.00 2672.00 2472.00 2192.00 1720.00 1336.00 960.00 568.00 152.00 0.00 0.00 0.00 +9079.00 7769.00 6681.00 6025.00 5425.00 5001.00 5057.00 5785.00 7089.00 8033.00 7569.00 6929.00 5697.00 3056.00 2712.00 2528.00 2224.00 1728.00 1400.00 1000.00 592.00 184.00 0.00 0.00 0.00 +9079.00 7833.00 6849.00 6121.00 5481.00 4977.00 4889.00 5633.00 6945.00 8305.00 7953.00 7009.00 6313.00 3784.00 2840.00 2576.00 2328.00 1888.00 1504.00 1056.00 648.00 224.00 0.00 0.00 0.00 +9079.00 7985.00 7001.00 6209.00 5465.00 4945.00 4680.00 5177.00 6281.00 7705.00 8033.00 6609.00 5681.00 4624.00 2296.00 1904.00 1616.00 1248.00 888.00 544.00 336.00 80.00 0.00 0.00 0.00 +9079.00 8129.00 7257.00 6329.00 5489.00 4793.00 4368.00 4456.00 4985.00 5345.00 4905.00 3936.00 3416.00 3248.00 2616.00 696.00 536.00 400.00 264.00 152.00 64.00 8.00 0.00 0.00 0.00 +9079.00 8281.00 7465.00 6505.00 5505.00 4737.00 4168.00 3896.00 3832.00 3744.00 3384.00 3136.00 2880.00 2176.00 1272.00 680.00 616.00 544.00 408.00 232.00 104.00 24.00 0.00 0.00 0.00 +9079.00 8529.00 7793.00 6825.00 5745.00 4753.00 4016.00 3528.00 3224.00 3048.00 3088.00 3184.00 2536.00 1624.00 1064.00 832.00 712.00 616.00 528.00 320.00 144.00 32.00 0.00 0.00 0.00 +9079.00 8689.00 8121.00 7353.00 6057.00 4969.00 4000.00 3456.00 3080.00 2864.00 2800.00 2800.00 2008.00 1512.00 1392.00 1200.00 928.00 616.00 440.00 272.00 136.00 40.00 0.00 0.00 0.00 +9079.00 8961.00 8577.00 7841.00 6721.00 5553.00 4352.00 3560.00 3096.00 2872.00 2688.00 2464.00 1360.00 1128.00 1120.00 1072.00 976.00 824.00 640.00 392.00 200.00 64.00 0.00 0.00 0.00 +9079.00 9089.00 8817.00 8161.00 7185.00 5953.00 4576.00 3664.00 3208.00 2992.00 2792.00 2472.00 1352.00 1048.00 1024.00 944.00 856.00 720.00 608.00 424.00 200.00 56.00 0.00 0.00 0.00 +9079.00 9297.00 9121.00 8609.00 7737.00 6641.00 5129.00 3840.00 3344.00 3168.00 2976.00 2544.00 1368.00 1032.00 936.00 808.00 712.00 608.00 472.00 328.00 176.00 48.00 0.00 0.00 0.00 +9079.00 9466.00 9401.00 8977.00 8161.00 7297.00 5513.00 3968.00 3448.00 3240.00 2848.00 2080.00 1224.00 1016.00 872.00 736.00 600.00 448.00 336.00 208.00 104.00 32.00 0.00 0.00 0.00 +9079.00 9666.00 9706.00 9313.00 8473.00 7369.00 5313.00 2864.00 1744.00 1352.00 1344.00 1264.00 1016.00 856.00 752.00 584.00 472.00 320.00 224.00 128.00 64.00 16.00 0.00 0.00 0.00 +9079.00 9874.00 10034.00 9642.00 8233.00 5769.00 3600.00 2352.00 1592.00 1256.00 1208.00 1240.00 904.00 696.00 536.00 384.00 272.00 168.00 104.00 56.00 24.00 0.00 0.00 0.00 0.00 +9079.00 10002.00 10210.00 9225.00 6513.00 4504.00 3880.00 3464.00 2496.00 1456.00 984.00 792.00 504.00 360.00 272.00 200.00 160.00 104.00 80.00 32.00 16.00 0.00 0.00 0.00 0.00 +9079.00 10162.00 10338.00 8361.00 5553.00 4721.00 4440.00 4256.00 3624.00 2056.00 768.00 456.00 280.00 200.00 160.00 120.00 96.00 56.00 40.00 16.00 8.00 0.00 0.00 0.00 0.00 +9079.00 10242.00 10226.00 7433.00 5529.00 5033.00 4897.00 4560.00 3376.00 1536.00 568.00 312.00 200.00 152.00 120.00 88.00 80.00 40.00 32.00 16.00 8.00 0.00 0.00 0.00 0.00 +9079.00 10330.00 9938.00 6873.00 5721.00 5409.00 5177.00 4352.00 2552.00 1032.00 544.00 360.00 248.00 176.00 136.00 96.00 72.00 40.00 32.00 24.00 8.00 0.00 0.00 0.00 0.00 +9079.00 10234.00 9794.00 6873.00 5913.00 5641.00 5273.00 4016.00 2120.00 1120.00 736.00 552.00 384.00 280.00 184.00 112.00 80.00 48.00 40.00 24.00 8.00 0.00 0.00 0.00 0.00 +9079.00 10242.00 9794.00 6825.00 5985.00 5777.00 5313.00 4000.00 2104.00 1160.00 840.00 640.00 456.00 320.00 232.00 152.00 104.00 56.00 48.00 24.00 16.00 0.00 0.00 0.00 0.00 +9079.00 10298.00 9666.00 6905.00 6097.00 5849.00 5401.00 4152.00 2128.00 1248.00 904.00 720.00 488.00 352.00 248.00 168.00 120.00 64.00 48.00 32.00 24.00 8.00 0.00 0.00 0.00 +`, +}; diff --git a/ies-lights/umbrella.ts b/ies-lights/umbrella.ts new file mode 100644 index 0000000..fe7ef3f --- /dev/null +++ b/ies-lights/umbrella.ts @@ -0,0 +1,29 @@ +export default { + name: "Umbrella", + data: ` +IESNA:LM-63-1995 +[TEST]BALLABS TEST NO. 12447.0 +[MANUFAC] INFINITY LIGHTING INC - CARTHAGE, MISSOURI +[LUMINAIRE] 1/100W ICETRON INDUCTION LAMP 20x15"AREALIGHT LUMINAIRE +[LUMINAIRE] MIRO4 HIGHLY SPEC FLOOD OPTICS w/CLEAR GLASS LENS +[LUMINAIRE] SYLVANIA BALLAST #QT1x150 ICE/UNV-T WATTS=145 +[LUMCAT] ICE DC-150W/41K-FL/CGI-MTV @277VOLTS +[LAMPCAT] ICETRON100/QT150 +TILT=NONE + 1 11000. 1.000000 19 5 1 1 .938 1.266 .000 + 1.0000 1.0000 145.0000 + .0 5.0 10.0 15.0 20.0 25.0 30.0 35.0 40.0 45.0 + 50.0 55.0 60.0 65.0 70.0 75.0 80.0 85.0 90.0 + .0 22.5 45.0 67.5 90.0 + 5122. 5161. 5246. 5337. 5360. 5211. 4910. 4510. 3890. 3056. + 1952. 1153. 451. 139. 30. 15. 3. 0. 0. + 5122. 5138. 5234. 5291. 5289. 5129. 4754. 4318. 3676. 2838. + 2069. 1240. 482. 172. 37. 11. 6. 1. 0. + 5122. 5134. 5160. 5118. 4967. 4781. 4477. 3831. 2940. 1851. + 1139. 685. 306. 85. 25. 13. 7. 1. 0. + 5122. 5119. 5076. 4880. 4697. 4385. 3786. 2876. 1738. 1121. + 711. 388. 120. 30. 11. 6. 4. 1. 0. + 5122. 5113. 5032. 4843. 4615. 4130. 3464. 2374. 1519. 1017. + 589. 293. 73. 27. 11. 6. 3. 1. 0. +`, +}; diff --git a/ies-lights/x-arrow-diffuse.ts b/ies-lights/x-arrow-diffuse.ts new file mode 100644 index 0000000..130e448 --- /dev/null +++ b/ies-lights/x-arrow-diffuse.ts @@ -0,0 +1,18 @@ +export default { + name: "X arrow diffuse", + data: ` +IESNA:LM-63-1995 +[TEST] BE1396 +[DATE] 22-SEPT-96 +[MANUFAC] BEGA +[LUMCAT] 6690 +[LUMINAIRE] SURFACE MOUNTED WALL LUMINAIRE +[LAMP] (1) 100W A-19 INC +TILT=NONE + 1 1750 1.75 37 1 1 2 -.12 0 0 + 1 1 100 + 0 2.5 5 7.5 10 12.5 15 17.5 20 22.5 25 27.5 30 32.5 35 37.5 40 42.5 45 47.5 50 52.5 55 57.5 60 62.5 65 67.5 70 72.5 75 77.5 80 82.5 85 87.5 90 + 0 + 283.4 280.7 270 250.8 228 207.8 185.8 160.1 140.4 133 131.4 131.4 130.9 127.9 120.7 109.3 99.46 95.13 98.4 106.8 116 122.2 124.1 119.1 97.99 57.94 26.92 11.71 4.582 1.544 .9573 .6497 .4341 .2616 .1724 .04603 .005727 +`, +}; diff --git a/ies-lights/x-arrow-soft.ts b/ies-lights/x-arrow-soft.ts new file mode 100644 index 0000000..0104747 --- /dev/null +++ b/ies-lights/x-arrow-soft.ts @@ -0,0 +1,18 @@ +export default { + name: "X arrow soft", + data: ` +IESNA:LM-63-1995 +[TEST] BE1667 +[DATE] 12-FEB-96 +[MANUFAC] BEGA +[LUMCAT] 6339 +[LUMINAIRE] SURFACE MOUNTED WALL LUMINAIRE +[LAMP] (1) 60W A-19 INC +TILT=NONE + 1 890 .89 73 1 1 2 -.1 0 0 + 1 1 60 + 0 2.5 5 7.5 10 12.5 15 17.5 20 22.5 25 27.5 30 32.5 35 37.5 40 42.5 45 47.5 50 52.5 55 57.5 60 62.5 65 67.5 70 72.5 75 77.5 80 82.5 85 87.5 90 92.5 95 97.5 100 102.5 105 107.5 110 112.5 115 117.5 120 122.5 125 127.5 130 132.5 135 137.5 140 142.5 145 147.5 150 152.5 155 157.5 160 162.5 165 167.5 170 172.5 175 177.5 180 + 0 + 178.4 176.7 170.8 160.9 147 133 114.6 96.13 80.57 67.13 56.54 47.61 40.87 36.97 36.86 39.76 45.47 54.35 66.39 75.84 79.96 73.53 62.87 52.35 44.33 39.14 36.31 33.87 29.1 22.59 15.67 9.13 5.317 2.654 1.382 .3416 .2 .09695 .2025 .175 .1518 .1455 .1328 .1307 .1139 .1097 .097 .1075 .1076 .07175 .1243 .1073 .1328 .1349 .1391 .1307 .1412 .1475 .156 .1813 .1876 .2087 .2466 .2466 .2782 .2993 .3035 .3035 .3035 .2993 .2993 .3035 .3035 +`, +}; diff --git a/ies-lights/x-arrow.ts b/ies-lights/x-arrow.ts new file mode 100644 index 0000000..120f59c --- /dev/null +++ b/ies-lights/x-arrow.ts @@ -0,0 +1,18 @@ +export default { + name: "X arrow", + data: ` +IESNA:LM-63-1995 +[TEST] BE1680 +[DATE] 12-FEB-96 +[MANUFAC] BEGA +[LUMCAT] 6340 +[LUMINAIRE] SURFACE MOUNTED WALL LUMINAIRE +[LAMP] (1) 100W A-19 INC +TILT=NONE + 1 1750 1.75 73 1 1 2 -.1 0 .05 + 1 1 100 + 0 2.5 5 7.5 10 12.5 15 17.5 20 22.5 25 27.5 30 32.5 35 37.5 40 42.5 45 47.5 50 52.5 55 57.5 60 62.5 65 67.5 70 72.5 75 77.5 80 82.5 85 87.5 90 92.5 95 97.5 100 102.5 105 107.5 110 112.5 115 117.5 120 122.5 125 127.5 130 132.5 135 137.5 140 142.5 145 147.5 150 152.5 155 157.5 160 162.5 165 167.5 170 172.5 175 177.5 180 + 0 + 167.3 168.9 173 179.9 179.2 151.2 119.4 95.63 81.03 71.95 66.46 62.67 60.25 57.67 52.18 46.62 48.91 63.15 83.15 95.41 97.4 87.75 62.6 43.08 39.26 47.36 52.89 45.74 31.45 18.17 10.5 7.888 8.112 7.592 3.665 .6467 .498 .4252 .3735 .3185 .2765 .2279 .2199 .2021 .1746 .1407 .1358 .1277 .1326 .1342 .1406 .1374 .1358 .1375 .1488 .1488 .1536 .1925 .2183 .2328 .2345 .249 .2765 .3023 .3266 .3476 .3557 .3638 .3541 .3573 .3638 .3719 .3816 +`, +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5e39f77 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4109 @@ +{ + "name": "iesna", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "iesna", + "version": "0.0.0", + "license": "MIT", + "devDependencies": { + "canvas": "^2.11.2", + "eslint": "^9.12.0", + "eslint-config-prettier": "^9.1.0", + "jsdom": "^25.0.1", + "prettier": "^3.2.5", + "rollup-plugin-dts": "^6.1.1", + "typescript": "^5.5.4", + "typescript-eslint": "^8.9.0", + "vite": "^5.4.9", + "vitest": "^2.1.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.10.0.tgz", + "integrity": "sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/type-utils": "8.10.0", + "@typescript-eslint/utils": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.10.0.tgz", + "integrity": "sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/typescript-estree": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.10.0.tgz", + "integrity": "sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.10.0.tgz", + "integrity": "sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.10.0", + "@typescript-eslint/utils": "8.10.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz", + "integrity": "sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.10.0.tgz", + "integrity": "sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/typescript-estree": "8.10.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz", + "integrity": "sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.10.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitest/expect": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz", + "integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.3", + "@vitest/utils": "2.1.3", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz", + "integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.3", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.11" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/spy": "2.1.3", + "msw": "^2.3.5", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz", + "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz", + "integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.3", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz", + "integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.3", + "magic-string": "^0.30.11", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz", + "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz", + "integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/canvas": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.17.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "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/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssstyle": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", + "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.7.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", + "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.12.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "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-glob/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==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true, + "license": "ISC" + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/jsdom/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", + "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-dts": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.1.1.tgz", + "integrity": "sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==", + "dev": true, + "license": "LGPL-3.0-only", + "dependencies": { + "magic-string": "^0.30.10" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/Swatinem" + }, + "optionalDependencies": { + "@babel/code-frame": "^7.24.2" + }, + "peerDependencies": { + "rollup": "^3.29.4 || ^4", + "typescript": "^4.5 || ^5.0" + } + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "dev": true, + "license": "MIT", + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "6.1.52", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.52.tgz", + "integrity": "sha512-fgrDJXDjbAverY6XnIt0lNfv8A0cf7maTEaZxNykLGsLG7XP+5xhjBTrt/ieAsFjAlZ+G5nmXomLcZDkxXnDzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.52" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.52", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.52.tgz", + "integrity": "sha512-j4OxQI5rc1Ve/4m/9o2WhWSC4jGc4uVbCINdOEJRAraCi0YqTqgMcxUx7DbmuP0G3PCixoof/RZB0Q5Kh9tagw==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.10.0.tgz", + "integrity": "sha512-YIu230PeN7z9zpu/EtqCIuRVHPs4iSlqW6TEvjbyDAE3MZsSl2RXBo+5ag+lbABCG8sFM1WVKEXhlQ8Ml8A3Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.10.0", + "@typescript-eslint/parser": "8.10.0", + "@typescript-eslint/utils": "8.10.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz", + "integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.6", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz", + "integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.3", + "@vitest/mocker": "2.1.3", + "@vitest/pretty-format": "^2.1.3", + "@vitest/runner": "2.1.3", + "@vitest/snapshot": "2.1.3", + "@vitest/spy": "2.1.3", + "@vitest/utils": "2.1.3", + "chai": "^5.1.1", + "debug": "^4.3.6", + "magic-string": "^0.30.11", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.3", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.3", + "@vitest/ui": "2.1.3", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "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": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1d2a0f5 --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "iesna", + "version": "0.0.0", + "author": "Richard Viney", + "license": "MIT", + "repository": "github:richard-viney/iesna", + "type": "module", + "files": [ + "dist", + "src", + "LICENSE.md", + "README.md" + ], + "main": "dist/index.js", + "types": "dist/index.d.ts", + "publishConfig": { + "access": "public" + }, + "scripts": { + "dev": "vite", + "format": "prettier --write \"**/*.js\" \"**/*.ts\"", + "format:check": "prettier --check \"**/*.js\" \"**/*.ts\"", + "lint": "eslint src", + "prepare": "tsc", + "test": "vitest" + }, + "devDependencies": { + "canvas": "^2.11.2", + "eslint": "^9.12.0", + "eslint-config-prettier": "^9.1.0", + "jsdom": "^25.0.1", + "prettier": "^3.2.5", + "rollup-plugin-dts": "^6.1.1", + "typescript": "^5.5.4", + "typescript-eslint": "^8.9.0", + "vite": "^5.4.9", + "vitest": "^2.1.3" + } +} diff --git a/src/ies-data.ts b/src/ies-data.ts new file mode 100644 index 0000000..88a0e22 --- /dev/null +++ b/src/ies-data.ts @@ -0,0 +1,38 @@ +/** + * Describes IES data that has been loaded from an IES document. + */ +export interface IesData { + version: string; // IES version string + + headers: Record; // IES headers + + tilt: string; // IES tilt string + + lamp: { + lampCount: number; + lumensPerLamp: number; + multiplier: number; // Candela multiplying factor + }; + + units: number; // (1) Feet | (2) Meters + + // Luminous cavity dimensions + dim: { + width: number; // Opening width + length: number; // Opening length + height: number; // Cavity height + }; + + electricalData: { + ballastFactor: number; + ballastLampPhotometricFactor: number; + inputWatts: number; + }; + + photometricData: { + goniometerType: number; // (3) TypeA | (2) TypeB | (1) TypeC + verticalAngles: number[]; + horizontalAngles: number[]; + candela: number[][]; // Candela values + }; +} diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..de75f7b --- /dev/null +++ b/src/index.ts @@ -0,0 +1,4 @@ +export type { IesData } from "./ies-data"; +export { parse } from "./parse"; +export { renderToCanvas } from "./render"; +export { sample } from "./sample"; diff --git a/src/parse.ts b/src/parse.ts new file mode 100644 index 0000000..42ae69c --- /dev/null +++ b/src/parse.ts @@ -0,0 +1,252 @@ +import type { IesData } from "./ies-data"; + +function removeLeadingBlankLines(lines: string[]): void { + while (lines.length > 0 && lines[0].trim() === "") { + lines.shift(); + } +} + +function readDocumentVersion(lines: string[]): string { + const version = lines.shift()?.trim(); + + if (version === undefined) { + throw Error("iesna: failed reading document version"); + } + + return version; +} + +function readDocumentHeaders(lines: string[]): Record { + const headers: Record = {}; + + while (lines.length > 0) { + const result = /^\[(.*)\](.*)$/g.exec(lines[0]); + if (result === null) { + break; + } + + lines.shift(); + + const header = result[1].trim(); + const value = result[2].trim(); + + headers[header] = value; + } + + return headers; +} + +function readDocumentTilt(lines: string[]): string { + const result = /TILT\s*=\s*(.*)/.exec(lines[0]); + + if (result === null) { + throw Error("iesna: missing TILT value"); + } + + lines.shift(); + + return result[1].trim(); +} + +function readDocumentCandelaValues(lines: string[]): number[] { + const buffer = []; + + while (true) { + const line = lines.shift(); + if (line === undefined) { + break; + } + + const elements = line + .replace(/(\t|,)/g, " ") + .split(" ") + .map((n) => n.trim()) + .filter((n) => n.length > 0); + + for (const element of elements) { + const value = Number(element); + if (isNaN(value)) { + throw Error(`iesna: non-numeric candela value "${element}"`); + } + + buffer.push(value); + } + } + + return buffer; +} + +interface IesDocument { + version: string; + headers: Record; + tilt: string; + values: number[]; +} + +function readDocument(source: string): IesDocument { + const lines = source.replace(/\r\n/g, "\n").split("\n"); + removeLeadingBlankLines(lines); + + const version = readDocumentVersion(lines); + const headers = readDocumentHeaders(lines); + const tilt = readDocumentTilt(lines); + const values = readDocumentCandelaValues(lines); + + return { version, headers, tilt, values }; +} + +function parseIesData(document: IesDocument): IesData { + function getNextValue(): number { + const value = document.values.shift(); + + if (value === undefined) { + throw Error("iesna: parsing document found too few values"); + } + + return value; + } + + const lamp = { + lampCount: getNextValue(), + lumensPerLamp: getNextValue(), + multiplier: getNextValue(), + }; + + const verticalAngleCount = getNextValue(); + const horizontalAngleCount = getNextValue(); + + const photometricData = { + goniometerType: getNextValue(), + verticalAngles: [], + horizontalAngles: [], + candela: [], + }; + + const units = getNextValue(); + + const dim = { + width: getNextValue(), + length: getNextValue(), + height: getNextValue(), + }; + + const electricalData = { + ballastFactor: getNextValue(), + ballastLampPhotometricFactor: getNextValue(), + inputWatts: getNextValue(), + }; + + const data: IesData = { + version: document.version, + headers: document.headers, + tilt: document.tilt, + lamp, + photometricData, + units, + dim, + electricalData, + }; + + // Unpack vertical angles + for (let i = 0; i < verticalAngleCount; i++) { + data.photometricData.verticalAngles.push(getNextValue()); + } + + // Unpack horizontal angles + for (let i = 0; i < horizontalAngleCount; i++) { + data.photometricData.horizontalAngles.push(getNextValue()); + } + + // Unpack candela values + for (let i = 0; i < horizontalAngleCount; i++) { + data.photometricData.candela.push([]); + for (let j = 0; j < verticalAngleCount; j++) { + data.photometricData.candela[i].push(getNextValue()); + } + } + + return data; +} + +// Standardizes IES data that has no horizontal sweep by repeating samples. +function standardizeHorizontalAngles0(data: IesData): void { + data.photometricData.horizontalAngles = [ + 0, 22.5, 45, 67.5, 90, 112.5, 135, 157.5, 180, 202.5, 225, 247.5, 270, + 292.5, 315, 337.5, 360, + ]; + + if (data.photometricData.candela.length === 0) { + throw Error("iesna: incomplete candela data"); + } + + const array = data.photometricData.candela[0]; + + for (let i = 1; i < data.photometricData.horizontalAngles.length; i++) { + data.photometricData.candela.push(array); + } +} + +// Standardizes IES data that has a 90 degree horizontal sweep by repeating +// samples. +function standardizeHorizontalAngles90(data: IesData): void { + data.photometricData.horizontalAngles = [ + ...data.photometricData.horizontalAngles, + ...data.photometricData.horizontalAngles.map((angle) => angle + 90), + ...data.photometricData.horizontalAngles.map((angle) => angle + 180), + ...data.photometricData.horizontalAngles.map((angle) => angle + 270), + ]; + + data.photometricData.candela = [ + ...data.photometricData.candela, + ...data.photometricData.candela.reverse(), + ...data.photometricData.candela, + ...data.photometricData.candela.reverse(), + ]; +} + +// Standardizes IES data that has a 180 degree horizontal sweep by repeating +// samples. +function standardizeHorizontalAngles180(data: IesData): void { + data.photometricData.horizontalAngles = [ + ...data.photometricData.horizontalAngles, + ...data.photometricData.horizontalAngles.map((angle) => angle + 180), + ]; + + data.photometricData.candela.push(...data.photometricData.candela.reverse()); +} + +// Some IES documents contain incomplete horizontal angles. This includes +// documents that only sweep 90 degrees horizontal and others that only contain +// a single horizontal sweep. This function standardizes the passed IES document +// to include a complete 360 degree horizontal sweep. +function standardizeHorizontalAngles(data: IesData): void { + const lastHorizontalAngle = + data.photometricData.horizontalAngles[ + data.photometricData.horizontalAngles.length - 1 + ]; + + if (lastHorizontalAngle === 0) { + standardizeHorizontalAngles0(data); + } else if (lastHorizontalAngle === 90) { + standardizeHorizontalAngles90(data); + } else if (lastHorizontalAngle === 180) { + standardizeHorizontalAngles180(data); + } else if (lastHorizontalAngle !== 360) { + throw Error( + `iesna: final horizontal angle is ${lastHorizontalAngle}, expect 0/90/180/360`, + ); + } +} + +/** + * Parses the given IES document into an IesData object. Throws an exception if + * an error occurs. + */ +export function parse(source: string): IesData { + const iesDocument = readDocument(source); + const iesData = parseIesData(iesDocument); + + standardizeHorizontalAngles(iesData); + + return iesData; +} diff --git a/src/render.ts b/src/render.ts new file mode 100644 index 0000000..930c12e --- /dev/null +++ b/src/render.ts @@ -0,0 +1,55 @@ +import type { IesData } from "./ies-data"; +import { sample } from "./sample"; + +/** + * Renders IESNA data into an HTML canvas. The entire canvas is rendered into by + * this function. The distance parameter sets the distance from the plane of the + * samples being taken. + */ +export function renderToCanvas({ + iesData, + canvas, + distance = 1, + zoom = 1, + convertSampleToRGB = (value: number): [number, number, number] => [ + value, + value, + value, + ], +}: { + iesData: IesData; + canvas: HTMLCanvasElement; + distance?: number; + zoom?: number; + convertSampleToRGB?: (value: number) => [number, number, number]; +}): void { + const context = canvas.getContext("2d"); + if (context === null) { + throw Error("iesna: renderToCanvas() failed getting context for canvas"); + } + + const width = canvas.width; + const height = canvas.height; + const imageData = context.getImageData(0, 0, width, height); + + for (let y = 0; y < height; y++) { + for (let x = 0; x < width; x++) { + const s = sample({ + iesData, + x: (x - width / 2 - 0.5) / zoom, + y: (y - height / 2 - 0.5) / zoom, + z: distance, + }); + + const [r, g, b] = convertSampleToRGB(s); + + const index = (y * width + x) * 4; + imageData.data[index] = Math.min(r * 255, 255); + imageData.data[index + 1] = Math.min(g * 255, 255); + imageData.data[index + 2] = Math.min(b * 255, 255); + imageData.data[index + 3] = 255; + } + } + + context.putImageData(imageData, 0, 0); +} diff --git a/src/sample.ts b/src/sample.ts new file mode 100644 index 0000000..6238a03 --- /dev/null +++ b/src/sample.ts @@ -0,0 +1,99 @@ +import type { IesData } from "./ies-data"; + +function linearInterpolate(a: number, b: number, t: number): number { + return a + (b - a) * t; +} + +function radiansToDegrees(radians: number): number { + return (radians * 180) / Math.PI; +} + +/** + * Returns the light intensity in the IES volume at the given coordinate + * relative to the light. The resulting intensity is found by bilinear + * interpolation of nearby samples. + */ +export function sample({ + iesData, + x, + y, + z, +}: { + iesData: IesData; + x: number; + y: number; + z: number; +}): number { + // Convert cartesian coordinate to polar coordinates + const distance = Math.sqrt(x * x + y * y + z * z); + const azimuth = radiansToDegrees(Math.atan2(z, x)) + 180; + const inclination = radiansToDegrees(Math.acos(y / distance)); + + // Find the horizontal index to use + let horizontalIndex: number | undefined = undefined; + for ( + let i = 0; + i < iesData.photometricData.horizontalAngles.length - 1; + i++ + ) { + if ( + azimuth >= iesData.photometricData.horizontalAngles[i] && + azimuth < iesData.photometricData.horizontalAngles[i + 1] + ) { + horizontalIndex = i; + break; + } + } + + // Find the vertical index to use + let verticalIndex: number | undefined = undefined; + for (let i = 0; i < iesData.photometricData.verticalAngles.length - 1; i++) { + if ( + inclination >= iesData.photometricData.verticalAngles[i] && + inclination < iesData.photometricData.verticalAngles[i + 1] + ) { + verticalIndex = i; + break; + } + } + + // Check for out of range + if (horizontalIndex === undefined || verticalIndex === undefined) { + return 0; + } + + // Get the four samples to use for bilinear interpolation + const a = iesData.photometricData.candela[horizontalIndex][verticalIndex]; + const b = iesData.photometricData.candela[horizontalIndex + 1][verticalIndex]; + const c = iesData.photometricData.candela[horizontalIndex][verticalIndex + 1]; + const d = + iesData.photometricData.candela[horizontalIndex + 1][verticalIndex + 1]; + + // Calculate fractions in each direction between the relevant samples + const horizontalFraction = + (azimuth - iesData.photometricData.horizontalAngles[horizontalIndex]) / + (iesData.photometricData.horizontalAngles[horizontalIndex + 1] - + iesData.photometricData.horizontalAngles[horizontalIndex]); + const verticalFraction = + (inclination - iesData.photometricData.verticalAngles[verticalIndex]) / + (iesData.photometricData.verticalAngles[verticalIndex + 1] - + iesData.photometricData.verticalAngles[verticalIndex]); + + // Sample candela value, with bilinear interpolation + const rawSample = linearInterpolate( + linearInterpolate(a, b, horizontalFraction), + linearInterpolate(c, d, horizontalFraction), + verticalFraction, + ); + + // Calculate attenuation + const attenuation = 1.0 / (distance * distance); + + return ( + rawSample * + iesData.lamp.multiplier * + iesData.electricalData.ballastFactor * + iesData.electricalData.ballastLampPhotometricFactor * + attenuation + ); +} diff --git a/test/iesna.test.ts b/test/iesna.test.ts new file mode 100644 index 0000000..56594af --- /dev/null +++ b/test/iesna.test.ts @@ -0,0 +1,21 @@ +import { createCanvas } from "canvas"; +import { describe, it } from "vitest"; +import IesLights from "../ies-lights"; +import * as IESNA from "../src"; + +describe("IESNA", () => { + it("parses all test documents", () => { + for (const light of IesLights) { + IESNA.parse(light.data); + } + }); + + it("renders all test documents", () => { + const canvas = createCanvas(100, 100) as unknown as HTMLCanvasElement; + + for (const light of IesLights) { + const iesData = IESNA.parse(light.data); + IESNA.renderToCanvas({ iesData, canvas }); + } + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6bce133 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "include": ["src/index.ts"], + + "compilerOptions": { + "outDir": "dist", + + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "node", + + "declaration": true, + + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmitOnError": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true + } +} diff --git a/vendor/iesna-c/ies_read.c b/vendor/iesna-c/ies_read.c new file mode 100644 index 0000000..9d6e356 --- /dev/null +++ b/vendor/iesna-c/ies_read.c @@ -0,0 +1,360 @@ +/* + ************************************************************************* + * + * IES_READ.C - IESNA LM-63 Photometric Data Test Module + * + * Version: 1.00D + * + * History: 95/08/15 - Created. + * 95/08/29 - Version 1.00A release. + * 95/08/03 - Revised photmetric data display. + * 95/09/04 - Version 1.00B release. + * 96/01/29 - Added PhotoData and PhotoCalc global data + * structures. + * - Revised DisplayPhotoData function. + * 96/01/30 - Version 1.00C release. + * 98/03/09 - Version 1.00D release. + * + * Compilers: Any ANSI C-compliant compiler + * + * Author: Ian Ashdown, P. Eng. + * byHeart Consultants Limited + * 620 Ballantree Road + * West Vancouver, B.C. + * Canada V7S 1W3 + * Tel. (604) 922-6148 + * Fax. (604) 987-7621 + * + * Copyright 1995-1998 byHeart Consultants Limited + * + * Permission: The following source code is copyrighted. However, it may + * be freely copied, redistributed, and modified for personal + * use or for royalty-free inclusion in commercial programs. + * + ************************************************************************* + */ + +#include +#include +#include "iesna.h" + +static IE_DATA PhotoData; +static IE_CALC PhotoCalc; + +static void DisplayPhotoData( BOOL ); + +/* + ************************************************************************* + * + * main - Executive Function + * + * Purpose: Executive function to demonstrate use of IESNA LM-63 + * Photometric Data Module functions. + * + * Setup: int main + * ( + * int argc, + * char **argv; + * ) + * + * Usage: ies_read + * + * Where: file is the file name of an IESNA LM-63 standard photo- + * metric data file. + * + ************************************************************************* + */ + +int main( int argc, char **argv ) +{ + BOOL status; + + /* Read IESNA photometric data file */ + status = IE_ReadFile(argv[1], &PhotoData); + + if (status == TRUE) + { + /* Calculate additional photometric data */ + status = IE_CalcData(&PhotoData, &PhotoCalc); + + DisplayPhotoData(status); /* Display photometric data */ + IE_Flush(&PhotoData); /* Release photometric data memory */ + + return 0; + } + else + return 2; +} + +/* + ************************************************************************* + * + * DisplayPhotoData - Display Photometric Data + * + * Purpose: To display the photometric data + * + * Setup: static void DisplayPhotoData + * ( + * BOOL calc_flag + * ) + * + * Where: calc_flag is a Boolean flag which if TRUE indicates that + * the calculated photometric data is valid. + * + ************************************************************************* + */ + +static void DisplayPhotoData( BOOL calc_flag ) +{ + struct IE_Label *plabel; + int vert; + int horz; + int i, j, k; + + /* Display file information */ + puts(" Ledalite IES Photometric Data File Utility"); + puts(" ------------------------------------------"); + puts(" Version 1.00C\n"); + puts("Photometric Data File Information"); + puts("---------------------------------"); + printf("File name: %s\n", + PhotoData.file.name); + printf("File format: "); + if (PhotoData.file.format == IESNA_86) + printf("%s\n", "LM-63-1986"); + else if (PhotoData.file.format == IESNA_91) + printf("%s\n", "LM-63-1991"); + else + printf("%s\n", "LM-63-1995"); + printf("TILT file name = %s\n\n", PhotoData.lamp.tilt_fname); + + /* Display label lines */ + puts("Luminaire Description"); + puts("---------------------"); + plabel = PhotoData.plline; + while (plabel) + { + printf("%s\n", plabel->line); + plabel = plabel->pnext; + } + putchar('\n'); + + /* Display lamp data */ + puts("Lamp Data"); + puts("---------"); + printf("Number of lamps = %-2d\n", PhotoData.lamp.num_lamps); + printf("Lumens per lamp = %8.2f\n", PhotoData.lamp.lumens_lamp); + + /* Display lamp tilt data (if any) */ + if (strcmp(PhotoData.lamp.tilt_fname, "NONE") != 0) + { + switch (PhotoData.lamp.tilt.orientation) + { + case LampVert: + puts("Lamp orientation = Vertical"); + break; + case LampHorz: + puts("Lamp orientation = Horizontal"); + break; + case LampTilt: + puts("Lamp orientation = Tilted"); + break; + default: + puts("Lamp orientation = Unknown"); + break; + } + + printf("Number A-MF pairs = %-3d\n", + PhotoData.lamp.tilt.num_pairs); + for (vert = 0; vert < PhotoData.lamp.tilt.num_pairs; vert++) + printf("%8.2f - %8.2f\n", PhotoData.lamp.tilt.angles[vert], + PhotoData.lamp.tilt.mult_factors[vert]); + } + + /* Display luminaire dimensions */ + puts("\nLuminaire Dimensions"); + puts("--------------------"); + printf("Measurement units = "); + if (PhotoData.units == Feet) + puts("Feet"); + else + puts("Meters"); + printf("Width = %8.2f\n", PhotoData.dim.width); + printf("Length = %8.2f\n", PhotoData.dim.length); + printf("Height = %8.2f\n\n", PhotoData.dim.height); + + /* Display luminaire electrical data */ + puts("Electrical Data"); + puts("---------------"); + printf("Ballast factor = %8.2f\n", PhotoData.elec.ball_factor); + + /* Ballast-lamp photometric factor is not defined for LM-63-1995 */ + if (PhotoData.file.format == IESNA_86 | PhotoData.file.format == + IESNA_91) + printf("Ballast-lamp factor = %8.2f\n", + PhotoData.elec.blp_factor); + + printf("Ballast watts = %8.2f\n\n", PhotoData.elec.input_watts); + + /* Display photometric measurements */ + puts("Photometric Data"); + puts("----------------"); + printf("Multiplier = %8.2f\n", PhotoData.lamp.multiplier); + printf("Goniometer type = Type "); + + switch (PhotoData.photo.gonio_type) + { + case Type_A: + puts("A"); + break; + case Type_B: + puts("B"); + break; + case Type_C: + puts("C"); + break; + default: + puts("Unknown"); + break; + } + + if (calc_flag == FALSE) + { + printf("Vertical angles = %-3d\n", + PhotoData.photo.num_vert_angles); + printf("Horizontal angles = %-3d\n", + PhotoData.photo.num_horz_angles); + + for (horz = 0; horz < PhotoData.photo.num_horz_angles; horz++) + { + printf("\nHorizontal Angle = %8.2f\n", + PhotoData.photo.horz_angles[horz]); + for (vert = 0; vert < PhotoData.photo.num_vert_angles; vert++) + { + printf(" %8.2f - %8.2f cd\n", + PhotoData.photo.vert_angles[vert], + PhotoData.photo.pcandela[horz][vert]); + } + } + puts("\nNOTE: This file does not contain sufficient photometric data" + " to"); + puts(" accurately calculate the following information:\n"); + puts(" 1. Luminaire efficiency"); + puts(" 2. Zonal lumens"); + puts(" 3. CIE distribution type"); + puts(" 4. Coefficients of Utilization"); + } + else + { + puts("\nCalculated Information"); + puts("----------------------"); + printf("Total Lamp Lumens: %5.2f\n", PhotoCalc.total_lm); + printf("Luminaire Efficiency: %2.1f %%\n\n", + PhotoCalc.efficiency); + puts(" CANDELA DISTRIBUTION " + "FLUX"); + puts(" -------------------- " + "----"); + puts(" 0.0 22.5 45.0 67.5 90.0 112.5 135.0 157.5 180.0\n"); + printf(" 0 %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld\n", + PhotoCalc.candela[0][0], PhotoCalc.candela[1][0], + PhotoCalc.candela[2][0], PhotoCalc.candela[3][0], + PhotoCalc.candela[4][0], PhotoCalc.candela[5][0], + PhotoCalc.candela[6][0], PhotoCalc.candela[7][0], + PhotoCalc.candela[8][0]); + + for (i = 1, j = 5, k = 1; i <= 9; i++, j += 10, k += 2) + { + printf(" %3d %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld\n", + j, PhotoCalc.candela[0][k], PhotoCalc.candela[1][k], + PhotoCalc.candela[2][k], PhotoCalc.candela[3][k], + PhotoCalc.candela[4][k], PhotoCalc.candela[5][k], + PhotoCalc.candela[6][k], PhotoCalc.candela[7][k], + PhotoCalc.candela[8][k], PhotoCalc.flux[i - 1]); + } + + printf(" 90 %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld\n", + PhotoCalc.candela[0][18], PhotoCalc.candela[1][18], + PhotoCalc.candela[2][18], PhotoCalc.candela[3][18], + PhotoCalc.candela[4][18], PhotoCalc.candela[5][18], + PhotoCalc.candela[6][18], PhotoCalc.candela[7][18], + PhotoCalc.candela[8][18]); + + for (i = 1, j = 95, k = 19; i <= 9; i++, j += 10, k += 2) + { + printf(" %3d %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld\n", + j, PhotoCalc.candela[0][k], PhotoCalc.candela[1][k], + PhotoCalc.candela[2][k], PhotoCalc.candela[3][k], + PhotoCalc.candela[4][k], PhotoCalc.candela[5][k], + PhotoCalc.candela[6][k], PhotoCalc.candela[7][k], + PhotoCalc.candela[8][k], PhotoCalc.flux[i + 8]); + } + + printf(" 180 %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld %5ld\n\n", + PhotoCalc.candela[0][36], PhotoCalc.candela[1][36], + PhotoCalc.candela[2][36], PhotoCalc.candela[3][36], + PhotoCalc.candela[4][36], PhotoCalc.candela[5][36], + PhotoCalc.candela[6][36], PhotoCalc.candela[7][36], + PhotoCalc.candela[8][36]); + puts(" ZONAL LUMEN SUMMARY"); + puts(" -------------------"); + puts(" ZONE LUMENS %% LAMP %% FIXT\n"); + printf(" 0 - 90 %6ld %4d %4d\n", + PhotoCalc.zonal_lm[3], PhotoCalc.lamp_pct[3], + PhotoCalc.fixt_pct[3]); + printf(" 0 - 30 %6ld %4d %4d\n", + PhotoCalc.zonal_lm[0], PhotoCalc.lamp_pct[0], + PhotoCalc.fixt_pct[0]); + printf(" 0 - 40 %6ld %4d %4d\n", + PhotoCalc.zonal_lm[1], PhotoCalc.lamp_pct[1], + PhotoCalc.fixt_pct[1]); + printf(" 0 - 60 %6ld %4d %4d\n", + PhotoCalc.zonal_lm[2], PhotoCalc.lamp_pct[2], + PhotoCalc.fixt_pct[2]); + printf(" 90 - 120 %6ld %4d %4d\n", + PhotoCalc.zonal_lm[4], PhotoCalc.lamp_pct[4], + PhotoCalc.fixt_pct[4]); + printf(" 90 - 130 %6ld %4d %4d\n", + PhotoCalc.zonal_lm[5], PhotoCalc.lamp_pct[5], + PhotoCalc.fixt_pct[5]); + printf(" 90 - 150 %6ld %4d %4d\n", + PhotoCalc.zonal_lm[6], PhotoCalc.lamp_pct[6], + PhotoCalc.fixt_pct[6]); + printf(" 90 - 180 %6ld %4d %4d\n", + PhotoCalc.zonal_lm[7], PhotoCalc.lamp_pct[7], + PhotoCalc.fixt_pct[7]); + printf(" 0 - 180 %6ld %4d %4d\n\n", + PhotoCalc.zonal_lm[8], PhotoCalc.lamp_pct[8], + PhotoCalc.fixt_pct[8]); + printf("CIE Classification: Type %s\n\n", + IE_CIE_Type[PhotoCalc.cie_type]); + puts(" COEFFICIENTS OF UTILIZATION"); + puts(" ---------------------------"); + puts(" RC 80 70 50 30 10 " + " 0\n"); + puts(" RW 70 50 30 10 70 50 30 10 50 30 10 50 30 10 50 30 " + "10 0"); + puts(" -------------------------------------------------------------" + "-------\n"); + + for (i = 0; i <= 10; i++) + { + printf(" %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d %2d " + "%2d %2d %2d %2d %2d %2d %2d\n", i, + PhotoCalc.IE_CU_Array[i][0], PhotoCalc.IE_CU_Array[i][1], + PhotoCalc.IE_CU_Array[i][2], PhotoCalc.IE_CU_Array[i][3], + PhotoCalc.IE_CU_Array[i][4], PhotoCalc.IE_CU_Array[i][5], + PhotoCalc.IE_CU_Array[i][6], PhotoCalc.IE_CU_Array[i][7], + PhotoCalc.IE_CU_Array[i][8], PhotoCalc.IE_CU_Array[i][9], + PhotoCalc.IE_CU_Array[i][10], PhotoCalc.IE_CU_Array[i][11], + PhotoCalc.IE_CU_Array[i][12], PhotoCalc.IE_CU_Array[i][13], + PhotoCalc.IE_CU_Array[i][14], PhotoCalc.IE_CU_Array[i][15], + PhotoCalc.IE_CU_Array[i][16], PhotoCalc.IE_CU_Array[i][17]); + } + + puts("\nNotes:\n"); + puts("1. Coefficients of Utilization calculations are based on an"); + puts(" effective floor cavity reflectance of 20 percent."); + } +} + diff --git a/vendor/iesna-c/ies_read.txt b/vendor/iesna-c/ies_read.txt new file mode 100644 index 0000000..69779fd --- /dev/null +++ b/vendor/iesna-c/ies_read.txt @@ -0,0 +1,52 @@ + IES_READ - Ledalite IES Photometric Data File Utility + ----------------------------------------------------- + +Version: 1.00D +Date: 98/03/09 + +Copyright 1995-1998 byHeart Consultants Limited + +Permission: The program IES_READ is copyrighted. However, it may be + be freely copied, redistributed, and modified for personal + use or for royalty-free inclusion in commercial programs. + +Description: IES_READ is an MS-DOS program that is designed to read + photometric data files that conform to IES LM-63, "IES + Standard File Format for Electronic Transfer of Photometric + Data and Related Information." + +Usage: IES_READ data_file_name + + The program output will be displayed on the computer screen. + To redirect this output to a file: + + IES_READ data_file_name > output_file_name + + The output file will contain ASCII text that can be edited + by any text editor or word processor. + +Example: IES_READ 111621pn.3s + + or + + IES_READ 111621pn.3s > aardvark.txt + +Notes: 1. There are three different versions of IES photometric + data files, as defined by IES LM-63-1986, LM-63-1991, + and LM-63-1995. This program will successfully read an + IES photometric data file that conforms to any of these + standards. + + 2. If the photometric data file contains candela + measurements at vertical angle intervals of 5.0 degrees, + IES_READ will calculate the following information in + accordance with IES LM-57-1982, "IES Recommended + Procedure for Calculating Coefficients of Utilization, + Wall and Ceiling Cavity Exitance": + + a) Luminaire efficiency + b) Zonal lumens summary + c) Coefficients of Utilization + + The CIE distribution type will also be determined. + diff --git a/vendor/iesna-c/iesna.c b/vendor/iesna-c/iesna.c new file mode 100644 index 0000000..e23aa79 --- /dev/null +++ b/vendor/iesna-c/iesna.c @@ -0,0 +1,1413 @@ +/* + ************************************************************************* + * + * IESNA.C - IESNA LM-63 Photometric Data Module + * + * Version: 1.00D + * + * History: 95/08/15 - Created. + * 95/08/29 - Version 1.00A release. + * 95/09/01 - Fixed memory deallocation error in IE_Flush. + * 95/09/04 - Version 1.00B release. + * 96/01/28 - Added IE_CalcCU_Array, IE_CalcCoeff, + * IE_CalcCU, and IE_CalcData functions. + * - Added zonal multiplier equation constants. + * - Added IE_Cosine array. + * - Added CIE luminaire classification type + * strings. + * - Fixed error messages in IE_GetLine. + * 96/01/30 - Version 1.00C release. + * 98/03/07 - Fixed file close problem in IE_ReadFile. + * 98/03/09 - Version 1.00D release. + * + * Compilers: Any ANSI C-compliant compiler + * + * Author: Ian Ashdown, P. Eng. + * byHeart Consultants Limited + * 620 Ballantree Road + * West Vancouver, B.C. + * Canada V7S 1W3 + * Tel. (604) 922-6148 + * Fax. (604) 987-7621 + * + * Copyright 1995-1998 byHeart Consultants Limited + * + * Permission: The following source code is copyrighted. However, it may + * be freely copied, redistributed, and modified for personal + * use or for royalty-free inclusion in commercial programs. + * + ************************************************************************* + */ + +#include +#include +#include +#include +#include +#include "iesna.h" + +static char IE_TextBuf[IE_MaxLabel + 1]; /* Input text buffer */ +static char IE_ValueBuf[IE_MaxLine + 1]; /* Input value buffer */ + +/* Zonal multiplier equation constants */ +static const double IE_A[] = +{ 0.000, 0.041, 0.070, 0.100, 0.136, 0.190, 0.315, 0.640, 2.100 }; +static const double IE_B[] = +{ 0.00, 0.98, 1.05, 1.12, 1.16, 1.25, 1.25, 1.25, 0.80 }; + +/* CIE luminaire classification types */ +const char *IE_CIE_Type[5] = +{ + "I - Direct", + "II - Semi-Direct", + "III - General Diffuse", + "IV - Semi-Indirect", + "V - Indirect" +}; + +/* Cosine lookup table (five degree increments from 0 to 180 degrees) */ +static const double IE_Cosine[] = +{ + 1.000000, 0.996195, 0.984808, 0.965926, 0.939693, 0.906308, + 0.866025, 0.819152, 0.766044, 0.707107, 0.642788, 0.573576, + 0.500000, 0.422618, 0.342020, 0.258819, 0.173648, 0.087156, + 0.000000, -0.087156, -0.173648, -0.258819, -0.342020, -0.422618, + -0.500000, -0.573576, -0.642788, -0.707107, -0.766044, -0.819152, + -0.866025, -0.906308, -0.939693, -0.965926, -0.984808, -0.996195, + -1.000000 +}; + +static BOOL IE_CalcCoeff( IE_CALC *, double, double, double, double ); +static BOOL IE_GetArray( FILE *, float *, int ); +static BOOL IE_GetList( FILE *, char *, ... ); +static BOOL IE_ReadTilt( IE_DATA *, FILE * ); +static char *IE_CopyString( char * ); +static char *IE_GetLine( char *, int, FILE * ); +static double IE_CalcCU( IE_CALC *, double, double, double, double ); +static void IE_AllocErr(); +static void IE_CalcCU_Array( IE_CALC * ); + +/* + ************************************************************************* + * + * IE_ReadFile - Read IESNA-Format Photometric Data File + * + * Purpose: To read an IESNA-format photometric data file. + * + * Setup: BOOL IE_ReadFile + * ( + * char *fname, + * IE_DATA *pdata + * ) + * + * Where: fname is the IESNA-format data file name. + * pdata is a pointer to the photometric data structure the + * file is to be read into. + * + * Return: TRUE if the file was successfully read; otherwise FALSE. + * + * Note: The file is parsed in accordance with the following + * Illuminating Engineering Society of North America + * publications: + * + * IES Computer Committee: "IES Recommended Standard File + * Format for Electronic Transfer of Photometric Data and + * Related Information," IES Publication LM-63-1995 (to + * be published). + * + * IES Computer Committee: "IES Recommended Standard File + * Format for Electronic Transfer of Photometric Data and + * Related Information," IES Publication LM-63-1991. + * + * IES Computer Committee: "IES Recommended Standard File + * Format for Electronic Transfer of Photometric Data," + * IES Publication LM-63-1986. + * + * The latest edition of this publication (currently + * LM-63-1991) may be purchased from: + * + * Illuminating Engineering Society of North America + * 120 Wall Street, 17th Floor + * New York, NY 10005 + * + * Tel. (212) 248-5000 + * + ************************************************************************* + */ + +BOOL IE_ReadFile( char *fname, IE_DATA *pdata ) +{ + char *tilt_str; /* TILT line parameter pointer */ + int i; /* Loop index */ + struct IE_Label *pnew; /* Current label line list element ptr */ + struct IE_Label *pold; /* Previous label line list element ptr */ + BOOL status = TRUE; /* Status flag */ + FILE *piesf; /* IESNA data file pointer */ + FILE *ptilt = NULL; /* TILT data file pointer */ + + /* Save file name */ + if ((pdata->file.name = IE_CopyString(fname)) == NULL) + { + IE_AllocErr(); /* Report memory allocation error */ + status = FALSE; + } + + if (status == TRUE) + { + /* Initialize the photometric data structure */ + pdata->plline = NULL; + pdata->lamp.tilt_fname = NULL; + pdata->lamp.tilt.angles = NULL; + pdata->lamp.tilt.mult_factors = NULL; + pdata->photo.vert_angles = NULL; + pdata->photo.horz_angles = NULL; + pdata->photo.pcandela = NULL; + + /* Open the IESNA data file */ + if ((piesf = fopen(fname, "r")) == NULL) + { + fprintf(stderr, "ERROR: could not open file %s\n", fname); + status = FALSE; + } + } + + if (status == TRUE) + { + /* Read the first line */ + if (IE_GetLine(IE_TextBuf, IE_MaxLabel + 1, piesf) == NULL) + status = FALSE; + } + + if (status == TRUE) + { + /* Determine file format */ + if (strcmp(IE_TextBuf, "IESNA:LM-63-1995") == 0) + { + /* File is LM-63-1995 format */ + pdata->file.format = IESNA_95; + } + else if (strcmp(IE_TextBuf, "IESNA91") == 0) + { + /* File is LM-63-1991 format */ + pdata->file.format = IESNA_91; + } + else + { + /* File is presumably LM-63-1986 format */ + pdata->file.format = IESNA_86; + + rewind(piesf); /* First line is a label line or "TILT=" */ + } + + for ( ; ; ) /* Read label lines */ + { + if (IE_GetLine(IE_TextBuf, IE_MaxLabel + 1, piesf) == NULL) + { + status = FALSE; + break; + } + + /* Check for "TILT" keyword indicating end of label lines */ + if (strncmp(IE_TextBuf, "TILT=", 5) == 0) + break; + + /* Instantiate a new label line linked list element */ + if ((pnew = (struct IE_Label *) malloc(sizeof(struct IE_Label))) + == NULL) + { + IE_AllocErr(); /* Report memory allocation error */ + status = FALSE; + break; + } + + /* Copy buffer to label line */ + if ((pnew->line = IE_CopyString(IE_TextBuf)) == NULL) + { + IE_AllocErr(); /* Report memory allocation error */ + status = FALSE; + break; + } + + /* Add label line element to linked list */ + if (pdata->plline == NULL) /* Empty list? */ + pdata->plline = pnew; + else /* Add to end of list */ + pold->pnext = pnew; + + pold = pnew; /* Update previous list element pointer */ + pnew->pnext = NULL; /* Terminate list */ + } + } + + if (status == TRUE) /* Check for errors */ + { + tilt_str = IE_TextBuf + 5; /* Point to TILT line parameter */ + + /* Save the TILT data file name */ + if ((pdata->lamp.tilt_fname = IE_CopyString(tilt_str)) == NULL) + { + IE_AllocErr(); /* Report memory allocation error */ + status = FALSE; + } + } + + if (status == TRUE) + { + /* Check for TILT data */ + if (strcmp(tilt_str, "NONE") != 0) + { + if (strcmp(tilt_str, "INCLUDE") != 0) + { + /* Open the TILT data file */ + if ((ptilt = fopen(tilt_str, "r")) == NULL) + status = FALSE; + else + { + /* Read the TILT data from the TILT data file */ + status = IE_ReadTilt(pdata, ptilt); + + fclose(ptilt); /* Close the TILT data file */ + } + } + else + { + /* Read the TILT data from the IESNA data file */ + status = IE_ReadTilt(pdata, piesf); + } + } + } + + if (status == TRUE) + { + /* Read in next two lines */ + status = IE_GetList(piesf, "%d%f%f%d%d%d%d%f%f%f", + &(pdata->lamp.num_lamps), &(pdata->lamp.lumens_lamp), + &(pdata->lamp.multiplier), &(pdata->photo.num_vert_angles), + &(pdata->photo.num_horz_angles), &(pdata->photo.gonio_type), + &(pdata->units),&(pdata->dim.width), &(pdata->dim.length), + &(pdata->dim.height)); + } + + if (status == TRUE) + { + status = IE_GetList(piesf, "%f%f%f", &(pdata->elec.ball_factor), + &(pdata->elec.blp_factor), &(pdata->elec.input_watts)); + } + + if (status == TRUE) + { + /* Allocate space for the vertical angles array */ + if ((pdata->photo.vert_angles = (float *) + calloc(pdata->photo.num_vert_angles, sizeof(float))) == NULL) + { + IE_AllocErr(); /* Report memory allocation error */ + status = FALSE; + } + } + + if (status == TRUE) + { + /* Allocate space for the horizontal angles array */ + if ((pdata->photo.horz_angles = (float *) + calloc(pdata->photo.num_horz_angles, sizeof(float))) == NULL) + { + IE_AllocErr(); /* Report memory allocation error */ + status = FALSE; + } + } + + if (status == TRUE) + { + // HERE !!!! + /* Read in vertical angles array */ + status = IE_GetArray(piesf, pdata->photo.vert_angles, + pdata->photo.num_vert_angles); + } + + if (status == TRUE) + { + /* Read in horizontal angles array */ + status = IE_GetArray(piesf, pdata->photo.horz_angles, + pdata->photo.num_horz_angles); + } + + if (status == TRUE) + { + /* Allocate space for the candela values array pointers */ + if ((pdata->photo.pcandela = (float **) + calloc(pdata->photo.num_horz_angles, sizeof(float *))) == NULL) + { + IE_AllocErr(); /* Report memory allocation error */ + status = FALSE; + } + } + + if (status == TRUE) + { + /* Read in candela values arrays */ + for (i = 0; i < pdata->photo.num_horz_angles; i++) + { + /* Allocate space for the candela values array */ + if ((pdata->photo.pcandela[i] = (float *) + calloc(pdata->photo.num_vert_angles, sizeof(float))) == NULL) + { + IE_AllocErr(); /* Report memory allocation error */ + status = FALSE; + break; + } + + /* Read in candela values */ + if (IE_GetArray(piesf, pdata->photo.pcandela[i], + pdata->photo.num_vert_angles) == FALSE) + { + status = FALSE; + break; + } + } + } + + if (piesf != NULL) + fclose(piesf); /* Close the IESNA data file */ + + if (status == FALSE) /* Check for errors */ + IE_Flush(pdata); + + return status; +} + +/* + ************************************************************************* + * + * IE_Flush- Release Photometric Data Structure + * + * Purpose: To release memory allocated to members of a photometric + * data structure. + * + * Setup: void IE_Flush + * ( + * IE_DATA *pdata + * ) + * + * Where: pdata is a pointer to a photometric data structure. + * + ************************************************************************* + */ + +void IE_Flush( IE_DATA *pdata ) +{ + int i; /* Loop index */ + float **ppcandela; /* Candela values array pointer pointer */ + struct IE_Label *pcurr; /* Current linked list element pointer */ + struct IE_Label *pnext; /* Next linked list element pointer */ + + /* Free file name */ + if (pdata->file.name != NULL) + free(pdata->file.name); + + /* Free label line linked list */ + if ((pcurr = pdata->plline) != NULL) + { + pdata->plline = NULL; + while (pcurr != NULL) + { + free(pcurr->line); /* Free the label line memory */ + pnext = pcurr->pnext; /* Get next element pointer */ + free(pcurr); /* Free the list element memory */ + pcurr = pnext; /* Make next element current */ + } + } + + /* Free TILT data file name (if allocated) */ + if (pdata->lamp.tilt_fname != NULL) + { + free(pdata->lamp.tilt_fname); + pdata->lamp.tilt_fname = NULL; + } + + /* Free angle and multiplying factor arrays (if allocated) */ + if (pdata->lamp.tilt.angles != NULL) + { + free(pdata->lamp.tilt.angles); + pdata->lamp.tilt.angles = NULL; + } + + if (pdata->lamp.tilt.mult_factors != NULL) + { + free(pdata->lamp.tilt.mult_factors); + pdata->lamp.tilt.mult_factors = NULL; + } + + /* Free vertical and horizontal angles arrays (if allocated) */ + if (pdata->photo.vert_angles != NULL) + { + free(pdata->photo.vert_angles); + pdata->photo.vert_angles = NULL; + } + + if (pdata->photo.horz_angles != NULL) + { + free(pdata->photo.horz_angles); + pdata->photo.horz_angles = NULL; + } + + /* Free candela arrays (if allocated) */ + if ((ppcandela = pdata->photo.pcandela) != NULL) + { + for (i = 0; i < pdata->photo.num_horz_angles; i++) + free(ppcandela[i]); + + /* Free candela array pointer array */ + free(pdata->photo.pcandela); + pdata->photo.pcandela = NULL; + } +} + +/* + ************************************************************************* + * + * IE_CalcData - Calculate Photometric Data + * + * Purpose: To calculate the luminaire photometric data from the IES + * Standard File data. + * + * Setup: BOOL IE_CalcData + * ( + * IE_DATA *pdata, + * IE_CALC *pcalc + * ) + * + * Where: pdata is a pointer to an IE_DATA data structure. + * pcalc is a pointer to an IE_CALC data structure. + * + * Return: TRUE if successful; otherwise FALSE (insufficient + * photometric data). + * + * Note: The following calculations are in accordance with: + * + * "IES Recommended Procedure for Calculating Coefficients + * of Utilization, Wall and Ceiling Cavity Exitance", IES + * Publication LM-57 + * + * The candela and lamp lumen values are multiplied by the + * value of "multiplier". + * + * This function requires photometric measurements at + * vertical angle increments of 5.0 degrees (e.g., 0.0 + * degrees, 5.0 degrees, 10.0 degrees, ... ). + * + ************************************************************************* + */ + +BOOL IE_CalcData( IE_DATA *pdata, IE_CALC *pcalc ) +{ + float **pcandela; /* Candela array pointer */ + int i; /* Scratch counter */ + int j; /* Scratch counter */ + long emit_lm; /* Emitted lumens */ + BOOL vva_flag; /* Valid vertical angles flag */ + static BOOL horz_flag[IE_HORZ]; /* Valid horz angle flags */ + static BOOL vert_flag[IE_VERT_CAND]; /* Valid vert angle flags */ + static long avg_candela[IE_VERT_CAND]; /* Avg candela value array */ + + /* Clear the candela values array */ + for (i = 0; i < IE_HORZ; i++) + for (j = 0; j < IE_VERT_CAND; j++) + pcalc->candela[i][j] = 0L; + + /* Initialize the horizontal and vertical angles array */ + for (i = 0; i < IE_HORZ; i++) + pcalc->h_angle[i] = IE_INDEX_NONE; + + for (i = 0; i < IE_VERT_CAND; i++) + pcalc->v_angle[i] = IE_INDEX_NONE; + + /* Initialize the horizontal and vertical angle flags array */ + for (i = 0; i < IE_HORZ; i++) + horz_flag[i] = FALSE; + + for (i = 0; i < IE_VERT_CAND; i++) + vert_flag[i] = FALSE; + + /* Search for valid horizontal angles */ + pcalc->horz_num = 0; + + for (i = 0; i < IE_HORZ; i++) + for (j = 0; j < pdata->photo.num_horz_angles; j++) + if (fabs(((double) i * IE_H_ANGLE) - (double) + pdata->photo.horz_angles[j]) < 1.0) + { + pcalc->horz_num++; + pcalc->h_angle[i] = j; + horz_flag[i] = TRUE; + } + + /* Search for valid vertical angles */ + for (i = 0; i < IE_VERT_CAND; i++) + for (j = 0; j < pdata->photo.num_vert_angles; j++) + if (fabs(((double) i * IE_V_ANGLE) - (double) + pdata->photo.vert_angles[j]) < 1.0) + { + pcalc->v_angle[i] = j; + vert_flag[i] = TRUE; + } + + /* Determine whether vertical angles exist at 5 degree increments */ + /* over range of 0 to 90 degrees */ + vva_flag = TRUE; + for (i = 0; i <= IE_VERT_90; i++) + { + if (vert_flag[i] == FALSE) + { + vva_flag = FALSE; + break; + } + } + + if (vva_flag == FALSE) + { + /* Determine whether vertical angles exist at 5 degree increments */ + /* over range of 90 to 180 degrees */ + vva_flag = TRUE; + for (i = IE_VERT_90; i <= IE_VERT_180; i++) + if (vert_flag[i] == FALSE) + return FALSE; /* Insufficient photometric data */ + } + + /* Add the candela values for valid angles */ + pcandela = pdata->photo.pcandela; + + for (i = 0; i < IE_HORZ; i++) + if (horz_flag[i] == TRUE) + for (j = 0; j < IE_VERT_CAND; j++) + if (vert_flag[j] == TRUE) + pcalc->candela[i][j] += (long) ((double) + pcandela[pcalc->h_angle[i]][pcalc->v_angle[j]] * + pdata->lamp.multiplier); + + /* Calculate the average candela values */ + for (i = 0; i < IE_VERT_CAND; i++) + if (pcalc->v_angle[i] != IE_INDEX_NONE) + { + avg_candela[i] = 0L; + + for (j = 0; j < IE_HORZ; j++) + if (pcalc->h_angle[j] != IE_INDEX_NONE) + avg_candela[i] += pcalc->candela[j][i]; + + avg_candela[i] /= (long) pcalc->horz_num; + } + + /* Calculate the total lamp lumens */ + pcalc->total_lm = ((double) pdata->lamp.num_lamps * (double) + pdata->lamp.lumens_lamp); + + emit_lm = 0L; /* Initialize emitted lumens */ + + /* Calculate the zonal flux values */ + for (i = 0; i < IE_VERT_FLUX; i++) + { + j = 2 * i + 1; + + if (pcalc->v_angle[j] != IE_INDEX_NONE) + { + pcalc->flux[i] = (long) (2.0 * PI * avg_candela[j] * + (IE_Cosine[j - 1] - IE_Cosine[j + 1])); + + emit_lm += pcalc->flux[i]; /* Update emitted lumens */ + } + else + pcalc->flux[i] = 0L; + } + + /* Calculate the luminaire efficiency */ + pcalc->efficiency = (double) (emit_lm * 100L) / pcalc->total_lm; + + /* Calculate the zonal lumen summary */ + + /* 0-30 degree zone */ + pcalc->zonal_lm[0] = pcalc->flux[0] + pcalc->flux[1] + pcalc->flux[2]; + pcalc->lamp_pct[0] = (int ) ((pcalc->zonal_lm[0] * 100L) / + pcalc->total_lm); + pcalc->fixt_pct[0] = (int ) ((pcalc->zonal_lm[0] * 100L) / emit_lm); + + /* 0-40 degree zone */ + pcalc->zonal_lm[1] = pcalc->zonal_lm[0] + pcalc->flux[3]; + pcalc->lamp_pct[1] = (int ) ((pcalc->zonal_lm[1] * 100L) / + pcalc->total_lm); + pcalc->fixt_pct[1] = (int ) ((pcalc->zonal_lm[1] * 100L) / emit_lm); + + /* 0-60 degree zone */ + pcalc->zonal_lm[2] = pcalc->zonal_lm[1] + pcalc->flux[4] + + pcalc->flux[5]; + pcalc->lamp_pct[2] = (int ) ((pcalc->zonal_lm[2] * 100L) / + pcalc->total_lm); + pcalc->fixt_pct[2] = (int ) ((pcalc->zonal_lm[2] * 100L) / emit_lm); + + /* 0-90 degree zone */ + pcalc->zonal_lm[3] = pcalc->zonal_lm[2] + pcalc->flux[6] + + pcalc->flux[7] + pcalc->flux[8]; + pcalc->lamp_pct[3] = (int ) ((pcalc->zonal_lm[3] * 100L) / + pcalc->total_lm); + pcalc->fixt_pct[3] = (int ) ((pcalc->zonal_lm[3] * 100L) / emit_lm); + + /* 90-120 degree zone */ + pcalc->zonal_lm[4] = pcalc->flux[9] + pcalc->flux[10] + + pcalc->flux[11]; + pcalc->lamp_pct[4] = (int ) ((pcalc->zonal_lm[4] * 100L) / + pcalc->total_lm); + pcalc->fixt_pct[4] = (int) ((pcalc->zonal_lm[4] * 100L) / emit_lm); + + /* 90-130 degree zone */ + pcalc->zonal_lm[5] = pcalc->zonal_lm[4] + pcalc->flux[12]; + pcalc->lamp_pct[5] = (int) ((pcalc->zonal_lm[5] * 100L) / + pcalc->total_lm); + pcalc->fixt_pct[5] = (int) ((pcalc->zonal_lm[5] * 100L) / emit_lm); + + /* 90-150 degree zone */ + pcalc->zonal_lm[6] = pcalc->zonal_lm[5] + pcalc->flux[13] + + pcalc->flux[14]; + pcalc->lamp_pct[6] = (int) ((pcalc->zonal_lm[6] * 100L) / + pcalc->total_lm); + pcalc->fixt_pct[6] = (int) ((pcalc->zonal_lm[6] * 100L) / emit_lm); + + /* 90-180 degree zone */ + pcalc->zonal_lm[7] = pcalc->zonal_lm[6] + pcalc->flux[15] + + pcalc->flux[16] + pcalc->flux[17]; + pcalc->lamp_pct[7] = (int) ((pcalc->zonal_lm[7] * 100L) / + pcalc->total_lm); + pcalc->fixt_pct[7] = (int) ((pcalc->zonal_lm[7] * 100L) / emit_lm); + + /* 0 - 180 degree zone */ + pcalc->zonal_lm[8] = pcalc->zonal_lm[3] + pcalc->zonal_lm[7]; + pcalc->lamp_pct[8] = (int) ((pcalc->zonal_lm[8] * 100L) / + pcalc->total_lm); + pcalc->fixt_pct[8] = (int) ((pcalc->zonal_lm[8] * 100L) / emit_lm); + + /* Determine the CIE luminaire type */ + if (pcalc->fixt_pct[7] < 10) + pcalc->cie_type = IE_CIE_1; /* Direct */ + else if (pcalc->fixt_pct[7] < 40) + pcalc->cie_type = IE_CIE_2; /* Semi-direct */ + else if (pcalc->fixt_pct[7] < 60) + pcalc->cie_type = IE_CIE_3; /* General diffuse */ + else if (pcalc->fixt_pct[7] < 90) + pcalc->cie_type = IE_CIE_4; /* Semi-indirect */ + else + pcalc->cie_type = IE_CIE_5; /* Indirect */ + + IE_CalcCU_Array(pcalc); /* Calculate coefficients of utilization */ + + return (TRUE); +} + +/* + ************************************************************************* + * + * IE_CalcCU_Array - Calculate Coefficients of Utilization Array + * + * Purpose: To calculate the coefficients of utilization for the + * selected product. + * + * Setup: static void IE_CalcCU_Array + * ( + * IE_CALC *pcalc + * ) + * + * Where: pcalc is a pointer to an IE_CALC data structure. + * + ************************************************************************* + */ + +static void IE_CalcCU_Array( IE_CALC *pcalc ) +{ + int i; /* Scratch counter */ + + for (i = 0; i < IE_CU_ROWS; i++) + { + pcalc->IE_CU_Array[i][0] = (int) (IE_CalcCU(pcalc, (double) i, 0.70, + 0.80, 0.20) * 100.0); + pcalc->IE_CU_Array[i][1] = (int) (IE_CalcCU(pcalc, (double) i, 0.50, + 0.80, 0.20) * 100.0); + pcalc->IE_CU_Array[i][2] = (int) (IE_CalcCU(pcalc, (double) i, 0.30, + 0.80, 0.20) * 100.0); + pcalc->IE_CU_Array[i][3] = (int) (IE_CalcCU(pcalc, (double) i, 0.10, + 0.80, 0.20) * 100.0); + pcalc->IE_CU_Array[i][4] = (int) (IE_CalcCU(pcalc, (double) i, 0.70, + 0.70, 0.20) * 100.0); + pcalc->IE_CU_Array[i][5] = (int) (IE_CalcCU(pcalc, (double) i, 0.50, + 0.70, 0.20) * 100.0); + pcalc->IE_CU_Array[i][6] = (int) (IE_CalcCU(pcalc, (double) i, 0.30, + 0.70, 0.20) * 100.0); + pcalc->IE_CU_Array[i][7] = (int) (IE_CalcCU(pcalc, (double) i, 0.10, + 0.70, 0.20) * 100.0); + pcalc->IE_CU_Array[i][8] = (int) (IE_CalcCU(pcalc, (double) i, 0.50, + 0.50, 0.20) * 100.0); + pcalc->IE_CU_Array[i][9] = (int) (IE_CalcCU(pcalc, (double) i, 0.30, + 0.50, 0.20) * 100.0); + pcalc->IE_CU_Array[i][10] = (int) (IE_CalcCU(pcalc, (double) i, 0.10, + 0.50, 0.20) * 100.0); + pcalc->IE_CU_Array[i][11] = (int) (IE_CalcCU(pcalc, (double) i, 0.50, + 0.30, 0.20) * 100.0); + pcalc->IE_CU_Array[i][12] = (int) (IE_CalcCU(pcalc, (double) i, 0.30, + 0.30, 0.20) * 100.0); + pcalc->IE_CU_Array[i][13] = (int) (IE_CalcCU(pcalc, (double) i, 0.10, + 0.30, 0.20) * 100.0); + pcalc->IE_CU_Array[i][14] = (int) (IE_CalcCU(pcalc, (double) i, 0.50, + 0.10, 0.20) * 100.0); + pcalc->IE_CU_Array[i][15] = (int) (IE_CalcCU(pcalc, (double) i, 0.30, + 0.10, 0.20) * 100.0); + pcalc->IE_CU_Array[i][16] = (int) (IE_CalcCU(pcalc, (double) i, 0.10, + 0.10, 0.20) * 100.0); + pcalc->IE_CU_Array[i][17] = (int) (IE_CalcCU(pcalc, (double) i, 0.0, + 0.0, 0.20) * 100.0); + } +} + +/* + ************************************************************************* + * + * IE_ReadTilt - Read TILT Data From File + * + * Purpose: To read TILT data from an IESNA-format data file into a + * photometric data structure. + * + * Setup: static BOOL IE_ReadTilt + * ( + * IE_DATA *pdata, + * FILE *pfile + * ) + * + * Where: pdata is a pointer to a photometric data structure. + * pfile is the IESNA-format data file pointer. + * + * Return: TRUE if no errors occurred; otherwise FALSE. + * + * Note: The file can be either part of a full IESNA-format data + * file or a separate TILT data file that was specified in + * the parent IESNA-format file on the "TILT=" line. + * + ************************************************************************* + */ + +static BOOL IE_ReadTilt( IE_DATA *pdata, FILE *pfile ) +{ + BOOL status = TRUE; /* Status flag */ + + /* Read the lamp-to-luminaire geometry line */ + if (IE_GetLine(IE_ValueBuf, IE_MaxLine + 1, pfile) == NULL) + status = FALSE; + + if (status == TRUE) + { + /* Get the lamp-to-luminaire geometry value */ + pdata->lamp.tilt.orientation = atoi(IE_ValueBuf); + + /* Read the number of angle-multiplying factor pairs line */ + if (IE_GetLine(IE_ValueBuf, IE_MaxLine + 1, pfile) == NULL) + status = FALSE; + } + + if (status == TRUE) + { + /* Get the number of angle-multiplying factor pairs value */ + pdata->lamp.tilt.num_pairs = atoi(IE_ValueBuf); + + if (pdata->lamp.tilt.num_pairs > 0) + { + /* Allocate space for the angle and multiplying factors arrays */ + if ((pdata->lamp.tilt.angles = (float *) + calloc(pdata->lamp.tilt.num_pairs, sizeof(float))) == NULL) + { + IE_AllocErr(); /* Report memory allocation error */ + status = FALSE; + } + } + } + + if (status == TRUE) + { + if ((pdata->lamp.tilt.mult_factors = (float *) + calloc(pdata->lamp.tilt.num_pairs, sizeof(float))) == NULL) + { + IE_AllocErr(); /* Report memory allocation error */ + status = FALSE; + } + } + + if (status == TRUE) + { + /* Read in the angle values */ + if (IE_GetArray(pfile, pdata->lamp.tilt.angles, + pdata->lamp.tilt.num_pairs) == FALSE) + status = FALSE; + } + + if (status == TRUE) + { + /* Read in the multiplying factor values */ + if (IE_GetArray(pfile, pdata->lamp.tilt.mult_factors, + pdata->lamp.tilt.num_pairs) == FALSE) + status = FALSE; + } + + return status; +} + +/* + ************************************************************************* + * + * IE_CalcCoeff - Calculate Zonal Cavity Luminaire Coefficients + * + * Purpose: To calculate the zonal cavity coefficients of a luminaire. + * + * Setup: BOOL IE_CalcCoeff + * ( + * IE_CALC *pcalc, + * double g, + * double p1, + * double p2, + * double p3 + * ) + * + * Where: pcalc is a pointer to an IE_CALC data structure. + * g is the room cavity ratio. + * p1 is the wall cavity reflectance (0.001 to 0.999). + * p2 is the effective ceiling cavity reflectance (0.000 to + * 0.999). + * p3 is the effective floor cavity reflectance (0.000 to + * 0.999). + * + * Return: TRUE if successful; otherwise FALSE (input parameters out + * of range). + * + * Result: The structure pointed to by "pcalc" is modified. + * + * Note: The following calculations are in accordance with: + * + * "IES Recommended Procedure for Calculating Coefficients + * of Utilization, Wall and Ceiling Cavity Exitance", IES + * Publication LM-57. + * + ************************************************************************* + */ + +BOOL IE_CalcCoeff( IE_CALC *pcalc, double g, double p1, double p2, + double p3 ) +{ + double C0; /* Intermediate calculation parameter */ + double C1; /* Intermediate calculation parameter */ + double C2; /* Intermediate calculation parameter */ + double C3; /* Intermediate calculation parameter */ + double f23; /* Ceiling-floor form factor */ + double phi_d = 0.0; /* Total downward luminaire flux */ + double phi_u = 0.0; /* Total upward luminaire flux */ + double Dg = 0.0; /* Luminaire direct ratio */ + int n; /* Scratch counter */ + + /* Check for conditions which could cause a divide-by-zero error */ + if (p1 > 0.999 || p2 > 0.999 || p3 > 0.999) + { + pcalc->cu = 0.0; + pcalc->ccec = 0.0; + pcalc->wec = 0.0; + pcalc->wdrc = 0.0; + return (FALSE); + } + + /* Calculate the flux functions */ + for (n = 0; n < IE_VERT_FLUX / 2; n++) + phi_d += (double) pcalc->flux[n]; + + for (n = IE_VERT_FLUX / 2; n < IE_VERT_FLUX; n++) + phi_u += (double) pcalc->flux[n]; + phi_d /= (double) pcalc->total_lm; + phi_u /= (double) pcalc->total_lm; + + if (g < 0.001) + { + /* Calculate the coefficient of utilization */ + pcalc->cu = (phi_d + p2 * phi_u) / (1.0 - p2 * p3); + + /* Calculate the ceiling cavity luminous exitance coefficient */ + pcalc->ccec = p2 * (phi_u + p3 * phi_d) / (1.0 - p2 * p3); + + pcalc->wec = 0.0; + pcalc->wdrc = 0.0; + } + else + { + /* Calculate the luminaire direct ratio */ + for (n = 0; n < IE_VERT_FLUX / 2; n++) + Dg += exp(-IE_A[n] * pow(g, IE_B[n])) * (double) pcalc->flux[n]; + + if (phi_d > 0.001) + Dg /= (phi_d * (double) pcalc->total_lm); + + /* Calculate the form factor approximation */ + f23 = 0.026 + 0.503 * exp(-0.270 * g) + 0.470 * exp(-0.119 * g); + + /* Calculate the intermediate calculation parameters */ + C1 = (1.0 - p1) * (1.0 - f23 * f23) * g / (2.5 * p1 * (1.0 - f23 * + f23) + g * f23 * (1.0 - p1)); + C2 = (1.0 - p2) * (1.0 + f23) / (1.0 + p2 * f23); + C3 = (1.0 - p3) * (1.0 + f23) / (1.0 + p3 * f23); + C0 = C1 + C2 + C3; + + /* Calculate the coefficient of utilization */ + pcalc->cu = 2.5 * p1 * C1 * C3 * (1.0 - Dg) * phi_d / (g * (1.0 - + p1) * (1.0 - p3) * C0) + p2 * C2 * C3 * phi_u / ((1.0 - p2) * + (1.0 - p3) * C0) + (1.0 - p3 * C3 * (C1 + C2) / ((1.0 - p3) * + C0)) * Dg * phi_d / (1.0 - p3); + + /* Calculate the ceiling cavity luminous exitance coefficient */ + pcalc->ccec = 2.5 * p1 * p2 * C1 * C2 * (1.0 - Dg) * phi_d / (g * + (1.0 - p1) * (1.0 - p2) * C0) + (p2 * phi_u / (1.0 - p2)) * (1.0 - + p2 * C2 * (C1 + C3) / ((1.0 - p2) * C0)) + p2 * p3 * C2 * C3 * + Dg * phi_d / ((1.0 - p2) * (1.0 - p3) * C0); + + /* Calculate the wall luminous exitance coefficient */ + pcalc->wec = 2.5 / g * (p1 * (1.0 - Dg) * phi_d / (1.0 - p1) * (1.0 - + 2.5 * p1 * C1 * (C2 + C3) / (g * (1.0 - p1) * C0)) + p1 * p2 * C1 + * C2 * phi_u / ((1.0 - p1) * (1.0 - p2) * C0) + p1 * p3 * C1 * C3 + * Dg * phi_d / ((1.0 - p1) * (1.0 - p3) * C0)); + + /* Calculate the wall direct radiation coefficient */ + pcalc->wdrc = 2.5 * phi_d * (1.0 - Dg) / g; + } + + return (TRUE); +} + +/* + ************************************************************************* + * + * IE_CalcCU - Calculate Luminaire Coefficient of Utilization + * + * Purpose: To calculate the zonal cavity coefficient of utilization + * for a luminaire. + * + * Setup: double IE_CalcCU + * ( + * IE_CALC *pcalc, + * double g, + * double p1, + * double p2, + * double p3 + * ) + * + * Where: pcalc is a pointer to an IE_CALC data structure. + * g is the room cavity ratio. + * p1 is the wall cavity reflectance (0.001 to 0.999). + * p2 is the effective ceiling cavity reflectance (0.000 to + * 0.999). + * p3 is the effective floor cavity reflectance (0.000 to + * 0.999). + * + * Return: The calculated coefficient of utilization if the input + * parameters are within range; otherwise 0.0. + * + * Note: The following calculations are in accordance with: + * + * "IES Recommended Procedure for Calculating Coefficients + * of Utilization, Wall and Ceiling Cavity Exitance", IES + * Publication LM-57. + * + ************************************************************************* + */ + +double IE_CalcCU( IE_CALC *pcalc, double g, double p1, double p2, + double p3 ) +{ + double C0; /* Intermediate calculation parameter */ + double C1; /* Intermediate calculation parameter */ + double C2; /* Intermediate calculation parameter */ + double C3; /* Intermediate calculation parameter */ + double f23; /* Ceiling-floor form factor */ + double phi_d = 0.0; /* Total downward luminaire flux */ + double phi_u = 0.0; /* Total upward luminaire flux */ + double Dg = 0.0; /* Luminaire direct ratio */ + double cu; /* Calculated coefficient of utilization */ + int n; /* Scratch counter */ + + /* Check for conditions which could cause a divide-by-zero error */ + if (p1 > 0.999 || p2 > 0.999 || p3 > 0.999) + return (0.0); + + /* Calculate the flux functions */ + for (n = 0; n < IE_VERT_FLUX / 2; n++) + phi_d += (double) pcalc->flux[n]; + + for (n = IE_VERT_FLUX / 2; n < IE_VERT_FLUX; n++) + phi_u += (double) pcalc->flux[n]; + + phi_d /= (double) pcalc->total_lm; + phi_u /= (double) pcalc->total_lm; + + if (g < 0.001) + { + /* Calculate the coefficient of utilization */ + cu = (phi_d + p2 * phi_u) / (1.0 - p2 * p3); + } + else + { + /* Calculate the luminaire direct ratio */ + for (n = 0; n < IE_VERT_FLUX / 2; n++) + Dg += exp(-IE_A[n] * pow(g, IE_B[n])) * (double) pcalc->flux[n]; + + if (phi_d > 0.001) + Dg /= (phi_d * (double) pcalc->total_lm); + + /* Calculate the form factor approximation */ + f23 = 0.026 + 0.503 * exp(-0.270 * g) + 0.470 * exp(-0.119 * g); + + /* Calculate the intermediate calculation parameters */ + C1 = (1.0 - p1) * (1.0 - f23 * f23) * g / (2.5 * p1 * (1.0 - f23 * + f23) + g * f23 * (1.0 - p1)); + C2 = (1.0 - p2) * (1.0 + f23) / (1.0 + p2 * f23); + C3 = (1.0 - p3) * (1.0 + f23) / (1.0 + p3 * f23); + C0 = C1 + C2 + C3; + + /* Calculate the coefficient of utilization */ + cu = 2.5 * p1 * C1 * C3 * (1.0 - Dg) * phi_d / (g * (1.0 - + p1) * (1.0 - p3) * C0) + p2 * C2 * C3 * phi_u / ((1.0 - p2) * + (1.0 - p3) * C0) + (1.0 - p3 * C3 * (C1 + C2) / ((1.0 - p3) * + C0)) * Dg * phi_d / (1.0 - p3); + } + + return (cu); +} + +/* + ************************************************************************* + * + * IE_GetList - Get List of Values From IESNA-Format Data File + * + * Purpose: To read in one or more lines from an IESNA-format data + * file and convert their substrings to a list of floating + * point and/or integer values. + * + * Setup: static BOOL IE_GetList + * ( + * FILE *pfile, + * char *format, + * ... + * ) + * + * Where: pfile is a pointer to an IESNA-format data file. + * format is a format string containing the following + * specifiers: + * + * %d - read in integer value + * %f - read in floating point value + * + * A pointer to a variable of the appropriate type + * must follow the format parameter in the same order + * (similar to "scanf"). + * + * Return: TRUE if no errors occurred; otherwise FALSE. + * + ************************************************************************* + */ + +static BOOL IE_GetList( FILE *pfile, char *format, ... ) +{ + char c; /* Scratch variable */ + char type; /* Format specifier */ + char *pbuf; /* Input buffer pointer */ + char *pfmt = format; /* Format string pointer */ + int itemp; /* Temporary integer variable */ + float ftemp; /* Temporary floating point variable */ + va_list pvla; /* Variable list argument pointer */ + + va_start(pvla, format); /* Set up for optional arguments */ + + /* Read in the first line */ + if ((pbuf = IE_GetLine(IE_ValueBuf, IE_MaxLine + 1, pfile)) == NULL) + return FALSE; + + for ( ; ; ) /* Skip over leading delimiters */ + { + c = *pbuf; + + if (c == '\0') /* End of current line? */ + return FALSE; + else if (isspace(c) != 0) + pbuf++; + else + break; + } + + for ( ; ; ) + { + if (*pfmt != '%') /* Check format specifier delimiter */ + return FALSE; + + /* Get and validate format specifier */ + switch (type = *(pfmt + 1)) + { + case 'd': + case 'D': + sscanf(pbuf, "%d", &itemp); /* Get integer value */ + + *(va_arg(pvla, int *)) = itemp; + + for ( ; ; ) /* Advance buffer pointer past the substring */ + { + c = *pbuf; + if ((isdigit(c) != 0) || c == '-') + pbuf++; + else + break; + } + break; + case 'f': + case 'F': + sscanf(pbuf, "%f", &ftemp); /* Get float value */ + + *(va_arg(pvla, float *)) = ftemp; + + for ( ; ; ) /* Advance buffer pointer past the substring */ + { + c = *pbuf; + if ((isdigit(c) != 0) || c == '.' || c == '-') + pbuf++; + else + break; + } + break; + default: + return FALSE; + } + + /* Point to next format specifier */ + + pfmt++; /* Skip over format specifier delimiter */ + + if (*pfmt == '\0') /* End of format string ? */ + return FALSE; + + pfmt++; /* Skip over format specifier parameter */ + + if (*pfmt == '\0') /* End of format string ? */ + break; + + for ( ; ; ) /* Skip over delimiters */ + { + c = *pbuf; + if (c == '\0') /* End of current line? */ + { + /* Get next line */ + if ((pbuf = IE_GetLine(IE_ValueBuf, IE_MaxLine + 1, pfile)) == + NULL) + return FALSE; + } + else if ((isspace(c) != 0) || c == ',') + pbuf++; + else + break; + } + } + + return TRUE; +} + +/* + ************************************************************************* + * + * IE_GetArray - Get Array Elements From IESNA-Format Data File + * + * Purpose: To read in one or more lines from an IESNA-format data + * file and convert their substrings to an array of floating + * point numbers. + * + * Setup: static BOOL IE_GetArray + * ( + * FILE *pfile, + * float *array, + * int size + * ) + * + * Where: pfile is a pointer to an IESNA-format data file. + * array is a pointer to an array of floats. + * size is the number of elements in the array. + * + * Return: TRUE if no errors occurred; otherwise FALSE. + * + ************************************************************************* + */ + +static BOOL IE_GetArray +( + FILE *pfile, + float *array, + int size +) +{ + int i = 0; /* Loop index */ + char c; /* Scratch variable */ + char *pbuf; /* Input buffer pointer */ + float ftemp; /* Temporary floating point variable */ + + /* Read in the first line */ + if ((pbuf = IE_GetLine(IE_ValueBuf, IE_MaxLine + 1, pfile)) == NULL) + return FALSE; + + for ( ; ; ) /* Skip over leading delimiters */ + { + c = *pbuf; + + if (c == '\0') /* End of current line? */ + return FALSE; + else if ((isspace(c) != 0)) + pbuf++; + else + break; + } + + for ( ; ; ) /* Parse the array elements */ + { + /* Convert the current substring to its floating point value */ + (void) sscanf(pbuf, "%f", &ftemp); + + array[i++] = ftemp; + + if (i == size) /* All substrings converted ? */ + break; + + for ( ; ; ) /* Advance buffer pointer past the substring */ + { + c = *pbuf; + if ((isdigit(c) != 0) || c == '.' || c == '-') + pbuf++; + else + break; + } + + for ( ; ; ) /* Skip over delimiters */ + { + if (c == '\0') /* End of current line? */ + { + /* Get next line */ + if ((pbuf = IE_GetLine(IE_ValueBuf, IE_MaxLine + 1, pfile)) == + NULL) + return FALSE; + } + else if ((isspace(c) != 0) || c == ',') + pbuf++; + else + break; + c = *pbuf; /* Get next delimiter */ + } + } + + return TRUE; +} + +/* + ************************************************************************* + * + * IE_GetLine - Get Line From File + * + * Purpose: To read in a line from a file and remove any trailing + * newline character. + * + * Setup: static char *IE_GetLine + * ( + * char *pbuf, + * int size, + * FILE *pfile + * ) + * + * Where: pbuf is a pointer to where the line is to be returned. + * size is the maximum number of characters to be returned + * in the buffer, including the '\0' terminator. + * pfile is the file pointer of the file to be read from. + * + * Return: A pointer to pbuf if successful; otherwise NULL. + * + * Result: Up to size - 1 characters are read into the buffer, + * which is then null-terminated. Any trailing '\n' + * character is stripped off. + * + * Note: IES LM-63 specifies that lines are terminated with a + * pair. The "fgets" function as implemented for + * MS-DOS C compilers typically converts these characters + * into a single (i.e., newline) character. Thus, + * this function should work for both MS-DOS and UNIX + * environments. + * + ************************************************************************* + */ + +static char *IE_GetLine( char *pbuf, int size, FILE *pfile ) +{ + char *pnl; /* Newline character pointer */ + + /* Read in the line */ + if (fgets(pbuf, size, pfile) != NULL) + { + /* Strip off trailing newline (if any) */ + if ((pnl = strchr(pbuf, '\n')) != NULL) + *pnl = '\0'; + + return pbuf; + } + else + { + /* Report error */ + if (ferror(pfile) != 0) + fputs("ERROR: could not read file %s\n", stderr); + else + fputs("ERROR: unexpected end of file %s\n", stderr); + + return NULL; + } +} + +/* + ************************************************************************* + * + * IE_CopyString - Copy String + * + * Purpose: To copy a string. + * + * Setup: static char *IE_CopyString + * ( + * char *pstr + * ) + * + * Where: pstr is a pointer to the string that is to be copied. + * + * Return: A pointer to the copied string if successful; otherwise + * NULL. + * + ************************************************************************* + */ + +static char *IE_CopyString( char *pstr ) +{ + char *pdup; /* Duplicated string pointer */ + + if ((pdup = (char *) malloc(strlen(pstr) + 1)) != NULL) + strcpy(pdup, pstr); + + return pdup; +} + +/* + ************************************************************************* + * + * IE_AllocErr - Report Memory Allocation Error + * + * Purpose: To report an out-of-memory error. + * + * Setup: static void IE_AllocErr() + * + ************************************************************************* + */ + +static void IE_AllocErr() +{ + fputs("ERROR: out of memory\n", stderr); +} + diff --git a/vendor/iesna-c/iesna.h b/vendor/iesna-c/iesna.h new file mode 100644 index 0000000..91b5744 --- /dev/null +++ b/vendor/iesna-c/iesna.h @@ -0,0 +1,232 @@ +/* + ************************************************************************* + * + * IESNA.H - IESNA LM-63 Photometric Data Module Include File + * + * Version: 1.00D + * + * History: 95/08/15 - Created. + * 95/08/29 - Version 1.00A release. + * 95/09/01 - Revised IE_MaxLabel and IE_MaxLine definitions. + * 95/09/04 - Version 1.00B release. + * 96/01/28 - Added CIE luminaire type classification + * definitions. + * - Added calculated photometric data definitions. + * - Added IE_Calc and IE_Zonal data structures. + * - Added IE_CalcData and IE_CalcCU_Array function + * prototypes. + * - Added coefficients of utilization array + * dimensions. + * - Added IE_CU_Array and IE_CIE_Type + * declarations. + * - Added definition for pi. + * 96/01/30 - Version 1.00C release. + * 98/03/09 - Version 1.00D release. + * + * Compilers: Any ANSI C-compliant compiler + * + * Author: Ian Ashdown, P. Eng. + * byHeart Consultants Limited + * 620 Ballantree Road + * West Vancouver, B.C. + * Canada V7S 1W3 + * Tel. (604) 922-6148 + * Fax. (604) 987-7621 + * + * Copyright 1995-1998 byHeart Consultants Limited + * + * Permission: The following source code is copyrighted. However, it may + * be freely copied, redistributed, and modified for personal + * use or for royalty-free inclusion in commercial programs. + * + ************************************************************************* + */ + +#ifndef _IESNA_H +#define _IESNA_H + +#include + +#define FALSE 0 +#define TRUE 1 + +#define PI 3.141592654 + +#define IE_MaxLabel 80 /* Maximum label line width */ +#define IE_MaxLine 130 /* Maximum non-label line width */ + +/* Calculated photometric data */ +#define IE_INDEX_NONE -1 /* Invalid candela array index */ +#define IE_HORZ 9 /* Number of horizontal angles (0-180) */ +#define IE_HORZ_90 IE_HORZ/2 /* 90-degree horizontal angle */ +#define IE_VERT_CAND 37 /* Number of vertical angles (candela) */ +#define IE_VERT_90 IE_VERT_CAND/2 /* 90-degree vertical angle */ +#define IE_VERT_180 IE_VERT_CAND-1 /* 180-degree vertical angle */ +#define IE_VERT_FLUX 18 /* Number of vertical angles (flux) */ +#define IE_V_ANGLE 5.0 /* Vertical angle increment */ +#define IE_H_ANGLE 22.5 /* Horizontal angle increment */ +#define IE_ZONES 9 /* Number of zones */ + +/* CIE luminaire type classification */ +#define IE_CIE_1 0 /* Direct */ +#define IE_CIE_2 1 /* Semi-direct */ +#define IE_CIE_3 2 /* General diffuse */ +#define IE_CIE_4 3 /* Semi-indirect */ +#define IE_CIE_5 4 /* Indirect */ + +/* Coefficients of utilization array dimensions */ +#define IE_CU_ROWS 11 /* Room cavity ratios */ +#define IE_CU_COLS 18 /* Ceiling/wall reflectances */ + +typedef int BOOL; /* Boolean flag */ + +typedef struct IE_Data /* IESNA Standard File data */ +{ + struct /* File information */ + { + char *name; /* Name */ + enum /* Format */ + { + IESNA_86, /* LM-63-1986 */ + IESNA_91, /* LM-63-1991 */ + IESNA_95 /* LM-63-1995 */ + } + format; + } + file; + + struct IE_Label /* Label line linked list element */ + { + char *line; /* Label line pointer */ + struct IE_Label *pnext; /* Next list element pointer */ + } + *plline; /* Label line linked list pointer */ + + struct /* Lamp data */ + { + int num_lamps; /* Number of lamps */ + float lumens_lamp; /* Lumens per lamp */ + float multiplier; /* Candela multiplying factor */ + char *tilt_fname; /* TILT file name pointer (optional) */ + + struct /* TILT data structure */ + { + enum /* Lamp-to-luminaire geometry */ + { + LampVert = 1, /* Lamp vertical base up or down */ + LampHorz = 2, /* Lamp horizontal */ + LampTilt = 3 /* Lamp tilted */ + } + orientation; + + int num_pairs; /* # of angle-multiplying factor pairs */ + float *angles; /* Angles array pointer */ + float *mult_factors; /* Multiplying factors array pointer */ + } + tilt; + } + lamp; + + enum /* Measurement units */ + { + Feet = 1, /* Imperial */ + Meters = 2 /* Standard Internationale */ + } + units; + + struct /* Luminous cavity dimensions */ + { + float width; /* Opening width */ + float length; /* Opening length */ + float height; /* Cavity height */ + } + dim; + + struct /* Electrical data */ + { + float ball_factor; /* Ballast factor */ + float blp_factor; /* Ballast-lamp photometric factor */ + float input_watts; /* Input watts */ + } + elec; + + struct /* Photometric data */ + { + enum /* Photometric goniometer type */ + { + Type_A = 3, /* Type A */ + Type_B = 2, /* Type B */ + Type_C = 1 /* Type C */ + } + gonio_type; + + int num_vert_angles; /* Number of vertical angles */ + int num_horz_angles; /* Number of horizontal angles */ + + float *vert_angles; /* Vertical angles array */ + float *horz_angles; /* Horizontal angles array */ + + float **pcandela; /* Candela values array pointers array */ + } + photo; +} +IE_DATA; + +typedef struct IE_Calc /* Calculated photometric data */ +{ + /* NOTE: The candlepower distribution array is ordered as follows: */ + /* */ + /* Horizontal: { 0.0, 22.5, 45.0, 67.5, 90.0, 112.5, 135.0, 157.5, */ + /* 180.0 } */ + /* Vertical: { 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, */ + /* 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, */ + /* 120, 125, 130, 135, 140, 145, 150, 155, 160, 165, */ + /* 170, 175, 180 } */ + + long candela[IE_HORZ][IE_VERT_CAND]; /* Candlepower distribution */ + + int h_angle[IE_HORZ]; /* Valid horizontal angle index array */ + int v_angle[IE_VERT_CAND]; /* Valid vertical angle index array */ + + int horz_num; /* Number of horizontal angles */ + int vert_num; /* Number of vertical angles */ + + /* NOTE: The flux distribution arrays are ordered as follows: */ + /* */ + /* { 5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115, 125, 135, */ + /* 145, 155, 165, 175 } */ + + long flux[IE_VERT_FLUX]; /* Lumen distribution */ + + /* NOTE: The zonal lumens, percent lamp lumens and percent fixture */ + /* lumens arrays are ordered as follows: */ + /* */ + /* { 0-30, 0-40, 0-60, 0-90, 90-120, 90-130, 90-150, 90-180, 0-180 */ + + long zonal_lm[IE_ZONES]; /* Zonal lumens */ + int lamp_pct[IE_ZONES]; /* Percent lamp lumens */ + int fixt_pct[IE_ZONES]; /* Percent fixture lumens */ + + double efficiency; /* Luminaire efficiency */ + double total_lm; /* Total lamp lumens */ + + int cie_type; /* CIE luminaire type classification */ + + double cu; /* Coefficient of utilization */ + double wec; /* Wall luminous exitance coefficient */ + double ccec; /* Ceiling cavity luminous exitance coefficient */ + double wdrc; /* Wall direct radiation coefficient */ + + /* Coefficients of Utilization array */ + int IE_CU_Array[IE_CU_ROWS][IE_CU_COLS]; +} +IE_CALC; + +extern const char *IE_CIE_Type[5]; + +extern BOOL IE_ReadFile( char *, IE_DATA * ); +extern BOOL IE_CalcData( IE_DATA *, IE_CALC * ); +extern void IE_Flush( IE_DATA * ); + +#endif + diff --git a/vendor/iesna-c/spec.txt b/vendor/iesna-c/spec.txt new file mode 100644 index 0000000..c6c3a02 --- /dev/null +++ b/vendor/iesna-c/spec.txt @@ -0,0 +1,904 @@ + Parsing The IESNA LM-63 Photometric Data File + --------------------------------------------- + + by + + Ian Ashdown, P. Eng. + Vice President, Research & Development + byHeart Consultants Limited + + +Version: 1.00D + +Date: March 9, 1998 + +Synopsis: The IESNA LM-63 photometric data file is an ASCII text file + commonly used by North American lighting fixture manufacturers + to distribute photometric information about their products. + This document and its accompanying ANSI C source code listings + demonstrates how to parse these files for use in lighting + calculation and visualization software programs. + +History: Version 1.00A (95/08/15) + + - Initial release. + + Version 1.00B (95/09/04) + + - Minor bug fixes (memory deallocation). + + Version 1.00C (96/01/30) + + - Minor bug fixes (output formatting). + - Added luminaire efficiency calculations. + - Added zonal lumens calculations. + - Added Coefficient of Utiliztion (CU) calculations. + - Added CIE distribution type determination. + - Revised Section 5, An IES Standard File Parser + - Added Section 6, Coefficients of Utilization. + - Revised Section 9, References. + + Version 1.00D (98/03/09) + + - Minor bug fix (file close) + +1. Introduction + +In 1986, the Illuminating Engineering Society of North America (IESNA) +published one of the first industry standards for the electronic +dissemination of photometric information for architectural lighting +fixtures (also known as "luminaires") and other light sources. + +This standard was published as an IESNA Transaction called "IES LM-63- +1986: IES Recommended Standard File Format for Electronic Transfer of +Photometric Data." Despite its unwieldly title, it was quickly adopted by +lighting manufacturers and the developers of lighting calculation +software. + +The standard was revised in 1991 to add "keywords", and again in 1995 to +clarify a number of ambiguities. (The title was also expanded to "IES +Standard File Format for Electronic Transfer of Photometric Data and +Related Information.") Both revisions are fully backward-compatible with +the previous versions. + +One of the shortcomings of IES LM-63 is that (like most standards) it +does not offer a worked example of a parser for the IES Standard File +Format. Without such an example, software developers are often left +wondering whether they have interpreted the standard correctly. + +This document and its accompanying ANSI C source code is an attempt to +rectify this situation. It is not an official implementation of an IES +Standard File parser (even though the author is a member of the IES +Computer Committee), and so cannot be guaranteed to be correct. However, +it has been thoroughly tested, and can be used as a model for developing +your own parser. + +This document is *not* a substitute for IES LM-63-1991 or IES LM-63-1995. +If you need to implement your own parser for a commercial project, you +should obtain a copy of this IES publication. It contains details and +discussions of numerous topics (such as the use of keywords) that are not +covered here. If you are not familiar with illumination engineering +principles and practices, you should also obtain a copy of the IES +Lighting Handbook (Rea 1993), the official bible of the lighting +industry. + +On the other hand, if you need to implement an IES Standard File parser +for a class project, thesis or other personal use ... well, the hard work +has been done for you. + +2. IES Standard File Format - Specification + +The IES Standard File format as described in IES LM-63 is an ASCII text +file. There are three variants, based on LM-63-1986, LM-63-1991, and LM- +63-1995 respectively. + +2.1 IES LM-63-1986 + +The file format specification for the LM-63-1986 variant is: + + Id Description + + 01