diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..242fa6a02584e345b472f643ddc32cb1fda20706 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,18 @@ +.git +.DS_Store +__pycache__ +*.pyc +*.pyo +.pytest_cache +.claude +node_modules +build +research +docs +plans +RESEARCH_NOTES.md +trainer +train.py +sim +viz +planner diff --git a/.gitignore b/.gitignore index aa3cd947100233a030e88417f9ad930429c56b97..6563588a202c10e6718b3cd7e592c885e79a613d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,9 +8,6 @@ # testing /coverage -# production -/build - # misc .DS_Store .env.local @@ -28,3 +25,5 @@ __pycache__/ # Reference repos (not pushed to HF) .reference/ +*.pyc +__pycache__/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..aaf15a9780b45d05060a4b961d6671cc9e3a7296 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +FROM node:20-alpine AS web-builder + +WORKDIR /web +COPY package*.json ./ +RUN npm ci --no-audit --no-fund +COPY public ./public +COPY src ./src +RUN npm run build + +FROM ghcr.io/meta-pytorch/openenv-base:latest + +WORKDIR /app + +# Install Python deps first for better layer caching +COPY requirements.txt ./ +RUN pip install --no-cache-dir -r requirements.txt \ + && pip install --no-cache-dir "openenv-core[core]>=0.2.1" + +# Copy application source +COPY . /app + +# Overlay the compiled React frontend +COPY --from=web-builder /web/build /app/build + +EXPOSE 8000 + +CMD ["uvicorn", "openenv_server.app:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/README.md b/README.md index cacdb4ddc76d310ab967af8f4440b6b7d28a3f91..9136cba301c0a82d944368088e90a806aaa41d33 100644 --- a/README.md +++ b/README.md @@ -3,81 +3,35 @@ title: Optigami emoji: 🐠 colorFrom: indigo colorTo: red -sdk: static +sdk: docker pinned: false -app_build_command: npm run build -app_file: build/index.html +app_port: 8000 license: mit -short_description: ':)' +short_description: OpenEnv origami environment and demo --- -# Getting Started with Create React App +# Optigami -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). +OpenEnv-compatible origami RL environment with: +- environment + reward checks in `env/` +- OpenEnv server adapter in `openenv_runtime/` and `openenv_server/` +- Dockerized deployment for Hugging Face Spaces -## Available Scripts +Entry point: `openenv_server.app:app` +Manifest: `openenv.yaml` +Container: `Dockerfile` -In the project directory, you can run: +## Local Run -### `npm start` +```bash +uvicorn openenv_server.app:app --host 0.0.0.0 --port 8000 +``` -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in your browser. +## Frontend (optional local React demo) -The page will reload when you make changes.\ -You may also see any lint errors in the console. +```bash +npm install +npm start +``` -### `npm test` - -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. - -### `npm run build` - -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `npm run eject` - -**Note: this is a one-way operation. Once you `eject`, you can't go back!** - -If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. - -You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). - -### Code Splitting - -This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) - -### Analyzing the Bundle Size - -This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) - -### Making a Progressive Web App - -This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) - -### Advanced Configuration - -This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) - -### Deployment - -This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) - -### `npm run build` fails to minify - -This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) +This serves the dashboard against the FastAPI API. diff --git a/build/asset-manifest.json b/build/asset-manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..0a5696da84d7ba994c73da4c14720129ec13b860 --- /dev/null +++ b/build/asset-manifest.json @@ -0,0 +1,13 @@ +{ + "files": { + "main.css": "/static/css/main.2ef3bb14.css", + "main.js": "/static/js/main.b94094b6.js", + "index.html": "/index.html", + "main.2ef3bb14.css.map": "/static/css/main.2ef3bb14.css.map", + "main.b94094b6.js.map": "/static/js/main.b94094b6.js.map" + }, + "entrypoints": [ + "static/css/main.2ef3bb14.css", + "static/js/main.b94094b6.js" + ] +} \ No newline at end of file diff --git a/build/favicon.ico b/build/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a11777cc471a4344702741ab1c8a588998b1311a Binary files /dev/null and b/build/favicon.ico differ diff --git a/build/index.html b/build/index.html new file mode 100644 index 0000000000000000000000000000000000000000..fd4f0e1d789001296bc778cc962254dbbf571762 --- /dev/null +++ b/build/index.html @@ -0,0 +1 @@ +React App
\ No newline at end of file diff --git a/build/logo192.png b/build/logo192.png new file mode 100644 index 0000000000000000000000000000000000000000..fc44b0a3796c0e0a64c3d858ca038bd4570465d9 Binary files /dev/null and b/build/logo192.png differ diff --git a/build/logo512.png b/build/logo512.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e47a6545bc15971f8f63fba70e4013df88a664 Binary files /dev/null and b/build/logo512.png differ diff --git a/build/manifest.json b/build/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..080d6c77ac21bb2ef88a6992b2b73ad93daaca92 --- /dev/null +++ b/build/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/build/robots.txt b/build/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..e9e57dc4d41b9b46e05112e9f45b7ea6ac0ba15e --- /dev/null +++ b/build/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/build/static/css/main.2ef3bb14.css b/build/static/css/main.2ef3bb14.css new file mode 100644 index 0000000000000000000000000000000000000000..12fe3578040ce2a26f102377f83692f079f13bd7 --- /dev/null +++ b/build/static/css/main.2ef3bb14.css @@ -0,0 +1,2 @@ +@import url(https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&family=IBM+Plex+Mono:wght@300;400;500&display=swap);*,:after,:before{box-sizing:border-box;margin:0;padding:0}body{-webkit-font-smoothing:antialiased;background:#0d0d14;color:#f8fafc;font-family:IBM Plex Mono,monospace;font-size:13px;line-height:1.5;overflow-x:hidden}::-webkit-scrollbar{height:4px;width:4px}::-webkit-scrollbar-track{background:#0d0d14}::-webkit-scrollbar-thumb{background:#2a2a3a}::-webkit-scrollbar-thumb:hover{background:#3a3a5a}:root{--bg:#0d0d14;--surface:#13131d;--surface-2:#1a1a2e;--paper-white:#fafaf5;--paper-edge:#2a2a3a;--mountain:#f59e0b;--valley:#38bdf8;--target-ghost:#7c3aed33;--target-ghost-stroke:#7c3aed73;--validity:#22d3ee;--progress:#22c55e;--economy:#a78bfa;--text-primary:#f8fafc;--text-dim:#64748b;--border:#2a2a3a;--border-bright:#3a3a5a;--font-display:"JetBrains Mono",monospace;--font-mono:"IBM Plex Mono",monospace}.app{background:#0d0d14;background:var(--bg);display:flex;flex-direction:column;height:100vh;overflow:hidden}.app-header{align-items:center;background:#13131d;background:var(--surface);border-bottom:1px solid #2a2a3a;border-bottom:1px solid var(--border);display:flex;flex-shrink:0;gap:24px;height:48px;padding:0 20px;z-index:10}.app-title{color:#f8fafc;color:var(--text-primary);font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:14px;font-weight:700;letter-spacing:.12em;white-space:nowrap}.app-title .title-accent{color:#f59e0b;color:var(--mountain)}.header-sep{background:#2a2a3a;background:var(--border);flex-shrink:0;height:24px;width:1px}.header-right{align-items:center;display:flex;gap:16px;margin-left:auto}.replay-badge{background:#38bdf81a;border:1px solid #38bdf84d;border-radius:3px;color:#38bdf8;letter-spacing:.1em;padding:3px 8px}.back-to-grid-btn,.replay-badge{font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:10px}.back-to-grid-btn{background:#0000;border:1px solid #1e2a3a;border-radius:3px;color:#64748b;cursor:pointer;letter-spacing:.08em;padding:3px 10px}.back-to-grid-btn:hover{border-color:#64748b;color:#e2e8f0}.api-status{align-items:center;display:flex;font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:11px;gap:6px;letter-spacing:.08em}.api-status-dot{background:#64748b;background:var(--text-dim);border-radius:50%;height:6px;width:6px}.api-status-dot.ok{background:#22c55e;background:var(--progress);box-shadow:0 0 6px #22c55e;box-shadow:0 0 6px var(--progress)}.api-status-dot.err{background:#ef4444;box-shadow:0 0 6px #ef4444}.app-body{display:grid;flex:1 1;grid-template-columns:1fr 280px;overflow:hidden}.app-left{border-right:1px solid #2a2a3a;border-right:1px solid var(--border)}.app-left,.app-right{display:flex;flex-direction:column;overflow:hidden}.app-right{background:#13131d;background:var(--surface)}.canvas-row{border-bottom:1px solid #2a2a3a;border-bottom:1px solid var(--border);display:flex;flex-shrink:0;gap:0;overflow-x:auto;padding:16px}.canvas-wrap{display:flex;flex:1 1;flex-direction:column;gap:8px;min-width:280px}.canvas-wrap+.canvas-wrap{margin-left:16px}.canvas-label{color:#64748b;color:var(--text-dim);font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:10px;font-weight:500;letter-spacing:.14em;text-transform:uppercase}.canvas-svg{background:#fafaf5;background:var(--paper-white);display:block}.canvas-3d{background:linear-gradient(180deg,#1a1a2e,#0f101a);border:1px solid #2a2a3a;border:1px solid var(--border);display:block}.canvas-label-row{align-items:center;display:flex;gap:10px;justify-content:space-between}.fold-mode-toggle{background:#13131d;background:var(--surface);border:1px solid #2a2a3a;border:1px solid var(--border);display:inline-flex}.fold-mode-btn{background:#0000;border:none;color:#64748b;color:var(--text-dim);cursor:pointer;font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:9px;letter-spacing:.08em;padding:3px 7px}.fold-mode-btn+.fold-mode-btn{border-left:1px solid #2a2a3a;border-left:1px solid var(--border)}.fold-mode-btn.active{background:#1f2538;color:#f8fafc;color:var(--text-primary)}.step-feed-section{display:flex;flex:1 1;flex-direction:column;overflow:hidden}.section-header{border-bottom:1px solid #2a2a3a;border-bottom:1px solid var(--border);color:#64748b;color:var(--text-dim);flex-shrink:0;font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:10px;font-weight:500;letter-spacing:.14em;padding:8px 16px;text-transform:uppercase}.step-feed{flex:1 1;overflow-y:auto;padding:4px 0}.step-entry{border-bottom:1px solid #2a2a3a;border-bottom:1px solid var(--border);cursor:default;display:flex;flex-direction:column;gap:2px;padding:8px 16px;transition:background .1s}.step-entry:hover{background:#13131d;background:var(--surface)}.step-entry.active{background:#1a1a2e;background:var(--surface-2);border-left:2px solid #38bdf8;border-left:2px solid var(--valley);padding-left:14px}.step-entry-top{align-items:center;display:flex;gap:8px}.step-num{color:#64748b;color:var(--text-dim);flex-shrink:0;font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:10px;font-weight:700;width:24px}.step-instruction{color:#f8fafc;color:var(--text-primary);flex:1 1;font-size:12px}.assign-badge{flex-shrink:0;font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:10px;font-weight:700;line-height:1.4;padding:1px 5px}.assign-badge.M{background:#f59e0b;background:var(--mountain);color:#0d0d14}.assign-badge.V{background:#38bdf8;background:var(--valley);color:#0d0d14}.assign-badge.B{background:#3a3a5a;background:var(--border-bright)}.assign-badge.B,.step-reward-delta{color:#64748b;color:var(--text-dim)}.step-reward-delta{font-size:11px;padding-left:32px}.step-reward-delta .delta-positive{color:#22c55e;color:var(--progress)}.step-reward-delta .delta-negative{color:#ef4444}.reward-panel{border-bottom:1px solid #2a2a3a;border-bottom:1px solid var(--border);flex-shrink:0;padding:12px 16px}.reward-row{align-items:center;display:flex;gap:8px;margin-bottom:6px}.reward-row:last-child{margin-bottom:0}.reward-label{color:#64748b;color:var(--text-dim);flex-shrink:0;font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:10px;font-weight:500;letter-spacing:.06em;text-transform:uppercase;width:72px}.reward-track{background:#0d0d14;background:var(--bg);border:1px solid #2a2a3a;border:1px solid var(--border);flex:1 1;height:8px;overflow:hidden}.reward-bar{height:100%;transition:width .4s ease}.reward-value{color:#f8fafc;color:var(--text-primary);flex-shrink:0;font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:11px;font-weight:500;text-align:right;width:36px}.reward-value.dim{color:#64748b;color:var(--text-dim)}.reward-divider{background:#2a2a3a;background:var(--border);height:1px;margin:6px 0}.info-badges{display:flex;flex-direction:column;gap:8px;padding:12px 16px}.info-row{align-items:center;display:flex;gap:8px;justify-content:space-between}.info-key{color:#64748b;color:var(--text-dim);font-size:10px;font-weight:500;letter-spacing:.06em;text-transform:uppercase}.info-key,.info-val{font-family:JetBrains Mono,monospace;font-family:var(--font-display)}.info-val{color:#f8fafc;color:var(--text-primary);font-size:11px;font-weight:700}.info-val.bool-true{color:#22c55e;color:var(--progress)}.info-val.bool-false{color:#ef4444}.info-val.dim{color:#64748b;color:var(--text-dim)}.target-selector{align-items:center;display:flex;gap:8px}.target-selector-label{color:#64748b;color:var(--text-dim);font-size:10px;font-weight:500;letter-spacing:.1em;text-transform:uppercase;white-space:nowrap}.target-select,.target-selector-label{font-family:JetBrains Mono,monospace;font-family:var(--font-display)}.target-select{background:#1a1a2e;background:var(--surface-2);border:1px solid #3a3a5a;border:1px solid var(--border-bright);color:#f8fafc;color:var(--text-primary);cursor:pointer;font-size:11px;min-width:180px;outline:none;padding:4px 8px}.target-select:focus{border-color:#38bdf8;border-color:var(--valley)}optgroup{background:#13131d;background:var(--surface);color:#64748b;color:var(--text-dim);font-size:10px}optgroup,option{font-family:JetBrains Mono,monospace;font-family:var(--font-display)}option{background:#1a1a2e;background:var(--surface-2);color:#f8fafc;color:var(--text-primary)}.player-controls{align-items:center;display:flex;flex-shrink:0;gap:6px}.ctrl-btn{background:#1a1a2e;background:var(--surface-2);border:1px solid #3a3a5a;border:1px solid var(--border-bright);color:#f8fafc;color:var(--text-primary);cursor:pointer;font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:11px;font-weight:500;letter-spacing:.04em;line-height:1.4;padding:4px 10px;transition:background .1s,border-color .1s;white-space:nowrap}.ctrl-btn:hover:not(:disabled){background:#13131d;background:var(--surface);border-color:#64748b;border-color:var(--text-dim)}.ctrl-btn:disabled{cursor:not-allowed;opacity:.35}.ctrl-btn.play{border-color:#38bdf8;border-color:var(--valley);color:#38bdf8;color:var(--valley)}.ctrl-btn.play:hover:not(:disabled){background:#38bdf81a}.ctrl-step-display{border:1px solid #2a2a3a;border:1px solid var(--border);color:#64748b;color:var(--text-dim);font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:11px;min-width:72px;padding:4px 8px;text-align:center;white-space:nowrap}.app-overlay,.ctrl-step-display{background:#0d0d14;background:var(--bg)}.app-overlay{inset:0;justify-content:center;position:fixed;z-index:100}.app-overlay,.overlay-message{align-items:center;display:flex}.overlay-message{color:#64748b;color:var(--text-dim);font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:13px;gap:12px;letter-spacing:.1em}.pulse-dot{animation:pulse 1.2s ease-in-out infinite;background:#38bdf8;background:var(--valley);border-radius:50%;height:8px;width:8px}@keyframes pulse{0%,to{opacity:.2;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}.episode-loading{align-items:center;color:#64748b;color:var(--text-dim);display:flex;font-family:JetBrains Mono,monospace;font-family:var(--font-display);font-size:11px;gap:8px;justify-content:center;letter-spacing:.08em;padding:12px 16px} +/*# sourceMappingURL=main.2ef3bb14.css.map*/ \ No newline at end of file diff --git a/build/static/css/main.2ef3bb14.css.map b/build/static/css/main.2ef3bb14.css.map new file mode 100644 index 0000000000000000000000000000000000000000..188a2a589901e6d562bb7d1062220b772b57550f --- /dev/null +++ b/build/static/css/main.2ef3bb14.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/main.2ef3bb14.css","mappings":"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","sources":["index.css","App.css"],"sourcesContent":["@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&family=IBM+Plex+Mono:wght@300;400;500&display=swap');\n\n*, *::before, *::after {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n\nbody {\n background: #0d0d14;\n color: #f8fafc;\n font-family: 'IBM Plex Mono', monospace;\n font-size: 13px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n overflow-x: hidden;\n}\n\n::-webkit-scrollbar {\n width: 4px;\n height: 4px;\n}\n\n::-webkit-scrollbar-track {\n background: #0d0d14;\n}\n\n::-webkit-scrollbar-thumb {\n background: #2a2a3a;\n}\n\n::-webkit-scrollbar-thumb:hover {\n background: #3a3a5a;\n}\n",":root {\n --bg: #0d0d14;\n --surface: #13131d;\n --surface-2: #1a1a2e;\n --paper-white: #fafaf5;\n --paper-edge: #2a2a3a;\n --mountain: #f59e0b;\n --valley: #38bdf8;\n --target-ghost: rgba(124, 58, 237, 0.20);\n --target-ghost-stroke: rgba(124, 58, 237, 0.45);\n --validity: #22d3ee;\n --progress: #22c55e;\n --economy: #a78bfa;\n --text-primary: #f8fafc;\n --text-dim: #64748b;\n --border: #2a2a3a;\n --border-bright: #3a3a5a;\n --font-display: 'JetBrains Mono', monospace;\n --font-mono: 'IBM Plex Mono', monospace;\n}\n\n.app {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: var(--bg);\n overflow: hidden;\n}\n\n/* ─── HEADER ─── */\n.app-header {\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 0 20px;\n height: 48px;\n border-bottom: 1px solid var(--border);\n background: var(--surface);\n flex-shrink: 0;\n z-index: 10;\n}\n\n.app-title {\n font-family: var(--font-display);\n font-size: 14px;\n font-weight: 700;\n letter-spacing: 0.12em;\n color: var(--text-primary);\n white-space: nowrap;\n}\n\n.app-title .title-accent {\n color: var(--mountain);\n}\n\n.header-sep {\n width: 1px;\n height: 24px;\n background: var(--border);\n flex-shrink: 0;\n}\n\n.header-right {\n display: flex;\n align-items: center;\n gap: 16px;\n margin-left: auto;\n}\n\n.replay-badge {\n font-size: 10px;\n font-family: var(--font-display);\n letter-spacing: 0.1em;\n color: #38bdf8;\n background: rgba(56, 189, 248, 0.1);\n border: 1px solid rgba(56, 189, 248, 0.3);\n padding: 3px 8px;\n border-radius: 3px;\n}\n\n.back-to-grid-btn {\n font-size: 10px;\n font-family: var(--font-display);\n letter-spacing: 0.08em;\n color: #64748b;\n background: transparent;\n border: 1px solid #1e2a3a;\n padding: 3px 10px;\n border-radius: 3px;\n cursor: pointer;\n}\n.back-to-grid-btn:hover { color: #e2e8f0; border-color: #64748b; }\n\n.api-status {\n font-size: 11px;\n font-family: var(--font-display);\n letter-spacing: 0.08em;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.api-status-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--text-dim);\n}\n\n.api-status-dot.ok {\n background: var(--progress);\n box-shadow: 0 0 6px var(--progress);\n}\n\n.api-status-dot.err {\n background: #ef4444;\n box-shadow: 0 0 6px #ef4444;\n}\n\n/* ─── MAIN LAYOUT ─── */\n.app-body {\n display: grid;\n grid-template-columns: 1fr 280px;\n flex: 1;\n overflow: hidden;\n}\n\n.app-left {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-right: 1px solid var(--border);\n}\n\n.app-right {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--surface);\n}\n\n/* ─── CANVAS ROW ─── */\n.canvas-row {\n display: flex;\n gap: 0;\n padding: 16px;\n flex-shrink: 0;\n border-bottom: 1px solid var(--border);\n overflow-x: auto;\n}\n\n.canvas-wrap {\n display: flex;\n flex-direction: column;\n gap: 8px;\n flex: 1;\n min-width: 280px;\n}\n\n.canvas-wrap + .canvas-wrap {\n margin-left: 16px;\n}\n\n.canvas-label {\n font-family: var(--font-display);\n font-size: 10px;\n font-weight: 500;\n letter-spacing: 0.14em;\n color: var(--text-dim);\n text-transform: uppercase;\n}\n\n.canvas-svg {\n display: block;\n background: var(--paper-white);\n}\n\n.canvas-3d {\n display: block;\n background: linear-gradient(180deg, #1a1a2e 0%, #0f101a 100%);\n border: 1px solid var(--border);\n}\n\n.canvas-label-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n}\n\n.fold-mode-toggle {\n display: inline-flex;\n border: 1px solid var(--border);\n background: var(--surface);\n}\n\n.fold-mode-btn {\n border: none;\n background: transparent;\n color: var(--text-dim);\n font-family: var(--font-display);\n font-size: 9px;\n letter-spacing: 0.08em;\n padding: 3px 7px;\n cursor: pointer;\n}\n\n.fold-mode-btn + .fold-mode-btn {\n border-left: 1px solid var(--border);\n}\n\n.fold-mode-btn.active {\n color: var(--text-primary);\n background: #1f2538;\n}\n\n/* ─── STEP FEED ─── */\n.step-feed-section {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.section-header {\n font-family: var(--font-display);\n font-size: 10px;\n font-weight: 500;\n letter-spacing: 0.14em;\n color: var(--text-dim);\n text-transform: uppercase;\n padding: 8px 16px;\n border-bottom: 1px solid var(--border);\n flex-shrink: 0;\n}\n\n.step-feed {\n overflow-y: auto;\n flex: 1;\n padding: 4px 0;\n}\n\n.step-entry {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 8px 16px;\n border-bottom: 1px solid var(--border);\n cursor: default;\n transition: background 0.1s;\n}\n\n.step-entry:hover {\n background: var(--surface);\n}\n\n.step-entry.active {\n background: var(--surface-2);\n border-left: 2px solid var(--valley);\n padding-left: 14px;\n}\n\n.step-entry-top {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.step-num {\n font-family: var(--font-display);\n font-size: 10px;\n font-weight: 700;\n color: var(--text-dim);\n width: 24px;\n flex-shrink: 0;\n}\n\n.step-instruction {\n font-size: 12px;\n color: var(--text-primary);\n flex: 1;\n}\n\n.assign-badge {\n font-family: var(--font-display);\n font-size: 10px;\n font-weight: 700;\n padding: 1px 5px;\n line-height: 1.4;\n flex-shrink: 0;\n}\n\n.assign-badge.M {\n background: var(--mountain);\n color: #0d0d14;\n}\n\n.assign-badge.V {\n background: var(--valley);\n color: #0d0d14;\n}\n\n.assign-badge.B {\n background: var(--border-bright);\n color: var(--text-dim);\n}\n\n.step-reward-delta {\n font-size: 11px;\n color: var(--text-dim);\n padding-left: 32px;\n}\n\n.step-reward-delta .delta-positive {\n color: var(--progress);\n}\n\n.step-reward-delta .delta-negative {\n color: #ef4444;\n}\n\n/* ─── REWARD PANEL ─── */\n.reward-panel {\n padding: 12px 16px;\n border-bottom: 1px solid var(--border);\n flex-shrink: 0;\n}\n\n.reward-row {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 6px;\n}\n\n.reward-row:last-child {\n margin-bottom: 0;\n}\n\n.reward-label {\n font-family: var(--font-display);\n font-size: 10px;\n font-weight: 500;\n letter-spacing: 0.06em;\n color: var(--text-dim);\n width: 72px;\n flex-shrink: 0;\n text-transform: uppercase;\n}\n\n.reward-track {\n flex: 1;\n height: 8px;\n background: var(--bg);\n border: 1px solid var(--border);\n overflow: hidden;\n}\n\n.reward-bar {\n height: 100%;\n transition: width 0.4s ease;\n}\n\n.reward-value {\n font-family: var(--font-display);\n font-size: 11px;\n font-weight: 500;\n color: var(--text-primary);\n width: 36px;\n text-align: right;\n flex-shrink: 0;\n}\n\n.reward-value.dim {\n color: var(--text-dim);\n}\n\n.reward-divider {\n height: 1px;\n background: var(--border);\n margin: 6px 0;\n}\n\n/* ─── INFO BADGES ─── */\n.info-badges {\n padding: 12px 16px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.info-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n\n.info-key {\n font-family: var(--font-display);\n font-size: 10px;\n font-weight: 500;\n letter-spacing: 0.06em;\n color: var(--text-dim);\n text-transform: uppercase;\n}\n\n.info-val {\n font-family: var(--font-display);\n font-size: 11px;\n font-weight: 700;\n color: var(--text-primary);\n}\n\n.info-val.bool-true {\n color: var(--progress);\n}\n\n.info-val.bool-false {\n color: #ef4444;\n}\n\n.info-val.dim {\n color: var(--text-dim);\n}\n\n/* ─── TARGET SELECTOR ─── */\n.target-selector {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.target-selector-label {\n font-family: var(--font-display);\n font-size: 10px;\n font-weight: 500;\n letter-spacing: 0.10em;\n color: var(--text-dim);\n text-transform: uppercase;\n white-space: nowrap;\n}\n\n.target-select {\n background: var(--surface-2);\n border: 1px solid var(--border-bright);\n color: var(--text-primary);\n font-family: var(--font-display);\n font-size: 11px;\n padding: 4px 8px;\n outline: none;\n cursor: pointer;\n min-width: 180px;\n}\n\n.target-select:focus {\n border-color: var(--valley);\n}\n\noptgroup {\n background: var(--surface);\n color: var(--text-dim);\n font-family: var(--font-display);\n font-size: 10px;\n}\n\noption {\n background: var(--surface-2);\n color: var(--text-primary);\n font-family: var(--font-display);\n}\n\n/* ─── PLAYER CONTROLS ─── */\n.player-controls {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-shrink: 0;\n}\n\n.ctrl-btn {\n background: var(--surface-2);\n border: 1px solid var(--border-bright);\n color: var(--text-primary);\n font-family: var(--font-display);\n font-size: 11px;\n font-weight: 500;\n padding: 4px 10px;\n cursor: pointer;\n white-space: nowrap;\n line-height: 1.4;\n letter-spacing: 0.04em;\n transition: background 0.1s, border-color 0.1s;\n}\n\n.ctrl-btn:hover:not(:disabled) {\n background: var(--surface);\n border-color: var(--text-dim);\n}\n\n.ctrl-btn:disabled {\n opacity: 0.35;\n cursor: not-allowed;\n}\n\n.ctrl-btn.play {\n border-color: var(--valley);\n color: var(--valley);\n}\n\n.ctrl-btn.play:hover:not(:disabled) {\n background: rgba(56, 189, 248, 0.1);\n}\n\n.ctrl-step-display {\n font-family: var(--font-display);\n font-size: 11px;\n color: var(--text-dim);\n padding: 4px 8px;\n border: 1px solid var(--border);\n background: var(--bg);\n white-space: nowrap;\n min-width: 72px;\n text-align: center;\n}\n\n/* ─── LOADING / ERROR ─── */\n.app-overlay {\n position: fixed;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--bg);\n z-index: 100;\n}\n\n.overlay-message {\n font-family: var(--font-display);\n font-size: 13px;\n letter-spacing: 0.1em;\n color: var(--text-dim);\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.pulse-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--valley);\n animation: pulse 1.2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% { opacity: 0.2; transform: scale(0.8); }\n 50% { opacity: 1; transform: scale(1); }\n}\n\n/* ─── MISC ─── */\n.episode-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 12px 16px;\n font-family: var(--font-display);\n font-size: 11px;\n color: var(--text-dim);\n letter-spacing: 0.08em;\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/build/static/js/main.b94094b6.js b/build/static/js/main.b94094b6.js new file mode 100644 index 0000000000000000000000000000000000000000..a460d93dc16db5703fd9f2708dc465f961ec51b1 --- /dev/null +++ b/build/static/js/main.b94094b6.js @@ -0,0 +1,3 @@ +/*! For license information please see main.b94094b6.js.LICENSE.txt */ +(()=>{"use strict";var e={4(e,t,n){var r=n(853),l=n(43),a=n(950);function o(e){var t="https://react.dev/errors/"+e;if(1F||(e.current=A[F],A[F]=null,F--)}function $(e,t){F++,A[F]=e.current,e.current=t}var H,V,B=I(null),Q=I(null),W=I(null),q=I(null);function K(e,t){switch($(W,t),$(Q,e),$(B,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?yf(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)e=bf(t=yf(t),e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}U(B),$(B,e)}function Y(){U(B),U(Q),U(W)}function G(e){null!==e.memoizedState&&$(q,e);var t=B.current,n=bf(t,e.type);t!==n&&($(Q,e),$(B,n))}function X(e){Q.current===e&&(U(B),U(Q)),q.current===e&&(U(q),fd._currentValue=D)}function Z(e){if(void 0===H)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);H=t&&t[1]||"",V=-1)":-1--l||u[r]!==s[l]){var c="\n"+u[r].replace(" at new "," at ");return e.displayName&&c.includes("")&&(c=c.replace("",e.displayName)),c}}while(1<=r&&0<=l);break}}}finally{J=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?Z(n):""}function te(e,t){switch(e.tag){case 26:case 27:case 5:return Z(e.type);case 16:return Z("Lazy");case 13:return e.child!==t&&null!==t?Z("Suspense Fallback"):Z("Suspense");case 19:return Z("SuspenseList");case 0:case 15:return ee(e.type,!1);case 11:return ee(e.type.render,!1);case 1:return ee(e.type,!0);case 31:return Z("Activity");default:return""}}function ne(e){try{var t="",n=null;do{t+=te(e,n),n=e,e=e.return}while(e);return t}catch(r){return"\nError generating stack: "+r.message+"\n"+r.stack}}var re=Object.prototype.hasOwnProperty,le=r.unstable_scheduleCallback,ae=r.unstable_cancelCallback,oe=r.unstable_shouldYield,ie=r.unstable_requestPaint,ue=r.unstable_now,se=r.unstable_getCurrentPriorityLevel,ce=r.unstable_ImmediatePriority,fe=r.unstable_UserBlockingPriority,de=r.unstable_NormalPriority,pe=r.unstable_LowPriority,me=r.unstable_IdlePriority,he=r.log,ge=r.unstable_setDisableYieldValue,ve=null,ye=null;function be(e){if("function"===typeof he&&ge(e),ye&&"function"===typeof ye.setStrictMode)try{ye.setStrictMode(ve,e)}catch(t){}}var ke=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(we(e)/Se|0)|0},we=Math.log,Se=Math.LN2;var xe=256,Ee=262144,Ce=4194304;function Ne(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return 261888&e;case 262144:case 524288:case 1048576:case 2097152:return 3932160&e;case 4194304:case 8388608:case 16777216:case 33554432:return 62914560&e;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function _e(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var l=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var i=134217727&r;return 0!==i?0!==(r=i&~a)?l=Ne(r):0!==(o&=i)?l=Ne(o):n||0!==(n=i&~e)&&(l=Ne(n)):0!==(i=r&~a)?l=Ne(i):0!==o?l=Ne(o):n||0!==(n=r&~e)&&(l=Ne(n)),0===l?0:0!==t&&t!==l&&0===(t&a)&&((a=l&-l)>=(n=t&-t)||32===a&&0!==(4194048&n))?t:l}function Pe(e,t){return 0===(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)}function ze(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function Te(){var e=Ce;return 0===(62914560&(Ce<<=1))&&(Ce=4194304),e}function Le(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Oe(e,t){e.pendingLanes|=t,268435456!==t&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function je(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-ke(t);e.entangledLanes|=t,e.entanglements[r]=1073741824|e.entanglements[r]|261930&n}function Re(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-ke(n),l=1<=Nn),zn=String.fromCharCode(32),Tn=!1;function Ln(e,t){switch(e){case"keyup":return-1!==En.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function On(e){return"object"===typeof(e=e.detail)&&"data"in e?e.data:null}var jn=!1;var Rn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Mn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Rn[e.type]:"textarea"===t}function Dn(e,t,n,r){Mt?Dt?Dt.push(r):Dt=[r]:Mt=r,0<(t=rf(t,"onChange")).length&&(n=new nn("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var An=null,Fn=null;function In(e){Yc(e,0)}function Un(e){if(mt(Ze(e)))return e}function $n(e,t){if("change"===e)return t}var Hn=!1;if($t){var Vn;if($t){var Bn="oninput"in document;if(!Bn){var Qn=document.createElement("div");Qn.setAttribute("oninput","return;"),Bn="function"===typeof Qn.oninput}Vn=Bn}else Vn=!1;Hn=Vn&&(!document.documentMode||9=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=er(r)}}function nr(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?nr(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function rr(e){for(var t=ht((e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window).document);t instanceof e.HTMLIFrameElement;){try{var n="string"===typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=ht((e=t.contentWindow).document)}return t}function lr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var ar=$t&&"documentMode"in document&&11>=document.documentMode,or=null,ir=null,ur=null,sr=!1;function cr(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;sr||null==or||or!==ht(r)||("selectionStart"in(r=or)&&lr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},ur&&Jn(ur,r)||(ur=r,0<(r=rf(ir,"onSelect")).length&&(t=new nn("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=or)))}function fr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var dr={animationend:fr("Animation","AnimationEnd"),animationiteration:fr("Animation","AnimationIteration"),animationstart:fr("Animation","AnimationStart"),transitionrun:fr("Transition","TransitionRun"),transitionstart:fr("Transition","TransitionStart"),transitioncancel:fr("Transition","TransitionCancel"),transitionend:fr("Transition","TransitionEnd")},pr={},mr={};function hr(e){if(pr[e])return pr[e];if(!dr[e])return e;var t,n=dr[e];for(t in n)if(n.hasOwnProperty(t)&&t in mr)return pr[e]=n[t];return e}$t&&(mr=document.createElement("div").style,"AnimationEvent"in window||(delete dr.animationend.animation,delete dr.animationiteration.animation,delete dr.animationstart.animation),"TransitionEvent"in window||delete dr.transitionend.transition);var gr=hr("animationend"),vr=hr("animationiteration"),yr=hr("animationstart"),br=hr("transitionrun"),kr=hr("transitionstart"),wr=hr("transitioncancel"),Sr=hr("transitionend"),xr=new Map,Er="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Cr(e,t){xr.set(e,t),rt(t,[e])}Er.push("scrollEnd");var Nr="function"===typeof reportError?reportError:function(e){if("object"===typeof window&&"function"===typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"===typeof e&&null!==e&&"string"===typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"===typeof process&&"function"===typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)},_r=[],Pr=0,zr=0;function Tr(){for(var e=Pr,t=zr=Pr=0;t>=o,l-=o,nl=1<<32-ke(t)+l|n<h?(g=f,f=null):g=f.sibling;var v=p(l,f,i[h],u);if(null===v){null===f&&(f=g);break}e&&f&&null===v.alternate&&t(l,f),o=a(v,o,h),null===c?s=v:c.sibling=v,c=v,f=g}if(h===i.length)return n(l,f),fl&&ll(l,h),s;if(null===f){for(;hg?(v=h,h=null):v=h.sibling;var b=p(l,h,y.value,s);if(null===b){null===h&&(h=v);break}e&&h&&null===b.alternate&&t(l,h),i=a(b,i,g),null===f?c=b:f.sibling=b,f=b,h=v}if(y.done)return n(l,h),fl&&ll(l,g),c;if(null===h){for(;!y.done;g++,y=u.next())null!==(y=d(l,y.value,s))&&(i=a(y,i,g),null===f?c=y:f.sibling=y,f=y);return fl&&ll(l,g),c}for(h=r(h);!y.done;g++,y=u.next())null!==(y=m(h,l,g,y.value,s))&&(e&&null!==y.alternate&&h.delete(null===y.key?g:y.key),i=a(y,i,g),null===f?c=y:f.sibling=y,f=y);return e&&h.forEach(function(e){return t(l,e)}),fl&&ll(l,g),c}(u,s,c=b.call(c),f)}if("function"===typeof c.then)return y(u,s,sa(c),f);if(c.$$typeof===w)return y(u,s,jl(u,c),f);fa(u,c)}return"string"===typeof c&&""!==c||"number"===typeof c||"bigint"===typeof c?(c=""+c,null!==s&&6===s.tag?(n(u,s.sibling),(f=l(s,c)).return=u,u=f):(n(u,s),(f=Br(c,u.mode,f)).return=u,u=f),i(u)):n(u,s)}return function(e,t,n,r){try{ua=0;var l=y(e,t,n,r);return ia=null,l}catch(o){if(o===Xl||o===Jl)throw o;var a=Fr(29,o,null,e.mode);return a.lanes=r,a.return=e,a}}}var pa=da(!0),ma=da(!1),ha=!1;function ga(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function va(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function ya(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function ba(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,0!==(2&ps)){var l=r.pending;return null===l?t.next=t:(t.next=l.next,l.next=t),r.pending=t,t=Mr(e),Rr(e,null,n),t}return Lr(e,r,t,n),Mr(e)}function ka(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!==(4194048&n))){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,Re(e,n)}}function wa(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var l=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};null===a?l=a=o:a=a.next=o,n=n.next}while(null!==n);null===a?l=a=t:a=a.next=t}else l=a=t;return n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Sa=!1;function xa(){if(Sa){if(null!==Bl)throw Bl}}function Ea(e,t,n,r){Sa=!1;var l=e.updateQueue;ha=!1;var a=l.firstBaseUpdate,o=l.lastBaseUpdate,i=l.shared.pending;if(null!==i){l.shared.pending=null;var u=i,s=u.next;u.next=null,null===o?a=s:o.next=s,o=u;var c=e.alternate;null!==c&&((i=(c=c.updateQueue).lastBaseUpdate)!==o&&(null===i?c.firstBaseUpdate=s:i.next=s,c.lastBaseUpdate=u))}if(null!==a){var f=l.baseState;for(o=0,c=s=u=null,i=a;;){var d=-536870913&i.lane,m=d!==i.lane;if(m?(gs&d)===d:(r&d)===d){0!==d&&d===Vl&&(Sa=!0),null!==c&&(c=c.next={lane:0,tag:i.tag,payload:i.payload,callback:null,next:null});e:{var h=e,g=i;d=t;var v=n;switch(g.tag){case 1:if("function"===typeof(h=g.payload)){f=h.call(v,f,d);break e}f=h;break e;case 3:h.flags=-65537&h.flags|128;case 0:if(null===(d="function"===typeof(h=g.payload)?h.call(v,f,d):h)||void 0===d)break e;f=p({},f,d);break e;case 2:ha=!0}}null!==(d=i.callback)&&(e.flags|=64,m&&(e.flags|=8192),null===(m=l.callbacks)?l.callbacks=[d]:m.push(d))}else m={lane:d,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===c?(s=c=m,u=f):c=c.next=m,o|=d;if(null===(i=i.next)){if(null===(i=l.shared.pending))break;i=(m=i).next,m.next=null,l.lastBaseUpdate=m,l.shared.pending=null}}null===c&&(u=f),l.baseState=u,l.firstBaseUpdate=s,l.lastBaseUpdate=c,null===a&&(l.shared.lanes=0),Es|=o,e.lanes=o,e.memoizedState=f}}function Ca(e,t){if("function"!==typeof e)throw Error(o(191,e));e.call(t)}function Na(e,t){var n=e.callbacks;if(null!==n)for(e.callbacks=null,e=0;ea?a:8;var o=R.T,i={};R.T=i,fi(e,!1,t,n);try{var u=l(),s=R.S;if(null!==s&&s(i,u),null!==u&&"object"===typeof u&&"function"===typeof u.then)ci(e,t,function(e,t){var n=[],r={status:"pending",value:null,reason:null,then:function(e){n.push(e)}};return e.then(function(){r.status="fulfilled",r.value=t;for(var e=0;e<\/script>",a=a.removeChild(a.firstChild);break;case"select":a="string"===typeof r.is?i.createElement("select",{is:r.is}):i.createElement("select"),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a="string"===typeof r.is?i.createElement(l,{is:r.is}):i.createElement(l)}}a[$e]=t,a[He]=r;e:for(i=t.child;null!==i;){if(5===i.tag||6===i.tag)a.appendChild(i.stateNode);else if(4!==i.tag&&27!==i.tag&&null!==i.child){i.child.return=i,i=i.child;continue}if(i===t)break e;for(;null===i.sibling;){if(null===i.return||i.return===t)break e;i=i.return}i.sibling.return=i.return,i=i.sibling}t.stateNode=a;e:switch(pf(a,l,r),l){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}r&&iu(t)}}return du(t),uu(t,t.type,null===e||e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&null!=t.stateNode)e.memoizedProps!==r&&iu(t);else{if("string"!==typeof r&&null===t.stateNode)throw Error(o(166));if(e=W.current,yl(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,null!==(l=sl))switch(l.tag){case 27:case 5:r=l.memoizedProps}e[$e]=t,(e=!!(e.nodeValue===n||null!==r&&!0===r.suppressHydrationWarning||cf(e.nodeValue,n)))||hl(t,!0)}else(e=vf(e).createTextNode(r))[$e]=t,t.stateNode=e}return du(t),null;case 31:if(n=t.memoizedState,null===e||null!==e.memoizedState){if(r=yl(t),null!==n){if(null===e){if(!r)throw Error(o(318));if(!(e=null!==(e=t.memoizedState)?e.dehydrated:null))throw Error(o(557));e[$e]=t}else bl(),0===(128&t.flags)&&(t.memoizedState=null),t.flags|=4;du(t),e=!1}else n=kl(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return 256&t.flags?(Fa(t),t):(Fa(t),null);if(0!==(128&t.flags))throw Error(o(558))}return du(t),null;case 13:if(r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(l=yl(t),null!==r&&null!==r.dehydrated){if(null===e){if(!l)throw Error(o(318));if(!(l=null!==(l=t.memoizedState)?l.dehydrated:null))throw Error(o(317));l[$e]=t}else bl(),0===(128&t.flags)&&(t.memoizedState=null),t.flags|=4;du(t),l=!1}else l=kl(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=l),l=!0;if(!l)return 256&t.flags?(Fa(t),t):(Fa(t),null)}return Fa(t),0!==(128&t.flags)?(t.lanes=n,t):(n=null!==r,e=null!==e&&null!==e.memoizedState,n&&(l=null,null!==(r=t.child).alternate&&null!==r.alternate.memoizedState&&null!==r.alternate.memoizedState.cachePool&&(l=r.alternate.memoizedState.cachePool.pool),a=null,null!==r.memoizedState&&null!==r.memoizedState.cachePool&&(a=r.memoizedState.cachePool.pool),a!==l&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),cu(t,t.updateQueue),du(t),null);case 4:return Y(),null===e&&Jc(t.stateNode.containerInfo),du(t),null;case 10:return Nl(t.type),du(t),null;case 19:if(U(Ia),null===(r=t.memoizedState))return du(t),null;if(l=0!==(128&t.flags),null===(a=r.rendering))if(l)fu(r,!1);else{if(0!==xs||null!==e&&0!==(128&e.flags))for(e=t.child;null!==e;){if(null!==(a=Ua(e))){for(t.flags|=128,fu(r,!1),e=a.updateQueue,t.updateQueue=e,cu(t,e),t.subtreeFlags=0,e=n,n=t.child;null!==n;)$r(n,e),n=n.sibling;return $(Ia,1&Ia.current|2),fl&&ll(t,r.treeForkCount),t.child}e=e.sibling}null!==r.tail&&ue()>Rs&&(t.flags|=128,l=!0,fu(r,!1),t.lanes=4194304)}else{if(!l)if(null!==(e=Ua(a))){if(t.flags|=128,l=!0,e=e.updateQueue,t.updateQueue=e,cu(t,e),fu(r,!0),null===r.tail&&"hidden"===r.tailMode&&!a.alternate&&!fl)return du(t),null}else 2*ue()-r.renderingStartTime>Rs&&536870912!==n&&(t.flags|=128,l=!0,fu(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(null!==(e=r.last)?e.sibling=a:t.child=a,r.last=a)}return null!==r.tail?(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=ue(),e.sibling=null,n=Ia.current,$(Ia,l?1&n|2:1&n),fl&&ll(t,r.treeForkCount),e):(du(t),null);case 22:case 23:return Fa(t),La(),r=null!==t.memoizedState,null!==e?null!==e.memoizedState!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?0!==(536870912&n)&&0===(128&t.flags)&&(du(t),6&t.subtreeFlags&&(t.flags|=8192)):du(t),null!==(n=t.updateQueue)&&cu(t,n.retryQueue),n=null,null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),r=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),null!==e&&U(ql),null;case 24:return n=null,null!==e&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),Nl(Fl),du(t),null;case 25:case 30:return null}throw Error(o(156,t.tag))}function mu(e,t){switch(il(t),t.tag){case 1:return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return Nl(Fl),Y(),0!==(65536&(e=t.flags))&&0===(128&e)?(t.flags=-65537&e|128,t):null;case 26:case 27:case 5:return X(t),null;case 31:if(null!==t.memoizedState){if(Fa(t),null===t.alternate)throw Error(o(340));bl()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 13:if(Fa(t),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(o(340));bl()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return U(Ia),null;case 4:return Y(),null;case 10:return Nl(t.type),null;case 22:case 23:return Fa(t),La(),null!==e&&U(ql),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 24:return Nl(Fl),null;default:return null}}function hu(e,t){switch(il(t),t.tag){case 3:Nl(Fl),Y();break;case 26:case 27:case 5:X(t);break;case 4:Y();break;case 31:null!==t.memoizedState&&Fa(t);break;case 13:Fa(t);break;case 19:U(Ia);break;case 10:Nl(t.type);break;case 22:case 23:Fa(t),La(),null!==e&&U(ql);break;case 24:Nl(Fl)}}function gu(e,t){try{var n=t.updateQueue,r=null!==n?n.lastEffect:null;if(null!==r){var l=r.next;n=l;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==l)}}catch(i){xc(t,t.return,i)}}function vu(e,t,n){try{var r=t.updateQueue,l=null!==r?r.lastEffect:null;if(null!==l){var a=l.next;r=a;do{if((r.tag&e)===e){var o=r.inst,i=o.destroy;if(void 0!==i){o.destroy=void 0,l=t;var u=n,s=i;try{s()}catch(c){xc(l,u,c)}}}r=r.next}while(r!==a)}}catch(c){xc(t,t.return,c)}}function yu(e){var t=e.updateQueue;if(null!==t){var n=e.stateNode;try{Na(t,n)}catch(r){xc(e,e.return,r)}}}function bu(e,t,n){n.props=xi(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(r){xc(e,t,r)}}function ku(e,t){try{var n=e.ref;if(null!==n){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;default:r=e.stateNode}"function"===typeof n?e.refCleanup=n(r):n.current=r}}catch(l){xc(e,t,l)}}function wu(e,t){var n=e.ref,r=e.refCleanup;if(null!==n)if("function"===typeof r)try{r()}catch(l){xc(e,t,l)}finally{e.refCleanup=null,null!=(e=e.alternate)&&(e.refCleanup=null)}else if("function"===typeof n)try{n(null)}catch(a){xc(e,t,a)}else n.current=null}function Su(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&r.focus();break e;case"img":n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(l){xc(e,e.return,l)}}function xu(e,t,n){try{var r=e.stateNode;!function(e,t,n,r){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var l=null,a=null,i=null,u=null,s=null,c=null,f=null;for(m in n){var d=n[m];if(n.hasOwnProperty(m)&&null!=d)switch(m){case"checked":case"value":break;case"defaultValue":s=d;default:r.hasOwnProperty(m)||ff(e,t,m,null,r,d)}}for(var p in r){var m=r[p];if(d=n[p],r.hasOwnProperty(p)&&(null!=m||null!=d))switch(p){case"type":a=m;break;case"name":l=m;break;case"checked":c=m;break;case"defaultChecked":f=m;break;case"value":i=m;break;case"defaultValue":u=m;break;case"children":case"dangerouslySetInnerHTML":if(null!=m)throw Error(o(137,t));break;default:m!==d&&ff(e,t,p,m,r,d)}}return void yt(e,i,u,s,c,f,a,l);case"select":for(a in m=i=u=p=null,n)if(s=n[a],n.hasOwnProperty(a)&&null!=s)switch(a){case"value":break;case"multiple":m=s;default:r.hasOwnProperty(a)||ff(e,t,a,null,r,s)}for(l in r)if(a=r[l],s=n[l],r.hasOwnProperty(l)&&(null!=a||null!=s))switch(l){case"value":p=a;break;case"defaultValue":u=a;break;case"multiple":i=a;default:a!==s&&ff(e,t,l,a,r,s)}return t=u,n=i,r=m,void(null!=p?wt(e,!!n,p,!1):!!r!==!!n&&(null!=t?wt(e,!!n,t,!0):wt(e,!!n,n?[]:"",!1)));case"textarea":for(u in m=p=null,n)if(l=n[u],n.hasOwnProperty(u)&&null!=l&&!r.hasOwnProperty(u))switch(u){case"value":case"children":break;default:ff(e,t,u,null,r,l)}for(i in r)if(l=r[i],a=n[i],r.hasOwnProperty(i)&&(null!=l||null!=a))switch(i){case"value":p=l;break;case"defaultValue":m=l;break;case"children":break;case"dangerouslySetInnerHTML":if(null!=l)throw Error(o(91));break;default:l!==a&&ff(e,t,i,l,r,a)}return void St(e,p,m);case"option":for(var h in n)if(p=n[h],n.hasOwnProperty(h)&&null!=p&&!r.hasOwnProperty(h))if("selected"===h)e.selected=!1;else ff(e,t,h,null,r,p);for(s in r)if(p=r[s],m=n[s],r.hasOwnProperty(s)&&p!==m&&(null!=p||null!=m))if("selected"===s)e.selected=p&&"function"!==typeof p&&"symbol"!==typeof p;else ff(e,t,s,p,r,m);return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var g in n)p=n[g],n.hasOwnProperty(g)&&null!=p&&!r.hasOwnProperty(g)&&ff(e,t,g,null,r,p);for(c in r)if(p=r[c],m=n[c],r.hasOwnProperty(c)&&p!==m&&(null!=p||null!=m))switch(c){case"children":case"dangerouslySetInnerHTML":if(null!=p)throw Error(o(137,t));break;default:ff(e,t,c,p,r,m)}return;default:if(Pt(t)){for(var v in n)p=n[v],n.hasOwnProperty(v)&&void 0!==p&&!r.hasOwnProperty(v)&&df(e,t,v,void 0,r,p);for(f in r)p=r[f],m=n[f],!r.hasOwnProperty(f)||p===m||void 0===p&&void 0===m||df(e,t,f,p,r,m);return}}for(var y in n)p=n[y],n.hasOwnProperty(y)&&null!=p&&!r.hasOwnProperty(y)&&ff(e,t,y,null,r,p);for(d in r)p=r[d],m=n[d],!r.hasOwnProperty(d)||p===m||null==p&&null==m||ff(e,t,d,p,r,m)}(r,e.type,n,t),r[He]=t}catch(l){xc(e,e.return,l)}}function Eu(e){return 5===e.tag||3===e.tag||26===e.tag||27===e.tag&&_f(e.type)||4===e.tag}function Cu(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||Eu(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(27===e.tag&&_f(e.type))continue e;if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function Nu(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?(9===n.nodeType?n.body:"HTML"===n.nodeName?n.ownerDocument.body:n).insertBefore(e,t):((t=9===n.nodeType?n.body:"HTML"===n.nodeName?n.ownerDocument.body:n).appendChild(e),null!==(n=n._reactRootContainer)&&void 0!==n||null!==t.onclick||(t.onclick=Ot));else if(4!==r&&(27===r&&_f(e.type)&&(n=e.stateNode,t=null),null!==(e=e.child)))for(Nu(e,t,n),e=e.sibling;null!==e;)Nu(e,t,n),e=e.sibling}function _u(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&(27===r&&_f(e.type)&&(n=e.stateNode),null!==(e=e.child)))for(_u(e,t,n),e=e.sibling;null!==e;)_u(e,t,n),e=e.sibling}function Pu(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,l=t.attributes;l.length;)t.removeAttributeNode(l[0]);pf(t,r,n),t[$e]=e,t[He]=n}catch(a){xc(e,e.return,a)}}var zu=!1,Tu=!1,Lu=!1,Ou="function"===typeof WeakSet?WeakSet:Set,ju=null;function Ru(e,t,n){var r=n.flags;switch(n.tag){case 0:case 11:case 15:Ku(e,n),4&r&&gu(5,n);break;case 1:if(Ku(e,n),4&r)if(e=n.stateNode,null===t)try{e.componentDidMount()}catch(o){xc(n,n.return,o)}else{var l=xi(n.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(l,t,e.__reactInternalSnapshotBeforeUpdate)}catch(i){xc(n,n.return,i)}}64&r&&yu(n),512&r&&ku(n,n.return);break;case 3:if(Ku(e,n),64&r&&null!==(e=n.updateQueue)){if(t=null,null!==n.child)switch(n.child.tag){case 27:case 5:case 1:t=n.child.stateNode}try{Na(e,t)}catch(o){xc(n,n.return,o)}}break;case 27:null===t&&4&r&&Pu(n);case 26:case 5:Ku(e,n),null===t&&4&r&&Su(n),512&r&&ku(n,n.return);break;case 12:Ku(e,n);break;case 31:Ku(e,n),4&r&&Uu(e,n);break;case 13:Ku(e,n),4&r&&$u(e,n),64&r&&(null!==(e=n.memoizedState)&&(null!==(e=e.dehydrated)&&function(e,t){var n=e.ownerDocument;if("$~"===e.data)e._reactRetry=t;else if("$?"!==e.data||"loading"!==n.readyState)t();else{var r=function(){t(),n.removeEventListener("DOMContentLoaded",r)};n.addEventListener("DOMContentLoaded",r),e._reactRetry=r}}(e,n=_c.bind(null,n))));break;case 22:if(!(r=null!==n.memoizedState||zu)){t=null!==t&&null!==t.memoizedState||Tu,l=zu;var a=Tu;zu=r,(Tu=t)&&!a?Gu(e,n,0!==(8772&n.subtreeFlags)):Ku(e,n),zu=l,Tu=a}break;case 30:break;default:Ku(e,n)}}function Mu(e){var t=e.alternate;null!==t&&(e.alternate=null,Mu(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&Ye(t)),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}var Du=null,Au=!1;function Fu(e,t,n){for(n=n.child;null!==n;)Iu(e,t,n),n=n.sibling}function Iu(e,t,n){if(ye&&"function"===typeof ye.onCommitFiberUnmount)try{ye.onCommitFiberUnmount(ve,n)}catch(a){}switch(n.tag){case 26:Tu||wu(n,t),Fu(e,t,n),n.memoizedState?n.memoizedState.count--:n.stateNode&&(n=n.stateNode).parentNode.removeChild(n);break;case 27:Tu||wu(n,t);var r=Du,l=Au;_f(n.type)&&(Du=n.stateNode,Au=!1),Fu(e,t,n),If(n.stateNode),Du=r,Au=l;break;case 5:Tu||wu(n,t);case 6:if(r=Du,l=Au,Du=null,Fu(e,t,n),Au=l,null!==(Du=r))if(Au)try{(9===Du.nodeType?Du.body:"HTML"===Du.nodeName?Du.ownerDocument.body:Du).removeChild(n.stateNode)}catch(o){xc(n,t,o)}else try{Du.removeChild(n.stateNode)}catch(o){xc(n,t,o)}break;case 18:null!==Du&&(Au?(Pf(9===(e=Du).nodeType?e.body:"HTML"===e.nodeName?e.ownerDocument.body:e,n.stateNode),Qd(e)):Pf(Du,n.stateNode));break;case 4:r=Du,l=Au,Du=n.stateNode.containerInfo,Au=!0,Fu(e,t,n),Du=r,Au=l;break;case 0:case 11:case 14:case 15:vu(2,n,t),Tu||vu(4,n,t),Fu(e,t,n);break;case 1:Tu||(wu(n,t),"function"===typeof(r=n.stateNode).componentWillUnmount&&bu(n,t,r)),Fu(e,t,n);break;case 21:Fu(e,t,n);break;case 22:Tu=(r=Tu)||null!==n.memoizedState,Fu(e,t,n),Tu=r;break;default:Fu(e,t,n)}}function Uu(e,t){if(null===t.memoizedState&&(null!==(e=t.alternate)&&null!==(e=e.memoizedState))){e=e.dehydrated;try{Qd(e)}catch(n){xc(t,t.return,n)}}}function $u(e,t){if(null===t.memoizedState&&(null!==(e=t.alternate)&&(null!==(e=e.memoizedState)&&null!==(e=e.dehydrated))))try{Qd(e)}catch(n){xc(t,t.return,n)}}function Hu(e,t){var n=function(e){switch(e.tag){case 31:case 13:case 19:var t=e.stateNode;return null===t&&(t=e.stateNode=new Ou),t;case 22:return null===(t=(e=e.stateNode)._retryCache)&&(t=e._retryCache=new Ou),t;default:throw Error(o(435,e.tag))}}(e);t.forEach(function(t){if(!n.has(t)){n.add(t);var r=Pc.bind(null,e,t);t.then(r,r)}})}function Vu(e,t){var n=t.deletions;if(null!==n)for(var r=0;r title"))),pf(a,r,n),a[$e]=e,et(a),r=a;break e;case"link":var i=rd("link","href",l).get(r+(n.href||""));if(i)for(var u=0;ui)break;var c=u.transferSize,f=u.initiatorType;c&&mf(f)&&(o+=c*((u=u.responseEnd)od?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(l)}}:null}(f,m)))return Us=a,e.cancelPendingCommit=m(hc.bind(null,e,t,a,n,r,l,o,i,u,c,f,null,d,p)),void Zs(e,a,o,!s)}hc(e,t,a,n,r,l,o,i,u)}function Xs(e){for(var t=e;;){var n=t.tag;if((0===n||11===n||15===n)&&16384&t.flags&&(null!==(n=t.updateQueue)&&null!==(n=n.stores)))for(var r=0;rg&&(o=g,g=h,h=o);var v=tr(i,h),y=tr(i,g);if(v&&y&&(1!==p.rangeCount||p.anchorNode!==v.node||p.anchorOffset!==v.offset||p.focusNode!==y.node||p.focusOffset!==y.offset)){var b=f.createRange();b.setStart(v.node,v.offset),p.removeAllRanges(),h>g?(p.addRange(b),p.extend(y.node,y.offset)):(b.setEnd(y.node,y.offset),p.addRange(b))}}}}for(f=[],p=i;p=p.parentNode;)1===p.nodeType&&f.push({element:p,left:p.scrollLeft,top:p.scrollTop});for("function"===typeof i.focus&&i.focus(),i=0;in?32:n,R.T=null,n=Hs,Hs=null;var a=Fs,i=Us;if(As=0,Is=Fs=null,Us=0,0!==(6&ps))throw Error(o(331));var u=ps;if(ps|=4,us(a.current),es(a,a.current,i,n),ps=u,Dc(0,!1),ye&&"function"===typeof ye.onPostCommitFiberRoot)try{ye.onPostCommitFiberRoot(ve,a)}catch(s){}return!0}finally{M.p=l,R.T=r,bc(e,t)}}function Sc(e,t,n){t=Kr(n,t),null!==(e=ba(e,t=zi(e.stateNode,t,2),2))&&(Oe(e,2),Mc(e))}function xc(e,t,n){if(3===e.tag)Sc(e,e,n);else for(;null!==t;){if(3===t.tag){Sc(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"===typeof t.type.getDerivedStateFromError||"function"===typeof r.componentDidCatch&&(null===Ds||!Ds.has(r))){e=Kr(n,e),null!==(r=ba(t,n=Ti(2),2))&&(Li(n,r,t,e),Oe(r,2),Mc(r));break}}t=t.return}}function Ec(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new ds;var l=new Set;r.set(t,l)}else void 0===(l=r.get(t))&&(l=new Set,r.set(t,l));l.has(n)||(ws=!0,l.add(n),e=Cc.bind(null,e,t,n),t.then(e,e))}function Cc(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,ms===e&&(gs&n)===n&&(4===xs||3===xs&&(62914560&gs)===gs&&300>ue()-Os?0===(2&ps)&&tc(e,0):Ns|=n,Ps===gs&&(Ps=0)),Mc(e)}function Nc(e,t){0===t&&(t=Te()),null!==(e=jr(e,t))&&(Oe(e,t),Mc(e))}function _c(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),Nc(e,n)}function Pc(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,l=e.memoizedState;null!==l&&(n=l.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(o(314))}null!==r&&r.delete(t),Nc(e,n)}var zc=null,Tc=null,Lc=!1,Oc=!1,jc=!1,Rc=0;function Mc(e){e!==Tc&&null===e.next&&(null===Tc?zc=Tc=e:Tc=Tc.next=e),Oc=!0,Lc||(Lc=!0,Cf(function(){0!==(6&ps)?le(ce,Ac):Fc()}))}function Dc(e,t){if(!jc&&Oc){jc=!0;do{for(var n=!1,r=zc;null!==r;){if(!t)if(0!==e){var l=r.pendingLanes;if(0===l)var a=0;else{var o=r.suspendedLanes,i=r.pingedLanes;a=(1<<31-ke(42|e)+1)-1,a=201326741&(a&=l&~(o&~i))?201326741&a|1:a?2|a:0}0!==a&&(n=!0,$c(r,a))}else a=gs,0===(3&(a=_e(r,r===ms?a:0,null!==r.cancelPendingCommit||-1!==r.timeoutHandle)))||Pe(r,a)||(n=!0,$c(r,a));r=r.next}}while(n);jc=!1}}function Ac(){Fc()}function Fc(){Oc=Lc=!1;var e=0;0!==Rc&&function(){var e=window.event;if(e&&"popstate"===e.type)return e!==wf&&(wf=e,!0);return wf=null,!1}()&&(e=Rc);for(var t=ue(),n=null,r=zc;null!==r;){var l=r.next,a=Ic(r,t);0===a?(r.next=null,null===n?zc=l:n.next=l,null===l&&(Tc=n)):(n=r,(0!==e||0!==(3&a))&&(Oc=!0)),r=l}0!==As&&5!==As||Dc(e,!1),0!==Rc&&(Rc=0)}function Ic(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,l=e.expirationTimes,a=-62914561&e.pendingLanes;0 title"):null)}function ad(e){return"stylesheet"!==e.type||0!==(3&e.state.loading)}var od=0;function id(){if(this.count--,0===this.count&&(0===this.imgCount||!this.waitingForImages))if(this.stylesheets)sd(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}var ud=null;function sd(e,t){e.stylesheets=null,null!==e.unsuspend&&(e.count++,ud=new Map,t.forEach(cd,e),ud=null,id.call(e))}function cd(e,t){if(!(4&t.state.loading)){var n=ud.get(e);if(n)var r=n.get(null);else{n=new Map,ud.set(e,n);for(var l=e.querySelectorAll("link[data-precedence],style[data-precedence]"),a=0;a>>1,l=e[r];if(!(0>>1;ra(u,n))sa(c,u)?(e[r]=c,e[s]=n,r=s):(e[r]=u,e[i]=n,r=i);else{if(!(sa(c,n)))break e;e[r]=c,e[s]=n,r=s}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(t.unstable_now=void 0,"object"===typeof performance&&"function"===typeof performance.now){var o=performance;t.unstable_now=function(){return o.now()}}else{var i=Date,u=i.now();t.unstable_now=function(){return i.now()-u}}var s=[],c=[],f=1,d=null,p=3,m=!1,h=!1,g=!1,v=!1,y="function"===typeof setTimeout?setTimeout:null,b="function"===typeof clearTimeout?clearTimeout:null,k="undefined"!==typeof setImmediate?setImmediate:null;function w(e){for(var t=r(c);null!==t;){if(null===t.callback)l(c);else{if(!(t.startTime<=e))break;l(c),t.sortIndex=t.expirationTime,n(s,t)}t=r(c)}}function S(e){if(g=!1,w(e),!h)if(null!==r(s))h=!0,E||(E=!0,x());else{var t=r(c);null!==t&&O(S,t.startTime-e)}}var x,E=!1,C=-1,N=5,_=-1;function P(){return!!v||!(t.unstable_now()-_e&&P());){var o=d.callback;if("function"===typeof o){d.callback=null,p=d.priorityLevel;var i=o(d.expirationTime<=e);if(e=t.unstable_now(),"function"===typeof i){d.callback=i,w(e),n=!0;break t}d===r(s)&&l(s),w(e)}else l(s);d=r(s)}if(null!==d)n=!0;else{var u=r(c);null!==u&&O(S,u.startTime-e),n=!1}}break e}finally{d=null,p=a,m=!1}n=void 0}}finally{n?x():E=!1}}}if("function"===typeof k)x=function(){k(z)};else if("undefined"!==typeof MessageChannel){var T=new MessageChannel,L=T.port2;T.port1.onmessage=z,x=function(){L.postMessage(null)}}else x=function(){y(z,0)};function O(e,n){C=y(function(){e(t.unstable_now())},n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_forceFrameRate=function(e){0>e||125o?(e.sortIndex=a,n(c,e),null===r(s)&&e===r(c)&&(g?(b(C),C=-1):g=!0,O(S,a-o))):(e.sortIndex=i,n(s,e),h||m||(h=!0,E||(E=!0,x()))),e},t.unstable_shouldYield=P,t.unstable_wrapCallback=function(e){var t=p;return function(){var n=p;p=t;try{return e.apply(this,arguments)}finally{p=n}}}},853(e,t,n){e.exports=n(896)}},t={};function n(r){var l=t[r];if(void 0!==l)return l.exports;var a=t[r]={exports:{}};return e[r](a,a.exports,n),a.exports}var r=n(43),l=n(391),a=n(579);const o="#f59e0b",i="#38bdf8";function u(e,t,n){return[e*n,(1-t)*n]}function s(e){let{target:t,dim:n}=e;if(!t)return null;const{vertices_coords:r,edges_vertices:l,edges_assignment:s}=t;return r&&l&&s?l.map((e,t)=>{const l=s[t];if("B"===l)return null;const c=r[e[0]],f=r[e[1]];if(!c||!f)return null;const[d,p]=u(c[0],c[1],n),[m,h]=u(f[0],f[1],n),g="M"===l?o:i;return(0,a.jsx)("line",{x1:d,y1:p,x2:m,y2:h,stroke:g,strokeOpacity:.25,strokeWidth:1.5,strokeDasharray:"5 4"},t)}):null}function c(e){let{paperState:t,dim:n}=e;if(!t)return null;const{vertices_coords:r,edges_vertices:l,edges_assignment:s}=t;return r&&l&&s?l.map((e,t)=>{const l=s[t];if("B"===l||"F"===l)return null;const c=r[e[0]],f=r[e[1]];if(!c||!f)return null;const[d,p]=u(c[0],c[1],n),[m,h]=u(f[0],f[1],n),g="M"===l?o:i;return(0,a.jsx)("line",{x1:d,y1:p,x2:m,y2:h,stroke:g,strokeWidth:2.5,strokeLinecap:"square"},t)}):null}function f(e){let{paperState:t,target:n,dim:r=280,ghostOnly:l=!1}=e;const o=r;return(0,a.jsxs)("svg",{className:"canvas-svg",width:o,height:o,viewBox:`0 0 ${o} ${o}`,style:{flexShrink:0},children:[(0,a.jsx)("rect",{x:1,y:1,width:o-2,height:o-2,fill:"#fafaf5"}),(0,a.jsx)(s,{target:n,dim:o}),!l&&(0,a.jsx)(c,{paperState:t,dim:o}),(0,a.jsx)("rect",{x:1,y:1,width:o-2,height:o-2,fill:"none",stroke:"#2a2a3a",strokeWidth:1})]})}const d=[{key:"compactness",label:"compactness",color:"var(--progress)",normalize:e=>Math.min(Math.max(e||0,0),1),format:e=>null!=e?e.toFixed(3):"\u2014"},{key:"max_strain",label:"max strain",color:"var(--validity)",normalize:e=>Math.min((e||0)/.2,1),format:e=>null!=e?e.toFixed(4):"\u2014",inverted:!0},{key:"kawasaki_violations",label:"kawasaki",color:"var(--validity)",normalize:e=>Math.min((e||0)/5,1),format:e=>null!=e?String(e):"\u2014",inverted:!0},{key:"maekawa_violations",label:"maekawa",color:"var(--validity)",normalize:e=>Math.min((e||0)/5,1),format:e=>null!=e?String(e):"\u2014",inverted:!0},{key:"fits_target_box",label:"fits box",color:"var(--progress)",normalize:e=>e?1:0,format:e=>null==e?"\u2014":e?"YES":"NO"},{key:"is_deployable",label:"deployable",color:"var(--progress)",normalize:e=>e?1:0,format:e=>null==e?"\u2014":e?"YES":"NO"}];function p(e){let{label:t,color:n,pct:r,formattedValue:l,isDash:o,inverted:i}=e;const u=i&&r>0?"var(--validity)":n;return(0,a.jsxs)("div",{className:"reward-row",children:[(0,a.jsx)("span",{className:"reward-label",children:t}),(0,a.jsx)("div",{className:"reward-track",children:(0,a.jsx)("div",{className:"reward-bar",style:{width:`${o?0:r}%`,background:u}})}),(0,a.jsx)("span",{className:"reward-value"+(o?" dim":""),children:l})]})}function m(e){let{metrics:t}=e;return(0,a.jsx)("div",{className:"reward-panel",children:d.map(e=>{let{key:n,label:r,color:l,normalize:o,format:i,inverted:u}=e;const s=t?t[n]:void 0,c=null===s||void 0===s,f=c?0:100*o(s);return(0,a.jsx)(p,{label:r,color:l,pct:f,formattedValue:c?"\u2014":i(s),isDash:c,inverted:!!u},n)})})}function h(e){let{steps:t,currentStep:n}=e;const l=(0,r.useRef)(null),o=(0,r.useRef)(null);return(0,r.useEffect)(()=>{o.current&&o.current.scrollIntoView({block:"nearest",behavior:"smooth"})},[n]),t&&0!==t.length?(0,a.jsx)("div",{className:"step-feed",ref:l,children:t.map((e,r)=>{const l=r+1,i=n===l,u=function(e,t){if(!e||!e.metrics)return null;const n=e.metrics.compactness;return null==n?null:t&&t.metrics&&null!=t.metrics.compactness?n-t.metrics.compactness:n}(e,r>0?t[r-1]:null),s=function(e){if(!e)return null;const t=e.type||"";return"valley"===t?"V":"mountain"===t?"M":"pleat"===t?"P":"crimp"===t?"C":t.charAt(0).toUpperCase()||null}(e.fold),c=function(e){if(!e)return"";const t=e.type||"fold",n=null!=e.angle?` ${e.angle}\xb0`:"";return`${t.toUpperCase()} FOLD${n}`}(e.fold),f=e.metrics||{};return(0,a.jsxs)("div",{className:"step-entry"+(i?" active":""),ref:i?o:null,children:[(0,a.jsxs)("div",{className:"step-entry-top",children:[(0,a.jsxs)("span",{className:"step-num",children:["#",l]}),(0,a.jsx)("span",{className:"step-instruction",children:c}),s&&(0,a.jsx)("span",{className:`assign-badge ${s}`,children:s})]}),null!==u&&(0,a.jsxs)("div",{className:"step-reward-delta",children:["\u0394"," compact:"," ",(0,a.jsxs)("span",{className:u>=0?"delta-positive":"delta-negative",children:[u>=0?"+":"",u.toFixed(3)]}),null!=f.max_strain&&(0,a.jsxs)("span",{style:{color:"var(--text-dim)"},children:[" ","| strain: ",f.max_strain.toFixed(4),null!=f.is_valid&&(0,a.jsxs)("span",{children:[" | ",f.is_valid?"\u2713":"\u2717"]})]})]})]},l)})}):(0,a.jsx)("div",{className:"step-feed",children:(0,a.jsx)("div",{style:{padding:"16px",color:"var(--text-dim)",fontFamily:"var(--font-display)",fontSize:"11px"},children:"NO STEPS LOADED"})})}function g(e){let{value:t}=e;return null===t||void 0===t?(0,a.jsx)("span",{className:"info-val dim",children:"\u2014"}):(0,a.jsx)("span",{className:"info-val "+(t?"bool-true":"bool-false"),children:t?"TRUE":"FALSE"})}function v(e){let{value:t,dim:n=!1}=e;return null===t||void 0===t?(0,a.jsx)("span",{className:"info-val dim",children:"\u2014"}):(0,a.jsx)("span",{className:"info-val"+(n?" dim":""),children:String(t).toUpperCase()})}function y(e){let{value:t}=e;return null===t||void 0===t?(0,a.jsx)("span",{className:"info-val dim",children:"\u2014"}):(0,a.jsx)("span",{className:"info-val",children:t})}function b(e){var t,n,r,l;let{metrics:o,paperState:i,targetDef:u}=e;const s=null!==(t=null!==(n=null===i||void 0===i?void 0:i.num_layers)&&void 0!==n?n:null===o||void 0===o?void 0:o.num_layers)&&void 0!==t?t:null,c=null!==(r=null!==(l=null===o||void 0===o?void 0:o.fold_count)&&void 0!==l?l:null===i||void 0===i?void 0:i.fold_count)&&void 0!==r?r:null;return(0,a.jsxs)("div",{className:"info-badges",children:[(0,a.jsxs)("div",{className:"info-row",children:[(0,a.jsx)("span",{className:"info-key",children:"fold_count"}),(0,a.jsx)(y,{value:c})]}),(0,a.jsxs)("div",{className:"info-row",children:[(0,a.jsx)("span",{className:"info-key",children:"num_layers"}),(0,a.jsx)(y,{value:s})]}),(0,a.jsxs)("div",{className:"info-row",children:[(0,a.jsx)("span",{className:"info-key",children:"is_valid"}),(0,a.jsx)(g,{value:o?o.is_valid:null})]}),(0,a.jsxs)("div",{className:"info-row",children:[(0,a.jsx)("span",{className:"info-key",children:"strain_exceeded"}),(0,a.jsx)(g,{value:o?o.strain_exceeded:null})]}),(0,a.jsxs)("div",{className:"info-row",children:[(0,a.jsx)("span",{className:"info-key",children:"is_deployable"}),(0,a.jsx)(g,{value:o?o.is_deployable:null})]}),u&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:"info-row",children:[(0,a.jsx)("span",{className:"info-key",children:"level"}),(0,a.jsxs)("span",{className:"info-val",children:["LVL ",u.level]})]}),(0,a.jsxs)("div",{className:"info-row",children:[(0,a.jsx)("span",{className:"info-key",children:"material"}),(0,a.jsx)(v,{value:u.material,dim:!0})]}),(0,a.jsxs)("div",{className:"info-row",children:[(0,a.jsx)("span",{className:"info-key",children:"task"}),(0,a.jsx)("span",{className:"info-val",style:{fontSize:"10px",textAlign:"right",maxWidth:"140px",wordBreak:"break-word"},children:(u.name||"").replace(/_/g," ").toUpperCase()})]})]})]})}function k(e){let{targets:t,selected:n,onChange:r}=e;const l=function(e){const t={};return Object.values(e).forEach(e=>{t[e.level]||(t[e.level]=[]),t[e.level].push(e)}),t}(t),o=Object.keys(l).sort((e,t)=>Number(e)-Number(t));return(0,a.jsxs)("div",{className:"target-selector",children:[(0,a.jsx)("span",{className:"target-selector-label",children:"TARGET"}),(0,a.jsx)("select",{className:"target-select",value:n,onChange:e=>r(e.target.value),children:0===o.length?(0,a.jsx)("option",{value:"",children:"LOADING..."}):o.map(e=>(0,a.jsx)("optgroup",{label:`\u2500\u2500 LEVEL ${e}`,children:l[e].map(e=>(0,a.jsx)("option",{value:e.name,children:e.name.replace(/_/g," ").toUpperCase()},e.name))},e))})]})}function w(e){let{playing:t,onPlay:n,onPause:r,onNext:l,onPrev:o,onReset:i,currentStep:u,totalSteps:s,disabled:c}=e;const f=0===u,d=u>=s;return(0,a.jsxs)("div",{className:"player-controls",children:[(0,a.jsx)("button",{className:"ctrl-btn",onClick:i,disabled:c||f,title:"Reset to start",children:"\u23ee RST"}),(0,a.jsx)("button",{className:"ctrl-btn",onClick:o,disabled:c||f,title:"Previous step",children:"\u25c0 PREV"}),(0,a.jsx)("span",{className:"ctrl-step-display",children:c?"\u2014/\u2014":`${u} / ${s}`}),(0,a.jsx)("button",{className:"ctrl-btn",onClick:l,disabled:c||d,title:"Next step",children:"NEXT \u25b6"}),(0,a.jsx)("button",{className:"ctrl-btn play",onClick:t?r:n,disabled:c||!t&&d,title:t?"Pause":"Play",children:t?"\u23f8 PAUSE":"\u25b6\u25b6 PLAY"})]})}const S=[250,250,245],x=-Math.PI/2+.1,E=Math.PI/2-.1,C=_([.4,-.45,1]);function N(e,t,n){return Math.min(Math.max(e,t),n)}function _(e){const t=Math.hypot(e[0],e[1],e[2]);return t<1e-12?[0,0,0]:[e[0]/t,e[1]/t,e[2]/t]}function P(e,t){return[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]]}function z(e,t){return[e[0]-t[0],e[1]-t[1],e[2]-t[2]]}function T(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]}function L(e){const t=N(.3+.7*Math.abs(e),0,1);return`rgb(${Math.round(S[0]*t)}, ${Math.round(S[1]*t)}, ${Math.round(S[2]*t)})`}function O(e,t){const n=N(e/.15,0,1),r=N(.3+.7*Math.abs(t),0,1),l=Math.round((250+5*n)*r),a=Math.round((250-200*n)*r),o=Math.round((245-245*n)*r);return`rgb(${N(l,0,255)}, ${N(a,0,255)}, ${N(o,0,255)})`}function j(e,t,n,r,l,a){e.clearRect(0,0,n,n),e.fillStyle="#121220",e.fillRect(0,0,n,n);const o=e=>function(e,t,n,r,l){let a=e[0]-.5,o=e[1]-.5,i=e[2]||0;const u=Math.cos(n),s=Math.sin(n),c=o*u-i*s,f=o*s+i*u,d=Math.cos(r),p=Math.sin(r),m=-a*p+f*d,h=2.8/(2.8-m),g=.82*l;return{x:.5*t+(a*d+f*p)*h*t*g,y:.52*t-c*h*t*g,z:m}}(e,n,r,l,a);if(!t){return void R(e,[[0,0,0],[1,0,0],[1,1,0],[0,1,0]],[[0,1,2],[0,2,3]],null,n,o)}const{vertices_coords:i,faces_vertices:u,strain_per_vertex:s,edges_vertices:c,edges_assignment:f}=t;if(!i||!u)return e.fillStyle="#121220",void e.fillRect(0,0,n,n);if(R(e,i,u,s,n,o),c&&f){const t=i.map(o);for(let n=0;ne.avgZ-t.avgZ);for(const u of i){const t=o[u.a],n=o[u.b],r=o[u.c];e.beginPath(),e.moveTo(t.x,t.y),e.lineTo(n.x,n.y),e.lineTo(r.x,r.y),e.closePath();const l=u.avgStrain>.005?O(u.avgStrain,u.intensity):L(u.intensity);e.fillStyle=l,e.fill(),e.strokeStyle="rgba(42, 42, 58, 0.22)",e.lineWidth=.55,e.stroke()}}function M(e){let{steps:t,currentStep:n,dim:l=280}=e;const o=(0,r.useRef)(null),[i,u]=(0,r.useState)(.62),[s,c]=(0,r.useState)(-.52),[f,d]=(0,r.useState)(1),p=(0,r.useRef)(!1),m=(0,r.useRef)({x:0,y:0}),h=(0,r.useCallback)(()=>{if(!t||0===t.length||0===n)return null;const e=t[n-1];return e?e.paper_state:null},[t,n]),g=(0,r.useCallback)(()=>{const e=o.current;if(!e)return;const t=e.getContext("2d");t&&j(t,h(),l,i,s,f)},[h,l,i,s,f]);return(0,r.useEffect)(()=>{g()},[g]),(0,r.useEffect)(()=>{const e=o.current;if(!e)return;const t=e=>{e.preventDefault(),d(t=>N(t*(e.deltaY>0?.9:1.1),.3,5))},n=t=>{p.current=!0,m.current={x:t.clientX,y:t.clientY},e.style.cursor="grabbing"},r=e=>{if(!p.current)return;const t=e.clientX-m.current.x,n=e.clientY-m.current.y;m.current={x:e.clientX,y:e.clientY},c(e=>e+.005*t),u(e=>N(e-.005*n,x,E))},l=()=>{p.current=!1,e.style.cursor="grab"};return e.addEventListener("wheel",t,{passive:!1}),e.addEventListener("mousedown",n),window.addEventListener("mousemove",r),window.addEventListener("mouseup",l),()=>{e.removeEventListener("wheel",t),e.removeEventListener("mousedown",n),window.removeEventListener("mousemove",r),window.removeEventListener("mouseup",l),e.style.cursor=""}},[]),(0,a.jsx)("canvas",{ref:o,width:l,height:l,className:"canvas-3d","aria-label":"3D fold preview",style:{cursor:"grab"}})}const D=new URLSearchParams(window.location.search).get("ep")||null;const A=function(){var e,t;const[n,l]=(0,r.useState)({}),[o,i]=(0,r.useState)("half_horizontal"),[u,s]=(0,r.useState)(null),[c,d]=(0,r.useState)(0),[p,g]=(0,r.useState)(!1),[v,y]=(0,r.useState)("connecting"),[S,x]=(0,r.useState)(!1),E=(0,r.useRef)(null),C=null!==D,N=(0,r.useCallback)(async()=>{try{const e=await fetch("/targets");if(!e.ok)throw new Error(`HTTP ${e.status}`);const t=await e.json();l(t),y("ok")}catch{y("err")}},[]),_=(0,r.useCallback)(async e=>{x(!0),g(!1),d(0);try{const t=await fetch(`/episode/demo?target=${e}`);if(!t.ok)throw new Error(`HTTP ${t.status}`);const n=await t.json();s(n),y("ok")}catch{s(null),y("err")}finally{x(!1)}},[]),P=(0,r.useCallback)(async e=>{x(!0),g(!1),d(0);try{const t=await fetch(`/episode/replay/${e}`);if(!t.ok)throw new Error(`HTTP ${t.status}`);const n=await t.json();s(n),y("ok")}catch{s(null),y("err")}finally{x(!1)}},[]);(0,r.useEffect)(()=>{N()},[N]),(0,r.useEffect)(()=>{C?P(D):_(o)},[C,o,_,P]);const z=u?u.steps.length:0,T=u&&c>0?u.steps[c-1]:null;(0,r.useEffect)(()=>(p&&(E.current=setInterval(()=>{d(e=>e>=z?(g(!1),e):e+1)},1500)),()=>clearInterval(E.current)),[p,z]);const L=n[o]||null;return(0,a.jsxs)("div",{className:"app",children:[(0,a.jsxs)("header",{className:"app-header",children:[(0,a.jsxs)("span",{className:"app-title",children:["OPTI",(0,a.jsx)("span",{className:"title-accent",children:"GAMI"})," RL"]}),(0,a.jsx)("div",{className:"header-sep"}),C?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("span",{className:"replay-badge",children:["REPLAY \u2014 ",D]}),(0,a.jsx)("button",{className:"back-to-grid-btn",onClick:()=>window.history.back(),children:"\u2190 GRID"})]}):(0,a.jsx)(k,{targets:n,selected:o,onChange:e=>i(e)}),(0,a.jsx)("div",{className:"header-sep"}),(0,a.jsx)(w,{playing:p,onPlay:()=>{c>=z&&d(0),g(!0)},onPause:()=>g(!1),onNext:()=>{g(!1),d(e=>Math.min(e+1,z))},onPrev:()=>{g(!1),d(e=>Math.max(e-1,0))},onReset:()=>{g(!1),d(0)},currentStep:c,totalSteps:z,disabled:!u||S}),(0,a.jsx)("div",{className:"header-right",children:(0,a.jsxs)("div",{className:"api-status",children:[(0,a.jsx)("span",{className:"api-status-dot "+("ok"===v?"ok":"err"===v?"err":"")}),(0,a.jsx)("span",{children:"ok"===v?"API OK":"err"===v?"API ERR":"CONNECTING"})]})})]}),(0,a.jsxs)("div",{className:"app-body",children:[(0,a.jsxs)("div",{className:"app-left",children:[(0,a.jsxs)("div",{className:"canvas-row",children:[(0,a.jsxs)("div",{className:"canvas-wrap",children:[(0,a.jsxs)("span",{className:"canvas-label",children:["TASK \u2014 ",L?L.name.replace(/_/g," ").toUpperCase():"\u2014"]}),(0,a.jsx)(f,{paperState:null,target:null!==(e=null===u||void 0===u?void 0:u.target_crease)&&void 0!==e?e:null,label:"TASK",dim:280,ghostOnly:!0})]}),(0,a.jsxs)("div",{className:"canvas-wrap",children:[(0,a.jsx)("span",{className:"canvas-label",children:0===c?"INITIAL STATE":`STEP ${c} / ${z}`}),(0,a.jsx)(f,{paperState:T?T.paper_state:null,target:null!==(t=null===u||void 0===u?void 0:u.target_crease)&&void 0!==t?t:null,label:0===c?"INITIAL":`STEP ${c}`,dim:280,ghostOnly:!1})]}),(0,a.jsxs)("div",{className:"canvas-wrap",children:[(0,a.jsx)("div",{className:"canvas-label-row",children:(0,a.jsx)("span",{className:"canvas-label",children:"3D FOLD PREVIEW"})}),(0,a.jsx)(M,{steps:u?u.steps:[],currentStep:c,dim:280})]})]}),(0,a.jsxs)("div",{className:"step-feed-section",children:[(0,a.jsx)("div",{className:"section-header",children:"FOLD SEQUENCE"}),S?(0,a.jsxs)("div",{className:"episode-loading",children:[(0,a.jsx)("div",{className:"pulse-dot"}),"FETCHING EPISODE..."]}):(0,a.jsx)(h,{steps:u?u.steps:[],currentStep:c})]})]}),(0,a.jsxs)("div",{className:"app-right",children:[(0,a.jsx)("div",{className:"section-header",children:"METRICS"}),(0,a.jsx)(m,{metrics:T?T.metrics:null}),(0,a.jsx)("div",{className:"section-header",children:"EPISODE INFO"}),(0,a.jsx)(b,{metrics:T?T.metrics:null,paperState:T?T.paper_state:null,targetDef:L})]})]})]})};l.createRoot(document.getElementById("root")).render((0,a.jsx)(r.StrictMode,{children:(0,a.jsx)(A,{})}))})(); +//# sourceMappingURL=main.b94094b6.js.map \ No newline at end of file diff --git a/build/static/js/main.b94094b6.js.LICENSE.txt b/build/static/js/main.b94094b6.js.LICENSE.txt new file mode 100644 index 0000000000000000000000000000000000000000..13261149f48d07fafa9bd9480c6faffa24778e72 --- /dev/null +++ b/build/static/js/main.b94094b6.js.LICENSE.txt @@ -0,0 +1,49 @@ +/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * scheduler.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/build/static/js/main.b94094b6.js.map b/build/static/js/main.b94094b6.js.map new file mode 100644 index 0000000000000000000000000000000000000000..35e0ab0ac7e059c491771f3fdf69bb878d2265eb --- /dev/null +++ b/build/static/js/main.b94094b6.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/main.b94094b6.js","mappings":"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","sources":["../node_modules/react-dom/cjs/react-dom-client.production.js","../node_modules/react-dom/cjs/react-dom.production.js","../node_modules/react-dom/client.js","../node_modules/react-dom/index.js","../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react.production.js","../node_modules/react/index.js","../node_modules/react/jsx-runtime.js","../node_modules/scheduler/cjs/scheduler.production.js","../node_modules/scheduler/index.js","../webpack/bootstrap","components/CreaseCanvas.js","components/RewardPanel.js","components/StepFeed.js","components/InfoBadges.js","components/TargetSelector.js","components/PlayerControls.js","components/Fold3DCanvas.js","App.js","index.js"],"sourcesContent":["/**\n * @license React\n * react-dom-client.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n\"use strict\";\nvar Scheduler = require(\"scheduler\"),\n React = require(\"react\"),\n ReactDOM = require(\"react-dom\");\nfunction formatProdErrorMessage(code) {\n var url = \"https://react.dev/errors/\" + code;\n if (1 < arguments.length) {\n url += \"?args[]=\" + encodeURIComponent(arguments[1]);\n for (var i = 2; i < arguments.length; i++)\n url += \"&args[]=\" + encodeURIComponent(arguments[i]);\n }\n return (\n \"Minified React error #\" +\n code +\n \"; visit \" +\n url +\n \" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"\n );\n}\nfunction isValidContainer(node) {\n return !(\n !node ||\n (1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType)\n );\n}\nfunction getNearestMountedFiber(fiber) {\n var node = fiber,\n nearestMounted = fiber;\n if (fiber.alternate) for (; node.return; ) node = node.return;\n else {\n fiber = node;\n do\n (node = fiber),\n 0 !== (node.flags & 4098) && (nearestMounted = node.return),\n (fiber = node.return);\n while (fiber);\n }\n return 3 === node.tag ? nearestMounted : null;\n}\nfunction getSuspenseInstanceFromFiber(fiber) {\n if (13 === fiber.tag) {\n var suspenseState = fiber.memoizedState;\n null === suspenseState &&\n ((fiber = fiber.alternate),\n null !== fiber && (suspenseState = fiber.memoizedState));\n if (null !== suspenseState) return suspenseState.dehydrated;\n }\n return null;\n}\nfunction getActivityInstanceFromFiber(fiber) {\n if (31 === fiber.tag) {\n var activityState = fiber.memoizedState;\n null === activityState &&\n ((fiber = fiber.alternate),\n null !== fiber && (activityState = fiber.memoizedState));\n if (null !== activityState) return activityState.dehydrated;\n }\n return null;\n}\nfunction assertIsMounted(fiber) {\n if (getNearestMountedFiber(fiber) !== fiber)\n throw Error(formatProdErrorMessage(188));\n}\nfunction findCurrentFiberUsingSlowPath(fiber) {\n var alternate = fiber.alternate;\n if (!alternate) {\n alternate = getNearestMountedFiber(fiber);\n if (null === alternate) throw Error(formatProdErrorMessage(188));\n return alternate !== fiber ? null : fiber;\n }\n for (var a = fiber, b = alternate; ; ) {\n var parentA = a.return;\n if (null === parentA) break;\n var parentB = parentA.alternate;\n if (null === parentB) {\n b = parentA.return;\n if (null !== b) {\n a = b;\n continue;\n }\n break;\n }\n if (parentA.child === parentB.child) {\n for (parentB = parentA.child; parentB; ) {\n if (parentB === a) return assertIsMounted(parentA), fiber;\n if (parentB === b) return assertIsMounted(parentA), alternate;\n parentB = parentB.sibling;\n }\n throw Error(formatProdErrorMessage(188));\n }\n if (a.return !== b.return) (a = parentA), (b = parentB);\n else {\n for (var didFindChild = !1, child$0 = parentA.child; child$0; ) {\n if (child$0 === a) {\n didFindChild = !0;\n a = parentA;\n b = parentB;\n break;\n }\n if (child$0 === b) {\n didFindChild = !0;\n b = parentA;\n a = parentB;\n break;\n }\n child$0 = child$0.sibling;\n }\n if (!didFindChild) {\n for (child$0 = parentB.child; child$0; ) {\n if (child$0 === a) {\n didFindChild = !0;\n a = parentB;\n b = parentA;\n break;\n }\n if (child$0 === b) {\n didFindChild = !0;\n b = parentB;\n a = parentA;\n break;\n }\n child$0 = child$0.sibling;\n }\n if (!didFindChild) throw Error(formatProdErrorMessage(189));\n }\n }\n if (a.alternate !== b) throw Error(formatProdErrorMessage(190));\n }\n if (3 !== a.tag) throw Error(formatProdErrorMessage(188));\n return a.stateNode.current === a ? fiber : alternate;\n}\nfunction findCurrentHostFiberImpl(node) {\n var tag = node.tag;\n if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;\n for (node = node.child; null !== node; ) {\n tag = findCurrentHostFiberImpl(node);\n if (null !== tag) return tag;\n node = node.sibling;\n }\n return null;\n}\nvar assign = Object.assign,\n REACT_LEGACY_ELEMENT_TYPE = Symbol.for(\"react.element\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\");\nSymbol.for(\"react.scope\");\nvar REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\");\nSymbol.for(\"react.legacy_hidden\");\nSymbol.for(\"react.tracing_marker\");\nvar REACT_MEMO_CACHE_SENTINEL = Symbol.for(\"react.memo_cache_sentinel\");\nSymbol.for(\"react.view_transition\");\nvar MAYBE_ITERATOR_SYMBOL = Symbol.iterator;\nfunction getIteratorFn(maybeIterable) {\n if (null === maybeIterable || \"object\" !== typeof maybeIterable) return null;\n maybeIterable =\n (MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||\n maybeIterable[\"@@iterator\"];\n return \"function\" === typeof maybeIterable ? maybeIterable : null;\n}\nvar REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\");\nfunction getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (type.$$typeof) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n}\nvar isArrayImpl = Array.isArray,\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n ReactDOMSharedInternals =\n ReactDOM.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n sharedNotPendingObject = {\n pending: !1,\n data: null,\n method: null,\n action: null\n },\n valueStack = [],\n index = -1;\nfunction createCursor(defaultValue) {\n return { current: defaultValue };\n}\nfunction pop(cursor) {\n 0 > index ||\n ((cursor.current = valueStack[index]), (valueStack[index] = null), index--);\n}\nfunction push(cursor, value) {\n index++;\n valueStack[index] = cursor.current;\n cursor.current = value;\n}\nvar contextStackCursor = createCursor(null),\n contextFiberStackCursor = createCursor(null),\n rootInstanceStackCursor = createCursor(null),\n hostTransitionProviderCursor = createCursor(null);\nfunction pushHostContainer(fiber, nextRootInstance) {\n push(rootInstanceStackCursor, nextRootInstance);\n push(contextFiberStackCursor, fiber);\n push(contextStackCursor, null);\n switch (nextRootInstance.nodeType) {\n case 9:\n case 11:\n fiber = (fiber = nextRootInstance.documentElement)\n ? (fiber = fiber.namespaceURI)\n ? getOwnHostContext(fiber)\n : 0\n : 0;\n break;\n default:\n if (\n ((fiber = nextRootInstance.tagName),\n (nextRootInstance = nextRootInstance.namespaceURI))\n )\n (nextRootInstance = getOwnHostContext(nextRootInstance)),\n (fiber = getChildHostContextProd(nextRootInstance, fiber));\n else\n switch (fiber) {\n case \"svg\":\n fiber = 1;\n break;\n case \"math\":\n fiber = 2;\n break;\n default:\n fiber = 0;\n }\n }\n pop(contextStackCursor);\n push(contextStackCursor, fiber);\n}\nfunction popHostContainer() {\n pop(contextStackCursor);\n pop(contextFiberStackCursor);\n pop(rootInstanceStackCursor);\n}\nfunction pushHostContext(fiber) {\n null !== fiber.memoizedState && push(hostTransitionProviderCursor, fiber);\n var context = contextStackCursor.current;\n var JSCompiler_inline_result = getChildHostContextProd(context, fiber.type);\n context !== JSCompiler_inline_result &&\n (push(contextFiberStackCursor, fiber),\n push(contextStackCursor, JSCompiler_inline_result));\n}\nfunction popHostContext(fiber) {\n contextFiberStackCursor.current === fiber &&\n (pop(contextStackCursor), pop(contextFiberStackCursor));\n hostTransitionProviderCursor.current === fiber &&\n (pop(hostTransitionProviderCursor),\n (HostTransitionContext._currentValue = sharedNotPendingObject));\n}\nvar prefix, suffix;\nfunction describeBuiltInComponentFrame(name) {\n if (void 0 === prefix)\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = (match && match[1]) || \"\";\n suffix =\n -1 < x.stack.indexOf(\"\\n at\")\n ? \" ()\"\n : -1 < x.stack.indexOf(\"@\")\n ? \"@unknown:0:0\"\n : \"\";\n }\n return \"\\n\" + prefix + name + suffix;\n}\nvar reentry = !1;\nfunction describeNativeComponentFrame(fn, construct) {\n if (!fn || reentry) return \"\";\n reentry = !0;\n var previousPrepareStackTrace = Error.prepareStackTrace;\n Error.prepareStackTrace = void 0;\n try {\n var RunInRootFrame = {\n DetermineComponentFrameRoot: function () {\n try {\n if (construct) {\n var Fake = function () {\n throw Error();\n };\n Object.defineProperty(Fake.prototype, \"props\", {\n set: function () {\n throw Error();\n }\n });\n if (\"object\" === typeof Reflect && Reflect.construct) {\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n var control = x;\n }\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x$1) {\n control = x$1;\n }\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x$2) {\n control = x$2;\n }\n (Fake = fn()) &&\n \"function\" === typeof Fake.catch &&\n Fake.catch(function () {});\n }\n } catch (sample) {\n if (sample && control && \"string\" === typeof sample.stack)\n return [sample.stack, control.stack];\n }\n return [null, null];\n }\n };\n RunInRootFrame.DetermineComponentFrameRoot.displayName =\n \"DetermineComponentFrameRoot\";\n var namePropDescriptor = Object.getOwnPropertyDescriptor(\n RunInRootFrame.DetermineComponentFrameRoot,\n \"name\"\n );\n namePropDescriptor &&\n namePropDescriptor.configurable &&\n Object.defineProperty(\n RunInRootFrame.DetermineComponentFrameRoot,\n \"name\",\n { value: \"DetermineComponentFrameRoot\" }\n );\n var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(),\n sampleStack = _RunInRootFrame$Deter[0],\n controlStack = _RunInRootFrame$Deter[1];\n if (sampleStack && controlStack) {\n var sampleLines = sampleStack.split(\"\\n\"),\n controlLines = controlStack.split(\"\\n\");\n for (\n namePropDescriptor = RunInRootFrame = 0;\n RunInRootFrame < sampleLines.length &&\n !sampleLines[RunInRootFrame].includes(\"DetermineComponentFrameRoot\");\n\n )\n RunInRootFrame++;\n for (\n ;\n namePropDescriptor < controlLines.length &&\n !controlLines[namePropDescriptor].includes(\n \"DetermineComponentFrameRoot\"\n );\n\n )\n namePropDescriptor++;\n if (\n RunInRootFrame === sampleLines.length ||\n namePropDescriptor === controlLines.length\n )\n for (\n RunInRootFrame = sampleLines.length - 1,\n namePropDescriptor = controlLines.length - 1;\n 1 <= RunInRootFrame &&\n 0 <= namePropDescriptor &&\n sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor];\n\n )\n namePropDescriptor--;\n for (\n ;\n 1 <= RunInRootFrame && 0 <= namePropDescriptor;\n RunInRootFrame--, namePropDescriptor--\n )\n if (sampleLines[RunInRootFrame] !== controlLines[namePropDescriptor]) {\n if (1 !== RunInRootFrame || 1 !== namePropDescriptor) {\n do\n if (\n (RunInRootFrame--,\n namePropDescriptor--,\n 0 > namePropDescriptor ||\n sampleLines[RunInRootFrame] !==\n controlLines[namePropDescriptor])\n ) {\n var frame =\n \"\\n\" +\n sampleLines[RunInRootFrame].replace(\" at new \", \" at \");\n fn.displayName &&\n frame.includes(\"\") &&\n (frame = frame.replace(\"\", fn.displayName));\n return frame;\n }\n while (1 <= RunInRootFrame && 0 <= namePropDescriptor);\n }\n break;\n }\n }\n } finally {\n (reentry = !1), (Error.prepareStackTrace = previousPrepareStackTrace);\n }\n return (previousPrepareStackTrace = fn ? fn.displayName || fn.name : \"\")\n ? describeBuiltInComponentFrame(previousPrepareStackTrace)\n : \"\";\n}\nfunction describeFiber(fiber, childFiber) {\n switch (fiber.tag) {\n case 26:\n case 27:\n case 5:\n return describeBuiltInComponentFrame(fiber.type);\n case 16:\n return describeBuiltInComponentFrame(\"Lazy\");\n case 13:\n return fiber.child !== childFiber && null !== childFiber\n ? describeBuiltInComponentFrame(\"Suspense Fallback\")\n : describeBuiltInComponentFrame(\"Suspense\");\n case 19:\n return describeBuiltInComponentFrame(\"SuspenseList\");\n case 0:\n case 15:\n return describeNativeComponentFrame(fiber.type, !1);\n case 11:\n return describeNativeComponentFrame(fiber.type.render, !1);\n case 1:\n return describeNativeComponentFrame(fiber.type, !0);\n case 31:\n return describeBuiltInComponentFrame(\"Activity\");\n default:\n return \"\";\n }\n}\nfunction getStackByFiberInDevAndProd(workInProgress) {\n try {\n var info = \"\",\n previous = null;\n do\n (info += describeFiber(workInProgress, previous)),\n (previous = workInProgress),\n (workInProgress = workInProgress.return);\n while (workInProgress);\n return info;\n } catch (x) {\n return \"\\nError generating stack: \" + x.message + \"\\n\" + x.stack;\n }\n}\nvar hasOwnProperty = Object.prototype.hasOwnProperty,\n scheduleCallback$3 = Scheduler.unstable_scheduleCallback,\n cancelCallback$1 = Scheduler.unstable_cancelCallback,\n shouldYield = Scheduler.unstable_shouldYield,\n requestPaint = Scheduler.unstable_requestPaint,\n now = Scheduler.unstable_now,\n getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel,\n ImmediatePriority = Scheduler.unstable_ImmediatePriority,\n UserBlockingPriority = Scheduler.unstable_UserBlockingPriority,\n NormalPriority$1 = Scheduler.unstable_NormalPriority,\n LowPriority = Scheduler.unstable_LowPriority,\n IdlePriority = Scheduler.unstable_IdlePriority,\n log$1 = Scheduler.log,\n unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue,\n rendererID = null,\n injectedHook = null;\nfunction setIsStrictModeForDevtools(newIsStrictMode) {\n \"function\" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);\n if (injectedHook && \"function\" === typeof injectedHook.setStrictMode)\n try {\n injectedHook.setStrictMode(rendererID, newIsStrictMode);\n } catch (err) {}\n}\nvar clz32 = Math.clz32 ? Math.clz32 : clz32Fallback,\n log = Math.log,\n LN2 = Math.LN2;\nfunction clz32Fallback(x) {\n x >>>= 0;\n return 0 === x ? 32 : (31 - ((log(x) / LN2) | 0)) | 0;\n}\nvar nextTransitionUpdateLane = 256,\n nextTransitionDeferredLane = 262144,\n nextRetryLane = 4194304;\nfunction getHighestPriorityLanes(lanes) {\n var pendingSyncLanes = lanes & 42;\n if (0 !== pendingSyncLanes) return pendingSyncLanes;\n switch (lanes & -lanes) {\n case 1:\n return 1;\n case 2:\n return 2;\n case 4:\n return 4;\n case 8:\n return 8;\n case 16:\n return 16;\n case 32:\n return 32;\n case 64:\n return 64;\n case 128:\n return 128;\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n return lanes & 261888;\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n return lanes & 3932160;\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n return lanes & 62914560;\n case 67108864:\n return 67108864;\n case 134217728:\n return 134217728;\n case 268435456:\n return 268435456;\n case 536870912:\n return 536870912;\n case 1073741824:\n return 0;\n default:\n return lanes;\n }\n}\nfunction getNextLanes(root, wipLanes, rootHasPendingCommit) {\n var pendingLanes = root.pendingLanes;\n if (0 === pendingLanes) return 0;\n var nextLanes = 0,\n suspendedLanes = root.suspendedLanes,\n pingedLanes = root.pingedLanes;\n root = root.warmLanes;\n var nonIdlePendingLanes = pendingLanes & 134217727;\n 0 !== nonIdlePendingLanes\n ? ((pendingLanes = nonIdlePendingLanes & ~suspendedLanes),\n 0 !== pendingLanes\n ? (nextLanes = getHighestPriorityLanes(pendingLanes))\n : ((pingedLanes &= nonIdlePendingLanes),\n 0 !== pingedLanes\n ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n : rootHasPendingCommit ||\n ((rootHasPendingCommit = nonIdlePendingLanes & ~root),\n 0 !== rootHasPendingCommit &&\n (nextLanes = getHighestPriorityLanes(rootHasPendingCommit)))))\n : ((nonIdlePendingLanes = pendingLanes & ~suspendedLanes),\n 0 !== nonIdlePendingLanes\n ? (nextLanes = getHighestPriorityLanes(nonIdlePendingLanes))\n : 0 !== pingedLanes\n ? (nextLanes = getHighestPriorityLanes(pingedLanes))\n : rootHasPendingCommit ||\n ((rootHasPendingCommit = pendingLanes & ~root),\n 0 !== rootHasPendingCommit &&\n (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))));\n return 0 === nextLanes\n ? 0\n : 0 !== wipLanes &&\n wipLanes !== nextLanes &&\n 0 === (wipLanes & suspendedLanes) &&\n ((suspendedLanes = nextLanes & -nextLanes),\n (rootHasPendingCommit = wipLanes & -wipLanes),\n suspendedLanes >= rootHasPendingCommit ||\n (32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)))\n ? wipLanes\n : nextLanes;\n}\nfunction checkIfRootIsPrerendering(root, renderLanes) {\n return (\n 0 ===\n (root.pendingLanes &\n ~(root.suspendedLanes & ~root.pingedLanes) &\n renderLanes)\n );\n}\nfunction computeExpirationTime(lane, currentTime) {\n switch (lane) {\n case 1:\n case 2:\n case 4:\n case 8:\n case 64:\n return currentTime + 250;\n case 16:\n case 32:\n case 128:\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n return currentTime + 5e3;\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n return -1;\n case 67108864:\n case 134217728:\n case 268435456:\n case 536870912:\n case 1073741824:\n return -1;\n default:\n return -1;\n }\n}\nfunction claimNextRetryLane() {\n var lane = nextRetryLane;\n nextRetryLane <<= 1;\n 0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304);\n return lane;\n}\nfunction createLaneMap(initial) {\n for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial);\n return laneMap;\n}\nfunction markRootUpdated$1(root, updateLane) {\n root.pendingLanes |= updateLane;\n 268435456 !== updateLane &&\n ((root.suspendedLanes = 0), (root.pingedLanes = 0), (root.warmLanes = 0));\n}\nfunction markRootFinished(\n root,\n finishedLanes,\n remainingLanes,\n spawnedLane,\n updatedLanes,\n suspendedRetryLanes\n) {\n var previouslyPendingLanes = root.pendingLanes;\n root.pendingLanes = remainingLanes;\n root.suspendedLanes = 0;\n root.pingedLanes = 0;\n root.warmLanes = 0;\n root.expiredLanes &= remainingLanes;\n root.entangledLanes &= remainingLanes;\n root.errorRecoveryDisabledLanes &= remainingLanes;\n root.shellSuspendCounter = 0;\n var entanglements = root.entanglements,\n expirationTimes = root.expirationTimes,\n hiddenUpdates = root.hiddenUpdates;\n for (\n remainingLanes = previouslyPendingLanes & ~remainingLanes;\n 0 < remainingLanes;\n\n ) {\n var index$7 = 31 - clz32(remainingLanes),\n lane = 1 << index$7;\n entanglements[index$7] = 0;\n expirationTimes[index$7] = -1;\n var hiddenUpdatesForLane = hiddenUpdates[index$7];\n if (null !== hiddenUpdatesForLane)\n for (\n hiddenUpdates[index$7] = null, index$7 = 0;\n index$7 < hiddenUpdatesForLane.length;\n index$7++\n ) {\n var update = hiddenUpdatesForLane[index$7];\n null !== update && (update.lane &= -536870913);\n }\n remainingLanes &= ~lane;\n }\n 0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, 0);\n 0 !== suspendedRetryLanes &&\n 0 === updatedLanes &&\n 0 !== root.tag &&\n (root.suspendedLanes |=\n suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes));\n}\nfunction markSpawnedDeferredLane(root, spawnedLane, entangledLanes) {\n root.pendingLanes |= spawnedLane;\n root.suspendedLanes &= ~spawnedLane;\n var spawnedLaneIndex = 31 - clz32(spawnedLane);\n root.entangledLanes |= spawnedLane;\n root.entanglements[spawnedLaneIndex] =\n root.entanglements[spawnedLaneIndex] |\n 1073741824 |\n (entangledLanes & 261930);\n}\nfunction markRootEntangled(root, entangledLanes) {\n var rootEntangledLanes = (root.entangledLanes |= entangledLanes);\n for (root = root.entanglements; rootEntangledLanes; ) {\n var index$8 = 31 - clz32(rootEntangledLanes),\n lane = 1 << index$8;\n (lane & entangledLanes) | (root[index$8] & entangledLanes) &&\n (root[index$8] |= entangledLanes);\n rootEntangledLanes &= ~lane;\n }\n}\nfunction getBumpedLaneForHydration(root, renderLanes) {\n var renderLane = renderLanes & -renderLanes;\n renderLane =\n 0 !== (renderLane & 42) ? 1 : getBumpedLaneForHydrationByLane(renderLane);\n return 0 !== (renderLane & (root.suspendedLanes | renderLanes))\n ? 0\n : renderLane;\n}\nfunction getBumpedLaneForHydrationByLane(lane) {\n switch (lane) {\n case 2:\n lane = 1;\n break;\n case 8:\n lane = 4;\n break;\n case 32:\n lane = 16;\n break;\n case 256:\n case 512:\n case 1024:\n case 2048:\n case 4096:\n case 8192:\n case 16384:\n case 32768:\n case 65536:\n case 131072:\n case 262144:\n case 524288:\n case 1048576:\n case 2097152:\n case 4194304:\n case 8388608:\n case 16777216:\n case 33554432:\n lane = 128;\n break;\n case 268435456:\n lane = 134217728;\n break;\n default:\n lane = 0;\n }\n return lane;\n}\nfunction lanesToEventPriority(lanes) {\n lanes &= -lanes;\n return 2 < lanes\n ? 8 < lanes\n ? 0 !== (lanes & 134217727)\n ? 32\n : 268435456\n : 8\n : 2;\n}\nfunction resolveUpdatePriority() {\n var updatePriority = ReactDOMSharedInternals.p;\n if (0 !== updatePriority) return updatePriority;\n updatePriority = window.event;\n return void 0 === updatePriority ? 32 : getEventPriority(updatePriority.type);\n}\nfunction runWithPriority(priority, fn) {\n var previousPriority = ReactDOMSharedInternals.p;\n try {\n return (ReactDOMSharedInternals.p = priority), fn();\n } finally {\n ReactDOMSharedInternals.p = previousPriority;\n }\n}\nvar randomKey = Math.random().toString(36).slice(2),\n internalInstanceKey = \"__reactFiber$\" + randomKey,\n internalPropsKey = \"__reactProps$\" + randomKey,\n internalContainerInstanceKey = \"__reactContainer$\" + randomKey,\n internalEventHandlersKey = \"__reactEvents$\" + randomKey,\n internalEventHandlerListenersKey = \"__reactListeners$\" + randomKey,\n internalEventHandlesSetKey = \"__reactHandles$\" + randomKey,\n internalRootNodeResourcesKey = \"__reactResources$\" + randomKey,\n internalHoistableMarker = \"__reactMarker$\" + randomKey;\nfunction detachDeletedInstance(node) {\n delete node[internalInstanceKey];\n delete node[internalPropsKey];\n delete node[internalEventHandlersKey];\n delete node[internalEventHandlerListenersKey];\n delete node[internalEventHandlesSetKey];\n}\nfunction getClosestInstanceFromNode(targetNode) {\n var targetInst = targetNode[internalInstanceKey];\n if (targetInst) return targetInst;\n for (var parentNode = targetNode.parentNode; parentNode; ) {\n if (\n (targetInst =\n parentNode[internalContainerInstanceKey] ||\n parentNode[internalInstanceKey])\n ) {\n parentNode = targetInst.alternate;\n if (\n null !== targetInst.child ||\n (null !== parentNode && null !== parentNode.child)\n )\n for (\n targetNode = getParentHydrationBoundary(targetNode);\n null !== targetNode;\n\n ) {\n if ((parentNode = targetNode[internalInstanceKey])) return parentNode;\n targetNode = getParentHydrationBoundary(targetNode);\n }\n return targetInst;\n }\n targetNode = parentNode;\n parentNode = targetNode.parentNode;\n }\n return null;\n}\nfunction getInstanceFromNode(node) {\n if (\n (node = node[internalInstanceKey] || node[internalContainerInstanceKey])\n ) {\n var tag = node.tag;\n if (\n 5 === tag ||\n 6 === tag ||\n 13 === tag ||\n 31 === tag ||\n 26 === tag ||\n 27 === tag ||\n 3 === tag\n )\n return node;\n }\n return null;\n}\nfunction getNodeFromInstance(inst) {\n var tag = inst.tag;\n if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return inst.stateNode;\n throw Error(formatProdErrorMessage(33));\n}\nfunction getResourcesFromRoot(root) {\n var resources = root[internalRootNodeResourcesKey];\n resources ||\n (resources = root[internalRootNodeResourcesKey] =\n { hoistableStyles: new Map(), hoistableScripts: new Map() });\n return resources;\n}\nfunction markNodeAsHoistable(node) {\n node[internalHoistableMarker] = !0;\n}\nvar allNativeEvents = new Set(),\n registrationNameDependencies = {};\nfunction registerTwoPhaseEvent(registrationName, dependencies) {\n registerDirectEvent(registrationName, dependencies);\n registerDirectEvent(registrationName + \"Capture\", dependencies);\n}\nfunction registerDirectEvent(registrationName, dependencies) {\n registrationNameDependencies[registrationName] = dependencies;\n for (\n registrationName = 0;\n registrationName < dependencies.length;\n registrationName++\n )\n allNativeEvents.add(dependencies[registrationName]);\n}\nvar VALID_ATTRIBUTE_NAME_REGEX = RegExp(\n \"^[:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD][:A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]*$\"\n ),\n illegalAttributeNameCache = {},\n validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n if (hasOwnProperty.call(validatedAttributeNameCache, attributeName))\n return !0;\n if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) return !1;\n if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName))\n return (validatedAttributeNameCache[attributeName] = !0);\n illegalAttributeNameCache[attributeName] = !0;\n return !1;\n}\nfunction setValueForAttribute(node, name, value) {\n if (isAttributeNameSafe(name))\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n node.removeAttribute(name);\n return;\n case \"boolean\":\n var prefix$10 = name.toLowerCase().slice(0, 5);\n if (\"data-\" !== prefix$10 && \"aria-\" !== prefix$10) {\n node.removeAttribute(name);\n return;\n }\n }\n node.setAttribute(name, \"\" + value);\n }\n}\nfunction setValueForKnownAttribute(node, name, value) {\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n case \"boolean\":\n node.removeAttribute(name);\n return;\n }\n node.setAttribute(name, \"\" + value);\n }\n}\nfunction setValueForNamespacedAttribute(node, namespace, name, value) {\n if (null === value) node.removeAttribute(name);\n else {\n switch (typeof value) {\n case \"undefined\":\n case \"function\":\n case \"symbol\":\n case \"boolean\":\n node.removeAttribute(name);\n return;\n }\n node.setAttributeNS(namespace, name, \"\" + value);\n }\n}\nfunction getToStringValue(value) {\n switch (typeof value) {\n case \"bigint\":\n case \"boolean\":\n case \"number\":\n case \"string\":\n case \"undefined\":\n return value;\n case \"object\":\n return value;\n default:\n return \"\";\n }\n}\nfunction isCheckable(elem) {\n var type = elem.type;\n return (\n (elem = elem.nodeName) &&\n \"input\" === elem.toLowerCase() &&\n (\"checkbox\" === type || \"radio\" === type)\n );\n}\nfunction trackValueOnNode(node, valueField, currentValue) {\n var descriptor = Object.getOwnPropertyDescriptor(\n node.constructor.prototype,\n valueField\n );\n if (\n !node.hasOwnProperty(valueField) &&\n \"undefined\" !== typeof descriptor &&\n \"function\" === typeof descriptor.get &&\n \"function\" === typeof descriptor.set\n ) {\n var get = descriptor.get,\n set = descriptor.set;\n Object.defineProperty(node, valueField, {\n configurable: !0,\n get: function () {\n return get.call(this);\n },\n set: function (value) {\n currentValue = \"\" + value;\n set.call(this, value);\n }\n });\n Object.defineProperty(node, valueField, {\n enumerable: descriptor.enumerable\n });\n return {\n getValue: function () {\n return currentValue;\n },\n setValue: function (value) {\n currentValue = \"\" + value;\n },\n stopTracking: function () {\n node._valueTracker = null;\n delete node[valueField];\n }\n };\n }\n}\nfunction track(node) {\n if (!node._valueTracker) {\n var valueField = isCheckable(node) ? \"checked\" : \"value\";\n node._valueTracker = trackValueOnNode(\n node,\n valueField,\n \"\" + node[valueField]\n );\n }\n}\nfunction updateValueIfChanged(node) {\n if (!node) return !1;\n var tracker = node._valueTracker;\n if (!tracker) return !0;\n var lastValue = tracker.getValue();\n var value = \"\";\n node &&\n (value = isCheckable(node)\n ? node.checked\n ? \"true\"\n : \"false\"\n : node.value);\n node = value;\n return node !== lastValue ? (tracker.setValue(node), !0) : !1;\n}\nfunction getActiveElement(doc) {\n doc = doc || (\"undefined\" !== typeof document ? document : void 0);\n if (\"undefined\" === typeof doc) return null;\n try {\n return doc.activeElement || doc.body;\n } catch (e) {\n return doc.body;\n }\n}\nvar escapeSelectorAttributeValueInsideDoubleQuotesRegex = /[\\n\"\\\\]/g;\nfunction escapeSelectorAttributeValueInsideDoubleQuotes(value) {\n return value.replace(\n escapeSelectorAttributeValueInsideDoubleQuotesRegex,\n function (ch) {\n return \"\\\\\" + ch.charCodeAt(0).toString(16) + \" \";\n }\n );\n}\nfunction updateInput(\n element,\n value,\n defaultValue,\n lastDefaultValue,\n checked,\n defaultChecked,\n type,\n name\n) {\n element.name = \"\";\n null != type &&\n \"function\" !== typeof type &&\n \"symbol\" !== typeof type &&\n \"boolean\" !== typeof type\n ? (element.type = type)\n : element.removeAttribute(\"type\");\n if (null != value)\n if (\"number\" === type) {\n if ((0 === value && \"\" === element.value) || element.value != value)\n element.value = \"\" + getToStringValue(value);\n } else\n element.value !== \"\" + getToStringValue(value) &&\n (element.value = \"\" + getToStringValue(value));\n else\n (\"submit\" !== type && \"reset\" !== type) || element.removeAttribute(\"value\");\n null != value\n ? setDefaultValue(element, type, getToStringValue(value))\n : null != defaultValue\n ? setDefaultValue(element, type, getToStringValue(defaultValue))\n : null != lastDefaultValue && element.removeAttribute(\"value\");\n null == checked &&\n null != defaultChecked &&\n (element.defaultChecked = !!defaultChecked);\n null != checked &&\n (element.checked =\n checked && \"function\" !== typeof checked && \"symbol\" !== typeof checked);\n null != name &&\n \"function\" !== typeof name &&\n \"symbol\" !== typeof name &&\n \"boolean\" !== typeof name\n ? (element.name = \"\" + getToStringValue(name))\n : element.removeAttribute(\"name\");\n}\nfunction initInput(\n element,\n value,\n defaultValue,\n checked,\n defaultChecked,\n type,\n name,\n isHydrating\n) {\n null != type &&\n \"function\" !== typeof type &&\n \"symbol\" !== typeof type &&\n \"boolean\" !== typeof type &&\n (element.type = type);\n if (null != value || null != defaultValue) {\n if (\n !(\n (\"submit\" !== type && \"reset\" !== type) ||\n (void 0 !== value && null !== value)\n )\n ) {\n track(element);\n return;\n }\n defaultValue =\n null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n value = null != value ? \"\" + getToStringValue(value) : defaultValue;\n isHydrating || value === element.value || (element.value = value);\n element.defaultValue = value;\n }\n checked = null != checked ? checked : defaultChecked;\n checked =\n \"function\" !== typeof checked && \"symbol\" !== typeof checked && !!checked;\n element.checked = isHydrating ? element.checked : !!checked;\n element.defaultChecked = !!checked;\n null != name &&\n \"function\" !== typeof name &&\n \"symbol\" !== typeof name &&\n \"boolean\" !== typeof name &&\n (element.name = name);\n track(element);\n}\nfunction setDefaultValue(node, type, value) {\n (\"number\" === type && getActiveElement(node.ownerDocument) === node) ||\n node.defaultValue === \"\" + value ||\n (node.defaultValue = \"\" + value);\n}\nfunction updateOptions(node, multiple, propValue, setDefaultSelected) {\n node = node.options;\n if (multiple) {\n multiple = {};\n for (var i = 0; i < propValue.length; i++)\n multiple[\"$\" + propValue[i]] = !0;\n for (propValue = 0; propValue < node.length; propValue++)\n (i = multiple.hasOwnProperty(\"$\" + node[propValue].value)),\n node[propValue].selected !== i && (node[propValue].selected = i),\n i && setDefaultSelected && (node[propValue].defaultSelected = !0);\n } else {\n propValue = \"\" + getToStringValue(propValue);\n multiple = null;\n for (i = 0; i < node.length; i++) {\n if (node[i].value === propValue) {\n node[i].selected = !0;\n setDefaultSelected && (node[i].defaultSelected = !0);\n return;\n }\n null !== multiple || node[i].disabled || (multiple = node[i]);\n }\n null !== multiple && (multiple.selected = !0);\n }\n}\nfunction updateTextarea(element, value, defaultValue) {\n if (\n null != value &&\n ((value = \"\" + getToStringValue(value)),\n value !== element.value && (element.value = value),\n null == defaultValue)\n ) {\n element.defaultValue !== value && (element.defaultValue = value);\n return;\n }\n element.defaultValue =\n null != defaultValue ? \"\" + getToStringValue(defaultValue) : \"\";\n}\nfunction initTextarea(element, value, defaultValue, children) {\n if (null == value) {\n if (null != children) {\n if (null != defaultValue) throw Error(formatProdErrorMessage(92));\n if (isArrayImpl(children)) {\n if (1 < children.length) throw Error(formatProdErrorMessage(93));\n children = children[0];\n }\n defaultValue = children;\n }\n null == defaultValue && (defaultValue = \"\");\n value = defaultValue;\n }\n defaultValue = getToStringValue(value);\n element.defaultValue = defaultValue;\n children = element.textContent;\n children === defaultValue &&\n \"\" !== children &&\n null !== children &&\n (element.value = children);\n track(element);\n}\nfunction setTextContent(node, text) {\n if (text) {\n var firstChild = node.firstChild;\n if (\n firstChild &&\n firstChild === node.lastChild &&\n 3 === firstChild.nodeType\n ) {\n firstChild.nodeValue = text;\n return;\n }\n }\n node.textContent = text;\n}\nvar unitlessNumbers = new Set(\n \"animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp\".split(\n \" \"\n )\n);\nfunction setValueForStyle(style, styleName, value) {\n var isCustomProperty = 0 === styleName.indexOf(\"--\");\n null == value || \"boolean\" === typeof value || \"\" === value\n ? isCustomProperty\n ? style.setProperty(styleName, \"\")\n : \"float\" === styleName\n ? (style.cssFloat = \"\")\n : (style[styleName] = \"\")\n : isCustomProperty\n ? style.setProperty(styleName, value)\n : \"number\" !== typeof value ||\n 0 === value ||\n unitlessNumbers.has(styleName)\n ? \"float\" === styleName\n ? (style.cssFloat = value)\n : (style[styleName] = (\"\" + value).trim())\n : (style[styleName] = value + \"px\");\n}\nfunction setValueForStyles(node, styles, prevStyles) {\n if (null != styles && \"object\" !== typeof styles)\n throw Error(formatProdErrorMessage(62));\n node = node.style;\n if (null != prevStyles) {\n for (var styleName in prevStyles)\n !prevStyles.hasOwnProperty(styleName) ||\n (null != styles && styles.hasOwnProperty(styleName)) ||\n (0 === styleName.indexOf(\"--\")\n ? node.setProperty(styleName, \"\")\n : \"float\" === styleName\n ? (node.cssFloat = \"\")\n : (node[styleName] = \"\"));\n for (var styleName$16 in styles)\n (styleName = styles[styleName$16]),\n styles.hasOwnProperty(styleName$16) &&\n prevStyles[styleName$16] !== styleName &&\n setValueForStyle(node, styleName$16, styleName);\n } else\n for (var styleName$17 in styles)\n styles.hasOwnProperty(styleName$17) &&\n setValueForStyle(node, styleName$17, styles[styleName$17]);\n}\nfunction isCustomElement(tagName) {\n if (-1 === tagName.indexOf(\"-\")) return !1;\n switch (tagName) {\n case \"annotation-xml\":\n case \"color-profile\":\n case \"font-face\":\n case \"font-face-src\":\n case \"font-face-uri\":\n case \"font-face-format\":\n case \"font-face-name\":\n case \"missing-glyph\":\n return !1;\n default:\n return !0;\n }\n}\nvar aliases = new Map([\n [\"acceptCharset\", \"accept-charset\"],\n [\"htmlFor\", \"for\"],\n [\"httpEquiv\", \"http-equiv\"],\n [\"crossOrigin\", \"crossorigin\"],\n [\"accentHeight\", \"accent-height\"],\n [\"alignmentBaseline\", \"alignment-baseline\"],\n [\"arabicForm\", \"arabic-form\"],\n [\"baselineShift\", \"baseline-shift\"],\n [\"capHeight\", \"cap-height\"],\n [\"clipPath\", \"clip-path\"],\n [\"clipRule\", \"clip-rule\"],\n [\"colorInterpolation\", \"color-interpolation\"],\n [\"colorInterpolationFilters\", \"color-interpolation-filters\"],\n [\"colorProfile\", \"color-profile\"],\n [\"colorRendering\", \"color-rendering\"],\n [\"dominantBaseline\", \"dominant-baseline\"],\n [\"enableBackground\", \"enable-background\"],\n [\"fillOpacity\", \"fill-opacity\"],\n [\"fillRule\", \"fill-rule\"],\n [\"floodColor\", \"flood-color\"],\n [\"floodOpacity\", \"flood-opacity\"],\n [\"fontFamily\", \"font-family\"],\n [\"fontSize\", \"font-size\"],\n [\"fontSizeAdjust\", \"font-size-adjust\"],\n [\"fontStretch\", \"font-stretch\"],\n [\"fontStyle\", \"font-style\"],\n [\"fontVariant\", \"font-variant\"],\n [\"fontWeight\", \"font-weight\"],\n [\"glyphName\", \"glyph-name\"],\n [\"glyphOrientationHorizontal\", \"glyph-orientation-horizontal\"],\n [\"glyphOrientationVertical\", \"glyph-orientation-vertical\"],\n [\"horizAdvX\", \"horiz-adv-x\"],\n [\"horizOriginX\", \"horiz-origin-x\"],\n [\"imageRendering\", \"image-rendering\"],\n [\"letterSpacing\", \"letter-spacing\"],\n [\"lightingColor\", \"lighting-color\"],\n [\"markerEnd\", \"marker-end\"],\n [\"markerMid\", \"marker-mid\"],\n [\"markerStart\", \"marker-start\"],\n [\"overlinePosition\", \"overline-position\"],\n [\"overlineThickness\", \"overline-thickness\"],\n [\"paintOrder\", \"paint-order\"],\n [\"panose-1\", \"panose-1\"],\n [\"pointerEvents\", \"pointer-events\"],\n [\"renderingIntent\", \"rendering-intent\"],\n [\"shapeRendering\", \"shape-rendering\"],\n [\"stopColor\", \"stop-color\"],\n [\"stopOpacity\", \"stop-opacity\"],\n [\"strikethroughPosition\", \"strikethrough-position\"],\n [\"strikethroughThickness\", \"strikethrough-thickness\"],\n [\"strokeDasharray\", \"stroke-dasharray\"],\n [\"strokeDashoffset\", \"stroke-dashoffset\"],\n [\"strokeLinecap\", \"stroke-linecap\"],\n [\"strokeLinejoin\", \"stroke-linejoin\"],\n [\"strokeMiterlimit\", \"stroke-miterlimit\"],\n [\"strokeOpacity\", \"stroke-opacity\"],\n [\"strokeWidth\", \"stroke-width\"],\n [\"textAnchor\", \"text-anchor\"],\n [\"textDecoration\", \"text-decoration\"],\n [\"textRendering\", \"text-rendering\"],\n [\"transformOrigin\", \"transform-origin\"],\n [\"underlinePosition\", \"underline-position\"],\n [\"underlineThickness\", \"underline-thickness\"],\n [\"unicodeBidi\", \"unicode-bidi\"],\n [\"unicodeRange\", \"unicode-range\"],\n [\"unitsPerEm\", \"units-per-em\"],\n [\"vAlphabetic\", \"v-alphabetic\"],\n [\"vHanging\", \"v-hanging\"],\n [\"vIdeographic\", \"v-ideographic\"],\n [\"vMathematical\", \"v-mathematical\"],\n [\"vectorEffect\", \"vector-effect\"],\n [\"vertAdvY\", \"vert-adv-y\"],\n [\"vertOriginX\", \"vert-origin-x\"],\n [\"vertOriginY\", \"vert-origin-y\"],\n [\"wordSpacing\", \"word-spacing\"],\n [\"writingMode\", \"writing-mode\"],\n [\"xmlnsXlink\", \"xmlns:xlink\"],\n [\"xHeight\", \"x-height\"]\n ]),\n isJavaScriptProtocol =\n /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*:/i;\nfunction sanitizeURL(url) {\n return isJavaScriptProtocol.test(\"\" + url)\n ? \"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')\"\n : url;\n}\nfunction noop$1() {}\nvar currentReplayingEvent = null;\nfunction getEventTarget(nativeEvent) {\n nativeEvent = nativeEvent.target || nativeEvent.srcElement || window;\n nativeEvent.correspondingUseElement &&\n (nativeEvent = nativeEvent.correspondingUseElement);\n return 3 === nativeEvent.nodeType ? nativeEvent.parentNode : nativeEvent;\n}\nvar restoreTarget = null,\n restoreQueue = null;\nfunction restoreStateOfTarget(target) {\n var internalInstance = getInstanceFromNode(target);\n if (internalInstance && (target = internalInstance.stateNode)) {\n var props = target[internalPropsKey] || null;\n a: switch (((target = internalInstance.stateNode), internalInstance.type)) {\n case \"input\":\n updateInput(\n target,\n props.value,\n props.defaultValue,\n props.defaultValue,\n props.checked,\n props.defaultChecked,\n props.type,\n props.name\n );\n internalInstance = props.name;\n if (\"radio\" === props.type && null != internalInstance) {\n for (props = target; props.parentNode; ) props = props.parentNode;\n props = props.querySelectorAll(\n 'input[name=\"' +\n escapeSelectorAttributeValueInsideDoubleQuotes(\n \"\" + internalInstance\n ) +\n '\"][type=\"radio\"]'\n );\n for (\n internalInstance = 0;\n internalInstance < props.length;\n internalInstance++\n ) {\n var otherNode = props[internalInstance];\n if (otherNode !== target && otherNode.form === target.form) {\n var otherProps = otherNode[internalPropsKey] || null;\n if (!otherProps) throw Error(formatProdErrorMessage(90));\n updateInput(\n otherNode,\n otherProps.value,\n otherProps.defaultValue,\n otherProps.defaultValue,\n otherProps.checked,\n otherProps.defaultChecked,\n otherProps.type,\n otherProps.name\n );\n }\n }\n for (\n internalInstance = 0;\n internalInstance < props.length;\n internalInstance++\n )\n (otherNode = props[internalInstance]),\n otherNode.form === target.form && updateValueIfChanged(otherNode);\n }\n break a;\n case \"textarea\":\n updateTextarea(target, props.value, props.defaultValue);\n break a;\n case \"select\":\n (internalInstance = props.value),\n null != internalInstance &&\n updateOptions(target, !!props.multiple, internalInstance, !1);\n }\n }\n}\nvar isInsideEventHandler = !1;\nfunction batchedUpdates$1(fn, a, b) {\n if (isInsideEventHandler) return fn(a, b);\n isInsideEventHandler = !0;\n try {\n var JSCompiler_inline_result = fn(a);\n return JSCompiler_inline_result;\n } finally {\n if (\n ((isInsideEventHandler = !1),\n null !== restoreTarget || null !== restoreQueue)\n )\n if (\n (flushSyncWork$1(),\n restoreTarget &&\n ((a = restoreTarget),\n (fn = restoreQueue),\n (restoreQueue = restoreTarget = null),\n restoreStateOfTarget(a),\n fn))\n )\n for (a = 0; a < fn.length; a++) restoreStateOfTarget(fn[a]);\n }\n}\nfunction getListener(inst, registrationName) {\n var stateNode = inst.stateNode;\n if (null === stateNode) return null;\n var props = stateNode[internalPropsKey] || null;\n if (null === props) return null;\n stateNode = props[registrationName];\n a: switch (registrationName) {\n case \"onClick\":\n case \"onClickCapture\":\n case \"onDoubleClick\":\n case \"onDoubleClickCapture\":\n case \"onMouseDown\":\n case \"onMouseDownCapture\":\n case \"onMouseMove\":\n case \"onMouseMoveCapture\":\n case \"onMouseUp\":\n case \"onMouseUpCapture\":\n case \"onMouseEnter\":\n (props = !props.disabled) ||\n ((inst = inst.type),\n (props = !(\n \"button\" === inst ||\n \"input\" === inst ||\n \"select\" === inst ||\n \"textarea\" === inst\n )));\n inst = !props;\n break a;\n default:\n inst = !1;\n }\n if (inst) return null;\n if (stateNode && \"function\" !== typeof stateNode)\n throw Error(\n formatProdErrorMessage(231, registrationName, typeof stateNode)\n );\n return stateNode;\n}\nvar canUseDOM = !(\n \"undefined\" === typeof window ||\n \"undefined\" === typeof window.document ||\n \"undefined\" === typeof window.document.createElement\n ),\n passiveBrowserEventsSupported = !1;\nif (canUseDOM)\n try {\n var options = {};\n Object.defineProperty(options, \"passive\", {\n get: function () {\n passiveBrowserEventsSupported = !0;\n }\n });\n window.addEventListener(\"test\", options, options);\n window.removeEventListener(\"test\", options, options);\n } catch (e) {\n passiveBrowserEventsSupported = !1;\n }\nvar root = null,\n startText = null,\n fallbackText = null;\nfunction getData() {\n if (fallbackText) return fallbackText;\n var start,\n startValue = startText,\n startLength = startValue.length,\n end,\n endValue = \"value\" in root ? root.value : root.textContent,\n endLength = endValue.length;\n for (\n start = 0;\n start < startLength && startValue[start] === endValue[start];\n start++\n );\n var minEnd = startLength - start;\n for (\n end = 1;\n end <= minEnd &&\n startValue[startLength - end] === endValue[endLength - end];\n end++\n );\n return (fallbackText = endValue.slice(start, 1 < end ? 1 - end : void 0));\n}\nfunction getEventCharCode(nativeEvent) {\n var keyCode = nativeEvent.keyCode;\n \"charCode\" in nativeEvent\n ? ((nativeEvent = nativeEvent.charCode),\n 0 === nativeEvent && 13 === keyCode && (nativeEvent = 13))\n : (nativeEvent = keyCode);\n 10 === nativeEvent && (nativeEvent = 13);\n return 32 <= nativeEvent || 13 === nativeEvent ? nativeEvent : 0;\n}\nfunction functionThatReturnsTrue() {\n return !0;\n}\nfunction functionThatReturnsFalse() {\n return !1;\n}\nfunction createSyntheticEvent(Interface) {\n function SyntheticBaseEvent(\n reactName,\n reactEventType,\n targetInst,\n nativeEvent,\n nativeEventTarget\n ) {\n this._reactName = reactName;\n this._targetInst = targetInst;\n this.type = reactEventType;\n this.nativeEvent = nativeEvent;\n this.target = nativeEventTarget;\n this.currentTarget = null;\n for (var propName in Interface)\n Interface.hasOwnProperty(propName) &&\n ((reactName = Interface[propName]),\n (this[propName] = reactName\n ? reactName(nativeEvent)\n : nativeEvent[propName]));\n this.isDefaultPrevented = (\n null != nativeEvent.defaultPrevented\n ? nativeEvent.defaultPrevented\n : !1 === nativeEvent.returnValue\n )\n ? functionThatReturnsTrue\n : functionThatReturnsFalse;\n this.isPropagationStopped = functionThatReturnsFalse;\n return this;\n }\n assign(SyntheticBaseEvent.prototype, {\n preventDefault: function () {\n this.defaultPrevented = !0;\n var event = this.nativeEvent;\n event &&\n (event.preventDefault\n ? event.preventDefault()\n : \"unknown\" !== typeof event.returnValue && (event.returnValue = !1),\n (this.isDefaultPrevented = functionThatReturnsTrue));\n },\n stopPropagation: function () {\n var event = this.nativeEvent;\n event &&\n (event.stopPropagation\n ? event.stopPropagation()\n : \"unknown\" !== typeof event.cancelBubble &&\n (event.cancelBubble = !0),\n (this.isPropagationStopped = functionThatReturnsTrue));\n },\n persist: function () {},\n isPersistent: functionThatReturnsTrue\n });\n return SyntheticBaseEvent;\n}\nvar EventInterface = {\n eventPhase: 0,\n bubbles: 0,\n cancelable: 0,\n timeStamp: function (event) {\n return event.timeStamp || Date.now();\n },\n defaultPrevented: 0,\n isTrusted: 0\n },\n SyntheticEvent = createSyntheticEvent(EventInterface),\n UIEventInterface = assign({}, EventInterface, { view: 0, detail: 0 }),\n SyntheticUIEvent = createSyntheticEvent(UIEventInterface),\n lastMovementX,\n lastMovementY,\n lastMouseEvent,\n MouseEventInterface = assign({}, UIEventInterface, {\n screenX: 0,\n screenY: 0,\n clientX: 0,\n clientY: 0,\n pageX: 0,\n pageY: 0,\n ctrlKey: 0,\n shiftKey: 0,\n altKey: 0,\n metaKey: 0,\n getModifierState: getEventModifierState,\n button: 0,\n buttons: 0,\n relatedTarget: function (event) {\n return void 0 === event.relatedTarget\n ? event.fromElement === event.srcElement\n ? event.toElement\n : event.fromElement\n : event.relatedTarget;\n },\n movementX: function (event) {\n if (\"movementX\" in event) return event.movementX;\n event !== lastMouseEvent &&\n (lastMouseEvent && \"mousemove\" === event.type\n ? ((lastMovementX = event.screenX - lastMouseEvent.screenX),\n (lastMovementY = event.screenY - lastMouseEvent.screenY))\n : (lastMovementY = lastMovementX = 0),\n (lastMouseEvent = event));\n return lastMovementX;\n },\n movementY: function (event) {\n return \"movementY\" in event ? event.movementY : lastMovementY;\n }\n }),\n SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface),\n DragEventInterface = assign({}, MouseEventInterface, { dataTransfer: 0 }),\n SyntheticDragEvent = createSyntheticEvent(DragEventInterface),\n FocusEventInterface = assign({}, UIEventInterface, { relatedTarget: 0 }),\n SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface),\n AnimationEventInterface = assign({}, EventInterface, {\n animationName: 0,\n elapsedTime: 0,\n pseudoElement: 0\n }),\n SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface),\n ClipboardEventInterface = assign({}, EventInterface, {\n clipboardData: function (event) {\n return \"clipboardData\" in event\n ? event.clipboardData\n : window.clipboardData;\n }\n }),\n SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface),\n CompositionEventInterface = assign({}, EventInterface, { data: 0 }),\n SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface),\n normalizeKey = {\n Esc: \"Escape\",\n Spacebar: \" \",\n Left: \"ArrowLeft\",\n Up: \"ArrowUp\",\n Right: \"ArrowRight\",\n Down: \"ArrowDown\",\n Del: \"Delete\",\n Win: \"OS\",\n Menu: \"ContextMenu\",\n Apps: \"ContextMenu\",\n Scroll: \"ScrollLock\",\n MozPrintableKey: \"Unidentified\"\n },\n translateToKey = {\n 8: \"Backspace\",\n 9: \"Tab\",\n 12: \"Clear\",\n 13: \"Enter\",\n 16: \"Shift\",\n 17: \"Control\",\n 18: \"Alt\",\n 19: \"Pause\",\n 20: \"CapsLock\",\n 27: \"Escape\",\n 32: \" \",\n 33: \"PageUp\",\n 34: \"PageDown\",\n 35: \"End\",\n 36: \"Home\",\n 37: \"ArrowLeft\",\n 38: \"ArrowUp\",\n 39: \"ArrowRight\",\n 40: \"ArrowDown\",\n 45: \"Insert\",\n 46: \"Delete\",\n 112: \"F1\",\n 113: \"F2\",\n 114: \"F3\",\n 115: \"F4\",\n 116: \"F5\",\n 117: \"F6\",\n 118: \"F7\",\n 119: \"F8\",\n 120: \"F9\",\n 121: \"F10\",\n 122: \"F11\",\n 123: \"F12\",\n 144: \"NumLock\",\n 145: \"ScrollLock\",\n 224: \"Meta\"\n },\n modifierKeyToProp = {\n Alt: \"altKey\",\n Control: \"ctrlKey\",\n Meta: \"metaKey\",\n Shift: \"shiftKey\"\n };\nfunction modifierStateGetter(keyArg) {\n var nativeEvent = this.nativeEvent;\n return nativeEvent.getModifierState\n ? nativeEvent.getModifierState(keyArg)\n : (keyArg = modifierKeyToProp[keyArg])\n ? !!nativeEvent[keyArg]\n : !1;\n}\nfunction getEventModifierState() {\n return modifierStateGetter;\n}\nvar KeyboardEventInterface = assign({}, UIEventInterface, {\n key: function (nativeEvent) {\n if (nativeEvent.key) {\n var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n if (\"Unidentified\" !== key) return key;\n }\n return \"keypress\" === nativeEvent.type\n ? ((nativeEvent = getEventCharCode(nativeEvent)),\n 13 === nativeEvent ? \"Enter\" : String.fromCharCode(nativeEvent))\n : \"keydown\" === nativeEvent.type || \"keyup\" === nativeEvent.type\n ? translateToKey[nativeEvent.keyCode] || \"Unidentified\"\n : \"\";\n },\n code: 0,\n location: 0,\n ctrlKey: 0,\n shiftKey: 0,\n altKey: 0,\n metaKey: 0,\n repeat: 0,\n locale: 0,\n getModifierState: getEventModifierState,\n charCode: function (event) {\n return \"keypress\" === event.type ? getEventCharCode(event) : 0;\n },\n keyCode: function (event) {\n return \"keydown\" === event.type || \"keyup\" === event.type\n ? event.keyCode\n : 0;\n },\n which: function (event) {\n return \"keypress\" === event.type\n ? getEventCharCode(event)\n : \"keydown\" === event.type || \"keyup\" === event.type\n ? event.keyCode\n : 0;\n }\n }),\n SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface),\n PointerEventInterface = assign({}, MouseEventInterface, {\n pointerId: 0,\n width: 0,\n height: 0,\n pressure: 0,\n tangentialPressure: 0,\n tiltX: 0,\n tiltY: 0,\n twist: 0,\n pointerType: 0,\n isPrimary: 0\n }),\n SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface),\n TouchEventInterface = assign({}, UIEventInterface, {\n touches: 0,\n targetTouches: 0,\n changedTouches: 0,\n altKey: 0,\n metaKey: 0,\n ctrlKey: 0,\n shiftKey: 0,\n getModifierState: getEventModifierState\n }),\n SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface),\n TransitionEventInterface = assign({}, EventInterface, {\n propertyName: 0,\n elapsedTime: 0,\n pseudoElement: 0\n }),\n SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface),\n WheelEventInterface = assign({}, MouseEventInterface, {\n deltaX: function (event) {\n return \"deltaX\" in event\n ? event.deltaX\n : \"wheelDeltaX\" in event\n ? -event.wheelDeltaX\n : 0;\n },\n deltaY: function (event) {\n return \"deltaY\" in event\n ? event.deltaY\n : \"wheelDeltaY\" in event\n ? -event.wheelDeltaY\n : \"wheelDelta\" in event\n ? -event.wheelDelta\n : 0;\n },\n deltaZ: 0,\n deltaMode: 0\n }),\n SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface),\n ToggleEventInterface = assign({}, EventInterface, {\n newState: 0,\n oldState: 0\n }),\n SyntheticToggleEvent = createSyntheticEvent(ToggleEventInterface),\n END_KEYCODES = [9, 13, 27, 32],\n canUseCompositionEvent = canUseDOM && \"CompositionEvent\" in window,\n documentMode = null;\ncanUseDOM &&\n \"documentMode\" in document &&\n (documentMode = document.documentMode);\nvar canUseTextInputEvent = canUseDOM && \"TextEvent\" in window && !documentMode,\n useFallbackCompositionData =\n canUseDOM &&\n (!canUseCompositionEvent ||\n (documentMode && 8 < documentMode && 11 >= documentMode)),\n SPACEBAR_CHAR = String.fromCharCode(32),\n hasSpaceKeypress = !1;\nfunction isFallbackCompositionEnd(domEventName, nativeEvent) {\n switch (domEventName) {\n case \"keyup\":\n return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode);\n case \"keydown\":\n return 229 !== nativeEvent.keyCode;\n case \"keypress\":\n case \"mousedown\":\n case \"focusout\":\n return !0;\n default:\n return !1;\n }\n}\nfunction getDataFromCustomEvent(nativeEvent) {\n nativeEvent = nativeEvent.detail;\n return \"object\" === typeof nativeEvent && \"data\" in nativeEvent\n ? nativeEvent.data\n : null;\n}\nvar isComposing = !1;\nfunction getNativeBeforeInputChars(domEventName, nativeEvent) {\n switch (domEventName) {\n case \"compositionend\":\n return getDataFromCustomEvent(nativeEvent);\n case \"keypress\":\n if (32 !== nativeEvent.which) return null;\n hasSpaceKeypress = !0;\n return SPACEBAR_CHAR;\n case \"textInput\":\n return (\n (domEventName = nativeEvent.data),\n domEventName === SPACEBAR_CHAR && hasSpaceKeypress ? null : domEventName\n );\n default:\n return null;\n }\n}\nfunction getFallbackBeforeInputChars(domEventName, nativeEvent) {\n if (isComposing)\n return \"compositionend\" === domEventName ||\n (!canUseCompositionEvent &&\n isFallbackCompositionEnd(domEventName, nativeEvent))\n ? ((domEventName = getData()),\n (fallbackText = startText = root = null),\n (isComposing = !1),\n domEventName)\n : null;\n switch (domEventName) {\n case \"paste\":\n return null;\n case \"keypress\":\n if (\n !(nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) ||\n (nativeEvent.ctrlKey && nativeEvent.altKey)\n ) {\n if (nativeEvent.char && 1 < nativeEvent.char.length)\n return nativeEvent.char;\n if (nativeEvent.which) return String.fromCharCode(nativeEvent.which);\n }\n return null;\n case \"compositionend\":\n return useFallbackCompositionData && \"ko\" !== nativeEvent.locale\n ? null\n : nativeEvent.data;\n default:\n return null;\n }\n}\nvar supportedInputTypes = {\n color: !0,\n date: !0,\n datetime: !0,\n \"datetime-local\": !0,\n email: !0,\n month: !0,\n number: !0,\n password: !0,\n range: !0,\n search: !0,\n tel: !0,\n text: !0,\n time: !0,\n url: !0,\n week: !0\n};\nfunction isTextInputElement(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return \"input\" === nodeName\n ? !!supportedInputTypes[elem.type]\n : \"textarea\" === nodeName\n ? !0\n : !1;\n}\nfunction createAndAccumulateChangeEvent(\n dispatchQueue,\n inst,\n nativeEvent,\n target\n) {\n restoreTarget\n ? restoreQueue\n ? restoreQueue.push(target)\n : (restoreQueue = [target])\n : (restoreTarget = target);\n inst = accumulateTwoPhaseListeners(inst, \"onChange\");\n 0 < inst.length &&\n ((nativeEvent = new SyntheticEvent(\n \"onChange\",\n \"change\",\n null,\n nativeEvent,\n target\n )),\n dispatchQueue.push({ event: nativeEvent, listeners: inst }));\n}\nvar activeElement$1 = null,\n activeElementInst$1 = null;\nfunction runEventInBatch(dispatchQueue) {\n processDispatchQueue(dispatchQueue, 0);\n}\nfunction getInstIfValueChanged(targetInst) {\n var targetNode = getNodeFromInstance(targetInst);\n if (updateValueIfChanged(targetNode)) return targetInst;\n}\nfunction getTargetInstForChangeEvent(domEventName, targetInst) {\n if (\"change\" === domEventName) return targetInst;\n}\nvar isInputEventSupported = !1;\nif (canUseDOM) {\n var JSCompiler_inline_result$jscomp$286;\n if (canUseDOM) {\n var isSupported$jscomp$inline_427 = \"oninput\" in document;\n if (!isSupported$jscomp$inline_427) {\n var element$jscomp$inline_428 = document.createElement(\"div\");\n element$jscomp$inline_428.setAttribute(\"oninput\", \"return;\");\n isSupported$jscomp$inline_427 =\n \"function\" === typeof element$jscomp$inline_428.oninput;\n }\n JSCompiler_inline_result$jscomp$286 = isSupported$jscomp$inline_427;\n } else JSCompiler_inline_result$jscomp$286 = !1;\n isInputEventSupported =\n JSCompiler_inline_result$jscomp$286 &&\n (!document.documentMode || 9 < document.documentMode);\n}\nfunction stopWatchingForValueChange() {\n activeElement$1 &&\n (activeElement$1.detachEvent(\"onpropertychange\", handlePropertyChange),\n (activeElementInst$1 = activeElement$1 = null));\n}\nfunction handlePropertyChange(nativeEvent) {\n if (\n \"value\" === nativeEvent.propertyName &&\n getInstIfValueChanged(activeElementInst$1)\n ) {\n var dispatchQueue = [];\n createAndAccumulateChangeEvent(\n dispatchQueue,\n activeElementInst$1,\n nativeEvent,\n getEventTarget(nativeEvent)\n );\n batchedUpdates$1(runEventInBatch, dispatchQueue);\n }\n}\nfunction handleEventsForInputEventPolyfill(domEventName, target, targetInst) {\n \"focusin\" === domEventName\n ? (stopWatchingForValueChange(),\n (activeElement$1 = target),\n (activeElementInst$1 = targetInst),\n activeElement$1.attachEvent(\"onpropertychange\", handlePropertyChange))\n : \"focusout\" === domEventName && stopWatchingForValueChange();\n}\nfunction getTargetInstForInputEventPolyfill(domEventName) {\n if (\n \"selectionchange\" === domEventName ||\n \"keyup\" === domEventName ||\n \"keydown\" === domEventName\n )\n return getInstIfValueChanged(activeElementInst$1);\n}\nfunction getTargetInstForClickEvent(domEventName, targetInst) {\n if (\"click\" === domEventName) return getInstIfValueChanged(targetInst);\n}\nfunction getTargetInstForInputOrChangeEvent(domEventName, targetInst) {\n if (\"input\" === domEventName || \"change\" === domEventName)\n return getInstIfValueChanged(targetInst);\n}\nfunction is(x, y) {\n return (x === y && (0 !== x || 1 / x === 1 / y)) || (x !== x && y !== y);\n}\nvar objectIs = \"function\" === typeof Object.is ? Object.is : is;\nfunction shallowEqual(objA, objB) {\n if (objectIs(objA, objB)) return !0;\n if (\n \"object\" !== typeof objA ||\n null === objA ||\n \"object\" !== typeof objB ||\n null === objB\n )\n return !1;\n var keysA = Object.keys(objA),\n keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return !1;\n for (keysB = 0; keysB < keysA.length; keysB++) {\n var currentKey = keysA[keysB];\n if (\n !hasOwnProperty.call(objB, currentKey) ||\n !objectIs(objA[currentKey], objB[currentKey])\n )\n return !1;\n }\n return !0;\n}\nfunction getLeafNode(node) {\n for (; node && node.firstChild; ) node = node.firstChild;\n return node;\n}\nfunction getNodeForCharacterOffset(root, offset) {\n var node = getLeafNode(root);\n root = 0;\n for (var nodeEnd; node; ) {\n if (3 === node.nodeType) {\n nodeEnd = root + node.textContent.length;\n if (root <= offset && nodeEnd >= offset)\n return { node: node, offset: offset - root };\n root = nodeEnd;\n }\n a: {\n for (; node; ) {\n if (node.nextSibling) {\n node = node.nextSibling;\n break a;\n }\n node = node.parentNode;\n }\n node = void 0;\n }\n node = getLeafNode(node);\n }\n}\nfunction containsNode(outerNode, innerNode) {\n return outerNode && innerNode\n ? outerNode === innerNode\n ? !0\n : outerNode && 3 === outerNode.nodeType\n ? !1\n : innerNode && 3 === innerNode.nodeType\n ? containsNode(outerNode, innerNode.parentNode)\n : \"contains\" in outerNode\n ? outerNode.contains(innerNode)\n : outerNode.compareDocumentPosition\n ? !!(outerNode.compareDocumentPosition(innerNode) & 16)\n : !1\n : !1;\n}\nfunction getActiveElementDeep(containerInfo) {\n containerInfo =\n null != containerInfo &&\n null != containerInfo.ownerDocument &&\n null != containerInfo.ownerDocument.defaultView\n ? containerInfo.ownerDocument.defaultView\n : window;\n for (\n var element = getActiveElement(containerInfo.document);\n element instanceof containerInfo.HTMLIFrameElement;\n\n ) {\n try {\n var JSCompiler_inline_result =\n \"string\" === typeof element.contentWindow.location.href;\n } catch (err) {\n JSCompiler_inline_result = !1;\n }\n if (JSCompiler_inline_result) containerInfo = element.contentWindow;\n else break;\n element = getActiveElement(containerInfo.document);\n }\n return element;\n}\nfunction hasSelectionCapabilities(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return (\n nodeName &&\n ((\"input\" === nodeName &&\n (\"text\" === elem.type ||\n \"search\" === elem.type ||\n \"tel\" === elem.type ||\n \"url\" === elem.type ||\n \"password\" === elem.type)) ||\n \"textarea\" === nodeName ||\n \"true\" === elem.contentEditable)\n );\n}\nvar skipSelectionChangeEvent =\n canUseDOM && \"documentMode\" in document && 11 >= document.documentMode,\n activeElement = null,\n activeElementInst = null,\n lastSelection = null,\n mouseDown = !1;\nfunction constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {\n var doc =\n nativeEventTarget.window === nativeEventTarget\n ? nativeEventTarget.document\n : 9 === nativeEventTarget.nodeType\n ? nativeEventTarget\n : nativeEventTarget.ownerDocument;\n mouseDown ||\n null == activeElement ||\n activeElement !== getActiveElement(doc) ||\n ((doc = activeElement),\n \"selectionStart\" in doc && hasSelectionCapabilities(doc)\n ? (doc = { start: doc.selectionStart, end: doc.selectionEnd })\n : ((doc = (\n (doc.ownerDocument && doc.ownerDocument.defaultView) ||\n window\n ).getSelection()),\n (doc = {\n anchorNode: doc.anchorNode,\n anchorOffset: doc.anchorOffset,\n focusNode: doc.focusNode,\n focusOffset: doc.focusOffset\n })),\n (lastSelection && shallowEqual(lastSelection, doc)) ||\n ((lastSelection = doc),\n (doc = accumulateTwoPhaseListeners(activeElementInst, \"onSelect\")),\n 0 < doc.length &&\n ((nativeEvent = new SyntheticEvent(\n \"onSelect\",\n \"select\",\n null,\n nativeEvent,\n nativeEventTarget\n )),\n dispatchQueue.push({ event: nativeEvent, listeners: doc }),\n (nativeEvent.target = activeElement))));\n}\nfunction makePrefixMap(styleProp, eventName) {\n var prefixes = {};\n prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n prefixes[\"Webkit\" + styleProp] = \"webkit\" + eventName;\n prefixes[\"Moz\" + styleProp] = \"moz\" + eventName;\n return prefixes;\n}\nvar vendorPrefixes = {\n animationend: makePrefixMap(\"Animation\", \"AnimationEnd\"),\n animationiteration: makePrefixMap(\"Animation\", \"AnimationIteration\"),\n animationstart: makePrefixMap(\"Animation\", \"AnimationStart\"),\n transitionrun: makePrefixMap(\"Transition\", \"TransitionRun\"),\n transitionstart: makePrefixMap(\"Transition\", \"TransitionStart\"),\n transitioncancel: makePrefixMap(\"Transition\", \"TransitionCancel\"),\n transitionend: makePrefixMap(\"Transition\", \"TransitionEnd\")\n },\n prefixedEventNames = {},\n style = {};\ncanUseDOM &&\n ((style = document.createElement(\"div\").style),\n \"AnimationEvent\" in window ||\n (delete vendorPrefixes.animationend.animation,\n delete vendorPrefixes.animationiteration.animation,\n delete vendorPrefixes.animationstart.animation),\n \"TransitionEvent\" in window ||\n delete vendorPrefixes.transitionend.transition);\nfunction getVendorPrefixedEventName(eventName) {\n if (prefixedEventNames[eventName]) return prefixedEventNames[eventName];\n if (!vendorPrefixes[eventName]) return eventName;\n var prefixMap = vendorPrefixes[eventName],\n styleProp;\n for (styleProp in prefixMap)\n if (prefixMap.hasOwnProperty(styleProp) && styleProp in style)\n return (prefixedEventNames[eventName] = prefixMap[styleProp]);\n return eventName;\n}\nvar ANIMATION_END = getVendorPrefixedEventName(\"animationend\"),\n ANIMATION_ITERATION = getVendorPrefixedEventName(\"animationiteration\"),\n ANIMATION_START = getVendorPrefixedEventName(\"animationstart\"),\n TRANSITION_RUN = getVendorPrefixedEventName(\"transitionrun\"),\n TRANSITION_START = getVendorPrefixedEventName(\"transitionstart\"),\n TRANSITION_CANCEL = getVendorPrefixedEventName(\"transitioncancel\"),\n TRANSITION_END = getVendorPrefixedEventName(\"transitionend\"),\n topLevelEventsToReactNames = new Map(),\n simpleEventPluginEvents =\n \"abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\n \" \"\n );\nsimpleEventPluginEvents.push(\"scrollEnd\");\nfunction registerSimpleEvent(domEventName, reactName) {\n topLevelEventsToReactNames.set(domEventName, reactName);\n registerTwoPhaseEvent(reactName, [domEventName]);\n}\nvar reportGlobalError =\n \"function\" === typeof reportError\n ? reportError\n : function (error) {\n if (\n \"object\" === typeof window &&\n \"function\" === typeof window.ErrorEvent\n ) {\n var event = new window.ErrorEvent(\"error\", {\n bubbles: !0,\n cancelable: !0,\n message:\n \"object\" === typeof error &&\n null !== error &&\n \"string\" === typeof error.message\n ? String(error.message)\n : String(error),\n error: error\n });\n if (!window.dispatchEvent(event)) return;\n } else if (\n \"object\" === typeof process &&\n \"function\" === typeof process.emit\n ) {\n process.emit(\"uncaughtException\", error);\n return;\n }\n console.error(error);\n },\n concurrentQueues = [],\n concurrentQueuesIndex = 0,\n concurrentlyUpdatedLanes = 0;\nfunction finishQueueingConcurrentUpdates() {\n for (\n var endIndex = concurrentQueuesIndex,\n i = (concurrentlyUpdatedLanes = concurrentQueuesIndex = 0);\n i < endIndex;\n\n ) {\n var fiber = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var queue = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var update = concurrentQueues[i];\n concurrentQueues[i++] = null;\n var lane = concurrentQueues[i];\n concurrentQueues[i++] = null;\n if (null !== queue && null !== update) {\n var pending = queue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n queue.pending = update;\n }\n 0 !== lane && markUpdateLaneFromFiberToRoot(fiber, update, lane);\n }\n}\nfunction enqueueUpdate$1(fiber, queue, update, lane) {\n concurrentQueues[concurrentQueuesIndex++] = fiber;\n concurrentQueues[concurrentQueuesIndex++] = queue;\n concurrentQueues[concurrentQueuesIndex++] = update;\n concurrentQueues[concurrentQueuesIndex++] = lane;\n concurrentlyUpdatedLanes |= lane;\n fiber.lanes |= lane;\n fiber = fiber.alternate;\n null !== fiber && (fiber.lanes |= lane);\n}\nfunction enqueueConcurrentHookUpdate(fiber, queue, update, lane) {\n enqueueUpdate$1(fiber, queue, update, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction enqueueConcurrentRenderForLane(fiber, lane) {\n enqueueUpdate$1(fiber, null, null, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction markUpdateLaneFromFiberToRoot(sourceFiber, update, lane) {\n sourceFiber.lanes |= lane;\n var alternate = sourceFiber.alternate;\n null !== alternate && (alternate.lanes |= lane);\n for (var isHidden = !1, parent = sourceFiber.return; null !== parent; )\n (parent.childLanes |= lane),\n (alternate = parent.alternate),\n null !== alternate && (alternate.childLanes |= lane),\n 22 === parent.tag &&\n ((sourceFiber = parent.stateNode),\n null === sourceFiber || sourceFiber._visibility & 1 || (isHidden = !0)),\n (sourceFiber = parent),\n (parent = parent.return);\n return 3 === sourceFiber.tag\n ? ((parent = sourceFiber.stateNode),\n isHidden &&\n null !== update &&\n ((isHidden = 31 - clz32(lane)),\n (sourceFiber = parent.hiddenUpdates),\n (alternate = sourceFiber[isHidden]),\n null === alternate\n ? (sourceFiber[isHidden] = [update])\n : alternate.push(update),\n (update.lane = lane | 536870912)),\n parent)\n : null;\n}\nfunction getRootForUpdatedFiber(sourceFiber) {\n if (50 < nestedUpdateCount)\n throw (\n ((nestedUpdateCount = 0),\n (rootWithNestedUpdates = null),\n Error(formatProdErrorMessage(185)))\n );\n for (var parent = sourceFiber.return; null !== parent; )\n (sourceFiber = parent), (parent = sourceFiber.return);\n return 3 === sourceFiber.tag ? sourceFiber.stateNode : null;\n}\nvar emptyContextObject = {};\nfunction FiberNode(tag, pendingProps, key, mode) {\n this.tag = tag;\n this.key = key;\n this.sibling =\n this.child =\n this.return =\n this.stateNode =\n this.type =\n this.elementType =\n null;\n this.index = 0;\n this.refCleanup = this.ref = null;\n this.pendingProps = pendingProps;\n this.dependencies =\n this.memoizedState =\n this.updateQueue =\n this.memoizedProps =\n null;\n this.mode = mode;\n this.subtreeFlags = this.flags = 0;\n this.deletions = null;\n this.childLanes = this.lanes = 0;\n this.alternate = null;\n}\nfunction createFiberImplClass(tag, pendingProps, key, mode) {\n return new FiberNode(tag, pendingProps, key, mode);\n}\nfunction shouldConstruct(Component) {\n Component = Component.prototype;\n return !(!Component || !Component.isReactComponent);\n}\nfunction createWorkInProgress(current, pendingProps) {\n var workInProgress = current.alternate;\n null === workInProgress\n ? ((workInProgress = createFiberImplClass(\n current.tag,\n pendingProps,\n current.key,\n current.mode\n )),\n (workInProgress.elementType = current.elementType),\n (workInProgress.type = current.type),\n (workInProgress.stateNode = current.stateNode),\n (workInProgress.alternate = current),\n (current.alternate = workInProgress))\n : ((workInProgress.pendingProps = pendingProps),\n (workInProgress.type = current.type),\n (workInProgress.flags = 0),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.deletions = null));\n workInProgress.flags = current.flags & 65011712;\n workInProgress.childLanes = current.childLanes;\n workInProgress.lanes = current.lanes;\n workInProgress.child = current.child;\n workInProgress.memoizedProps = current.memoizedProps;\n workInProgress.memoizedState = current.memoizedState;\n workInProgress.updateQueue = current.updateQueue;\n pendingProps = current.dependencies;\n workInProgress.dependencies =\n null === pendingProps\n ? null\n : { lanes: pendingProps.lanes, firstContext: pendingProps.firstContext };\n workInProgress.sibling = current.sibling;\n workInProgress.index = current.index;\n workInProgress.ref = current.ref;\n workInProgress.refCleanup = current.refCleanup;\n return workInProgress;\n}\nfunction resetWorkInProgress(workInProgress, renderLanes) {\n workInProgress.flags &= 65011714;\n var current = workInProgress.alternate;\n null === current\n ? ((workInProgress.childLanes = 0),\n (workInProgress.lanes = renderLanes),\n (workInProgress.child = null),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.memoizedProps = null),\n (workInProgress.memoizedState = null),\n (workInProgress.updateQueue = null),\n (workInProgress.dependencies = null),\n (workInProgress.stateNode = null))\n : ((workInProgress.childLanes = current.childLanes),\n (workInProgress.lanes = current.lanes),\n (workInProgress.child = current.child),\n (workInProgress.subtreeFlags = 0),\n (workInProgress.deletions = null),\n (workInProgress.memoizedProps = current.memoizedProps),\n (workInProgress.memoizedState = current.memoizedState),\n (workInProgress.updateQueue = current.updateQueue),\n (workInProgress.type = current.type),\n (renderLanes = current.dependencies),\n (workInProgress.dependencies =\n null === renderLanes\n ? null\n : {\n lanes: renderLanes.lanes,\n firstContext: renderLanes.firstContext\n }));\n return workInProgress;\n}\nfunction createFiberFromTypeAndProps(\n type,\n key,\n pendingProps,\n owner,\n mode,\n lanes\n) {\n var fiberTag = 0;\n owner = type;\n if (\"function\" === typeof type) shouldConstruct(type) && (fiberTag = 1);\n else if (\"string\" === typeof type)\n fiberTag = isHostHoistableType(\n type,\n pendingProps,\n contextStackCursor.current\n )\n ? 26\n : \"html\" === type || \"head\" === type || \"body\" === type\n ? 27\n : 5;\n else\n a: switch (type) {\n case REACT_ACTIVITY_TYPE:\n return (\n (type = createFiberImplClass(31, pendingProps, key, mode)),\n (type.elementType = REACT_ACTIVITY_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_FRAGMENT_TYPE:\n return createFiberFromFragment(pendingProps.children, mode, lanes, key);\n case REACT_STRICT_MODE_TYPE:\n fiberTag = 8;\n mode |= 24;\n break;\n case REACT_PROFILER_TYPE:\n return (\n (type = createFiberImplClass(12, pendingProps, key, mode | 2)),\n (type.elementType = REACT_PROFILER_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_SUSPENSE_TYPE:\n return (\n (type = createFiberImplClass(13, pendingProps, key, mode)),\n (type.elementType = REACT_SUSPENSE_TYPE),\n (type.lanes = lanes),\n type\n );\n case REACT_SUSPENSE_LIST_TYPE:\n return (\n (type = createFiberImplClass(19, pendingProps, key, mode)),\n (type.elementType = REACT_SUSPENSE_LIST_TYPE),\n (type.lanes = lanes),\n type\n );\n default:\n if (\"object\" === typeof type && null !== type)\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n fiberTag = 10;\n break a;\n case REACT_CONSUMER_TYPE:\n fiberTag = 9;\n break a;\n case REACT_FORWARD_REF_TYPE:\n fiberTag = 11;\n break a;\n case REACT_MEMO_TYPE:\n fiberTag = 14;\n break a;\n case REACT_LAZY_TYPE:\n fiberTag = 16;\n owner = null;\n break a;\n }\n fiberTag = 29;\n pendingProps = Error(\n formatProdErrorMessage(130, null === type ? \"null\" : typeof type, \"\")\n );\n owner = null;\n }\n key = createFiberImplClass(fiberTag, pendingProps, key, mode);\n key.elementType = type;\n key.type = owner;\n key.lanes = lanes;\n return key;\n}\nfunction createFiberFromFragment(elements, mode, lanes, key) {\n elements = createFiberImplClass(7, elements, key, mode);\n elements.lanes = lanes;\n return elements;\n}\nfunction createFiberFromText(content, mode, lanes) {\n content = createFiberImplClass(6, content, null, mode);\n content.lanes = lanes;\n return content;\n}\nfunction createFiberFromDehydratedFragment(dehydratedNode) {\n var fiber = createFiberImplClass(18, null, null, 0);\n fiber.stateNode = dehydratedNode;\n return fiber;\n}\nfunction createFiberFromPortal(portal, mode, lanes) {\n mode = createFiberImplClass(\n 4,\n null !== portal.children ? portal.children : [],\n portal.key,\n mode\n );\n mode.lanes = lanes;\n mode.stateNode = {\n containerInfo: portal.containerInfo,\n pendingChildren: null,\n implementation: portal.implementation\n };\n return mode;\n}\nvar CapturedStacks = new WeakMap();\nfunction createCapturedValueAtFiber(value, source) {\n if (\"object\" === typeof value && null !== value) {\n var existing = CapturedStacks.get(value);\n if (void 0 !== existing) return existing;\n source = {\n value: value,\n source: source,\n stack: getStackByFiberInDevAndProd(source)\n };\n CapturedStacks.set(value, source);\n return source;\n }\n return {\n value: value,\n source: source,\n stack: getStackByFiberInDevAndProd(source)\n };\n}\nvar forkStack = [],\n forkStackIndex = 0,\n treeForkProvider = null,\n treeForkCount = 0,\n idStack = [],\n idStackIndex = 0,\n treeContextProvider = null,\n treeContextId = 1,\n treeContextOverflow = \"\";\nfunction pushTreeFork(workInProgress, totalChildren) {\n forkStack[forkStackIndex++] = treeForkCount;\n forkStack[forkStackIndex++] = treeForkProvider;\n treeForkProvider = workInProgress;\n treeForkCount = totalChildren;\n}\nfunction pushTreeId(workInProgress, totalChildren, index) {\n idStack[idStackIndex++] = treeContextId;\n idStack[idStackIndex++] = treeContextOverflow;\n idStack[idStackIndex++] = treeContextProvider;\n treeContextProvider = workInProgress;\n var baseIdWithLeadingBit = treeContextId;\n workInProgress = treeContextOverflow;\n var baseLength = 32 - clz32(baseIdWithLeadingBit) - 1;\n baseIdWithLeadingBit &= ~(1 << baseLength);\n index += 1;\n var length = 32 - clz32(totalChildren) + baseLength;\n if (30 < length) {\n var numberOfOverflowBits = baseLength - (baseLength % 5);\n length = (\n baseIdWithLeadingBit &\n ((1 << numberOfOverflowBits) - 1)\n ).toString(32);\n baseIdWithLeadingBit >>= numberOfOverflowBits;\n baseLength -= numberOfOverflowBits;\n treeContextId =\n (1 << (32 - clz32(totalChildren) + baseLength)) |\n (index << baseLength) |\n baseIdWithLeadingBit;\n treeContextOverflow = length + workInProgress;\n } else\n (treeContextId =\n (1 << length) | (index << baseLength) | baseIdWithLeadingBit),\n (treeContextOverflow = workInProgress);\n}\nfunction pushMaterializedTreeId(workInProgress) {\n null !== workInProgress.return &&\n (pushTreeFork(workInProgress, 1), pushTreeId(workInProgress, 1, 0));\n}\nfunction popTreeContext(workInProgress) {\n for (; workInProgress === treeForkProvider; )\n (treeForkProvider = forkStack[--forkStackIndex]),\n (forkStack[forkStackIndex] = null),\n (treeForkCount = forkStack[--forkStackIndex]),\n (forkStack[forkStackIndex] = null);\n for (; workInProgress === treeContextProvider; )\n (treeContextProvider = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null),\n (treeContextOverflow = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null),\n (treeContextId = idStack[--idStackIndex]),\n (idStack[idStackIndex] = null);\n}\nfunction restoreSuspendedTreeContext(workInProgress, suspendedContext) {\n idStack[idStackIndex++] = treeContextId;\n idStack[idStackIndex++] = treeContextOverflow;\n idStack[idStackIndex++] = treeContextProvider;\n treeContextId = suspendedContext.id;\n treeContextOverflow = suspendedContext.overflow;\n treeContextProvider = workInProgress;\n}\nvar hydrationParentFiber = null,\n nextHydratableInstance = null,\n isHydrating = !1,\n hydrationErrors = null,\n rootOrSingletonContext = !1,\n HydrationMismatchException = Error(formatProdErrorMessage(519));\nfunction throwOnHydrationMismatch(fiber) {\n var error = Error(\n formatProdErrorMessage(\n 418,\n 1 < arguments.length && void 0 !== arguments[1] && arguments[1]\n ? \"text\"\n : \"HTML\",\n \"\"\n )\n );\n queueHydrationError(createCapturedValueAtFiber(error, fiber));\n throw HydrationMismatchException;\n}\nfunction prepareToHydrateHostInstance(fiber) {\n var instance = fiber.stateNode,\n type = fiber.type,\n props = fiber.memoizedProps;\n instance[internalInstanceKey] = fiber;\n instance[internalPropsKey] = props;\n switch (type) {\n case \"dialog\":\n listenToNonDelegatedEvent(\"cancel\", instance);\n listenToNonDelegatedEvent(\"close\", instance);\n break;\n case \"iframe\":\n case \"object\":\n case \"embed\":\n listenToNonDelegatedEvent(\"load\", instance);\n break;\n case \"video\":\n case \"audio\":\n for (type = 0; type < mediaEventTypes.length; type++)\n listenToNonDelegatedEvent(mediaEventTypes[type], instance);\n break;\n case \"source\":\n listenToNonDelegatedEvent(\"error\", instance);\n break;\n case \"img\":\n case \"image\":\n case \"link\":\n listenToNonDelegatedEvent(\"error\", instance);\n listenToNonDelegatedEvent(\"load\", instance);\n break;\n case \"details\":\n listenToNonDelegatedEvent(\"toggle\", instance);\n break;\n case \"input\":\n listenToNonDelegatedEvent(\"invalid\", instance);\n initInput(\n instance,\n props.value,\n props.defaultValue,\n props.checked,\n props.defaultChecked,\n props.type,\n props.name,\n !0\n );\n break;\n case \"select\":\n listenToNonDelegatedEvent(\"invalid\", instance);\n break;\n case \"textarea\":\n listenToNonDelegatedEvent(\"invalid\", instance),\n initTextarea(instance, props.value, props.defaultValue, props.children);\n }\n type = props.children;\n (\"string\" !== typeof type &&\n \"number\" !== typeof type &&\n \"bigint\" !== typeof type) ||\n instance.textContent === \"\" + type ||\n !0 === props.suppressHydrationWarning ||\n checkForUnmatchedText(instance.textContent, type)\n ? (null != props.popover &&\n (listenToNonDelegatedEvent(\"beforetoggle\", instance),\n listenToNonDelegatedEvent(\"toggle\", instance)),\n null != props.onScroll && listenToNonDelegatedEvent(\"scroll\", instance),\n null != props.onScrollEnd &&\n listenToNonDelegatedEvent(\"scrollend\", instance),\n null != props.onClick && (instance.onclick = noop$1),\n (instance = !0))\n : (instance = !1);\n instance || throwOnHydrationMismatch(fiber, !0);\n}\nfunction popToNextHostParent(fiber) {\n for (hydrationParentFiber = fiber.return; hydrationParentFiber; )\n switch (hydrationParentFiber.tag) {\n case 5:\n case 31:\n case 13:\n rootOrSingletonContext = !1;\n return;\n case 27:\n case 3:\n rootOrSingletonContext = !0;\n return;\n default:\n hydrationParentFiber = hydrationParentFiber.return;\n }\n}\nfunction popHydrationState(fiber) {\n if (fiber !== hydrationParentFiber) return !1;\n if (!isHydrating) return popToNextHostParent(fiber), (isHydrating = !0), !1;\n var tag = fiber.tag,\n JSCompiler_temp;\n if ((JSCompiler_temp = 3 !== tag && 27 !== tag)) {\n if ((JSCompiler_temp = 5 === tag))\n (JSCompiler_temp = fiber.type),\n (JSCompiler_temp =\n !(\"form\" !== JSCompiler_temp && \"button\" !== JSCompiler_temp) ||\n shouldSetTextContent(fiber.type, fiber.memoizedProps));\n JSCompiler_temp = !JSCompiler_temp;\n }\n JSCompiler_temp && nextHydratableInstance && throwOnHydrationMismatch(fiber);\n popToNextHostParent(fiber);\n if (13 === tag) {\n fiber = fiber.memoizedState;\n fiber = null !== fiber ? fiber.dehydrated : null;\n if (!fiber) throw Error(formatProdErrorMessage(317));\n nextHydratableInstance =\n getNextHydratableInstanceAfterHydrationBoundary(fiber);\n } else if (31 === tag) {\n fiber = fiber.memoizedState;\n fiber = null !== fiber ? fiber.dehydrated : null;\n if (!fiber) throw Error(formatProdErrorMessage(317));\n nextHydratableInstance =\n getNextHydratableInstanceAfterHydrationBoundary(fiber);\n } else\n 27 === tag\n ? ((tag = nextHydratableInstance),\n isSingletonScope(fiber.type)\n ? ((fiber = previousHydratableOnEnteringScopedSingleton),\n (previousHydratableOnEnteringScopedSingleton = null),\n (nextHydratableInstance = fiber))\n : (nextHydratableInstance = tag))\n : (nextHydratableInstance = hydrationParentFiber\n ? getNextHydratable(fiber.stateNode.nextSibling)\n : null);\n return !0;\n}\nfunction resetHydrationState() {\n nextHydratableInstance = hydrationParentFiber = null;\n isHydrating = !1;\n}\nfunction upgradeHydrationErrorsToRecoverable() {\n var queuedErrors = hydrationErrors;\n null !== queuedErrors &&\n (null === workInProgressRootRecoverableErrors\n ? (workInProgressRootRecoverableErrors = queuedErrors)\n : workInProgressRootRecoverableErrors.push.apply(\n workInProgressRootRecoverableErrors,\n queuedErrors\n ),\n (hydrationErrors = null));\n return queuedErrors;\n}\nfunction queueHydrationError(error) {\n null === hydrationErrors\n ? (hydrationErrors = [error])\n : hydrationErrors.push(error);\n}\nvar valueCursor = createCursor(null),\n currentlyRenderingFiber$1 = null,\n lastContextDependency = null;\nfunction pushProvider(providerFiber, context, nextValue) {\n push(valueCursor, context._currentValue);\n context._currentValue = nextValue;\n}\nfunction popProvider(context) {\n context._currentValue = valueCursor.current;\n pop(valueCursor);\n}\nfunction scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) {\n for (; null !== parent; ) {\n var alternate = parent.alternate;\n (parent.childLanes & renderLanes) !== renderLanes\n ? ((parent.childLanes |= renderLanes),\n null !== alternate && (alternate.childLanes |= renderLanes))\n : null !== alternate &&\n (alternate.childLanes & renderLanes) !== renderLanes &&\n (alternate.childLanes |= renderLanes);\n if (parent === propagationRoot) break;\n parent = parent.return;\n }\n}\nfunction propagateContextChanges(\n workInProgress,\n contexts,\n renderLanes,\n forcePropagateEntireTree\n) {\n var fiber = workInProgress.child;\n null !== fiber && (fiber.return = workInProgress);\n for (; null !== fiber; ) {\n var list = fiber.dependencies;\n if (null !== list) {\n var nextFiber = fiber.child;\n list = list.firstContext;\n a: for (; null !== list; ) {\n var dependency = list;\n list = fiber;\n for (var i = 0; i < contexts.length; i++)\n if (dependency.context === contexts[i]) {\n list.lanes |= renderLanes;\n dependency = list.alternate;\n null !== dependency && (dependency.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(\n list.return,\n renderLanes,\n workInProgress\n );\n forcePropagateEntireTree || (nextFiber = null);\n break a;\n }\n list = dependency.next;\n }\n } else if (18 === fiber.tag) {\n nextFiber = fiber.return;\n if (null === nextFiber) throw Error(formatProdErrorMessage(341));\n nextFiber.lanes |= renderLanes;\n list = nextFiber.alternate;\n null !== list && (list.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(nextFiber, renderLanes, workInProgress);\n nextFiber = null;\n } else nextFiber = fiber.child;\n if (null !== nextFiber) nextFiber.return = fiber;\n else\n for (nextFiber = fiber; null !== nextFiber; ) {\n if (nextFiber === workInProgress) {\n nextFiber = null;\n break;\n }\n fiber = nextFiber.sibling;\n if (null !== fiber) {\n fiber.return = nextFiber.return;\n nextFiber = fiber;\n break;\n }\n nextFiber = nextFiber.return;\n }\n fiber = nextFiber;\n }\n}\nfunction propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n forcePropagateEntireTree\n) {\n current = null;\n for (\n var parent = workInProgress, isInsidePropagationBailout = !1;\n null !== parent;\n\n ) {\n if (!isInsidePropagationBailout)\n if (0 !== (parent.flags & 524288)) isInsidePropagationBailout = !0;\n else if (0 !== (parent.flags & 262144)) break;\n if (10 === parent.tag) {\n var currentParent = parent.alternate;\n if (null === currentParent) throw Error(formatProdErrorMessage(387));\n currentParent = currentParent.memoizedProps;\n if (null !== currentParent) {\n var context = parent.type;\n objectIs(parent.pendingProps.value, currentParent.value) ||\n (null !== current ? current.push(context) : (current = [context]));\n }\n } else if (parent === hostTransitionProviderCursor.current) {\n currentParent = parent.alternate;\n if (null === currentParent) throw Error(formatProdErrorMessage(387));\n currentParent.memoizedState.memoizedState !==\n parent.memoizedState.memoizedState &&\n (null !== current\n ? current.push(HostTransitionContext)\n : (current = [HostTransitionContext]));\n }\n parent = parent.return;\n }\n null !== current &&\n propagateContextChanges(\n workInProgress,\n current,\n renderLanes,\n forcePropagateEntireTree\n );\n workInProgress.flags |= 262144;\n}\nfunction checkIfContextChanged(currentDependencies) {\n for (\n currentDependencies = currentDependencies.firstContext;\n null !== currentDependencies;\n\n ) {\n if (\n !objectIs(\n currentDependencies.context._currentValue,\n currentDependencies.memoizedValue\n )\n )\n return !0;\n currentDependencies = currentDependencies.next;\n }\n return !1;\n}\nfunction prepareToReadContext(workInProgress) {\n currentlyRenderingFiber$1 = workInProgress;\n lastContextDependency = null;\n workInProgress = workInProgress.dependencies;\n null !== workInProgress && (workInProgress.firstContext = null);\n}\nfunction readContext(context) {\n return readContextForConsumer(currentlyRenderingFiber$1, context);\n}\nfunction readContextDuringReconciliation(consumer, context) {\n null === currentlyRenderingFiber$1 && prepareToReadContext(consumer);\n return readContextForConsumer(consumer, context);\n}\nfunction readContextForConsumer(consumer, context) {\n var value = context._currentValue;\n context = { context: context, memoizedValue: value, next: null };\n if (null === lastContextDependency) {\n if (null === consumer) throw Error(formatProdErrorMessage(308));\n lastContextDependency = context;\n consumer.dependencies = { lanes: 0, firstContext: context };\n consumer.flags |= 524288;\n } else lastContextDependency = lastContextDependency.next = context;\n return value;\n}\nvar AbortControllerLocal =\n \"undefined\" !== typeof AbortController\n ? AbortController\n : function () {\n var listeners = [],\n signal = (this.signal = {\n aborted: !1,\n addEventListener: function (type, listener) {\n listeners.push(listener);\n }\n });\n this.abort = function () {\n signal.aborted = !0;\n listeners.forEach(function (listener) {\n return listener();\n });\n };\n },\n scheduleCallback$2 = Scheduler.unstable_scheduleCallback,\n NormalPriority = Scheduler.unstable_NormalPriority,\n CacheContext = {\n $$typeof: REACT_CONTEXT_TYPE,\n Consumer: null,\n Provider: null,\n _currentValue: null,\n _currentValue2: null,\n _threadCount: 0\n };\nfunction createCache() {\n return {\n controller: new AbortControllerLocal(),\n data: new Map(),\n refCount: 0\n };\n}\nfunction releaseCache(cache) {\n cache.refCount--;\n 0 === cache.refCount &&\n scheduleCallback$2(NormalPriority, function () {\n cache.controller.abort();\n });\n}\nvar currentEntangledListeners = null,\n currentEntangledPendingCount = 0,\n currentEntangledLane = 0,\n currentEntangledActionThenable = null;\nfunction entangleAsyncAction(transition, thenable) {\n if (null === currentEntangledListeners) {\n var entangledListeners = (currentEntangledListeners = []);\n currentEntangledPendingCount = 0;\n currentEntangledLane = requestTransitionLane();\n currentEntangledActionThenable = {\n status: \"pending\",\n value: void 0,\n then: function (resolve) {\n entangledListeners.push(resolve);\n }\n };\n }\n currentEntangledPendingCount++;\n thenable.then(pingEngtangledActionScope, pingEngtangledActionScope);\n return thenable;\n}\nfunction pingEngtangledActionScope() {\n if (\n 0 === --currentEntangledPendingCount &&\n null !== currentEntangledListeners\n ) {\n null !== currentEntangledActionThenable &&\n (currentEntangledActionThenable.status = \"fulfilled\");\n var listeners = currentEntangledListeners;\n currentEntangledListeners = null;\n currentEntangledLane = 0;\n currentEntangledActionThenable = null;\n for (var i = 0; i < listeners.length; i++) (0, listeners[i])();\n }\n}\nfunction chainThenableValue(thenable, result) {\n var listeners = [],\n thenableWithOverride = {\n status: \"pending\",\n value: null,\n reason: null,\n then: function (resolve) {\n listeners.push(resolve);\n }\n };\n thenable.then(\n function () {\n thenableWithOverride.status = \"fulfilled\";\n thenableWithOverride.value = result;\n for (var i = 0; i < listeners.length; i++) (0, listeners[i])(result);\n },\n function (error) {\n thenableWithOverride.status = \"rejected\";\n thenableWithOverride.reason = error;\n for (error = 0; error < listeners.length; error++)\n (0, listeners[error])(void 0);\n }\n );\n return thenableWithOverride;\n}\nvar prevOnStartTransitionFinish = ReactSharedInternals.S;\nReactSharedInternals.S = function (transition, returnValue) {\n globalMostRecentTransitionTime = now();\n \"object\" === typeof returnValue &&\n null !== returnValue &&\n \"function\" === typeof returnValue.then &&\n entangleAsyncAction(transition, returnValue);\n null !== prevOnStartTransitionFinish &&\n prevOnStartTransitionFinish(transition, returnValue);\n};\nvar resumedCache = createCursor(null);\nfunction peekCacheFromPool() {\n var cacheResumedFromPreviousRender = resumedCache.current;\n return null !== cacheResumedFromPreviousRender\n ? cacheResumedFromPreviousRender\n : workInProgressRoot.pooledCache;\n}\nfunction pushTransition(offscreenWorkInProgress, prevCachePool) {\n null === prevCachePool\n ? push(resumedCache, resumedCache.current)\n : push(resumedCache, prevCachePool.pool);\n}\nfunction getSuspendedCache() {\n var cacheFromPool = peekCacheFromPool();\n return null === cacheFromPool\n ? null\n : { parent: CacheContext._currentValue, pool: cacheFromPool };\n}\nvar SuspenseException = Error(formatProdErrorMessage(460)),\n SuspenseyCommitException = Error(formatProdErrorMessage(474)),\n SuspenseActionException = Error(formatProdErrorMessage(542)),\n noopSuspenseyCommitThenable = { then: function () {} };\nfunction isThenableResolved(thenable) {\n thenable = thenable.status;\n return \"fulfilled\" === thenable || \"rejected\" === thenable;\n}\nfunction trackUsedThenable(thenableState, thenable, index) {\n index = thenableState[index];\n void 0 === index\n ? thenableState.push(thenable)\n : index !== thenable && (thenable.then(noop$1, noop$1), (thenable = index));\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw (\n ((thenableState = thenable.reason),\n checkIfUseWrappedInAsyncCatch(thenableState),\n thenableState)\n );\n default:\n if (\"string\" === typeof thenable.status) thenable.then(noop$1, noop$1);\n else {\n thenableState = workInProgressRoot;\n if (null !== thenableState && 100 < thenableState.shellSuspendCounter)\n throw Error(formatProdErrorMessage(482));\n thenableState = thenable;\n thenableState.status = \"pending\";\n thenableState.then(\n function (fulfilledValue) {\n if (\"pending\" === thenable.status) {\n var fulfilledThenable = thenable;\n fulfilledThenable.status = \"fulfilled\";\n fulfilledThenable.value = fulfilledValue;\n }\n },\n function (error) {\n if (\"pending\" === thenable.status) {\n var rejectedThenable = thenable;\n rejectedThenable.status = \"rejected\";\n rejectedThenable.reason = error;\n }\n }\n );\n }\n switch (thenable.status) {\n case \"fulfilled\":\n return thenable.value;\n case \"rejected\":\n throw (\n ((thenableState = thenable.reason),\n checkIfUseWrappedInAsyncCatch(thenableState),\n thenableState)\n );\n }\n suspendedThenable = thenable;\n throw SuspenseException;\n }\n}\nfunction resolveLazy(lazyType) {\n try {\n var init = lazyType._init;\n return init(lazyType._payload);\n } catch (x) {\n if (null !== x && \"object\" === typeof x && \"function\" === typeof x.then)\n throw ((suspendedThenable = x), SuspenseException);\n throw x;\n }\n}\nvar suspendedThenable = null;\nfunction getSuspendedThenable() {\n if (null === suspendedThenable) throw Error(formatProdErrorMessage(459));\n var thenable = suspendedThenable;\n suspendedThenable = null;\n return thenable;\n}\nfunction checkIfUseWrappedInAsyncCatch(rejectedReason) {\n if (\n rejectedReason === SuspenseException ||\n rejectedReason === SuspenseActionException\n )\n throw Error(formatProdErrorMessage(483));\n}\nvar thenableState$1 = null,\n thenableIndexCounter$1 = 0;\nfunction unwrapThenable(thenable) {\n var index = thenableIndexCounter$1;\n thenableIndexCounter$1 += 1;\n null === thenableState$1 && (thenableState$1 = []);\n return trackUsedThenable(thenableState$1, thenable, index);\n}\nfunction coerceRef(workInProgress, element) {\n element = element.props.ref;\n workInProgress.ref = void 0 !== element ? element : null;\n}\nfunction throwOnInvalidObjectTypeImpl(returnFiber, newChild) {\n if (newChild.$$typeof === REACT_LEGACY_ELEMENT_TYPE)\n throw Error(formatProdErrorMessage(525));\n returnFiber = Object.prototype.toString.call(newChild);\n throw Error(\n formatProdErrorMessage(\n 31,\n \"[object Object]\" === returnFiber\n ? \"object with keys {\" + Object.keys(newChild).join(\", \") + \"}\"\n : returnFiber\n )\n );\n}\nfunction createChildReconciler(shouldTrackSideEffects) {\n function deleteChild(returnFiber, childToDelete) {\n if (shouldTrackSideEffects) {\n var deletions = returnFiber.deletions;\n null === deletions\n ? ((returnFiber.deletions = [childToDelete]), (returnFiber.flags |= 16))\n : deletions.push(childToDelete);\n }\n }\n function deleteRemainingChildren(returnFiber, currentFirstChild) {\n if (!shouldTrackSideEffects) return null;\n for (; null !== currentFirstChild; )\n deleteChild(returnFiber, currentFirstChild),\n (currentFirstChild = currentFirstChild.sibling);\n return null;\n }\n function mapRemainingChildren(currentFirstChild) {\n for (var existingChildren = new Map(); null !== currentFirstChild; )\n null !== currentFirstChild.key\n ? existingChildren.set(currentFirstChild.key, currentFirstChild)\n : existingChildren.set(currentFirstChild.index, currentFirstChild),\n (currentFirstChild = currentFirstChild.sibling);\n return existingChildren;\n }\n function useFiber(fiber, pendingProps) {\n fiber = createWorkInProgress(fiber, pendingProps);\n fiber.index = 0;\n fiber.sibling = null;\n return fiber;\n }\n function placeChild(newFiber, lastPlacedIndex, newIndex) {\n newFiber.index = newIndex;\n if (!shouldTrackSideEffects)\n return (newFiber.flags |= 1048576), lastPlacedIndex;\n newIndex = newFiber.alternate;\n if (null !== newIndex)\n return (\n (newIndex = newIndex.index),\n newIndex < lastPlacedIndex\n ? ((newFiber.flags |= 67108866), lastPlacedIndex)\n : newIndex\n );\n newFiber.flags |= 67108866;\n return lastPlacedIndex;\n }\n function placeSingleChild(newFiber) {\n shouldTrackSideEffects &&\n null === newFiber.alternate &&\n (newFiber.flags |= 67108866);\n return newFiber;\n }\n function updateTextNode(returnFiber, current, textContent, lanes) {\n if (null === current || 6 !== current.tag)\n return (\n (current = createFiberFromText(textContent, returnFiber.mode, lanes)),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, textContent);\n current.return = returnFiber;\n return current;\n }\n function updateElement(returnFiber, current, element, lanes) {\n var elementType = element.type;\n if (elementType === REACT_FRAGMENT_TYPE)\n return updateFragment(\n returnFiber,\n current,\n element.props.children,\n lanes,\n element.key\n );\n if (\n null !== current &&\n (current.elementType === elementType ||\n (\"object\" === typeof elementType &&\n null !== elementType &&\n elementType.$$typeof === REACT_LAZY_TYPE &&\n resolveLazy(elementType) === current.type))\n )\n return (\n (current = useFiber(current, element.props)),\n coerceRef(current, element),\n (current.return = returnFiber),\n current\n );\n current = createFiberFromTypeAndProps(\n element.type,\n element.key,\n element.props,\n null,\n returnFiber.mode,\n lanes\n );\n coerceRef(current, element);\n current.return = returnFiber;\n return current;\n }\n function updatePortal(returnFiber, current, portal, lanes) {\n if (\n null === current ||\n 4 !== current.tag ||\n current.stateNode.containerInfo !== portal.containerInfo ||\n current.stateNode.implementation !== portal.implementation\n )\n return (\n (current = createFiberFromPortal(portal, returnFiber.mode, lanes)),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, portal.children || []);\n current.return = returnFiber;\n return current;\n }\n function updateFragment(returnFiber, current, fragment, lanes, key) {\n if (null === current || 7 !== current.tag)\n return (\n (current = createFiberFromFragment(\n fragment,\n returnFiber.mode,\n lanes,\n key\n )),\n (current.return = returnFiber),\n current\n );\n current = useFiber(current, fragment);\n current.return = returnFiber;\n return current;\n }\n function createChild(returnFiber, newChild, lanes) {\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return (\n (newChild = createFiberFromText(\n \"\" + newChild,\n returnFiber.mode,\n lanes\n )),\n (newChild.return = returnFiber),\n newChild\n );\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return (\n (lanes = createFiberFromTypeAndProps(\n newChild.type,\n newChild.key,\n newChild.props,\n null,\n returnFiber.mode,\n lanes\n )),\n coerceRef(lanes, newChild),\n (lanes.return = returnFiber),\n lanes\n );\n case REACT_PORTAL_TYPE:\n return (\n (newChild = createFiberFromPortal(\n newChild,\n returnFiber.mode,\n lanes\n )),\n (newChild.return = returnFiber),\n newChild\n );\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n createChild(returnFiber, newChild, lanes)\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return (\n (newChild = createFiberFromFragment(\n newChild,\n returnFiber.mode,\n lanes,\n null\n )),\n (newChild.return = returnFiber),\n newChild\n );\n if (\"function\" === typeof newChild.then)\n return createChild(returnFiber, unwrapThenable(newChild), lanes);\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return createChild(\n returnFiber,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function updateSlot(returnFiber, oldFiber, newChild, lanes) {\n var key = null !== oldFiber ? oldFiber.key : null;\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return null !== key\n ? null\n : updateTextNode(returnFiber, oldFiber, \"\" + newChild, lanes);\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return newChild.key === key\n ? updateElement(returnFiber, oldFiber, newChild, lanes)\n : null;\n case REACT_PORTAL_TYPE:\n return newChild.key === key\n ? updatePortal(returnFiber, oldFiber, newChild, lanes)\n : null;\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n updateSlot(returnFiber, oldFiber, newChild, lanes)\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return null !== key\n ? null\n : updateFragment(returnFiber, oldFiber, newChild, lanes, null);\n if (\"function\" === typeof newChild.then)\n return updateSlot(\n returnFiber,\n oldFiber,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return updateSlot(\n returnFiber,\n oldFiber,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n newChild,\n lanes\n ) {\n if (\n (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n )\n return (\n (existingChildren = existingChildren.get(newIdx) || null),\n updateTextNode(returnFiber, existingChildren, \"\" + newChild, lanes)\n );\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return (\n (existingChildren =\n existingChildren.get(\n null === newChild.key ? newIdx : newChild.key\n ) || null),\n updateElement(returnFiber, existingChildren, newChild, lanes)\n );\n case REACT_PORTAL_TYPE:\n return (\n (existingChildren =\n existingChildren.get(\n null === newChild.key ? newIdx : newChild.key\n ) || null),\n updatePortal(returnFiber, existingChildren, newChild, lanes)\n );\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n newChild,\n lanes\n )\n );\n }\n if (isArrayImpl(newChild) || getIteratorFn(newChild))\n return (\n (existingChildren = existingChildren.get(newIdx) || null),\n updateFragment(returnFiber, existingChildren, newChild, lanes, null)\n );\n if (\"function\" === typeof newChild.then)\n return updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return updateFromMap(\n existingChildren,\n returnFiber,\n newIdx,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return null;\n }\n function reconcileChildrenArray(\n returnFiber,\n currentFirstChild,\n newChildren,\n lanes\n ) {\n for (\n var resultingFirstChild = null,\n previousNewFiber = null,\n oldFiber = currentFirstChild,\n newIdx = (currentFirstChild = 0),\n nextOldFiber = null;\n null !== oldFiber && newIdx < newChildren.length;\n newIdx++\n ) {\n oldFiber.index > newIdx\n ? ((nextOldFiber = oldFiber), (oldFiber = null))\n : (nextOldFiber = oldFiber.sibling);\n var newFiber = updateSlot(\n returnFiber,\n oldFiber,\n newChildren[newIdx],\n lanes\n );\n if (null === newFiber) {\n null === oldFiber && (oldFiber = nextOldFiber);\n break;\n }\n shouldTrackSideEffects &&\n oldFiber &&\n null === newFiber.alternate &&\n deleteChild(returnFiber, oldFiber);\n currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n null === previousNewFiber\n ? (resultingFirstChild = newFiber)\n : (previousNewFiber.sibling = newFiber);\n previousNewFiber = newFiber;\n oldFiber = nextOldFiber;\n }\n if (newIdx === newChildren.length)\n return (\n deleteRemainingChildren(returnFiber, oldFiber),\n isHydrating && pushTreeFork(returnFiber, newIdx),\n resultingFirstChild\n );\n if (null === oldFiber) {\n for (; newIdx < newChildren.length; newIdx++)\n (oldFiber = createChild(returnFiber, newChildren[newIdx], lanes)),\n null !== oldFiber &&\n ((currentFirstChild = placeChild(\n oldFiber,\n currentFirstChild,\n newIdx\n )),\n null === previousNewFiber\n ? (resultingFirstChild = oldFiber)\n : (previousNewFiber.sibling = oldFiber),\n (previousNewFiber = oldFiber));\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n for (\n oldFiber = mapRemainingChildren(oldFiber);\n newIdx < newChildren.length;\n newIdx++\n )\n (nextOldFiber = updateFromMap(\n oldFiber,\n returnFiber,\n newIdx,\n newChildren[newIdx],\n lanes\n )),\n null !== nextOldFiber &&\n (shouldTrackSideEffects &&\n null !== nextOldFiber.alternate &&\n oldFiber.delete(\n null === nextOldFiber.key ? newIdx : nextOldFiber.key\n ),\n (currentFirstChild = placeChild(\n nextOldFiber,\n currentFirstChild,\n newIdx\n )),\n null === previousNewFiber\n ? (resultingFirstChild = nextOldFiber)\n : (previousNewFiber.sibling = nextOldFiber),\n (previousNewFiber = nextOldFiber));\n shouldTrackSideEffects &&\n oldFiber.forEach(function (child) {\n return deleteChild(returnFiber, child);\n });\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n function reconcileChildrenIterator(\n returnFiber,\n currentFirstChild,\n newChildren,\n lanes\n ) {\n if (null == newChildren) throw Error(formatProdErrorMessage(151));\n for (\n var resultingFirstChild = null,\n previousNewFiber = null,\n oldFiber = currentFirstChild,\n newIdx = (currentFirstChild = 0),\n nextOldFiber = null,\n step = newChildren.next();\n null !== oldFiber && !step.done;\n newIdx++, step = newChildren.next()\n ) {\n oldFiber.index > newIdx\n ? ((nextOldFiber = oldFiber), (oldFiber = null))\n : (nextOldFiber = oldFiber.sibling);\n var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);\n if (null === newFiber) {\n null === oldFiber && (oldFiber = nextOldFiber);\n break;\n }\n shouldTrackSideEffects &&\n oldFiber &&\n null === newFiber.alternate &&\n deleteChild(returnFiber, oldFiber);\n currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);\n null === previousNewFiber\n ? (resultingFirstChild = newFiber)\n : (previousNewFiber.sibling = newFiber);\n previousNewFiber = newFiber;\n oldFiber = nextOldFiber;\n }\n if (step.done)\n return (\n deleteRemainingChildren(returnFiber, oldFiber),\n isHydrating && pushTreeFork(returnFiber, newIdx),\n resultingFirstChild\n );\n if (null === oldFiber) {\n for (; !step.done; newIdx++, step = newChildren.next())\n (step = createChild(returnFiber, step.value, lanes)),\n null !== step &&\n ((currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n null === previousNewFiber\n ? (resultingFirstChild = step)\n : (previousNewFiber.sibling = step),\n (previousNewFiber = step));\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n for (\n oldFiber = mapRemainingChildren(oldFiber);\n !step.done;\n newIdx++, step = newChildren.next()\n )\n (step = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes)),\n null !== step &&\n (shouldTrackSideEffects &&\n null !== step.alternate &&\n oldFiber.delete(null === step.key ? newIdx : step.key),\n (currentFirstChild = placeChild(step, currentFirstChild, newIdx)),\n null === previousNewFiber\n ? (resultingFirstChild = step)\n : (previousNewFiber.sibling = step),\n (previousNewFiber = step));\n shouldTrackSideEffects &&\n oldFiber.forEach(function (child) {\n return deleteChild(returnFiber, child);\n });\n isHydrating && pushTreeFork(returnFiber, newIdx);\n return resultingFirstChild;\n }\n function reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n ) {\n \"object\" === typeof newChild &&\n null !== newChild &&\n newChild.type === REACT_FRAGMENT_TYPE &&\n null === newChild.key &&\n (newChild = newChild.props.children);\n if (\"object\" === typeof newChild && null !== newChild) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n a: {\n for (var key = newChild.key; null !== currentFirstChild; ) {\n if (currentFirstChild.key === key) {\n key = newChild.type;\n if (key === REACT_FRAGMENT_TYPE) {\n if (7 === currentFirstChild.tag) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(\n currentFirstChild,\n newChild.props.children\n );\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n }\n } else if (\n currentFirstChild.elementType === key ||\n (\"object\" === typeof key &&\n null !== key &&\n key.$$typeof === REACT_LAZY_TYPE &&\n resolveLazy(key) === currentFirstChild.type)\n ) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(currentFirstChild, newChild.props);\n coerceRef(lanes, newChild);\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n }\n deleteRemainingChildren(returnFiber, currentFirstChild);\n break;\n } else deleteChild(returnFiber, currentFirstChild);\n currentFirstChild = currentFirstChild.sibling;\n }\n newChild.type === REACT_FRAGMENT_TYPE\n ? ((lanes = createFiberFromFragment(\n newChild.props.children,\n returnFiber.mode,\n lanes,\n newChild.key\n )),\n (lanes.return = returnFiber),\n (returnFiber = lanes))\n : ((lanes = createFiberFromTypeAndProps(\n newChild.type,\n newChild.key,\n newChild.props,\n null,\n returnFiber.mode,\n lanes\n )),\n coerceRef(lanes, newChild),\n (lanes.return = returnFiber),\n (returnFiber = lanes));\n }\n return placeSingleChild(returnFiber);\n case REACT_PORTAL_TYPE:\n a: {\n for (key = newChild.key; null !== currentFirstChild; ) {\n if (currentFirstChild.key === key)\n if (\n 4 === currentFirstChild.tag &&\n currentFirstChild.stateNode.containerInfo ===\n newChild.containerInfo &&\n currentFirstChild.stateNode.implementation ===\n newChild.implementation\n ) {\n deleteRemainingChildren(\n returnFiber,\n currentFirstChild.sibling\n );\n lanes = useFiber(currentFirstChild, newChild.children || []);\n lanes.return = returnFiber;\n returnFiber = lanes;\n break a;\n } else {\n deleteRemainingChildren(returnFiber, currentFirstChild);\n break;\n }\n else deleteChild(returnFiber, currentFirstChild);\n currentFirstChild = currentFirstChild.sibling;\n }\n lanes = createFiberFromPortal(newChild, returnFiber.mode, lanes);\n lanes.return = returnFiber;\n returnFiber = lanes;\n }\n return placeSingleChild(returnFiber);\n case REACT_LAZY_TYPE:\n return (\n (newChild = resolveLazy(newChild)),\n reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n )\n );\n }\n if (isArrayImpl(newChild))\n return reconcileChildrenArray(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n if (getIteratorFn(newChild)) {\n key = getIteratorFn(newChild);\n if (\"function\" !== typeof key) throw Error(formatProdErrorMessage(150));\n newChild = key.call(newChild);\n return reconcileChildrenIterator(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n }\n if (\"function\" === typeof newChild.then)\n return reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n unwrapThenable(newChild),\n lanes\n );\n if (newChild.$$typeof === REACT_CONTEXT_TYPE)\n return reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n readContextDuringReconciliation(returnFiber, newChild),\n lanes\n );\n throwOnInvalidObjectTypeImpl(returnFiber, newChild);\n }\n return (\"string\" === typeof newChild && \"\" !== newChild) ||\n \"number\" === typeof newChild ||\n \"bigint\" === typeof newChild\n ? ((newChild = \"\" + newChild),\n null !== currentFirstChild && 6 === currentFirstChild.tag\n ? (deleteRemainingChildren(returnFiber, currentFirstChild.sibling),\n (lanes = useFiber(currentFirstChild, newChild)),\n (lanes.return = returnFiber),\n (returnFiber = lanes))\n : (deleteRemainingChildren(returnFiber, currentFirstChild),\n (lanes = createFiberFromText(newChild, returnFiber.mode, lanes)),\n (lanes.return = returnFiber),\n (returnFiber = lanes)),\n placeSingleChild(returnFiber))\n : deleteRemainingChildren(returnFiber, currentFirstChild);\n }\n return function (returnFiber, currentFirstChild, newChild, lanes) {\n try {\n thenableIndexCounter$1 = 0;\n var firstChildFiber = reconcileChildFibersImpl(\n returnFiber,\n currentFirstChild,\n newChild,\n lanes\n );\n thenableState$1 = null;\n return firstChildFiber;\n } catch (x) {\n if (x === SuspenseException || x === SuspenseActionException) throw x;\n var fiber = createFiberImplClass(29, x, null, returnFiber.mode);\n fiber.lanes = lanes;\n fiber.return = returnFiber;\n return fiber;\n } finally {\n }\n };\n}\nvar reconcileChildFibers = createChildReconciler(!0),\n mountChildFibers = createChildReconciler(!1),\n hasForceUpdate = !1;\nfunction initializeUpdateQueue(fiber) {\n fiber.updateQueue = {\n baseState: fiber.memoizedState,\n firstBaseUpdate: null,\n lastBaseUpdate: null,\n shared: { pending: null, lanes: 0, hiddenCallbacks: null },\n callbacks: null\n };\n}\nfunction cloneUpdateQueue(current, workInProgress) {\n current = current.updateQueue;\n workInProgress.updateQueue === current &&\n (workInProgress.updateQueue = {\n baseState: current.baseState,\n firstBaseUpdate: current.firstBaseUpdate,\n lastBaseUpdate: current.lastBaseUpdate,\n shared: current.shared,\n callbacks: null\n });\n}\nfunction createUpdate(lane) {\n return { lane: lane, tag: 0, payload: null, callback: null, next: null };\n}\nfunction enqueueUpdate(fiber, update, lane) {\n var updateQueue = fiber.updateQueue;\n if (null === updateQueue) return null;\n updateQueue = updateQueue.shared;\n if (0 !== (executionContext & 2)) {\n var pending = updateQueue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n updateQueue.pending = update;\n update = getRootForUpdatedFiber(fiber);\n markUpdateLaneFromFiberToRoot(fiber, null, lane);\n return update;\n }\n enqueueUpdate$1(fiber, updateQueue, update, lane);\n return getRootForUpdatedFiber(fiber);\n}\nfunction entangleTransitions(root, fiber, lane) {\n fiber = fiber.updateQueue;\n if (null !== fiber && ((fiber = fiber.shared), 0 !== (lane & 4194048))) {\n var queueLanes = fiber.lanes;\n queueLanes &= root.pendingLanes;\n lane |= queueLanes;\n fiber.lanes = lane;\n markRootEntangled(root, lane);\n }\n}\nfunction enqueueCapturedUpdate(workInProgress, capturedUpdate) {\n var queue = workInProgress.updateQueue,\n current = workInProgress.alternate;\n if (\n null !== current &&\n ((current = current.updateQueue), queue === current)\n ) {\n var newFirst = null,\n newLast = null;\n queue = queue.firstBaseUpdate;\n if (null !== queue) {\n do {\n var clone = {\n lane: queue.lane,\n tag: queue.tag,\n payload: queue.payload,\n callback: null,\n next: null\n };\n null === newLast\n ? (newFirst = newLast = clone)\n : (newLast = newLast.next = clone);\n queue = queue.next;\n } while (null !== queue);\n null === newLast\n ? (newFirst = newLast = capturedUpdate)\n : (newLast = newLast.next = capturedUpdate);\n } else newFirst = newLast = capturedUpdate;\n queue = {\n baseState: current.baseState,\n firstBaseUpdate: newFirst,\n lastBaseUpdate: newLast,\n shared: current.shared,\n callbacks: current.callbacks\n };\n workInProgress.updateQueue = queue;\n return;\n }\n workInProgress = queue.lastBaseUpdate;\n null === workInProgress\n ? (queue.firstBaseUpdate = capturedUpdate)\n : (workInProgress.next = capturedUpdate);\n queue.lastBaseUpdate = capturedUpdate;\n}\nvar didReadFromEntangledAsyncAction = !1;\nfunction suspendIfUpdateReadFromEntangledAsyncAction() {\n if (didReadFromEntangledAsyncAction) {\n var entangledActionThenable = currentEntangledActionThenable;\n if (null !== entangledActionThenable) throw entangledActionThenable;\n }\n}\nfunction processUpdateQueue(\n workInProgress$jscomp$0,\n props,\n instance$jscomp$0,\n renderLanes\n) {\n didReadFromEntangledAsyncAction = !1;\n var queue = workInProgress$jscomp$0.updateQueue;\n hasForceUpdate = !1;\n var firstBaseUpdate = queue.firstBaseUpdate,\n lastBaseUpdate = queue.lastBaseUpdate,\n pendingQueue = queue.shared.pending;\n if (null !== pendingQueue) {\n queue.shared.pending = null;\n var lastPendingUpdate = pendingQueue,\n firstPendingUpdate = lastPendingUpdate.next;\n lastPendingUpdate.next = null;\n null === lastBaseUpdate\n ? (firstBaseUpdate = firstPendingUpdate)\n : (lastBaseUpdate.next = firstPendingUpdate);\n lastBaseUpdate = lastPendingUpdate;\n var current = workInProgress$jscomp$0.alternate;\n null !== current &&\n ((current = current.updateQueue),\n (pendingQueue = current.lastBaseUpdate),\n pendingQueue !== lastBaseUpdate &&\n (null === pendingQueue\n ? (current.firstBaseUpdate = firstPendingUpdate)\n : (pendingQueue.next = firstPendingUpdate),\n (current.lastBaseUpdate = lastPendingUpdate)));\n }\n if (null !== firstBaseUpdate) {\n var newState = queue.baseState;\n lastBaseUpdate = 0;\n current = firstPendingUpdate = lastPendingUpdate = null;\n pendingQueue = firstBaseUpdate;\n do {\n var updateLane = pendingQueue.lane & -536870913,\n isHiddenUpdate = updateLane !== pendingQueue.lane;\n if (\n isHiddenUpdate\n ? (workInProgressRootRenderLanes & updateLane) === updateLane\n : (renderLanes & updateLane) === updateLane\n ) {\n 0 !== updateLane &&\n updateLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction = !0);\n null !== current &&\n (current = current.next =\n {\n lane: 0,\n tag: pendingQueue.tag,\n payload: pendingQueue.payload,\n callback: null,\n next: null\n });\n a: {\n var workInProgress = workInProgress$jscomp$0,\n update = pendingQueue;\n updateLane = props;\n var instance = instance$jscomp$0;\n switch (update.tag) {\n case 1:\n workInProgress = update.payload;\n if (\"function\" === typeof workInProgress) {\n newState = workInProgress.call(instance, newState, updateLane);\n break a;\n }\n newState = workInProgress;\n break a;\n case 3:\n workInProgress.flags = (workInProgress.flags & -65537) | 128;\n case 0:\n workInProgress = update.payload;\n updateLane =\n \"function\" === typeof workInProgress\n ? workInProgress.call(instance, newState, updateLane)\n : workInProgress;\n if (null === updateLane || void 0 === updateLane) break a;\n newState = assign({}, newState, updateLane);\n break a;\n case 2:\n hasForceUpdate = !0;\n }\n }\n updateLane = pendingQueue.callback;\n null !== updateLane &&\n ((workInProgress$jscomp$0.flags |= 64),\n isHiddenUpdate && (workInProgress$jscomp$0.flags |= 8192),\n (isHiddenUpdate = queue.callbacks),\n null === isHiddenUpdate\n ? (queue.callbacks = [updateLane])\n : isHiddenUpdate.push(updateLane));\n } else\n (isHiddenUpdate = {\n lane: updateLane,\n tag: pendingQueue.tag,\n payload: pendingQueue.payload,\n callback: pendingQueue.callback,\n next: null\n }),\n null === current\n ? ((firstPendingUpdate = current = isHiddenUpdate),\n (lastPendingUpdate = newState))\n : (current = current.next = isHiddenUpdate),\n (lastBaseUpdate |= updateLane);\n pendingQueue = pendingQueue.next;\n if (null === pendingQueue)\n if (((pendingQueue = queue.shared.pending), null === pendingQueue))\n break;\n else\n (isHiddenUpdate = pendingQueue),\n (pendingQueue = isHiddenUpdate.next),\n (isHiddenUpdate.next = null),\n (queue.lastBaseUpdate = isHiddenUpdate),\n (queue.shared.pending = null);\n } while (1);\n null === current && (lastPendingUpdate = newState);\n queue.baseState = lastPendingUpdate;\n queue.firstBaseUpdate = firstPendingUpdate;\n queue.lastBaseUpdate = current;\n null === firstBaseUpdate && (queue.shared.lanes = 0);\n workInProgressRootSkippedLanes |= lastBaseUpdate;\n workInProgress$jscomp$0.lanes = lastBaseUpdate;\n workInProgress$jscomp$0.memoizedState = newState;\n }\n}\nfunction callCallback(callback, context) {\n if (\"function\" !== typeof callback)\n throw Error(formatProdErrorMessage(191, callback));\n callback.call(context);\n}\nfunction commitCallbacks(updateQueue, context) {\n var callbacks = updateQueue.callbacks;\n if (null !== callbacks)\n for (\n updateQueue.callbacks = null, updateQueue = 0;\n updateQueue < callbacks.length;\n updateQueue++\n )\n callCallback(callbacks[updateQueue], context);\n}\nvar currentTreeHiddenStackCursor = createCursor(null),\n prevEntangledRenderLanesCursor = createCursor(0);\nfunction pushHiddenContext(fiber, context) {\n fiber = entangledRenderLanes;\n push(prevEntangledRenderLanesCursor, fiber);\n push(currentTreeHiddenStackCursor, context);\n entangledRenderLanes = fiber | context.baseLanes;\n}\nfunction reuseHiddenContextOnStack() {\n push(prevEntangledRenderLanesCursor, entangledRenderLanes);\n push(currentTreeHiddenStackCursor, currentTreeHiddenStackCursor.current);\n}\nfunction popHiddenContext() {\n entangledRenderLanes = prevEntangledRenderLanesCursor.current;\n pop(currentTreeHiddenStackCursor);\n pop(prevEntangledRenderLanesCursor);\n}\nvar suspenseHandlerStackCursor = createCursor(null),\n shellBoundary = null;\nfunction pushPrimaryTreeSuspenseHandler(handler) {\n var current = handler.alternate;\n push(suspenseStackCursor, suspenseStackCursor.current & 1);\n push(suspenseHandlerStackCursor, handler);\n null === shellBoundary &&\n (null === current || null !== currentTreeHiddenStackCursor.current\n ? (shellBoundary = handler)\n : null !== current.memoizedState && (shellBoundary = handler));\n}\nfunction pushDehydratedActivitySuspenseHandler(fiber) {\n push(suspenseStackCursor, suspenseStackCursor.current);\n push(suspenseHandlerStackCursor, fiber);\n null === shellBoundary && (shellBoundary = fiber);\n}\nfunction pushOffscreenSuspenseHandler(fiber) {\n 22 === fiber.tag\n ? (push(suspenseStackCursor, suspenseStackCursor.current),\n push(suspenseHandlerStackCursor, fiber),\n null === shellBoundary && (shellBoundary = fiber))\n : reuseSuspenseHandlerOnStack(fiber);\n}\nfunction reuseSuspenseHandlerOnStack() {\n push(suspenseStackCursor, suspenseStackCursor.current);\n push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current);\n}\nfunction popSuspenseHandler(fiber) {\n pop(suspenseHandlerStackCursor);\n shellBoundary === fiber && (shellBoundary = null);\n pop(suspenseStackCursor);\n}\nvar suspenseStackCursor = createCursor(0);\nfunction findFirstSuspended(row) {\n for (var node = row; null !== node; ) {\n if (13 === node.tag) {\n var state = node.memoizedState;\n if (\n null !== state &&\n ((state = state.dehydrated),\n null === state ||\n isSuspenseInstancePending(state) ||\n isSuspenseInstanceFallback(state))\n )\n return node;\n } else if (\n 19 === node.tag &&\n (\"forwards\" === node.memoizedProps.revealOrder ||\n \"backwards\" === node.memoizedProps.revealOrder ||\n \"unstable_legacy-backwards\" === node.memoizedProps.revealOrder ||\n \"together\" === node.memoizedProps.revealOrder)\n ) {\n if (0 !== (node.flags & 128)) return node;\n } else if (null !== node.child) {\n node.child.return = node;\n node = node.child;\n continue;\n }\n if (node === row) break;\n for (; null === node.sibling; ) {\n if (null === node.return || node.return === row) return null;\n node = node.return;\n }\n node.sibling.return = node.return;\n node = node.sibling;\n }\n return null;\n}\nvar renderLanes = 0,\n currentlyRenderingFiber = null,\n currentHook = null,\n workInProgressHook = null,\n didScheduleRenderPhaseUpdate = !1,\n didScheduleRenderPhaseUpdateDuringThisPass = !1,\n shouldDoubleInvokeUserFnsInHooksDEV = !1,\n localIdCounter = 0,\n thenableIndexCounter = 0,\n thenableState = null,\n globalClientIdCounter = 0;\nfunction throwInvalidHookError() {\n throw Error(formatProdErrorMessage(321));\n}\nfunction areHookInputsEqual(nextDeps, prevDeps) {\n if (null === prevDeps) return !1;\n for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++)\n if (!objectIs(nextDeps[i], prevDeps[i])) return !1;\n return !0;\n}\nfunction renderWithHooks(\n current,\n workInProgress,\n Component,\n props,\n secondArg,\n nextRenderLanes\n) {\n renderLanes = nextRenderLanes;\n currentlyRenderingFiber = workInProgress;\n workInProgress.memoizedState = null;\n workInProgress.updateQueue = null;\n workInProgress.lanes = 0;\n ReactSharedInternals.H =\n null === current || null === current.memoizedState\n ? HooksDispatcherOnMount\n : HooksDispatcherOnUpdate;\n shouldDoubleInvokeUserFnsInHooksDEV = !1;\n nextRenderLanes = Component(props, secondArg);\n shouldDoubleInvokeUserFnsInHooksDEV = !1;\n didScheduleRenderPhaseUpdateDuringThisPass &&\n (nextRenderLanes = renderWithHooksAgain(\n workInProgress,\n Component,\n props,\n secondArg\n ));\n finishRenderingHooks(current);\n return nextRenderLanes;\n}\nfunction finishRenderingHooks(current) {\n ReactSharedInternals.H = ContextOnlyDispatcher;\n var didRenderTooFewHooks = null !== currentHook && null !== currentHook.next;\n renderLanes = 0;\n workInProgressHook = currentHook = currentlyRenderingFiber = null;\n didScheduleRenderPhaseUpdate = !1;\n thenableIndexCounter = 0;\n thenableState = null;\n if (didRenderTooFewHooks) throw Error(formatProdErrorMessage(300));\n null === current ||\n didReceiveUpdate ||\n ((current = current.dependencies),\n null !== current &&\n checkIfContextChanged(current) &&\n (didReceiveUpdate = !0));\n}\nfunction renderWithHooksAgain(workInProgress, Component, props, secondArg) {\n currentlyRenderingFiber = workInProgress;\n var numberOfReRenders = 0;\n do {\n didScheduleRenderPhaseUpdateDuringThisPass && (thenableState = null);\n thenableIndexCounter = 0;\n didScheduleRenderPhaseUpdateDuringThisPass = !1;\n if (25 <= numberOfReRenders) throw Error(formatProdErrorMessage(301));\n numberOfReRenders += 1;\n workInProgressHook = currentHook = null;\n if (null != workInProgress.updateQueue) {\n var children = workInProgress.updateQueue;\n children.lastEffect = null;\n children.events = null;\n children.stores = null;\n null != children.memoCache && (children.memoCache.index = 0);\n }\n ReactSharedInternals.H = HooksDispatcherOnRerender;\n children = Component(props, secondArg);\n } while (didScheduleRenderPhaseUpdateDuringThisPass);\n return children;\n}\nfunction TransitionAwareHostComponent() {\n var dispatcher = ReactSharedInternals.H,\n maybeThenable = dispatcher.useState()[0];\n maybeThenable =\n \"function\" === typeof maybeThenable.then\n ? useThenable(maybeThenable)\n : maybeThenable;\n dispatcher = dispatcher.useState()[0];\n (null !== currentHook ? currentHook.memoizedState : null) !== dispatcher &&\n (currentlyRenderingFiber.flags |= 1024);\n return maybeThenable;\n}\nfunction checkDidRenderIdHook() {\n var didRenderIdHook = 0 !== localIdCounter;\n localIdCounter = 0;\n return didRenderIdHook;\n}\nfunction bailoutHooks(current, workInProgress, lanes) {\n workInProgress.updateQueue = current.updateQueue;\n workInProgress.flags &= -2053;\n current.lanes &= ~lanes;\n}\nfunction resetHooksOnUnwind(workInProgress) {\n if (didScheduleRenderPhaseUpdate) {\n for (\n workInProgress = workInProgress.memoizedState;\n null !== workInProgress;\n\n ) {\n var queue = workInProgress.queue;\n null !== queue && (queue.pending = null);\n workInProgress = workInProgress.next;\n }\n didScheduleRenderPhaseUpdate = !1;\n }\n renderLanes = 0;\n workInProgressHook = currentHook = currentlyRenderingFiber = null;\n didScheduleRenderPhaseUpdateDuringThisPass = !1;\n thenableIndexCounter = localIdCounter = 0;\n thenableState = null;\n}\nfunction mountWorkInProgressHook() {\n var hook = {\n memoizedState: null,\n baseState: null,\n baseQueue: null,\n queue: null,\n next: null\n };\n null === workInProgressHook\n ? (currentlyRenderingFiber.memoizedState = workInProgressHook = hook)\n : (workInProgressHook = workInProgressHook.next = hook);\n return workInProgressHook;\n}\nfunction updateWorkInProgressHook() {\n if (null === currentHook) {\n var nextCurrentHook = currentlyRenderingFiber.alternate;\n nextCurrentHook =\n null !== nextCurrentHook ? nextCurrentHook.memoizedState : null;\n } else nextCurrentHook = currentHook.next;\n var nextWorkInProgressHook =\n null === workInProgressHook\n ? currentlyRenderingFiber.memoizedState\n : workInProgressHook.next;\n if (null !== nextWorkInProgressHook)\n (workInProgressHook = nextWorkInProgressHook),\n (currentHook = nextCurrentHook);\n else {\n if (null === nextCurrentHook) {\n if (null === currentlyRenderingFiber.alternate)\n throw Error(formatProdErrorMessage(467));\n throw Error(formatProdErrorMessage(310));\n }\n currentHook = nextCurrentHook;\n nextCurrentHook = {\n memoizedState: currentHook.memoizedState,\n baseState: currentHook.baseState,\n baseQueue: currentHook.baseQueue,\n queue: currentHook.queue,\n next: null\n };\n null === workInProgressHook\n ? (currentlyRenderingFiber.memoizedState = workInProgressHook =\n nextCurrentHook)\n : (workInProgressHook = workInProgressHook.next = nextCurrentHook);\n }\n return workInProgressHook;\n}\nfunction createFunctionComponentUpdateQueue() {\n return { lastEffect: null, events: null, stores: null, memoCache: null };\n}\nfunction useThenable(thenable) {\n var index = thenableIndexCounter;\n thenableIndexCounter += 1;\n null === thenableState && (thenableState = []);\n thenable = trackUsedThenable(thenableState, thenable, index);\n index = currentlyRenderingFiber;\n null ===\n (null === workInProgressHook\n ? index.memoizedState\n : workInProgressHook.next) &&\n ((index = index.alternate),\n (ReactSharedInternals.H =\n null === index || null === index.memoizedState\n ? HooksDispatcherOnMount\n : HooksDispatcherOnUpdate));\n return thenable;\n}\nfunction use(usable) {\n if (null !== usable && \"object\" === typeof usable) {\n if (\"function\" === typeof usable.then) return useThenable(usable);\n if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable);\n }\n throw Error(formatProdErrorMessage(438, String(usable)));\n}\nfunction useMemoCache(size) {\n var memoCache = null,\n updateQueue = currentlyRenderingFiber.updateQueue;\n null !== updateQueue && (memoCache = updateQueue.memoCache);\n if (null == memoCache) {\n var current = currentlyRenderingFiber.alternate;\n null !== current &&\n ((current = current.updateQueue),\n null !== current &&\n ((current = current.memoCache),\n null != current &&\n (memoCache = {\n data: current.data.map(function (array) {\n return array.slice();\n }),\n index: 0\n })));\n }\n null == memoCache && (memoCache = { data: [], index: 0 });\n null === updateQueue &&\n ((updateQueue = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = updateQueue));\n updateQueue.memoCache = memoCache;\n updateQueue = memoCache.data[memoCache.index];\n if (void 0 === updateQueue)\n for (\n updateQueue = memoCache.data[memoCache.index] = Array(size), current = 0;\n current < size;\n current++\n )\n updateQueue[current] = REACT_MEMO_CACHE_SENTINEL;\n memoCache.index++;\n return updateQueue;\n}\nfunction basicStateReducer(state, action) {\n return \"function\" === typeof action ? action(state) : action;\n}\nfunction updateReducer(reducer) {\n var hook = updateWorkInProgressHook();\n return updateReducerImpl(hook, currentHook, reducer);\n}\nfunction updateReducerImpl(hook, current, reducer) {\n var queue = hook.queue;\n if (null === queue) throw Error(formatProdErrorMessage(311));\n queue.lastRenderedReducer = reducer;\n var baseQueue = hook.baseQueue,\n pendingQueue = queue.pending;\n if (null !== pendingQueue) {\n if (null !== baseQueue) {\n var baseFirst = baseQueue.next;\n baseQueue.next = pendingQueue.next;\n pendingQueue.next = baseFirst;\n }\n current.baseQueue = baseQueue = pendingQueue;\n queue.pending = null;\n }\n pendingQueue = hook.baseState;\n if (null === baseQueue) hook.memoizedState = pendingQueue;\n else {\n current = baseQueue.next;\n var newBaseQueueFirst = (baseFirst = null),\n newBaseQueueLast = null,\n update = current,\n didReadFromEntangledAsyncAction$60 = !1;\n do {\n var updateLane = update.lane & -536870913;\n if (\n updateLane !== update.lane\n ? (workInProgressRootRenderLanes & updateLane) === updateLane\n : (renderLanes & updateLane) === updateLane\n ) {\n var revertLane = update.revertLane;\n if (0 === revertLane)\n null !== newBaseQueueLast &&\n (newBaseQueueLast = newBaseQueueLast.next =\n {\n lane: 0,\n revertLane: 0,\n gesture: null,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n updateLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction$60 = !0);\n else if ((renderLanes & revertLane) === revertLane) {\n update = update.next;\n revertLane === currentEntangledLane &&\n (didReadFromEntangledAsyncAction$60 = !0);\n continue;\n } else\n (updateLane = {\n lane: 0,\n revertLane: update.revertLane,\n gesture: null,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n null === newBaseQueueLast\n ? ((newBaseQueueFirst = newBaseQueueLast = updateLane),\n (baseFirst = pendingQueue))\n : (newBaseQueueLast = newBaseQueueLast.next = updateLane),\n (currentlyRenderingFiber.lanes |= revertLane),\n (workInProgressRootSkippedLanes |= revertLane);\n updateLane = update.action;\n shouldDoubleInvokeUserFnsInHooksDEV &&\n reducer(pendingQueue, updateLane);\n pendingQueue = update.hasEagerState\n ? update.eagerState\n : reducer(pendingQueue, updateLane);\n } else\n (revertLane = {\n lane: updateLane,\n revertLane: update.revertLane,\n gesture: update.gesture,\n action: update.action,\n hasEagerState: update.hasEagerState,\n eagerState: update.eagerState,\n next: null\n }),\n null === newBaseQueueLast\n ? ((newBaseQueueFirst = newBaseQueueLast = revertLane),\n (baseFirst = pendingQueue))\n : (newBaseQueueLast = newBaseQueueLast.next = revertLane),\n (currentlyRenderingFiber.lanes |= updateLane),\n (workInProgressRootSkippedLanes |= updateLane);\n update = update.next;\n } while (null !== update && update !== current);\n null === newBaseQueueLast\n ? (baseFirst = pendingQueue)\n : (newBaseQueueLast.next = newBaseQueueFirst);\n if (\n !objectIs(pendingQueue, hook.memoizedState) &&\n ((didReceiveUpdate = !0),\n didReadFromEntangledAsyncAction$60 &&\n ((reducer = currentEntangledActionThenable), null !== reducer))\n )\n throw reducer;\n hook.memoizedState = pendingQueue;\n hook.baseState = baseFirst;\n hook.baseQueue = newBaseQueueLast;\n queue.lastRenderedState = pendingQueue;\n }\n null === baseQueue && (queue.lanes = 0);\n return [hook.memoizedState, queue.dispatch];\n}\nfunction rerenderReducer(reducer) {\n var hook = updateWorkInProgressHook(),\n queue = hook.queue;\n if (null === queue) throw Error(formatProdErrorMessage(311));\n queue.lastRenderedReducer = reducer;\n var dispatch = queue.dispatch,\n lastRenderPhaseUpdate = queue.pending,\n newState = hook.memoizedState;\n if (null !== lastRenderPhaseUpdate) {\n queue.pending = null;\n var update = (lastRenderPhaseUpdate = lastRenderPhaseUpdate.next);\n do (newState = reducer(newState, update.action)), (update = update.next);\n while (update !== lastRenderPhaseUpdate);\n objectIs(newState, hook.memoizedState) || (didReceiveUpdate = !0);\n hook.memoizedState = newState;\n null === hook.baseQueue && (hook.baseState = newState);\n queue.lastRenderedState = newState;\n }\n return [newState, dispatch];\n}\nfunction updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {\n var fiber = currentlyRenderingFiber,\n hook = updateWorkInProgressHook(),\n isHydrating$jscomp$0 = isHydrating;\n if (isHydrating$jscomp$0) {\n if (void 0 === getServerSnapshot) throw Error(formatProdErrorMessage(407));\n getServerSnapshot = getServerSnapshot();\n } else getServerSnapshot = getSnapshot();\n var snapshotChanged = !objectIs(\n (currentHook || hook).memoizedState,\n getServerSnapshot\n );\n snapshotChanged &&\n ((hook.memoizedState = getServerSnapshot), (didReceiveUpdate = !0));\n hook = hook.queue;\n updateEffect(subscribeToStore.bind(null, fiber, hook, subscribe), [\n subscribe\n ]);\n if (\n hook.getSnapshot !== getSnapshot ||\n snapshotChanged ||\n (null !== workInProgressHook && workInProgressHook.memoizedState.tag & 1)\n ) {\n fiber.flags |= 2048;\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n updateStoreInstance.bind(\n null,\n fiber,\n hook,\n getServerSnapshot,\n getSnapshot\n ),\n null\n );\n if (null === workInProgressRoot) throw Error(formatProdErrorMessage(349));\n isHydrating$jscomp$0 ||\n 0 !== (renderLanes & 127) ||\n pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n }\n return getServerSnapshot;\n}\nfunction pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {\n fiber.flags |= 16384;\n fiber = { getSnapshot: getSnapshot, value: renderedSnapshot };\n getSnapshot = currentlyRenderingFiber.updateQueue;\n null === getSnapshot\n ? ((getSnapshot = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = getSnapshot),\n (getSnapshot.stores = [fiber]))\n : ((renderedSnapshot = getSnapshot.stores),\n null === renderedSnapshot\n ? (getSnapshot.stores = [fiber])\n : renderedSnapshot.push(fiber));\n}\nfunction updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {\n inst.value = nextSnapshot;\n inst.getSnapshot = getSnapshot;\n checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n}\nfunction subscribeToStore(fiber, inst, subscribe) {\n return subscribe(function () {\n checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);\n });\n}\nfunction checkIfSnapshotChanged(inst) {\n var latestGetSnapshot = inst.getSnapshot;\n inst = inst.value;\n try {\n var nextValue = latestGetSnapshot();\n return !objectIs(inst, nextValue);\n } catch (error) {\n return !0;\n }\n}\nfunction forceStoreRerender(fiber) {\n var root = enqueueConcurrentRenderForLane(fiber, 2);\n null !== root && scheduleUpdateOnFiber(root, fiber, 2);\n}\nfunction mountStateImpl(initialState) {\n var hook = mountWorkInProgressHook();\n if (\"function\" === typeof initialState) {\n var initialStateInitializer = initialState;\n initialState = initialStateInitializer();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n initialStateInitializer();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n }\n hook.memoizedState = hook.baseState = initialState;\n hook.queue = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: initialState\n };\n return hook;\n}\nfunction updateOptimisticImpl(hook, current, passthrough, reducer) {\n hook.baseState = passthrough;\n return updateReducerImpl(\n hook,\n currentHook,\n \"function\" === typeof reducer ? reducer : basicStateReducer\n );\n}\nfunction dispatchActionState(\n fiber,\n actionQueue,\n setPendingState,\n setState,\n payload\n) {\n if (isRenderPhaseUpdate(fiber)) throw Error(formatProdErrorMessage(485));\n fiber = actionQueue.action;\n if (null !== fiber) {\n var actionNode = {\n payload: payload,\n action: fiber,\n next: null,\n isTransition: !0,\n status: \"pending\",\n value: null,\n reason: null,\n listeners: [],\n then: function (listener) {\n actionNode.listeners.push(listener);\n }\n };\n null !== ReactSharedInternals.T\n ? setPendingState(!0)\n : (actionNode.isTransition = !1);\n setState(actionNode);\n setPendingState = actionQueue.pending;\n null === setPendingState\n ? ((actionNode.next = actionQueue.pending = actionNode),\n runActionStateAction(actionQueue, actionNode))\n : ((actionNode.next = setPendingState.next),\n (actionQueue.pending = setPendingState.next = actionNode));\n }\n}\nfunction runActionStateAction(actionQueue, node) {\n var action = node.action,\n payload = node.payload,\n prevState = actionQueue.state;\n if (node.isTransition) {\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n try {\n var returnValue = action(prevState, payload),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n handleActionReturnValue(actionQueue, node, returnValue);\n } catch (error) {\n onActionError(actionQueue, node, error);\n } finally {\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n } else\n try {\n (prevTransition = action(prevState, payload)),\n handleActionReturnValue(actionQueue, node, prevTransition);\n } catch (error$66) {\n onActionError(actionQueue, node, error$66);\n }\n}\nfunction handleActionReturnValue(actionQueue, node, returnValue) {\n null !== returnValue &&\n \"object\" === typeof returnValue &&\n \"function\" === typeof returnValue.then\n ? returnValue.then(\n function (nextState) {\n onActionSuccess(actionQueue, node, nextState);\n },\n function (error) {\n return onActionError(actionQueue, node, error);\n }\n )\n : onActionSuccess(actionQueue, node, returnValue);\n}\nfunction onActionSuccess(actionQueue, actionNode, nextState) {\n actionNode.status = \"fulfilled\";\n actionNode.value = nextState;\n notifyActionListeners(actionNode);\n actionQueue.state = nextState;\n actionNode = actionQueue.pending;\n null !== actionNode &&\n ((nextState = actionNode.next),\n nextState === actionNode\n ? (actionQueue.pending = null)\n : ((nextState = nextState.next),\n (actionNode.next = nextState),\n runActionStateAction(actionQueue, nextState)));\n}\nfunction onActionError(actionQueue, actionNode, error) {\n var last = actionQueue.pending;\n actionQueue.pending = null;\n if (null !== last) {\n last = last.next;\n do\n (actionNode.status = \"rejected\"),\n (actionNode.reason = error),\n notifyActionListeners(actionNode),\n (actionNode = actionNode.next);\n while (actionNode !== last);\n }\n actionQueue.action = null;\n}\nfunction notifyActionListeners(actionNode) {\n actionNode = actionNode.listeners;\n for (var i = 0; i < actionNode.length; i++) (0, actionNode[i])();\n}\nfunction actionStateReducer(oldState, newState) {\n return newState;\n}\nfunction mountActionState(action, initialStateProp) {\n if (isHydrating) {\n var ssrFormState = workInProgressRoot.formState;\n if (null !== ssrFormState) {\n a: {\n var JSCompiler_inline_result = currentlyRenderingFiber;\n if (isHydrating) {\n if (nextHydratableInstance) {\n b: {\n var JSCompiler_inline_result$jscomp$0 = nextHydratableInstance;\n for (\n var inRootOrSingleton = rootOrSingletonContext;\n 8 !== JSCompiler_inline_result$jscomp$0.nodeType;\n\n ) {\n if (!inRootOrSingleton) {\n JSCompiler_inline_result$jscomp$0 = null;\n break b;\n }\n JSCompiler_inline_result$jscomp$0 = getNextHydratable(\n JSCompiler_inline_result$jscomp$0.nextSibling\n );\n if (null === JSCompiler_inline_result$jscomp$0) {\n JSCompiler_inline_result$jscomp$0 = null;\n break b;\n }\n }\n inRootOrSingleton = JSCompiler_inline_result$jscomp$0.data;\n JSCompiler_inline_result$jscomp$0 =\n \"F!\" === inRootOrSingleton || \"F\" === inRootOrSingleton\n ? JSCompiler_inline_result$jscomp$0\n : null;\n }\n if (JSCompiler_inline_result$jscomp$0) {\n nextHydratableInstance = getNextHydratable(\n JSCompiler_inline_result$jscomp$0.nextSibling\n );\n JSCompiler_inline_result =\n \"F!\" === JSCompiler_inline_result$jscomp$0.data;\n break a;\n }\n }\n throwOnHydrationMismatch(JSCompiler_inline_result);\n }\n JSCompiler_inline_result = !1;\n }\n JSCompiler_inline_result && (initialStateProp = ssrFormState[0]);\n }\n }\n ssrFormState = mountWorkInProgressHook();\n ssrFormState.memoizedState = ssrFormState.baseState = initialStateProp;\n JSCompiler_inline_result = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: actionStateReducer,\n lastRenderedState: initialStateProp\n };\n ssrFormState.queue = JSCompiler_inline_result;\n ssrFormState = dispatchSetState.bind(\n null,\n currentlyRenderingFiber,\n JSCompiler_inline_result\n );\n JSCompiler_inline_result.dispatch = ssrFormState;\n JSCompiler_inline_result = mountStateImpl(!1);\n inRootOrSingleton = dispatchOptimisticSetState.bind(\n null,\n currentlyRenderingFiber,\n !1,\n JSCompiler_inline_result.queue\n );\n JSCompiler_inline_result = mountWorkInProgressHook();\n JSCompiler_inline_result$jscomp$0 = {\n state: initialStateProp,\n dispatch: null,\n action: action,\n pending: null\n };\n JSCompiler_inline_result.queue = JSCompiler_inline_result$jscomp$0;\n ssrFormState = dispatchActionState.bind(\n null,\n currentlyRenderingFiber,\n JSCompiler_inline_result$jscomp$0,\n inRootOrSingleton,\n ssrFormState\n );\n JSCompiler_inline_result$jscomp$0.dispatch = ssrFormState;\n JSCompiler_inline_result.memoizedState = action;\n return [initialStateProp, ssrFormState, !1];\n}\nfunction updateActionState(action) {\n var stateHook = updateWorkInProgressHook();\n return updateActionStateImpl(stateHook, currentHook, action);\n}\nfunction updateActionStateImpl(stateHook, currentStateHook, action) {\n currentStateHook = updateReducerImpl(\n stateHook,\n currentStateHook,\n actionStateReducer\n )[0];\n stateHook = updateReducer(basicStateReducer)[0];\n if (\n \"object\" === typeof currentStateHook &&\n null !== currentStateHook &&\n \"function\" === typeof currentStateHook.then\n )\n try {\n var state = useThenable(currentStateHook);\n } catch (x) {\n if (x === SuspenseException) throw SuspenseActionException;\n throw x;\n }\n else state = currentStateHook;\n currentStateHook = updateWorkInProgressHook();\n var actionQueue = currentStateHook.queue,\n dispatch = actionQueue.dispatch;\n action !== currentStateHook.memoizedState &&\n ((currentlyRenderingFiber.flags |= 2048),\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n actionStateActionEffect.bind(null, actionQueue, action),\n null\n ));\n return [state, dispatch, stateHook];\n}\nfunction actionStateActionEffect(actionQueue, action) {\n actionQueue.action = action;\n}\nfunction rerenderActionState(action) {\n var stateHook = updateWorkInProgressHook(),\n currentStateHook = currentHook;\n if (null !== currentStateHook)\n return updateActionStateImpl(stateHook, currentStateHook, action);\n updateWorkInProgressHook();\n stateHook = stateHook.memoizedState;\n currentStateHook = updateWorkInProgressHook();\n var dispatch = currentStateHook.queue.dispatch;\n currentStateHook.memoizedState = action;\n return [stateHook, dispatch, !1];\n}\nfunction pushSimpleEffect(tag, inst, create, deps) {\n tag = { tag: tag, create: create, deps: deps, inst: inst, next: null };\n inst = currentlyRenderingFiber.updateQueue;\n null === inst &&\n ((inst = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = inst));\n create = inst.lastEffect;\n null === create\n ? (inst.lastEffect = tag.next = tag)\n : ((deps = create.next),\n (create.next = tag),\n (tag.next = deps),\n (inst.lastEffect = tag));\n return tag;\n}\nfunction updateRef() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction mountEffectImpl(fiberFlags, hookFlags, create, deps) {\n var hook = mountWorkInProgressHook();\n currentlyRenderingFiber.flags |= fiberFlags;\n hook.memoizedState = pushSimpleEffect(\n 1 | hookFlags,\n { destroy: void 0 },\n create,\n void 0 === deps ? null : deps\n );\n}\nfunction updateEffectImpl(fiberFlags, hookFlags, create, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var inst = hook.memoizedState.inst;\n null !== currentHook &&\n null !== deps &&\n areHookInputsEqual(deps, currentHook.memoizedState.deps)\n ? (hook.memoizedState = pushSimpleEffect(hookFlags, inst, create, deps))\n : ((currentlyRenderingFiber.flags |= fiberFlags),\n (hook.memoizedState = pushSimpleEffect(\n 1 | hookFlags,\n inst,\n create,\n deps\n )));\n}\nfunction mountEffect(create, deps) {\n mountEffectImpl(8390656, 8, create, deps);\n}\nfunction updateEffect(create, deps) {\n updateEffectImpl(2048, 8, create, deps);\n}\nfunction useEffectEventImpl(payload) {\n currentlyRenderingFiber.flags |= 4;\n var componentUpdateQueue = currentlyRenderingFiber.updateQueue;\n if (null === componentUpdateQueue)\n (componentUpdateQueue = createFunctionComponentUpdateQueue()),\n (currentlyRenderingFiber.updateQueue = componentUpdateQueue),\n (componentUpdateQueue.events = [payload]);\n else {\n var events = componentUpdateQueue.events;\n null === events\n ? (componentUpdateQueue.events = [payload])\n : events.push(payload);\n }\n}\nfunction updateEvent(callback) {\n var ref = updateWorkInProgressHook().memoizedState;\n useEffectEventImpl({ ref: ref, nextImpl: callback });\n return function () {\n if (0 !== (executionContext & 2)) throw Error(formatProdErrorMessage(440));\n return ref.impl.apply(void 0, arguments);\n };\n}\nfunction updateInsertionEffect(create, deps) {\n return updateEffectImpl(4, 2, create, deps);\n}\nfunction updateLayoutEffect(create, deps) {\n return updateEffectImpl(4, 4, create, deps);\n}\nfunction imperativeHandleEffect(create, ref) {\n if (\"function\" === typeof ref) {\n create = create();\n var refCleanup = ref(create);\n return function () {\n \"function\" === typeof refCleanup ? refCleanup() : ref(null);\n };\n }\n if (null !== ref && void 0 !== ref)\n return (\n (create = create()),\n (ref.current = create),\n function () {\n ref.current = null;\n }\n );\n}\nfunction updateImperativeHandle(ref, create, deps) {\n deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n updateEffectImpl(4, 4, imperativeHandleEffect.bind(null, create, ref), deps);\n}\nfunction mountDebugValue() {}\nfunction updateCallback(callback, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var prevState = hook.memoizedState;\n if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n return prevState[0];\n hook.memoizedState = [callback, deps];\n return callback;\n}\nfunction updateMemo(nextCreate, deps) {\n var hook = updateWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var prevState = hook.memoizedState;\n if (null !== deps && areHookInputsEqual(deps, prevState[1]))\n return prevState[0];\n prevState = nextCreate();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n nextCreate();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n hook.memoizedState = [prevState, deps];\n return prevState;\n}\nfunction mountDeferredValueImpl(hook, value, initialValue) {\n if (\n void 0 === initialValue ||\n (0 !== (renderLanes & 1073741824) &&\n 0 === (workInProgressRootRenderLanes & 261930))\n )\n return (hook.memoizedState = value);\n hook.memoizedState = initialValue;\n hook = requestDeferredLane();\n currentlyRenderingFiber.lanes |= hook;\n workInProgressRootSkippedLanes |= hook;\n return initialValue;\n}\nfunction updateDeferredValueImpl(hook, prevValue, value, initialValue) {\n if (objectIs(value, prevValue)) return value;\n if (null !== currentTreeHiddenStackCursor.current)\n return (\n (hook = mountDeferredValueImpl(hook, value, initialValue)),\n objectIs(hook, prevValue) || (didReceiveUpdate = !0),\n hook\n );\n if (\n 0 === (renderLanes & 42) ||\n (0 !== (renderLanes & 1073741824) &&\n 0 === (workInProgressRootRenderLanes & 261930))\n )\n return (didReceiveUpdate = !0), (hook.memoizedState = value);\n hook = requestDeferredLane();\n currentlyRenderingFiber.lanes |= hook;\n workInProgressRootSkippedLanes |= hook;\n return prevValue;\n}\nfunction startTransition(fiber, queue, pendingState, finishedState, callback) {\n var previousPriority = ReactDOMSharedInternals.p;\n ReactDOMSharedInternals.p =\n 0 !== previousPriority && 8 > previousPriority ? previousPriority : 8;\n var prevTransition = ReactSharedInternals.T,\n currentTransition = {};\n ReactSharedInternals.T = currentTransition;\n dispatchOptimisticSetState(fiber, !1, queue, pendingState);\n try {\n var returnValue = callback(),\n onStartTransitionFinish = ReactSharedInternals.S;\n null !== onStartTransitionFinish &&\n onStartTransitionFinish(currentTransition, returnValue);\n if (\n null !== returnValue &&\n \"object\" === typeof returnValue &&\n \"function\" === typeof returnValue.then\n ) {\n var thenableForFinishedState = chainThenableValue(\n returnValue,\n finishedState\n );\n dispatchSetStateInternal(\n fiber,\n queue,\n thenableForFinishedState,\n requestUpdateLane(fiber)\n );\n } else\n dispatchSetStateInternal(\n fiber,\n queue,\n finishedState,\n requestUpdateLane(fiber)\n );\n } catch (error) {\n dispatchSetStateInternal(\n fiber,\n queue,\n { then: function () {}, status: \"rejected\", reason: error },\n requestUpdateLane()\n );\n } finally {\n (ReactDOMSharedInternals.p = previousPriority),\n null !== prevTransition &&\n null !== currentTransition.types &&\n (prevTransition.types = currentTransition.types),\n (ReactSharedInternals.T = prevTransition);\n }\n}\nfunction noop() {}\nfunction startHostTransition(formFiber, pendingState, action, formData) {\n if (5 !== formFiber.tag) throw Error(formatProdErrorMessage(476));\n var queue = ensureFormComponentIsStateful(formFiber).queue;\n startTransition(\n formFiber,\n queue,\n pendingState,\n sharedNotPendingObject,\n null === action\n ? noop\n : function () {\n requestFormReset$1(formFiber);\n return action(formData);\n }\n );\n}\nfunction ensureFormComponentIsStateful(formFiber) {\n var existingStateHook = formFiber.memoizedState;\n if (null !== existingStateHook) return existingStateHook;\n existingStateHook = {\n memoizedState: sharedNotPendingObject,\n baseState: sharedNotPendingObject,\n baseQueue: null,\n queue: {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: sharedNotPendingObject\n },\n next: null\n };\n var initialResetState = {};\n existingStateHook.next = {\n memoizedState: initialResetState,\n baseState: initialResetState,\n baseQueue: null,\n queue: {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: basicStateReducer,\n lastRenderedState: initialResetState\n },\n next: null\n };\n formFiber.memoizedState = existingStateHook;\n formFiber = formFiber.alternate;\n null !== formFiber && (formFiber.memoizedState = existingStateHook);\n return existingStateHook;\n}\nfunction requestFormReset$1(formFiber) {\n var stateHook = ensureFormComponentIsStateful(formFiber);\n null === stateHook.next && (stateHook = formFiber.alternate.memoizedState);\n dispatchSetStateInternal(\n formFiber,\n stateHook.next.queue,\n {},\n requestUpdateLane()\n );\n}\nfunction useHostTransitionStatus() {\n return readContext(HostTransitionContext);\n}\nfunction updateId() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction updateRefresh() {\n return updateWorkInProgressHook().memoizedState;\n}\nfunction refreshCache(fiber) {\n for (var provider = fiber.return; null !== provider; ) {\n switch (provider.tag) {\n case 24:\n case 3:\n var lane = requestUpdateLane();\n fiber = createUpdate(lane);\n var root$69 = enqueueUpdate(provider, fiber, lane);\n null !== root$69 &&\n (scheduleUpdateOnFiber(root$69, provider, lane),\n entangleTransitions(root$69, provider, lane));\n provider = { cache: createCache() };\n fiber.payload = provider;\n return;\n }\n provider = provider.return;\n }\n}\nfunction dispatchReducerAction(fiber, queue, action) {\n var lane = requestUpdateLane();\n action = {\n lane: lane,\n revertLane: 0,\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n isRenderPhaseUpdate(fiber)\n ? enqueueRenderPhaseUpdate(queue, action)\n : ((action = enqueueConcurrentHookUpdate(fiber, queue, action, lane)),\n null !== action &&\n (scheduleUpdateOnFiber(action, fiber, lane),\n entangleTransitionUpdate(action, queue, lane)));\n}\nfunction dispatchSetState(fiber, queue, action) {\n var lane = requestUpdateLane();\n dispatchSetStateInternal(fiber, queue, action, lane);\n}\nfunction dispatchSetStateInternal(fiber, queue, action, lane) {\n var update = {\n lane: lane,\n revertLane: 0,\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n if (isRenderPhaseUpdate(fiber)) enqueueRenderPhaseUpdate(queue, update);\n else {\n var alternate = fiber.alternate;\n if (\n 0 === fiber.lanes &&\n (null === alternate || 0 === alternate.lanes) &&\n ((alternate = queue.lastRenderedReducer), null !== alternate)\n )\n try {\n var currentState = queue.lastRenderedState,\n eagerState = alternate(currentState, action);\n update.hasEagerState = !0;\n update.eagerState = eagerState;\n if (objectIs(eagerState, currentState))\n return (\n enqueueUpdate$1(fiber, queue, update, 0),\n null === workInProgressRoot && finishQueueingConcurrentUpdates(),\n !1\n );\n } catch (error) {\n } finally {\n }\n action = enqueueConcurrentHookUpdate(fiber, queue, update, lane);\n if (null !== action)\n return (\n scheduleUpdateOnFiber(action, fiber, lane),\n entangleTransitionUpdate(action, queue, lane),\n !0\n );\n }\n return !1;\n}\nfunction dispatchOptimisticSetState(fiber, throwIfDuringRender, queue, action) {\n action = {\n lane: 2,\n revertLane: requestTransitionLane(),\n gesture: null,\n action: action,\n hasEagerState: !1,\n eagerState: null,\n next: null\n };\n if (isRenderPhaseUpdate(fiber)) {\n if (throwIfDuringRender) throw Error(formatProdErrorMessage(479));\n } else\n (throwIfDuringRender = enqueueConcurrentHookUpdate(\n fiber,\n queue,\n action,\n 2\n )),\n null !== throwIfDuringRender &&\n scheduleUpdateOnFiber(throwIfDuringRender, fiber, 2);\n}\nfunction isRenderPhaseUpdate(fiber) {\n var alternate = fiber.alternate;\n return (\n fiber === currentlyRenderingFiber ||\n (null !== alternate && alternate === currentlyRenderingFiber)\n );\n}\nfunction enqueueRenderPhaseUpdate(queue, update) {\n didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate =\n !0;\n var pending = queue.pending;\n null === pending\n ? (update.next = update)\n : ((update.next = pending.next), (pending.next = update));\n queue.pending = update;\n}\nfunction entangleTransitionUpdate(root, queue, lane) {\n if (0 !== (lane & 4194048)) {\n var queueLanes = queue.lanes;\n queueLanes &= root.pendingLanes;\n lane |= queueLanes;\n queue.lanes = lane;\n markRootEntangled(root, lane);\n }\n}\nvar ContextOnlyDispatcher = {\n readContext: readContext,\n use: use,\n useCallback: throwInvalidHookError,\n useContext: throwInvalidHookError,\n useEffect: throwInvalidHookError,\n useImperativeHandle: throwInvalidHookError,\n useLayoutEffect: throwInvalidHookError,\n useInsertionEffect: throwInvalidHookError,\n useMemo: throwInvalidHookError,\n useReducer: throwInvalidHookError,\n useRef: throwInvalidHookError,\n useState: throwInvalidHookError,\n useDebugValue: throwInvalidHookError,\n useDeferredValue: throwInvalidHookError,\n useTransition: throwInvalidHookError,\n useSyncExternalStore: throwInvalidHookError,\n useId: throwInvalidHookError,\n useHostTransitionStatus: throwInvalidHookError,\n useFormState: throwInvalidHookError,\n useActionState: throwInvalidHookError,\n useOptimistic: throwInvalidHookError,\n useMemoCache: throwInvalidHookError,\n useCacheRefresh: throwInvalidHookError\n};\nContextOnlyDispatcher.useEffectEvent = throwInvalidHookError;\nvar HooksDispatcherOnMount = {\n readContext: readContext,\n use: use,\n useCallback: function (callback, deps) {\n mountWorkInProgressHook().memoizedState = [\n callback,\n void 0 === deps ? null : deps\n ];\n return callback;\n },\n useContext: readContext,\n useEffect: mountEffect,\n useImperativeHandle: function (ref, create, deps) {\n deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;\n mountEffectImpl(\n 4194308,\n 4,\n imperativeHandleEffect.bind(null, create, ref),\n deps\n );\n },\n useLayoutEffect: function (create, deps) {\n return mountEffectImpl(4194308, 4, create, deps);\n },\n useInsertionEffect: function (create, deps) {\n mountEffectImpl(4, 2, create, deps);\n },\n useMemo: function (nextCreate, deps) {\n var hook = mountWorkInProgressHook();\n deps = void 0 === deps ? null : deps;\n var nextValue = nextCreate();\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n nextCreate();\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n hook.memoizedState = [nextValue, deps];\n return nextValue;\n },\n useReducer: function (reducer, initialArg, init) {\n var hook = mountWorkInProgressHook();\n if (void 0 !== init) {\n var initialState = init(initialArg);\n if (shouldDoubleInvokeUserFnsInHooksDEV) {\n setIsStrictModeForDevtools(!0);\n try {\n init(initialArg);\n } finally {\n setIsStrictModeForDevtools(!1);\n }\n }\n } else initialState = initialArg;\n hook.memoizedState = hook.baseState = initialState;\n reducer = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: reducer,\n lastRenderedState: initialState\n };\n hook.queue = reducer;\n reducer = reducer.dispatch = dispatchReducerAction.bind(\n null,\n currentlyRenderingFiber,\n reducer\n );\n return [hook.memoizedState, reducer];\n },\n useRef: function (initialValue) {\n var hook = mountWorkInProgressHook();\n initialValue = { current: initialValue };\n return (hook.memoizedState = initialValue);\n },\n useState: function (initialState) {\n initialState = mountStateImpl(initialState);\n var queue = initialState.queue,\n dispatch = dispatchSetState.bind(null, currentlyRenderingFiber, queue);\n queue.dispatch = dispatch;\n return [initialState.memoizedState, dispatch];\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = mountWorkInProgressHook();\n return mountDeferredValueImpl(hook, value, initialValue);\n },\n useTransition: function () {\n var stateHook = mountStateImpl(!1);\n stateHook = startTransition.bind(\n null,\n currentlyRenderingFiber,\n stateHook.queue,\n !0,\n !1\n );\n mountWorkInProgressHook().memoizedState = stateHook;\n return [!1, stateHook];\n },\n useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {\n var fiber = currentlyRenderingFiber,\n hook = mountWorkInProgressHook();\n if (isHydrating) {\n if (void 0 === getServerSnapshot)\n throw Error(formatProdErrorMessage(407));\n getServerSnapshot = getServerSnapshot();\n } else {\n getServerSnapshot = getSnapshot();\n if (null === workInProgressRoot)\n throw Error(formatProdErrorMessage(349));\n 0 !== (workInProgressRootRenderLanes & 127) ||\n pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);\n }\n hook.memoizedState = getServerSnapshot;\n var inst = { value: getServerSnapshot, getSnapshot: getSnapshot };\n hook.queue = inst;\n mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [\n subscribe\n ]);\n fiber.flags |= 2048;\n pushSimpleEffect(\n 9,\n { destroy: void 0 },\n updateStoreInstance.bind(\n null,\n fiber,\n inst,\n getServerSnapshot,\n getSnapshot\n ),\n null\n );\n return getServerSnapshot;\n },\n useId: function () {\n var hook = mountWorkInProgressHook(),\n identifierPrefix = workInProgressRoot.identifierPrefix;\n if (isHydrating) {\n var JSCompiler_inline_result = treeContextOverflow;\n var idWithLeadingBit = treeContextId;\n JSCompiler_inline_result =\n (\n idWithLeadingBit & ~(1 << (32 - clz32(idWithLeadingBit) - 1))\n ).toString(32) + JSCompiler_inline_result;\n identifierPrefix =\n \"_\" + identifierPrefix + \"R_\" + JSCompiler_inline_result;\n JSCompiler_inline_result = localIdCounter++;\n 0 < JSCompiler_inline_result &&\n (identifierPrefix += \"H\" + JSCompiler_inline_result.toString(32));\n identifierPrefix += \"_\";\n } else\n (JSCompiler_inline_result = globalClientIdCounter++),\n (identifierPrefix =\n \"_\" +\n identifierPrefix +\n \"r_\" +\n JSCompiler_inline_result.toString(32) +\n \"_\");\n return (hook.memoizedState = identifierPrefix);\n },\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: mountActionState,\n useActionState: mountActionState,\n useOptimistic: function (passthrough) {\n var hook = mountWorkInProgressHook();\n hook.memoizedState = hook.baseState = passthrough;\n var queue = {\n pending: null,\n lanes: 0,\n dispatch: null,\n lastRenderedReducer: null,\n lastRenderedState: null\n };\n hook.queue = queue;\n hook = dispatchOptimisticSetState.bind(\n null,\n currentlyRenderingFiber,\n !0,\n queue\n );\n queue.dispatch = hook;\n return [passthrough, hook];\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: function () {\n return (mountWorkInProgressHook().memoizedState = refreshCache.bind(\n null,\n currentlyRenderingFiber\n ));\n },\n useEffectEvent: function (callback) {\n var hook = mountWorkInProgressHook(),\n ref = { impl: callback };\n hook.memoizedState = ref;\n return function () {\n if (0 !== (executionContext & 2))\n throw Error(formatProdErrorMessage(440));\n return ref.impl.apply(void 0, arguments);\n };\n }\n },\n HooksDispatcherOnUpdate = {\n readContext: readContext,\n use: use,\n useCallback: updateCallback,\n useContext: readContext,\n useEffect: updateEffect,\n useImperativeHandle: updateImperativeHandle,\n useInsertionEffect: updateInsertionEffect,\n useLayoutEffect: updateLayoutEffect,\n useMemo: updateMemo,\n useReducer: updateReducer,\n useRef: updateRef,\n useState: function () {\n return updateReducer(basicStateReducer);\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = updateWorkInProgressHook();\n return updateDeferredValueImpl(\n hook,\n currentHook.memoizedState,\n value,\n initialValue\n );\n },\n useTransition: function () {\n var booleanOrThenable = updateReducer(basicStateReducer)[0],\n start = updateWorkInProgressHook().memoizedState;\n return [\n \"boolean\" === typeof booleanOrThenable\n ? booleanOrThenable\n : useThenable(booleanOrThenable),\n start\n ];\n },\n useSyncExternalStore: updateSyncExternalStore,\n useId: updateId,\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: updateActionState,\n useActionState: updateActionState,\n useOptimistic: function (passthrough, reducer) {\n var hook = updateWorkInProgressHook();\n return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: updateRefresh\n };\nHooksDispatcherOnUpdate.useEffectEvent = updateEvent;\nvar HooksDispatcherOnRerender = {\n readContext: readContext,\n use: use,\n useCallback: updateCallback,\n useContext: readContext,\n useEffect: updateEffect,\n useImperativeHandle: updateImperativeHandle,\n useInsertionEffect: updateInsertionEffect,\n useLayoutEffect: updateLayoutEffect,\n useMemo: updateMemo,\n useReducer: rerenderReducer,\n useRef: updateRef,\n useState: function () {\n return rerenderReducer(basicStateReducer);\n },\n useDebugValue: mountDebugValue,\n useDeferredValue: function (value, initialValue) {\n var hook = updateWorkInProgressHook();\n return null === currentHook\n ? mountDeferredValueImpl(hook, value, initialValue)\n : updateDeferredValueImpl(\n hook,\n currentHook.memoizedState,\n value,\n initialValue\n );\n },\n useTransition: function () {\n var booleanOrThenable = rerenderReducer(basicStateReducer)[0],\n start = updateWorkInProgressHook().memoizedState;\n return [\n \"boolean\" === typeof booleanOrThenable\n ? booleanOrThenable\n : useThenable(booleanOrThenable),\n start\n ];\n },\n useSyncExternalStore: updateSyncExternalStore,\n useId: updateId,\n useHostTransitionStatus: useHostTransitionStatus,\n useFormState: rerenderActionState,\n useActionState: rerenderActionState,\n useOptimistic: function (passthrough, reducer) {\n var hook = updateWorkInProgressHook();\n if (null !== currentHook)\n return updateOptimisticImpl(hook, currentHook, passthrough, reducer);\n hook.baseState = passthrough;\n return [passthrough, hook.queue.dispatch];\n },\n useMemoCache: useMemoCache,\n useCacheRefresh: updateRefresh\n};\nHooksDispatcherOnRerender.useEffectEvent = updateEvent;\nfunction applyDerivedStateFromProps(\n workInProgress,\n ctor,\n getDerivedStateFromProps,\n nextProps\n) {\n ctor = workInProgress.memoizedState;\n getDerivedStateFromProps = getDerivedStateFromProps(nextProps, ctor);\n getDerivedStateFromProps =\n null === getDerivedStateFromProps || void 0 === getDerivedStateFromProps\n ? ctor\n : assign({}, ctor, getDerivedStateFromProps);\n workInProgress.memoizedState = getDerivedStateFromProps;\n 0 === workInProgress.lanes &&\n (workInProgress.updateQueue.baseState = getDerivedStateFromProps);\n}\nvar classComponentUpdater = {\n enqueueSetState: function (inst, payload, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.payload = payload;\n void 0 !== callback && null !== callback && (update.callback = callback);\n payload = enqueueUpdate(inst, update, lane);\n null !== payload &&\n (scheduleUpdateOnFiber(payload, inst, lane),\n entangleTransitions(payload, inst, lane));\n },\n enqueueReplaceState: function (inst, payload, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.tag = 1;\n update.payload = payload;\n void 0 !== callback && null !== callback && (update.callback = callback);\n payload = enqueueUpdate(inst, update, lane);\n null !== payload &&\n (scheduleUpdateOnFiber(payload, inst, lane),\n entangleTransitions(payload, inst, lane));\n },\n enqueueForceUpdate: function (inst, callback) {\n inst = inst._reactInternals;\n var lane = requestUpdateLane(),\n update = createUpdate(lane);\n update.tag = 2;\n void 0 !== callback && null !== callback && (update.callback = callback);\n callback = enqueueUpdate(inst, update, lane);\n null !== callback &&\n (scheduleUpdateOnFiber(callback, inst, lane),\n entangleTransitions(callback, inst, lane));\n }\n};\nfunction checkShouldComponentUpdate(\n workInProgress,\n ctor,\n oldProps,\n newProps,\n oldState,\n newState,\n nextContext\n) {\n workInProgress = workInProgress.stateNode;\n return \"function\" === typeof workInProgress.shouldComponentUpdate\n ? workInProgress.shouldComponentUpdate(newProps, newState, nextContext)\n : ctor.prototype && ctor.prototype.isPureReactComponent\n ? !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState)\n : !0;\n}\nfunction callComponentWillReceiveProps(\n workInProgress,\n instance,\n newProps,\n nextContext\n) {\n workInProgress = instance.state;\n \"function\" === typeof instance.componentWillReceiveProps &&\n instance.componentWillReceiveProps(newProps, nextContext);\n \"function\" === typeof instance.UNSAFE_componentWillReceiveProps &&\n instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);\n instance.state !== workInProgress &&\n classComponentUpdater.enqueueReplaceState(instance, instance.state, null);\n}\nfunction resolveClassComponentProps(Component, baseProps) {\n var newProps = baseProps;\n if (\"ref\" in baseProps) {\n newProps = {};\n for (var propName in baseProps)\n \"ref\" !== propName && (newProps[propName] = baseProps[propName]);\n }\n if ((Component = Component.defaultProps)) {\n newProps === baseProps && (newProps = assign({}, newProps));\n for (var propName$73 in Component)\n void 0 === newProps[propName$73] &&\n (newProps[propName$73] = Component[propName$73]);\n }\n return newProps;\n}\nfunction defaultOnUncaughtError(error) {\n reportGlobalError(error);\n}\nfunction defaultOnCaughtError(error) {\n console.error(error);\n}\nfunction defaultOnRecoverableError(error) {\n reportGlobalError(error);\n}\nfunction logUncaughtError(root, errorInfo) {\n try {\n var onUncaughtError = root.onUncaughtError;\n onUncaughtError(errorInfo.value, { componentStack: errorInfo.stack });\n } catch (e$74) {\n setTimeout(function () {\n throw e$74;\n });\n }\n}\nfunction logCaughtError(root, boundary, errorInfo) {\n try {\n var onCaughtError = root.onCaughtError;\n onCaughtError(errorInfo.value, {\n componentStack: errorInfo.stack,\n errorBoundary: 1 === boundary.tag ? boundary.stateNode : null\n });\n } catch (e$75) {\n setTimeout(function () {\n throw e$75;\n });\n }\n}\nfunction createRootErrorUpdate(root, errorInfo, lane) {\n lane = createUpdate(lane);\n lane.tag = 3;\n lane.payload = { element: null };\n lane.callback = function () {\n logUncaughtError(root, errorInfo);\n };\n return lane;\n}\nfunction createClassErrorUpdate(lane) {\n lane = createUpdate(lane);\n lane.tag = 3;\n return lane;\n}\nfunction initializeClassErrorUpdate(update, root, fiber, errorInfo) {\n var getDerivedStateFromError = fiber.type.getDerivedStateFromError;\n if (\"function\" === typeof getDerivedStateFromError) {\n var error = errorInfo.value;\n update.payload = function () {\n return getDerivedStateFromError(error);\n };\n update.callback = function () {\n logCaughtError(root, fiber, errorInfo);\n };\n }\n var inst = fiber.stateNode;\n null !== inst &&\n \"function\" === typeof inst.componentDidCatch &&\n (update.callback = function () {\n logCaughtError(root, fiber, errorInfo);\n \"function\" !== typeof getDerivedStateFromError &&\n (null === legacyErrorBoundariesThatAlreadyFailed\n ? (legacyErrorBoundariesThatAlreadyFailed = new Set([this]))\n : legacyErrorBoundariesThatAlreadyFailed.add(this));\n var stack = errorInfo.stack;\n this.componentDidCatch(errorInfo.value, {\n componentStack: null !== stack ? stack : \"\"\n });\n });\n}\nfunction throwException(\n root,\n returnFiber,\n sourceFiber,\n value,\n rootRenderLanes\n) {\n sourceFiber.flags |= 32768;\n if (\n null !== value &&\n \"object\" === typeof value &&\n \"function\" === typeof value.then\n ) {\n returnFiber = sourceFiber.alternate;\n null !== returnFiber &&\n propagateParentContextChanges(\n returnFiber,\n sourceFiber,\n rootRenderLanes,\n !0\n );\n sourceFiber = suspenseHandlerStackCursor.current;\n if (null !== sourceFiber) {\n switch (sourceFiber.tag) {\n case 31:\n case 13:\n return (\n null === shellBoundary\n ? renderDidSuspendDelayIfPossible()\n : null === sourceFiber.alternate &&\n 0 === workInProgressRootExitStatus &&\n (workInProgressRootExitStatus = 3),\n (sourceFiber.flags &= -257),\n (sourceFiber.flags |= 65536),\n (sourceFiber.lanes = rootRenderLanes),\n value === noopSuspenseyCommitThenable\n ? (sourceFiber.flags |= 16384)\n : ((returnFiber = sourceFiber.updateQueue),\n null === returnFiber\n ? (sourceFiber.updateQueue = new Set([value]))\n : returnFiber.add(value),\n attachPingListener(root, value, rootRenderLanes)),\n !1\n );\n case 22:\n return (\n (sourceFiber.flags |= 65536),\n value === noopSuspenseyCommitThenable\n ? (sourceFiber.flags |= 16384)\n : ((returnFiber = sourceFiber.updateQueue),\n null === returnFiber\n ? ((returnFiber = {\n transitions: null,\n markerInstances: null,\n retryQueue: new Set([value])\n }),\n (sourceFiber.updateQueue = returnFiber))\n : ((sourceFiber = returnFiber.retryQueue),\n null === sourceFiber\n ? (returnFiber.retryQueue = new Set([value]))\n : sourceFiber.add(value)),\n attachPingListener(root, value, rootRenderLanes)),\n !1\n );\n }\n throw Error(formatProdErrorMessage(435, sourceFiber.tag));\n }\n attachPingListener(root, value, rootRenderLanes);\n renderDidSuspendDelayIfPossible();\n return !1;\n }\n if (isHydrating)\n return (\n (returnFiber = suspenseHandlerStackCursor.current),\n null !== returnFiber\n ? (0 === (returnFiber.flags & 65536) && (returnFiber.flags |= 256),\n (returnFiber.flags |= 65536),\n (returnFiber.lanes = rootRenderLanes),\n value !== HydrationMismatchException &&\n ((root = Error(formatProdErrorMessage(422), { cause: value })),\n queueHydrationError(createCapturedValueAtFiber(root, sourceFiber))))\n : (value !== HydrationMismatchException &&\n ((returnFiber = Error(formatProdErrorMessage(423), {\n cause: value\n })),\n queueHydrationError(\n createCapturedValueAtFiber(returnFiber, sourceFiber)\n )),\n (root = root.current.alternate),\n (root.flags |= 65536),\n (rootRenderLanes &= -rootRenderLanes),\n (root.lanes |= rootRenderLanes),\n (value = createCapturedValueAtFiber(value, sourceFiber)),\n (rootRenderLanes = createRootErrorUpdate(\n root.stateNode,\n value,\n rootRenderLanes\n )),\n enqueueCapturedUpdate(root, rootRenderLanes),\n 4 !== workInProgressRootExitStatus &&\n (workInProgressRootExitStatus = 2)),\n !1\n );\n var wrapperError = Error(formatProdErrorMessage(520), { cause: value });\n wrapperError = createCapturedValueAtFiber(wrapperError, sourceFiber);\n null === workInProgressRootConcurrentErrors\n ? (workInProgressRootConcurrentErrors = [wrapperError])\n : workInProgressRootConcurrentErrors.push(wrapperError);\n 4 !== workInProgressRootExitStatus && (workInProgressRootExitStatus = 2);\n if (null === returnFiber) return !0;\n value = createCapturedValueAtFiber(value, sourceFiber);\n sourceFiber = returnFiber;\n do {\n switch (sourceFiber.tag) {\n case 3:\n return (\n (sourceFiber.flags |= 65536),\n (root = rootRenderLanes & -rootRenderLanes),\n (sourceFiber.lanes |= root),\n (root = createRootErrorUpdate(sourceFiber.stateNode, value, root)),\n enqueueCapturedUpdate(sourceFiber, root),\n !1\n );\n case 1:\n if (\n ((returnFiber = sourceFiber.type),\n (wrapperError = sourceFiber.stateNode),\n 0 === (sourceFiber.flags & 128) &&\n (\"function\" === typeof returnFiber.getDerivedStateFromError ||\n (null !== wrapperError &&\n \"function\" === typeof wrapperError.componentDidCatch &&\n (null === legacyErrorBoundariesThatAlreadyFailed ||\n !legacyErrorBoundariesThatAlreadyFailed.has(wrapperError)))))\n )\n return (\n (sourceFiber.flags |= 65536),\n (rootRenderLanes &= -rootRenderLanes),\n (sourceFiber.lanes |= rootRenderLanes),\n (rootRenderLanes = createClassErrorUpdate(rootRenderLanes)),\n initializeClassErrorUpdate(\n rootRenderLanes,\n root,\n sourceFiber,\n value\n ),\n enqueueCapturedUpdate(sourceFiber, rootRenderLanes),\n !1\n );\n }\n sourceFiber = sourceFiber.return;\n } while (null !== sourceFiber);\n return !1;\n}\nvar SelectiveHydrationException = Error(formatProdErrorMessage(461)),\n didReceiveUpdate = !1;\nfunction reconcileChildren(current, workInProgress, nextChildren, renderLanes) {\n workInProgress.child =\n null === current\n ? mountChildFibers(workInProgress, null, nextChildren, renderLanes)\n : reconcileChildFibers(\n workInProgress,\n current.child,\n nextChildren,\n renderLanes\n );\n}\nfunction updateForwardRef(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n Component = Component.render;\n var ref = workInProgress.ref;\n if (\"ref\" in nextProps) {\n var propsWithoutRef = {};\n for (var key in nextProps)\n \"ref\" !== key && (propsWithoutRef[key] = nextProps[key]);\n } else propsWithoutRef = nextProps;\n prepareToReadContext(workInProgress);\n nextProps = renderWithHooks(\n current,\n workInProgress,\n Component,\n propsWithoutRef,\n ref,\n renderLanes\n );\n key = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && key && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n return workInProgress.child;\n}\nfunction updateMemoComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n if (null === current) {\n var type = Component.type;\n if (\n \"function\" === typeof type &&\n !shouldConstruct(type) &&\n void 0 === type.defaultProps &&\n null === Component.compare\n )\n return (\n (workInProgress.tag = 15),\n (workInProgress.type = type),\n updateSimpleMemoComponent(\n current,\n workInProgress,\n type,\n nextProps,\n renderLanes\n )\n );\n current = createFiberFromTypeAndProps(\n Component.type,\n null,\n nextProps,\n workInProgress,\n workInProgress.mode,\n renderLanes\n );\n current.ref = workInProgress.ref;\n current.return = workInProgress;\n return (workInProgress.child = current);\n }\n type = current.child;\n if (!checkScheduledUpdateOrContext(current, renderLanes)) {\n var prevProps = type.memoizedProps;\n Component = Component.compare;\n Component = null !== Component ? Component : shallowEqual;\n if (Component(prevProps, nextProps) && current.ref === workInProgress.ref)\n return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n }\n workInProgress.flags |= 1;\n current = createWorkInProgress(type, nextProps);\n current.ref = workInProgress.ref;\n current.return = workInProgress;\n return (workInProgress.child = current);\n}\nfunction updateSimpleMemoComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n if (null !== current) {\n var prevProps = current.memoizedProps;\n if (\n shallowEqual(prevProps, nextProps) &&\n current.ref === workInProgress.ref\n )\n if (\n ((didReceiveUpdate = !1),\n (workInProgress.pendingProps = nextProps = prevProps),\n checkScheduledUpdateOrContext(current, renderLanes))\n )\n 0 !== (current.flags & 131072) && (didReceiveUpdate = !0);\n else\n return (\n (workInProgress.lanes = current.lanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n }\n return updateFunctionComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n );\n}\nfunction updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n nextProps\n) {\n var nextChildren = nextProps.children,\n prevState = null !== current ? current.memoizedState : null;\n null === current &&\n null === workInProgress.stateNode &&\n (workInProgress.stateNode = {\n _visibility: 1,\n _pendingMarkers: null,\n _retryCache: null,\n _transitions: null\n });\n if (\"hidden\" === nextProps.mode) {\n if (0 !== (workInProgress.flags & 128)) {\n prevState =\n null !== prevState ? prevState.baseLanes | renderLanes : renderLanes;\n if (null !== current) {\n nextProps = workInProgress.child = current.child;\n for (nextChildren = 0; null !== nextProps; )\n (nextChildren =\n nextChildren | nextProps.lanes | nextProps.childLanes),\n (nextProps = nextProps.sibling);\n nextProps = nextChildren & ~prevState;\n } else (nextProps = 0), (workInProgress.child = null);\n return deferHiddenOffscreenComponent(\n current,\n workInProgress,\n prevState,\n renderLanes,\n nextProps\n );\n }\n if (0 !== (renderLanes & 536870912))\n (workInProgress.memoizedState = { baseLanes: 0, cachePool: null }),\n null !== current &&\n pushTransition(\n workInProgress,\n null !== prevState ? prevState.cachePool : null\n ),\n null !== prevState\n ? pushHiddenContext(workInProgress, prevState)\n : reuseHiddenContextOnStack(),\n pushOffscreenSuspenseHandler(workInProgress);\n else\n return (\n (nextProps = workInProgress.lanes = 536870912),\n deferHiddenOffscreenComponent(\n current,\n workInProgress,\n null !== prevState ? prevState.baseLanes | renderLanes : renderLanes,\n renderLanes,\n nextProps\n )\n );\n } else\n null !== prevState\n ? (pushTransition(workInProgress, prevState.cachePool),\n pushHiddenContext(workInProgress, prevState),\n reuseSuspenseHandlerOnStack(workInProgress),\n (workInProgress.memoizedState = null))\n : (null !== current && pushTransition(workInProgress, null),\n reuseHiddenContextOnStack(),\n reuseSuspenseHandlerOnStack(workInProgress));\n reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n return workInProgress.child;\n}\nfunction bailoutOffscreenComponent(current, workInProgress) {\n (null !== current && 22 === current.tag) ||\n null !== workInProgress.stateNode ||\n (workInProgress.stateNode = {\n _visibility: 1,\n _pendingMarkers: null,\n _retryCache: null,\n _transitions: null\n });\n return workInProgress.sibling;\n}\nfunction deferHiddenOffscreenComponent(\n current,\n workInProgress,\n nextBaseLanes,\n renderLanes,\n remainingChildLanes\n) {\n var JSCompiler_inline_result = peekCacheFromPool();\n JSCompiler_inline_result =\n null === JSCompiler_inline_result\n ? null\n : { parent: CacheContext._currentValue, pool: JSCompiler_inline_result };\n workInProgress.memoizedState = {\n baseLanes: nextBaseLanes,\n cachePool: JSCompiler_inline_result\n };\n null !== current && pushTransition(workInProgress, null);\n reuseHiddenContextOnStack();\n pushOffscreenSuspenseHandler(workInProgress);\n null !== current &&\n propagateParentContextChanges(current, workInProgress, renderLanes, !0);\n workInProgress.childLanes = remainingChildLanes;\n return null;\n}\nfunction mountActivityChildren(workInProgress, nextProps) {\n nextProps = mountWorkInProgressOffscreenFiber(\n { mode: nextProps.mode, children: nextProps.children },\n workInProgress.mode\n );\n nextProps.ref = workInProgress.ref;\n workInProgress.child = nextProps;\n nextProps.return = workInProgress;\n return nextProps;\n}\nfunction retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n) {\n reconcileChildFibers(workInProgress, current.child, null, renderLanes);\n current = mountActivityChildren(workInProgress, workInProgress.pendingProps);\n current.flags |= 2;\n popSuspenseHandler(workInProgress);\n workInProgress.memoizedState = null;\n return current;\n}\nfunction updateActivityComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n didSuspend = 0 !== (workInProgress.flags & 128);\n workInProgress.flags &= -129;\n if (null === current) {\n if (isHydrating) {\n if (\"hidden\" === nextProps.mode)\n return (\n (current = mountActivityChildren(workInProgress, nextProps)),\n (workInProgress.lanes = 536870912),\n bailoutOffscreenComponent(null, current)\n );\n pushDehydratedActivitySuspenseHandler(workInProgress);\n (current = nextHydratableInstance)\n ? ((current = canHydrateHydrationBoundary(\n current,\n rootOrSingletonContext\n )),\n (current = null !== current && \"&\" === current.data ? current : null),\n null !== current &&\n ((workInProgress.memoizedState = {\n dehydrated: current,\n treeContext:\n null !== treeContextProvider\n ? { id: treeContextId, overflow: treeContextOverflow }\n : null,\n retryLane: 536870912,\n hydrationErrors: null\n }),\n (renderLanes = createFiberFromDehydratedFragment(current)),\n (renderLanes.return = workInProgress),\n (workInProgress.child = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null)))\n : (current = null);\n if (null === current) throw throwOnHydrationMismatch(workInProgress);\n workInProgress.lanes = 536870912;\n return null;\n }\n return mountActivityChildren(workInProgress, nextProps);\n }\n var prevState = current.memoizedState;\n if (null !== prevState) {\n var dehydrated = prevState.dehydrated;\n pushDehydratedActivitySuspenseHandler(workInProgress);\n if (didSuspend)\n if (workInProgress.flags & 256)\n (workInProgress.flags &= -257),\n (workInProgress = retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n ));\n else if (null !== workInProgress.memoizedState)\n (workInProgress.child = current.child),\n (workInProgress.flags |= 128),\n (workInProgress = null);\n else throw Error(formatProdErrorMessage(558));\n else if (\n (didReceiveUpdate ||\n propagateParentContextChanges(current, workInProgress, renderLanes, !1),\n (didSuspend = 0 !== (renderLanes & current.childLanes)),\n didReceiveUpdate || didSuspend)\n ) {\n nextProps = workInProgressRoot;\n if (\n null !== nextProps &&\n ((dehydrated = getBumpedLaneForHydration(nextProps, renderLanes)),\n 0 !== dehydrated && dehydrated !== prevState.retryLane)\n )\n throw (\n ((prevState.retryLane = dehydrated),\n enqueueConcurrentRenderForLane(current, dehydrated),\n scheduleUpdateOnFiber(nextProps, current, dehydrated),\n SelectiveHydrationException)\n );\n renderDidSuspendDelayIfPossible();\n workInProgress = retryActivityComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else\n (current = prevState.treeContext),\n (nextHydratableInstance = getNextHydratable(dehydrated.nextSibling)),\n (hydrationParentFiber = workInProgress),\n (isHydrating = !0),\n (hydrationErrors = null),\n (rootOrSingletonContext = !1),\n null !== current &&\n restoreSuspendedTreeContext(workInProgress, current),\n (workInProgress = mountActivityChildren(workInProgress, nextProps)),\n (workInProgress.flags |= 4096);\n return workInProgress;\n }\n current = createWorkInProgress(current.child, {\n mode: nextProps.mode,\n children: nextProps.children\n });\n current.ref = workInProgress.ref;\n workInProgress.child = current;\n current.return = workInProgress;\n return current;\n}\nfunction markRef(current, workInProgress) {\n var ref = workInProgress.ref;\n if (null === ref)\n null !== current &&\n null !== current.ref &&\n (workInProgress.flags |= 4194816);\n else {\n if (\"function\" !== typeof ref && \"object\" !== typeof ref)\n throw Error(formatProdErrorMessage(284));\n if (null === current || current.ref !== ref)\n workInProgress.flags |= 4194816;\n }\n}\nfunction updateFunctionComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n Component = renderWithHooks(\n current,\n workInProgress,\n Component,\n nextProps,\n void 0,\n renderLanes\n );\n nextProps = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && nextProps && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, Component, renderLanes);\n return workInProgress.child;\n}\nfunction replayFunctionComponent(\n current,\n workInProgress,\n nextProps,\n Component,\n secondArg,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n workInProgress.updateQueue = null;\n nextProps = renderWithHooksAgain(\n workInProgress,\n Component,\n nextProps,\n secondArg\n );\n finishRenderingHooks(current);\n Component = checkDidRenderIdHook();\n if (null !== current && !didReceiveUpdate)\n return (\n bailoutHooks(current, workInProgress, renderLanes),\n bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes)\n );\n isHydrating && Component && pushMaterializedTreeId(workInProgress);\n workInProgress.flags |= 1;\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n return workInProgress.child;\n}\nfunction updateClassComponent(\n current,\n workInProgress,\n Component,\n nextProps,\n renderLanes\n) {\n prepareToReadContext(workInProgress);\n if (null === workInProgress.stateNode) {\n var context = emptyContextObject,\n contextType = Component.contextType;\n \"object\" === typeof contextType &&\n null !== contextType &&\n (context = readContext(contextType));\n context = new Component(nextProps, context);\n workInProgress.memoizedState =\n null !== context.state && void 0 !== context.state ? context.state : null;\n context.updater = classComponentUpdater;\n workInProgress.stateNode = context;\n context._reactInternals = workInProgress;\n context = workInProgress.stateNode;\n context.props = nextProps;\n context.state = workInProgress.memoizedState;\n context.refs = {};\n initializeUpdateQueue(workInProgress);\n contextType = Component.contextType;\n context.context =\n \"object\" === typeof contextType && null !== contextType\n ? readContext(contextType)\n : emptyContextObject;\n context.state = workInProgress.memoizedState;\n contextType = Component.getDerivedStateFromProps;\n \"function\" === typeof contextType &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n contextType,\n nextProps\n ),\n (context.state = workInProgress.memoizedState));\n \"function\" === typeof Component.getDerivedStateFromProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate ||\n (\"function\" !== typeof context.UNSAFE_componentWillMount &&\n \"function\" !== typeof context.componentWillMount) ||\n ((contextType = context.state),\n \"function\" === typeof context.componentWillMount &&\n context.componentWillMount(),\n \"function\" === typeof context.UNSAFE_componentWillMount &&\n context.UNSAFE_componentWillMount(),\n contextType !== context.state &&\n classComponentUpdater.enqueueReplaceState(context, context.state, null),\n processUpdateQueue(workInProgress, nextProps, context, renderLanes),\n suspendIfUpdateReadFromEntangledAsyncAction(),\n (context.state = workInProgress.memoizedState));\n \"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308);\n nextProps = !0;\n } else if (null === current) {\n context = workInProgress.stateNode;\n var unresolvedOldProps = workInProgress.memoizedProps,\n oldProps = resolveClassComponentProps(Component, unresolvedOldProps);\n context.props = oldProps;\n var oldContext = context.context,\n contextType$jscomp$0 = Component.contextType;\n contextType = emptyContextObject;\n \"object\" === typeof contextType$jscomp$0 &&\n null !== contextType$jscomp$0 &&\n (contextType = readContext(contextType$jscomp$0));\n var getDerivedStateFromProps = Component.getDerivedStateFromProps;\n contextType$jscomp$0 =\n \"function\" === typeof getDerivedStateFromProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate;\n unresolvedOldProps = workInProgress.pendingProps !== unresolvedOldProps;\n contextType$jscomp$0 ||\n (\"function\" !== typeof context.UNSAFE_componentWillReceiveProps &&\n \"function\" !== typeof context.componentWillReceiveProps) ||\n ((unresolvedOldProps || oldContext !== contextType) &&\n callComponentWillReceiveProps(\n workInProgress,\n context,\n nextProps,\n contextType\n ));\n hasForceUpdate = !1;\n var oldState = workInProgress.memoizedState;\n context.state = oldState;\n processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n suspendIfUpdateReadFromEntangledAsyncAction();\n oldContext = workInProgress.memoizedState;\n unresolvedOldProps || oldState !== oldContext || hasForceUpdate\n ? (\"function\" === typeof getDerivedStateFromProps &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n getDerivedStateFromProps,\n nextProps\n ),\n (oldContext = workInProgress.memoizedState)),\n (oldProps =\n hasForceUpdate ||\n checkShouldComponentUpdate(\n workInProgress,\n Component,\n oldProps,\n nextProps,\n oldState,\n oldContext,\n contextType\n ))\n ? (contextType$jscomp$0 ||\n (\"function\" !== typeof context.UNSAFE_componentWillMount &&\n \"function\" !== typeof context.componentWillMount) ||\n (\"function\" === typeof context.componentWillMount &&\n context.componentWillMount(),\n \"function\" === typeof context.UNSAFE_componentWillMount &&\n context.UNSAFE_componentWillMount()),\n \"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308))\n : (\"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308),\n (workInProgress.memoizedProps = nextProps),\n (workInProgress.memoizedState = oldContext)),\n (context.props = nextProps),\n (context.state = oldContext),\n (context.context = contextType),\n (nextProps = oldProps))\n : (\"function\" === typeof context.componentDidMount &&\n (workInProgress.flags |= 4194308),\n (nextProps = !1));\n } else {\n context = workInProgress.stateNode;\n cloneUpdateQueue(current, workInProgress);\n contextType = workInProgress.memoizedProps;\n contextType$jscomp$0 = resolveClassComponentProps(Component, contextType);\n context.props = contextType$jscomp$0;\n getDerivedStateFromProps = workInProgress.pendingProps;\n oldState = context.context;\n oldContext = Component.contextType;\n oldProps = emptyContextObject;\n \"object\" === typeof oldContext &&\n null !== oldContext &&\n (oldProps = readContext(oldContext));\n unresolvedOldProps = Component.getDerivedStateFromProps;\n (oldContext =\n \"function\" === typeof unresolvedOldProps ||\n \"function\" === typeof context.getSnapshotBeforeUpdate) ||\n (\"function\" !== typeof context.UNSAFE_componentWillReceiveProps &&\n \"function\" !== typeof context.componentWillReceiveProps) ||\n ((contextType !== getDerivedStateFromProps || oldState !== oldProps) &&\n callComponentWillReceiveProps(\n workInProgress,\n context,\n nextProps,\n oldProps\n ));\n hasForceUpdate = !1;\n oldState = workInProgress.memoizedState;\n context.state = oldState;\n processUpdateQueue(workInProgress, nextProps, context, renderLanes);\n suspendIfUpdateReadFromEntangledAsyncAction();\n var newState = workInProgress.memoizedState;\n contextType !== getDerivedStateFromProps ||\n oldState !== newState ||\n hasForceUpdate ||\n (null !== current &&\n null !== current.dependencies &&\n checkIfContextChanged(current.dependencies))\n ? (\"function\" === typeof unresolvedOldProps &&\n (applyDerivedStateFromProps(\n workInProgress,\n Component,\n unresolvedOldProps,\n nextProps\n ),\n (newState = workInProgress.memoizedState)),\n (contextType$jscomp$0 =\n hasForceUpdate ||\n checkShouldComponentUpdate(\n workInProgress,\n Component,\n contextType$jscomp$0,\n nextProps,\n oldState,\n newState,\n oldProps\n ) ||\n (null !== current &&\n null !== current.dependencies &&\n checkIfContextChanged(current.dependencies)))\n ? (oldContext ||\n (\"function\" !== typeof context.UNSAFE_componentWillUpdate &&\n \"function\" !== typeof context.componentWillUpdate) ||\n (\"function\" === typeof context.componentWillUpdate &&\n context.componentWillUpdate(nextProps, newState, oldProps),\n \"function\" === typeof context.UNSAFE_componentWillUpdate &&\n context.UNSAFE_componentWillUpdate(\n nextProps,\n newState,\n oldProps\n )),\n \"function\" === typeof context.componentDidUpdate &&\n (workInProgress.flags |= 4),\n \"function\" === typeof context.getSnapshotBeforeUpdate &&\n (workInProgress.flags |= 1024))\n : (\"function\" !== typeof context.componentDidUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 4),\n \"function\" !== typeof context.getSnapshotBeforeUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 1024),\n (workInProgress.memoizedProps = nextProps),\n (workInProgress.memoizedState = newState)),\n (context.props = nextProps),\n (context.state = newState),\n (context.context = oldProps),\n (nextProps = contextType$jscomp$0))\n : (\"function\" !== typeof context.componentDidUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 4),\n \"function\" !== typeof context.getSnapshotBeforeUpdate ||\n (contextType === current.memoizedProps &&\n oldState === current.memoizedState) ||\n (workInProgress.flags |= 1024),\n (nextProps = !1));\n }\n context = nextProps;\n markRef(current, workInProgress);\n nextProps = 0 !== (workInProgress.flags & 128);\n context || nextProps\n ? ((context = workInProgress.stateNode),\n (Component =\n nextProps && \"function\" !== typeof Component.getDerivedStateFromError\n ? null\n : context.render()),\n (workInProgress.flags |= 1),\n null !== current && nextProps\n ? ((workInProgress.child = reconcileChildFibers(\n workInProgress,\n current.child,\n null,\n renderLanes\n )),\n (workInProgress.child = reconcileChildFibers(\n workInProgress,\n null,\n Component,\n renderLanes\n )))\n : reconcileChildren(current, workInProgress, Component, renderLanes),\n (workInProgress.memoizedState = context.state),\n (current = workInProgress.child))\n : (current = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n ));\n return current;\n}\nfunction mountHostRootWithoutHydrating(\n current,\n workInProgress,\n nextChildren,\n renderLanes\n) {\n resetHydrationState();\n workInProgress.flags |= 256;\n reconcileChildren(current, workInProgress, nextChildren, renderLanes);\n return workInProgress.child;\n}\nvar SUSPENDED_MARKER = {\n dehydrated: null,\n treeContext: null,\n retryLane: 0,\n hydrationErrors: null\n};\nfunction mountSuspenseOffscreenState(renderLanes) {\n return { baseLanes: renderLanes, cachePool: getSuspendedCache() };\n}\nfunction getRemainingWorkInPrimaryTree(\n current,\n primaryTreeDidDefer,\n renderLanes\n) {\n current = null !== current ? current.childLanes & ~renderLanes : 0;\n primaryTreeDidDefer && (current |= workInProgressDeferredLane);\n return current;\n}\nfunction updateSuspenseComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n showFallback = !1,\n didSuspend = 0 !== (workInProgress.flags & 128),\n JSCompiler_temp;\n (JSCompiler_temp = didSuspend) ||\n (JSCompiler_temp =\n null !== current && null === current.memoizedState\n ? !1\n : 0 !== (suspenseStackCursor.current & 2));\n JSCompiler_temp && ((showFallback = !0), (workInProgress.flags &= -129));\n JSCompiler_temp = 0 !== (workInProgress.flags & 32);\n workInProgress.flags &= -33;\n if (null === current) {\n if (isHydrating) {\n showFallback\n ? pushPrimaryTreeSuspenseHandler(workInProgress)\n : reuseSuspenseHandlerOnStack(workInProgress);\n (current = nextHydratableInstance)\n ? ((current = canHydrateHydrationBoundary(\n current,\n rootOrSingletonContext\n )),\n (current = null !== current && \"&\" !== current.data ? current : null),\n null !== current &&\n ((workInProgress.memoizedState = {\n dehydrated: current,\n treeContext:\n null !== treeContextProvider\n ? { id: treeContextId, overflow: treeContextOverflow }\n : null,\n retryLane: 536870912,\n hydrationErrors: null\n }),\n (renderLanes = createFiberFromDehydratedFragment(current)),\n (renderLanes.return = workInProgress),\n (workInProgress.child = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null)))\n : (current = null);\n if (null === current) throw throwOnHydrationMismatch(workInProgress);\n isSuspenseInstanceFallback(current)\n ? (workInProgress.lanes = 32)\n : (workInProgress.lanes = 536870912);\n return null;\n }\n var nextPrimaryChildren = nextProps.children;\n nextProps = nextProps.fallback;\n if (showFallback)\n return (\n reuseSuspenseHandlerOnStack(workInProgress),\n (showFallback = workInProgress.mode),\n (nextPrimaryChildren = mountWorkInProgressOffscreenFiber(\n { mode: \"hidden\", children: nextPrimaryChildren },\n showFallback\n )),\n (nextProps = createFiberFromFragment(\n nextProps,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.return = workInProgress),\n (nextPrimaryChildren.sibling = nextProps),\n (workInProgress.child = nextPrimaryChildren),\n (nextProps = workInProgress.child),\n (nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes)),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n bailoutOffscreenComponent(null, nextProps)\n );\n pushPrimaryTreeSuspenseHandler(workInProgress);\n return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren);\n }\n var prevState = current.memoizedState;\n if (\n null !== prevState &&\n ((nextPrimaryChildren = prevState.dehydrated), null !== nextPrimaryChildren)\n ) {\n if (didSuspend)\n workInProgress.flags & 256\n ? (pushPrimaryTreeSuspenseHandler(workInProgress),\n (workInProgress.flags &= -257),\n (workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n )))\n : null !== workInProgress.memoizedState\n ? (reuseSuspenseHandlerOnStack(workInProgress),\n (workInProgress.child = current.child),\n (workInProgress.flags |= 128),\n (workInProgress = null))\n : (reuseSuspenseHandlerOnStack(workInProgress),\n (nextPrimaryChildren = nextProps.fallback),\n (showFallback = workInProgress.mode),\n (nextProps = mountWorkInProgressOffscreenFiber(\n { mode: \"visible\", children: nextProps.children },\n showFallback\n )),\n (nextPrimaryChildren = createFiberFromFragment(\n nextPrimaryChildren,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.flags |= 2),\n (nextProps.return = workInProgress),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.sibling = nextPrimaryChildren),\n (workInProgress.child = nextProps),\n reconcileChildFibers(\n workInProgress,\n current.child,\n null,\n renderLanes\n ),\n (nextProps = workInProgress.child),\n (nextProps.memoizedState =\n mountSuspenseOffscreenState(renderLanes)),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n (workInProgress = bailoutOffscreenComponent(null, nextProps)));\n else if (\n (pushPrimaryTreeSuspenseHandler(workInProgress),\n isSuspenseInstanceFallback(nextPrimaryChildren))\n ) {\n JSCompiler_temp =\n nextPrimaryChildren.nextSibling &&\n nextPrimaryChildren.nextSibling.dataset;\n if (JSCompiler_temp) var digest = JSCompiler_temp.dgst;\n JSCompiler_temp = digest;\n nextProps = Error(formatProdErrorMessage(419));\n nextProps.stack = \"\";\n nextProps.digest = JSCompiler_temp;\n queueHydrationError({ value: nextProps, source: null, stack: null });\n workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else if (\n (didReceiveUpdate ||\n propagateParentContextChanges(current, workInProgress, renderLanes, !1),\n (JSCompiler_temp = 0 !== (renderLanes & current.childLanes)),\n didReceiveUpdate || JSCompiler_temp)\n ) {\n JSCompiler_temp = workInProgressRoot;\n if (\n null !== JSCompiler_temp &&\n ((nextProps = getBumpedLaneForHydration(JSCompiler_temp, renderLanes)),\n 0 !== nextProps && nextProps !== prevState.retryLane)\n )\n throw (\n ((prevState.retryLane = nextProps),\n enqueueConcurrentRenderForLane(current, nextProps),\n scheduleUpdateOnFiber(JSCompiler_temp, current, nextProps),\n SelectiveHydrationException)\n );\n isSuspenseInstancePending(nextPrimaryChildren) ||\n renderDidSuspendDelayIfPossible();\n workInProgress = retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n );\n } else\n isSuspenseInstancePending(nextPrimaryChildren)\n ? ((workInProgress.flags |= 192),\n (workInProgress.child = current.child),\n (workInProgress = null))\n : ((current = prevState.treeContext),\n (nextHydratableInstance = getNextHydratable(\n nextPrimaryChildren.nextSibling\n )),\n (hydrationParentFiber = workInProgress),\n (isHydrating = !0),\n (hydrationErrors = null),\n (rootOrSingletonContext = !1),\n null !== current &&\n restoreSuspendedTreeContext(workInProgress, current),\n (workInProgress = mountSuspensePrimaryChildren(\n workInProgress,\n nextProps.children\n )),\n (workInProgress.flags |= 4096));\n return workInProgress;\n }\n if (showFallback)\n return (\n reuseSuspenseHandlerOnStack(workInProgress),\n (nextPrimaryChildren = nextProps.fallback),\n (showFallback = workInProgress.mode),\n (prevState = current.child),\n (digest = prevState.sibling),\n (nextProps = createWorkInProgress(prevState, {\n mode: \"hidden\",\n children: nextProps.children\n })),\n (nextProps.subtreeFlags = prevState.subtreeFlags & 65011712),\n null !== digest\n ? (nextPrimaryChildren = createWorkInProgress(\n digest,\n nextPrimaryChildren\n ))\n : ((nextPrimaryChildren = createFiberFromFragment(\n nextPrimaryChildren,\n showFallback,\n renderLanes,\n null\n )),\n (nextPrimaryChildren.flags |= 2)),\n (nextPrimaryChildren.return = workInProgress),\n (nextProps.return = workInProgress),\n (nextProps.sibling = nextPrimaryChildren),\n (workInProgress.child = nextProps),\n bailoutOffscreenComponent(null, nextProps),\n (nextProps = workInProgress.child),\n (nextPrimaryChildren = current.child.memoizedState),\n null === nextPrimaryChildren\n ? (nextPrimaryChildren = mountSuspenseOffscreenState(renderLanes))\n : ((showFallback = nextPrimaryChildren.cachePool),\n null !== showFallback\n ? ((prevState = CacheContext._currentValue),\n (showFallback =\n showFallback.parent !== prevState\n ? { parent: prevState, pool: prevState }\n : showFallback))\n : (showFallback = getSuspendedCache()),\n (nextPrimaryChildren = {\n baseLanes: nextPrimaryChildren.baseLanes | renderLanes,\n cachePool: showFallback\n })),\n (nextProps.memoizedState = nextPrimaryChildren),\n (nextProps.childLanes = getRemainingWorkInPrimaryTree(\n current,\n JSCompiler_temp,\n renderLanes\n )),\n (workInProgress.memoizedState = SUSPENDED_MARKER),\n bailoutOffscreenComponent(current.child, nextProps)\n );\n pushPrimaryTreeSuspenseHandler(workInProgress);\n renderLanes = current.child;\n current = renderLanes.sibling;\n renderLanes = createWorkInProgress(renderLanes, {\n mode: \"visible\",\n children: nextProps.children\n });\n renderLanes.return = workInProgress;\n renderLanes.sibling = null;\n null !== current &&\n ((JSCompiler_temp = workInProgress.deletions),\n null === JSCompiler_temp\n ? ((workInProgress.deletions = [current]), (workInProgress.flags |= 16))\n : JSCompiler_temp.push(current));\n workInProgress.child = renderLanes;\n workInProgress.memoizedState = null;\n return renderLanes;\n}\nfunction mountSuspensePrimaryChildren(workInProgress, primaryChildren) {\n primaryChildren = mountWorkInProgressOffscreenFiber(\n { mode: \"visible\", children: primaryChildren },\n workInProgress.mode\n );\n primaryChildren.return = workInProgress;\n return (workInProgress.child = primaryChildren);\n}\nfunction mountWorkInProgressOffscreenFiber(offscreenProps, mode) {\n offscreenProps = createFiberImplClass(22, offscreenProps, null, mode);\n offscreenProps.lanes = 0;\n return offscreenProps;\n}\nfunction retrySuspenseComponentWithoutHydrating(\n current,\n workInProgress,\n renderLanes\n) {\n reconcileChildFibers(workInProgress, current.child, null, renderLanes);\n current = mountSuspensePrimaryChildren(\n workInProgress,\n workInProgress.pendingProps.children\n );\n current.flags |= 2;\n workInProgress.memoizedState = null;\n return current;\n}\nfunction scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) {\n fiber.lanes |= renderLanes;\n var alternate = fiber.alternate;\n null !== alternate && (alternate.lanes |= renderLanes);\n scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot);\n}\nfunction initSuspenseListRenderState(\n workInProgress,\n isBackwards,\n tail,\n lastContentRow,\n tailMode,\n treeForkCount\n) {\n var renderState = workInProgress.memoizedState;\n null === renderState\n ? (workInProgress.memoizedState = {\n isBackwards: isBackwards,\n rendering: null,\n renderingStartTime: 0,\n last: lastContentRow,\n tail: tail,\n tailMode: tailMode,\n treeForkCount: treeForkCount\n })\n : ((renderState.isBackwards = isBackwards),\n (renderState.rendering = null),\n (renderState.renderingStartTime = 0),\n (renderState.last = lastContentRow),\n (renderState.tail = tail),\n (renderState.tailMode = tailMode),\n (renderState.treeForkCount = treeForkCount));\n}\nfunction updateSuspenseListComponent(current, workInProgress, renderLanes) {\n var nextProps = workInProgress.pendingProps,\n revealOrder = nextProps.revealOrder,\n tailMode = nextProps.tail;\n nextProps = nextProps.children;\n var suspenseContext = suspenseStackCursor.current,\n shouldForceFallback = 0 !== (suspenseContext & 2);\n shouldForceFallback\n ? ((suspenseContext = (suspenseContext & 1) | 2),\n (workInProgress.flags |= 128))\n : (suspenseContext &= 1);\n push(suspenseStackCursor, suspenseContext);\n reconcileChildren(current, workInProgress, nextProps, renderLanes);\n nextProps = isHydrating ? treeForkCount : 0;\n if (!shouldForceFallback && null !== current && 0 !== (current.flags & 128))\n a: for (current = workInProgress.child; null !== current; ) {\n if (13 === current.tag)\n null !== current.memoizedState &&\n scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n else if (19 === current.tag)\n scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);\n else if (null !== current.child) {\n current.child.return = current;\n current = current.child;\n continue;\n }\n if (current === workInProgress) break a;\n for (; null === current.sibling; ) {\n if (null === current.return || current.return === workInProgress)\n break a;\n current = current.return;\n }\n current.sibling.return = current.return;\n current = current.sibling;\n }\n switch (revealOrder) {\n case \"forwards\":\n renderLanes = workInProgress.child;\n for (revealOrder = null; null !== renderLanes; )\n (current = renderLanes.alternate),\n null !== current &&\n null === findFirstSuspended(current) &&\n (revealOrder = renderLanes),\n (renderLanes = renderLanes.sibling);\n renderLanes = revealOrder;\n null === renderLanes\n ? ((revealOrder = workInProgress.child), (workInProgress.child = null))\n : ((revealOrder = renderLanes.sibling), (renderLanes.sibling = null));\n initSuspenseListRenderState(\n workInProgress,\n !1,\n revealOrder,\n renderLanes,\n tailMode,\n nextProps\n );\n break;\n case \"backwards\":\n case \"unstable_legacy-backwards\":\n renderLanes = null;\n revealOrder = workInProgress.child;\n for (workInProgress.child = null; null !== revealOrder; ) {\n current = revealOrder.alternate;\n if (null !== current && null === findFirstSuspended(current)) {\n workInProgress.child = revealOrder;\n break;\n }\n current = revealOrder.sibling;\n revealOrder.sibling = renderLanes;\n renderLanes = revealOrder;\n revealOrder = current;\n }\n initSuspenseListRenderState(\n workInProgress,\n !0,\n renderLanes,\n null,\n tailMode,\n nextProps\n );\n break;\n case \"together\":\n initSuspenseListRenderState(\n workInProgress,\n !1,\n null,\n null,\n void 0,\n nextProps\n );\n break;\n default:\n workInProgress.memoizedState = null;\n }\n return workInProgress.child;\n}\nfunction bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) {\n null !== current && (workInProgress.dependencies = current.dependencies);\n workInProgressRootSkippedLanes |= workInProgress.lanes;\n if (0 === (renderLanes & workInProgress.childLanes))\n if (null !== current) {\n if (\n (propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n !1\n ),\n 0 === (renderLanes & workInProgress.childLanes))\n )\n return null;\n } else return null;\n if (null !== current && workInProgress.child !== current.child)\n throw Error(formatProdErrorMessage(153));\n if (null !== workInProgress.child) {\n current = workInProgress.child;\n renderLanes = createWorkInProgress(current, current.pendingProps);\n workInProgress.child = renderLanes;\n for (renderLanes.return = workInProgress; null !== current.sibling; )\n (current = current.sibling),\n (renderLanes = renderLanes.sibling =\n createWorkInProgress(current, current.pendingProps)),\n (renderLanes.return = workInProgress);\n renderLanes.sibling = null;\n }\n return workInProgress.child;\n}\nfunction checkScheduledUpdateOrContext(current, renderLanes) {\n if (0 !== (current.lanes & renderLanes)) return !0;\n current = current.dependencies;\n return null !== current && checkIfContextChanged(current) ? !0 : !1;\n}\nfunction attemptEarlyBailoutIfNoScheduledUpdate(\n current,\n workInProgress,\n renderLanes\n) {\n switch (workInProgress.tag) {\n case 3:\n pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n resetHydrationState();\n break;\n case 27:\n case 5:\n pushHostContext(workInProgress);\n break;\n case 4:\n pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n break;\n case 10:\n pushProvider(\n workInProgress,\n workInProgress.type,\n workInProgress.memoizedProps.value\n );\n break;\n case 31:\n if (null !== workInProgress.memoizedState)\n return (\n (workInProgress.flags |= 128),\n pushDehydratedActivitySuspenseHandler(workInProgress),\n null\n );\n break;\n case 13:\n var state$102 = workInProgress.memoizedState;\n if (null !== state$102) {\n if (null !== state$102.dehydrated)\n return (\n pushPrimaryTreeSuspenseHandler(workInProgress),\n (workInProgress.flags |= 128),\n null\n );\n if (0 !== (renderLanes & workInProgress.child.childLanes))\n return updateSuspenseComponent(current, workInProgress, renderLanes);\n pushPrimaryTreeSuspenseHandler(workInProgress);\n current = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n );\n return null !== current ? current.sibling : null;\n }\n pushPrimaryTreeSuspenseHandler(workInProgress);\n break;\n case 19:\n var didSuspendBefore = 0 !== (current.flags & 128);\n state$102 = 0 !== (renderLanes & workInProgress.childLanes);\n state$102 ||\n (propagateParentContextChanges(\n current,\n workInProgress,\n renderLanes,\n !1\n ),\n (state$102 = 0 !== (renderLanes & workInProgress.childLanes)));\n if (didSuspendBefore) {\n if (state$102)\n return updateSuspenseListComponent(\n current,\n workInProgress,\n renderLanes\n );\n workInProgress.flags |= 128;\n }\n didSuspendBefore = workInProgress.memoizedState;\n null !== didSuspendBefore &&\n ((didSuspendBefore.rendering = null),\n (didSuspendBefore.tail = null),\n (didSuspendBefore.lastEffect = null));\n push(suspenseStackCursor, suspenseStackCursor.current);\n if (state$102) break;\n else return null;\n case 22:\n return (\n (workInProgress.lanes = 0),\n updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n workInProgress.pendingProps\n )\n );\n case 24:\n pushProvider(workInProgress, CacheContext, current.memoizedState.cache);\n }\n return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);\n}\nfunction beginWork(current, workInProgress, renderLanes) {\n if (null !== current)\n if (current.memoizedProps !== workInProgress.pendingProps)\n didReceiveUpdate = !0;\n else {\n if (\n !checkScheduledUpdateOrContext(current, renderLanes) &&\n 0 === (workInProgress.flags & 128)\n )\n return (\n (didReceiveUpdate = !1),\n attemptEarlyBailoutIfNoScheduledUpdate(\n current,\n workInProgress,\n renderLanes\n )\n );\n didReceiveUpdate = 0 !== (current.flags & 131072) ? !0 : !1;\n }\n else\n (didReceiveUpdate = !1),\n isHydrating &&\n 0 !== (workInProgress.flags & 1048576) &&\n pushTreeId(workInProgress, treeForkCount, workInProgress.index);\n workInProgress.lanes = 0;\n switch (workInProgress.tag) {\n case 16:\n a: {\n var props = workInProgress.pendingProps;\n current = resolveLazy(workInProgress.elementType);\n workInProgress.type = current;\n if (\"function\" === typeof current)\n shouldConstruct(current)\n ? ((props = resolveClassComponentProps(current, props)),\n (workInProgress.tag = 1),\n (workInProgress = updateClassComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n )))\n : ((workInProgress.tag = 0),\n (workInProgress = updateFunctionComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n )));\n else {\n if (void 0 !== current && null !== current) {\n var $$typeof = current.$$typeof;\n if ($$typeof === REACT_FORWARD_REF_TYPE) {\n workInProgress.tag = 11;\n workInProgress = updateForwardRef(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n );\n break a;\n } else if ($$typeof === REACT_MEMO_TYPE) {\n workInProgress.tag = 14;\n workInProgress = updateMemoComponent(\n null,\n workInProgress,\n current,\n props,\n renderLanes\n );\n break a;\n }\n }\n workInProgress = getComponentNameFromType(current) || current;\n throw Error(formatProdErrorMessage(306, workInProgress, \"\"));\n }\n }\n return workInProgress;\n case 0:\n return updateFunctionComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 1:\n return (\n (props = workInProgress.type),\n ($$typeof = resolveClassComponentProps(\n props,\n workInProgress.pendingProps\n )),\n updateClassComponent(\n current,\n workInProgress,\n props,\n $$typeof,\n renderLanes\n )\n );\n case 3:\n a: {\n pushHostContainer(\n workInProgress,\n workInProgress.stateNode.containerInfo\n );\n if (null === current) throw Error(formatProdErrorMessage(387));\n props = workInProgress.pendingProps;\n var prevState = workInProgress.memoizedState;\n $$typeof = prevState.element;\n cloneUpdateQueue(current, workInProgress);\n processUpdateQueue(workInProgress, props, null, renderLanes);\n var nextState = workInProgress.memoizedState;\n props = nextState.cache;\n pushProvider(workInProgress, CacheContext, props);\n props !== prevState.cache &&\n propagateContextChanges(\n workInProgress,\n [CacheContext],\n renderLanes,\n !0\n );\n suspendIfUpdateReadFromEntangledAsyncAction();\n props = nextState.element;\n if (prevState.isDehydrated)\n if (\n ((prevState = {\n element: props,\n isDehydrated: !1,\n cache: nextState.cache\n }),\n (workInProgress.updateQueue.baseState = prevState),\n (workInProgress.memoizedState = prevState),\n workInProgress.flags & 256)\n ) {\n workInProgress = mountHostRootWithoutHydrating(\n current,\n workInProgress,\n props,\n renderLanes\n );\n break a;\n } else if (props !== $$typeof) {\n $$typeof = createCapturedValueAtFiber(\n Error(formatProdErrorMessage(424)),\n workInProgress\n );\n queueHydrationError($$typeof);\n workInProgress = mountHostRootWithoutHydrating(\n current,\n workInProgress,\n props,\n renderLanes\n );\n break a;\n } else {\n current = workInProgress.stateNode.containerInfo;\n switch (current.nodeType) {\n case 9:\n current = current.body;\n break;\n default:\n current =\n \"HTML\" === current.nodeName\n ? current.ownerDocument.body\n : current;\n }\n nextHydratableInstance = getNextHydratable(current.firstChild);\n hydrationParentFiber = workInProgress;\n isHydrating = !0;\n hydrationErrors = null;\n rootOrSingletonContext = !0;\n renderLanes = mountChildFibers(\n workInProgress,\n null,\n props,\n renderLanes\n );\n for (workInProgress.child = renderLanes; renderLanes; )\n (renderLanes.flags = (renderLanes.flags & -3) | 4096),\n (renderLanes = renderLanes.sibling);\n }\n else {\n resetHydrationState();\n if (props === $$typeof) {\n workInProgress = bailoutOnAlreadyFinishedWork(\n current,\n workInProgress,\n renderLanes\n );\n break a;\n }\n reconcileChildren(current, workInProgress, props, renderLanes);\n }\n workInProgress = workInProgress.child;\n }\n return workInProgress;\n case 26:\n return (\n markRef(current, workInProgress),\n null === current\n ? (renderLanes = getResource(\n workInProgress.type,\n null,\n workInProgress.pendingProps,\n null\n ))\n ? (workInProgress.memoizedState = renderLanes)\n : isHydrating ||\n ((renderLanes = workInProgress.type),\n (current = workInProgress.pendingProps),\n (props = getOwnerDocumentFromRootContainer(\n rootInstanceStackCursor.current\n ).createElement(renderLanes)),\n (props[internalInstanceKey] = workInProgress),\n (props[internalPropsKey] = current),\n setInitialProperties(props, renderLanes, current),\n markNodeAsHoistable(props),\n (workInProgress.stateNode = props))\n : (workInProgress.memoizedState = getResource(\n workInProgress.type,\n current.memoizedProps,\n workInProgress.pendingProps,\n current.memoizedState\n )),\n null\n );\n case 27:\n return (\n pushHostContext(workInProgress),\n null === current &&\n isHydrating &&\n ((props = workInProgress.stateNode =\n resolveSingletonInstance(\n workInProgress.type,\n workInProgress.pendingProps,\n rootInstanceStackCursor.current\n )),\n (hydrationParentFiber = workInProgress),\n (rootOrSingletonContext = !0),\n ($$typeof = nextHydratableInstance),\n isSingletonScope(workInProgress.type)\n ? ((previousHydratableOnEnteringScopedSingleton = $$typeof),\n (nextHydratableInstance = getNextHydratable(props.firstChild)))\n : (nextHydratableInstance = $$typeof)),\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n markRef(current, workInProgress),\n null === current && (workInProgress.flags |= 4194304),\n workInProgress.child\n );\n case 5:\n if (null === current && isHydrating) {\n if (($$typeof = props = nextHydratableInstance))\n (props = canHydrateInstance(\n props,\n workInProgress.type,\n workInProgress.pendingProps,\n rootOrSingletonContext\n )),\n null !== props\n ? ((workInProgress.stateNode = props),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = getNextHydratable(props.firstChild)),\n (rootOrSingletonContext = !1),\n ($$typeof = !0))\n : ($$typeof = !1);\n $$typeof || throwOnHydrationMismatch(workInProgress);\n }\n pushHostContext(workInProgress);\n $$typeof = workInProgress.type;\n prevState = workInProgress.pendingProps;\n nextState = null !== current ? current.memoizedProps : null;\n props = prevState.children;\n shouldSetTextContent($$typeof, prevState)\n ? (props = null)\n : null !== nextState &&\n shouldSetTextContent($$typeof, nextState) &&\n (workInProgress.flags |= 32);\n null !== workInProgress.memoizedState &&\n (($$typeof = renderWithHooks(\n current,\n workInProgress,\n TransitionAwareHostComponent,\n null,\n null,\n renderLanes\n )),\n (HostTransitionContext._currentValue = $$typeof));\n markRef(current, workInProgress);\n reconcileChildren(current, workInProgress, props, renderLanes);\n return workInProgress.child;\n case 6:\n if (null === current && isHydrating) {\n if ((current = renderLanes = nextHydratableInstance))\n (renderLanes = canHydrateTextInstance(\n renderLanes,\n workInProgress.pendingProps,\n rootOrSingletonContext\n )),\n null !== renderLanes\n ? ((workInProgress.stateNode = renderLanes),\n (hydrationParentFiber = workInProgress),\n (nextHydratableInstance = null),\n (current = !0))\n : (current = !1);\n current || throwOnHydrationMismatch(workInProgress);\n }\n return null;\n case 13:\n return updateSuspenseComponent(current, workInProgress, renderLanes);\n case 4:\n return (\n pushHostContainer(\n workInProgress,\n workInProgress.stateNode.containerInfo\n ),\n (props = workInProgress.pendingProps),\n null === current\n ? (workInProgress.child = reconcileChildFibers(\n workInProgress,\n null,\n props,\n renderLanes\n ))\n : reconcileChildren(current, workInProgress, props, renderLanes),\n workInProgress.child\n );\n case 11:\n return updateForwardRef(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 7:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps,\n renderLanes\n ),\n workInProgress.child\n );\n case 8:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 12:\n return (\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 10:\n return (\n (props = workInProgress.pendingProps),\n pushProvider(workInProgress, workInProgress.type, props.value),\n reconcileChildren(current, workInProgress, props.children, renderLanes),\n workInProgress.child\n );\n case 9:\n return (\n ($$typeof = workInProgress.type._context),\n (props = workInProgress.pendingProps.children),\n prepareToReadContext(workInProgress),\n ($$typeof = readContext($$typeof)),\n (props = props($$typeof)),\n (workInProgress.flags |= 1),\n reconcileChildren(current, workInProgress, props, renderLanes),\n workInProgress.child\n );\n case 14:\n return updateMemoComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 15:\n return updateSimpleMemoComponent(\n current,\n workInProgress,\n workInProgress.type,\n workInProgress.pendingProps,\n renderLanes\n );\n case 19:\n return updateSuspenseListComponent(current, workInProgress, renderLanes);\n case 31:\n return updateActivityComponent(current, workInProgress, renderLanes);\n case 22:\n return updateOffscreenComponent(\n current,\n workInProgress,\n renderLanes,\n workInProgress.pendingProps\n );\n case 24:\n return (\n prepareToReadContext(workInProgress),\n (props = readContext(CacheContext)),\n null === current\n ? (($$typeof = peekCacheFromPool()),\n null === $$typeof &&\n (($$typeof = workInProgressRoot),\n (prevState = createCache()),\n ($$typeof.pooledCache = prevState),\n prevState.refCount++,\n null !== prevState && ($$typeof.pooledCacheLanes |= renderLanes),\n ($$typeof = prevState)),\n (workInProgress.memoizedState = { parent: props, cache: $$typeof }),\n initializeUpdateQueue(workInProgress),\n pushProvider(workInProgress, CacheContext, $$typeof))\n : (0 !== (current.lanes & renderLanes) &&\n (cloneUpdateQueue(current, workInProgress),\n processUpdateQueue(workInProgress, null, null, renderLanes),\n suspendIfUpdateReadFromEntangledAsyncAction()),\n ($$typeof = current.memoizedState),\n (prevState = workInProgress.memoizedState),\n $$typeof.parent !== props\n ? (($$typeof = { parent: props, cache: props }),\n (workInProgress.memoizedState = $$typeof),\n 0 === workInProgress.lanes &&\n (workInProgress.memoizedState =\n workInProgress.updateQueue.baseState =\n $$typeof),\n pushProvider(workInProgress, CacheContext, props))\n : ((props = prevState.cache),\n pushProvider(workInProgress, CacheContext, props),\n props !== $$typeof.cache &&\n propagateContextChanges(\n workInProgress,\n [CacheContext],\n renderLanes,\n !0\n ))),\n reconcileChildren(\n current,\n workInProgress,\n workInProgress.pendingProps.children,\n renderLanes\n ),\n workInProgress.child\n );\n case 29:\n throw workInProgress.pendingProps;\n }\n throw Error(formatProdErrorMessage(156, workInProgress.tag));\n}\nfunction markUpdate(workInProgress) {\n workInProgress.flags |= 4;\n}\nfunction preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n oldProps,\n newProps,\n renderLanes\n) {\n if ((type = 0 !== (workInProgress.mode & 32))) type = !1;\n if (type) {\n if (\n ((workInProgress.flags |= 16777216),\n (renderLanes & 335544128) === renderLanes)\n )\n if (workInProgress.stateNode.complete) workInProgress.flags |= 8192;\n else if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192;\n else\n throw (\n ((suspendedThenable = noopSuspenseyCommitThenable),\n SuspenseyCommitException)\n );\n } else workInProgress.flags &= -16777217;\n}\nfunction preloadResourceAndSuspendIfNeeded(workInProgress, resource) {\n if (\"stylesheet\" !== resource.type || 0 !== (resource.state.loading & 4))\n workInProgress.flags &= -16777217;\n else if (((workInProgress.flags |= 16777216), !preloadResource(resource)))\n if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192;\n else\n throw (\n ((suspendedThenable = noopSuspenseyCommitThenable),\n SuspenseyCommitException)\n );\n}\nfunction scheduleRetryEffect(workInProgress, retryQueue) {\n null !== retryQueue && (workInProgress.flags |= 4);\n workInProgress.flags & 16384 &&\n ((retryQueue =\n 22 !== workInProgress.tag ? claimNextRetryLane() : 536870912),\n (workInProgress.lanes |= retryQueue),\n (workInProgressSuspendedRetryLanes |= retryQueue));\n}\nfunction cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {\n if (!isHydrating)\n switch (renderState.tailMode) {\n case \"hidden\":\n hasRenderedATailFallback = renderState.tail;\n for (var lastTailNode = null; null !== hasRenderedATailFallback; )\n null !== hasRenderedATailFallback.alternate &&\n (lastTailNode = hasRenderedATailFallback),\n (hasRenderedATailFallback = hasRenderedATailFallback.sibling);\n null === lastTailNode\n ? (renderState.tail = null)\n : (lastTailNode.sibling = null);\n break;\n case \"collapsed\":\n lastTailNode = renderState.tail;\n for (var lastTailNode$106 = null; null !== lastTailNode; )\n null !== lastTailNode.alternate && (lastTailNode$106 = lastTailNode),\n (lastTailNode = lastTailNode.sibling);\n null === lastTailNode$106\n ? hasRenderedATailFallback || null === renderState.tail\n ? (renderState.tail = null)\n : (renderState.tail.sibling = null)\n : (lastTailNode$106.sibling = null);\n }\n}\nfunction bubbleProperties(completedWork) {\n var didBailout =\n null !== completedWork.alternate &&\n completedWork.alternate.child === completedWork.child,\n newChildLanes = 0,\n subtreeFlags = 0;\n if (didBailout)\n for (var child$107 = completedWork.child; null !== child$107; )\n (newChildLanes |= child$107.lanes | child$107.childLanes),\n (subtreeFlags |= child$107.subtreeFlags & 65011712),\n (subtreeFlags |= child$107.flags & 65011712),\n (child$107.return = completedWork),\n (child$107 = child$107.sibling);\n else\n for (child$107 = completedWork.child; null !== child$107; )\n (newChildLanes |= child$107.lanes | child$107.childLanes),\n (subtreeFlags |= child$107.subtreeFlags),\n (subtreeFlags |= child$107.flags),\n (child$107.return = completedWork),\n (child$107 = child$107.sibling);\n completedWork.subtreeFlags |= subtreeFlags;\n completedWork.childLanes = newChildLanes;\n return didBailout;\n}\nfunction completeWork(current, workInProgress, renderLanes) {\n var newProps = workInProgress.pendingProps;\n popTreeContext(workInProgress);\n switch (workInProgress.tag) {\n case 16:\n case 15:\n case 0:\n case 11:\n case 7:\n case 8:\n case 12:\n case 9:\n case 14:\n return bubbleProperties(workInProgress), null;\n case 1:\n return bubbleProperties(workInProgress), null;\n case 3:\n renderLanes = workInProgress.stateNode;\n newProps = null;\n null !== current && (newProps = current.memoizedState.cache);\n workInProgress.memoizedState.cache !== newProps &&\n (workInProgress.flags |= 2048);\n popProvider(CacheContext);\n popHostContainer();\n renderLanes.pendingContext &&\n ((renderLanes.context = renderLanes.pendingContext),\n (renderLanes.pendingContext = null));\n if (null === current || null === current.child)\n popHydrationState(workInProgress)\n ? markUpdate(workInProgress)\n : null === current ||\n (current.memoizedState.isDehydrated &&\n 0 === (workInProgress.flags & 256)) ||\n ((workInProgress.flags |= 1024),\n upgradeHydrationErrorsToRecoverable());\n bubbleProperties(workInProgress);\n return null;\n case 26:\n var type = workInProgress.type,\n nextResource = workInProgress.memoizedState;\n null === current\n ? (markUpdate(workInProgress),\n null !== nextResource\n ? (bubbleProperties(workInProgress),\n preloadResourceAndSuspendIfNeeded(workInProgress, nextResource))\n : (bubbleProperties(workInProgress),\n preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n null,\n newProps,\n renderLanes\n )))\n : nextResource\n ? nextResource !== current.memoizedState\n ? (markUpdate(workInProgress),\n bubbleProperties(workInProgress),\n preloadResourceAndSuspendIfNeeded(workInProgress, nextResource))\n : (bubbleProperties(workInProgress),\n (workInProgress.flags &= -16777217))\n : ((current = current.memoizedProps),\n current !== newProps && markUpdate(workInProgress),\n bubbleProperties(workInProgress),\n preloadInstanceAndSuspendIfNeeded(\n workInProgress,\n type,\n current,\n newProps,\n renderLanes\n ));\n return null;\n case 27:\n popHostContext(workInProgress);\n renderLanes = rootInstanceStackCursor.current;\n type = workInProgress.type;\n if (null !== current && null != workInProgress.stateNode)\n current.memoizedProps !== newProps && markUpdate(workInProgress);\n else {\n if (!newProps) {\n if (null === workInProgress.stateNode)\n throw Error(formatProdErrorMessage(166));\n bubbleProperties(workInProgress);\n return null;\n }\n current = contextStackCursor.current;\n popHydrationState(workInProgress)\n ? prepareToHydrateHostInstance(workInProgress, current)\n : ((current = resolveSingletonInstance(type, newProps, renderLanes)),\n (workInProgress.stateNode = current),\n markUpdate(workInProgress));\n }\n bubbleProperties(workInProgress);\n return null;\n case 5:\n popHostContext(workInProgress);\n type = workInProgress.type;\n if (null !== current && null != workInProgress.stateNode)\n current.memoizedProps !== newProps && markUpdate(workInProgress);\n else {\n if (!newProps) {\n if (null === workInProgress.stateNode)\n throw Error(formatProdErrorMessage(166));\n bubbleProperties(workInProgress);\n return null;\n }\n nextResource = contextStackCursor.current;\n if (popHydrationState(workInProgress))\n prepareToHydrateHostInstance(workInProgress, nextResource);\n else {\n var ownerDocument = getOwnerDocumentFromRootContainer(\n rootInstanceStackCursor.current\n );\n switch (nextResource) {\n case 1:\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/2000/svg\",\n type\n );\n break;\n case 2:\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/1998/Math/MathML\",\n type\n );\n break;\n default:\n switch (type) {\n case \"svg\":\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/2000/svg\",\n type\n );\n break;\n case \"math\":\n nextResource = ownerDocument.createElementNS(\n \"http://www.w3.org/1998/Math/MathML\",\n type\n );\n break;\n case \"script\":\n nextResource = ownerDocument.createElement(\"div\");\n nextResource.innerHTML = \" + +``` + +--- + +## Sources + +- [Origami Simulator - GitHub](https://github.com/amandaghassaei/OrigamiSimulator) +- [Origami Simulator - Live Demo](https://origamisimulator.org/) +- [OrigamiOdyssey - React + R3F Origami App](https://github.com/robbwdoering/origamiodyssey) +- [georgiee/origami - Three.js Origami Builder](https://github.com/georgiee/origami) +- [flat-folder - Flat-Foldable State Computation](https://github.com/origamimagiro/flat-folder) +- [crease - SVG Crease Pattern Editor](https://github.com/mwalczyk/crease) +- [FOLD File Format - GitHub](https://github.com/edemaine/fold) +- [FOLD Specification](https://edemaine.github.io/fold/doc/spec.html) +- [FOLD npm package](https://www.npmjs.com/package/fold) +- [react-three-fiber - GitHub](https://github.com/pmndrs/react-three-fiber) +- [drei - R3F Helpers](https://github.com/pmndrs/drei) +- [R3F Basic Animations Tutorial](https://r3f.docs.pmnd.rs/tutorials/basic-animations) +- [Three.js Lut Documentation](https://threejs.org/docs/examples/en/math/Lut.html) +- [Three.js Vertex Colors Lookup Table Example](https://threejs.org/examples/webgl_geometry_colors_lookuptable.html) +- [Three.js Heatmap on 3D Model - Forum](https://discourse.threejs.org/t/how-to-creating-heatmap-over-3d-model/52744) +- [Three.js Vertex Color BufferGeometry](https://dustinpfister.github.io/2023/01/20/threejs-buffer-geometry-attributes-color/) +- [Three.js Mesh Modifiers (Bend/Twist)](https://github.com/drawcall/threejs-mesh-modifiers) +- [CCapture.js - Canvas Animation Capture](https://github.com/spite/ccapture.js/) +- [use-capture - R3F Recording Hook](https://github.com/gsimone/use-capture) +- [Videos and GIFs with Three.js](https://janakiev.com/blog/videos-and-gifs-with-threejs/) +- [R3F Screenshot Discussion](https://github.com/pmndrs/react-three-fiber/discussions/2054) +- [Headless Three.js Rendering - Forum](https://discourse.threejs.org/t/headless-rendering/14401) +- [Gradio Custom HTML Components Guide](https://www.gradio.app/guides/custom-HTML-components) +- [Gradio Custom Components in Five Minutes](https://www.gradio.app/guides/custom-components-in-five-minutes) +- [Gradio gr.HTML One-Shot Apps](https://huggingface.co/blog/gradio-html-one-shot-apps) +- [Gradio Model3D Component](https://www.gradio.app/docs/gradio/model3d) +- [HuggingFace Static HTML Spaces](https://huggingface.co/docs/hub/spaces-sdks-static) +- [Create Static HF Space with React](https://blog.rednegra.net/2024/10/14/create-a-static-huggingface-space-with-react) +- [Streamlit + R3F Discussion](https://discuss.streamlit.io/t/streamlit-components-wrap-around-react-three-fiber/4749) +- [OriDomi - CSS Paper Folding](http://oridomi.com/) +- [Fast, Interactive Origami Simulation using GPU Computation (Paper)](https://erikdemaine.org/papers/OrigamiSimulator_Origami7/paper.pdf) diff --git a/research/origami/simulation_engines.md b/research/origami/simulation_engines.md new file mode 100644 index 0000000000000000000000000000000000000000..4fbeaaa86ba63720f3eef8f7a5416bd1ea50a5ab --- /dev/null +++ b/research/origami/simulation_engines.md @@ -0,0 +1,65 @@ +# Origami Simulation Engines + +## Ghassaei's Origami Simulator (Top Pick) + +- **URL**: https://origamisimulator.org/ | [GitHub](https://github.com/amandaghassaei/OrigamiSimulator) +- **License**: MIT | **Language**: JavaScript/WebGL + +**Physics model (truss model):** +- Folds all creases simultaneously via iterative constraint solving +- Three constraint types: + - **Distance** — prevent stretching/compressing + - **Face** — prevent shearing + - **Angular** — fold or flatten the sheet +- Each constraint has a **stiffness parameter** (higher = more rigid) +- All computation runs in **GPU fragment shaders** for real-time + +**Strain visualization:** +- Blue (no strain) → Red (max strain) +- Strain = avg percent deviation of distance constraints (Cauchy/engineering strain) + +**I/O**: SVG, FOLD → FOLD, STL, OBJ + +**For us**: Port the truss model physics to NumPy. The constraint system maps directly to our reward signal. + +--- + +## rigid-origami (Existing RL Gym Environment) + +- **GitHub**: https://github.com/belalugaX/rigid-origami +- **Paper**: IJCAI 2023 — "Automating Rigid Origami Design" + +Already has Gym API, PPO, MCTS, evolutionary agents. Formulates origami as a board game on a grid. Validation via triangle-triangle intersection + kinematic checks. + +**For us**: Study the validation logic. The grid-based vertex placement can be our starting point. + +--- + +## SWOMPS (Multi-Physics, MATLAB) + +- **GitHub**: https://github.com/zzhuyii/OrigamiSimulator +- Large deformation + heat transfer + contact detection +- Five different solvers +- Companion dataset generator: https://github.com/zzhuyii/GenerateOrigamiDataSet + +**For us**: Reference for stress/contact physics only. Not directly usable (MATLAB). + +--- + +## Tachi's Software (Foundational, Proprietary) + +- Rigid Origami Simulator, Freeform Origami, Origamizer +- **Origamizer**: universal — can fold ANY 3D polyhedral surface +- Windows-only, proprietary + +**For us**: Algorithms are key references. Origamizer algorithm (Tachi & Demaine, SoCG 2017) proves universality. + +--- + +## Others (Low Priority) + +| Tool | Language | Notes | +|------|----------|-------| +| Origami Editor 3D | Java | GUI editor | +| Oriedita | Java | Crease pattern editor, FOLD I/O | +| VPython Origami | Python | Minimal, unmaintained | diff --git a/research/plan/architecture.md b/research/plan/architecture.md new file mode 100644 index 0000000000000000000000000000000000000000..d629424b09e1cc210da9273434a33207e5092629 --- /dev/null +++ b/research/plan/architecture.md @@ -0,0 +1,474 @@ +# Origami RL Environment — Final Architecture + +## The Idea + +An OpenEnv environment where an LLM learns to design optimal fold patterns for real-world folding problems — solar panel packing, medical stent deployment, shelter construction. The LLM generates a `fold_strategy()` function (code-as-policy, same as the 2048 pattern), which is executed against our origami simulation engine. + +--- + +## 1. Action Space + +Based on the Huzita-Justin axioms and fold type research, we use a **named-fold-level** action space (not raw axioms — too low-level for LLM code generation). + +### Fold Operations Available to the Agent + +```python +class FoldAction: + fold_type: str # "valley", "mountain", "reverse_inside", "reverse_outside", + # "squash", "petal", "pleat", "crimp" + fold_line: FoldLine # Defined by two points OR angle + offset from edge + fold_angle: float # 0-180 degrees (how far to fold) + layer_select: str # "top", "all", "specific" (which layers to fold) +``` + +### Simplified Action Space (Start Here) + +For the **code-as-policy** approach, the LLM writes a function that returns a list of fold instructions: + +```python +def fold_strategy(paper_state: dict) -> list[dict]: + """ + paper_state = { + "width": 1.0, "height": 1.0, + "material": {"name": "mylar", "thickness_mm": 0.05, "youngs_modulus_gpa": 4.0}, + "vertices": [[x,y,z], ...], + "edges": [[v1,v2], ...], + "assignments": ["B","B",...], # current M/V/B assignments + "fold_angles": [0, 0, ...], # current fold angles in degrees + "num_layers_at_center": 1, + "bounding_box": {"x": 1.0, "y": 1.0, "z": 0.0}, + } + + Returns list of fold operations: + [ + {"type": "valley", "line": {"start": [0,0.5], "end": [1,0.5]}, "angle": 180}, + {"type": "mountain", "line": {"start": [0.5,0], "end": [0.5,0.5]}, "angle": 180}, + ... + ] + """ +``` + +### Why This Works + +- LLM can reason about geometry in natural language / code +- Fold operations map directly to the simulation engine +- The strategy function is self-contained (sandbox-safe) +- Same pattern as 2048 — proven with GRPO training + +--- + +## 2. State Representation + +Based on FOLD format (the standard) + bar-and-hinge physics model. + +### Internal State (Simulation Engine) + +```python +@dataclass +class PaperState: + # Geometry (FOLD format compatible) + vertices: np.ndarray # (N, 3) vertex positions + edges: np.ndarray # (E, 2) edge vertex indices + faces: list[list[int]] # face vertex indices + assignments: list[str] # ["M","V","B","F"] per edge + fold_angles: np.ndarray # (E,) current fold angle per edge, degrees + + # Physics + rest_lengths: np.ndarray # (E,) original edge lengths + strain: np.ndarray # (N,) per-vertex Cauchy strain + energy: float # total elastic energy + + # Layer tracking + face_orders: list[tuple] # [(f1, f2, +1/-1), ...] layer ordering + num_layers: int # max layer count + + # Material + material: Material # thickness, Young's modulus, max_strain + + # Metrics (computed after each fold) + bounding_box: np.ndarray # (3,) folded bounding box dimensions + deployment_ratio: float # folded_area / unfolded_area + is_valid: bool # no self-intersections, theorems satisfied + kawasaki_violation: float # sum of angle violations + maekawa_violation: float # sum of M-V violations + self_intersections: int # count of face-face penetrations +``` + +### Observation (What the LLM Sees via Prompt) + +```python +class OrigamiObservation(Observation): + paper_state: dict # Serialized PaperState (simplified) + task: dict # What to optimize + metrics: dict # Current scores + fold_history: list[dict] # Previous folds applied + error: str | None # If last fold was invalid, why +``` + +### Text Prompt Format + +``` +TASK: Fold a 1m x 1m Mylar sheet to minimize packed volume while maintaining deployability. + +MATERIAL: + - Name: Mylar (space-grade) + - Thickness: 0.05mm + - Young's modulus: 4 GPa + - Max strain before failure: 3% + +CONSTRAINTS: + - Must pack into bounding box <= 15cm x 15cm x 5cm + - Must deploy to >= 0.8m^2 area when unfolded + - Maximum 20 fold operations + - No self-intersections allowed + +CURRENT STATE: + - Sheet: 1.0m x 1.0m, flat (0 folds applied) + - Bounding box: 1.0m x 1.0m x 0.0m + - Deployment ratio: 1.0 (fully deployed) + - Strain: 0.0 (no stress) + +Write a fold_strategy(paper_state) function that returns a list of fold operations. +Each fold: {"type": "valley"|"mountain", "line": {"start": [x,y], "end": [x,y]}, "angle": 0-180} +``` + +--- + +## 3. Physics Engine + +Based on the bar-and-hinge model (Ghassaei's approach, ported to NumPy). + +### Module Layout + +``` +engine/ + paper.py -> Paper data structure, FOLD I/O + fold_engine.py -> Apply fold operations to paper geometry + physics.py -> Bar-and-hinge energy computation, strain calculation + validation.py -> Kawasaki, Maekawa, self-intersection checks + metrics.py -> Deployment ratio, compactness, shape similarity + materials.py -> Material definitions (paper, mylar, aluminum, etc.) +``` + +### Fold Execution Pipeline + +``` +Input: FoldAction (type, line, angle) + | + +-- 1. Validate fold line (does it intersect the paper?) + +-- 2. Determine affected vertices (which side of fold line) + +-- 3. Apply rotation to affected vertices + | - Rotate around fold line by fold_angle + | - Using quaternion rotation for numerical stability + +-- 4. Update edge assignments (M/V based on fold type) + +-- 5. Update fold angles array + +-- 6. Compute new face topology (split faces at fold line if needed) + +-- 7. Run physics step + | - Compute bar energies (stretching) + | - Compute facet hinge energies (panel bending) + | - Compute fold hinge energies (crease folding) + | - Iterative solver: minimize total energy + +-- 8. Compute strain per vertex + +-- 9. Check validity + | - Kawasaki theorem at all vertices + | - Maekawa theorem at all vertices + | - Self-intersection detection (triangle-triangle) + +-- 10. Update metrics + | - Bounding box, deployment ratio, layer count + | + Output: Updated PaperState + validity report +``` + +### Energy Formulation (from research) + +```python +# Bar-and-hinge model: three energy components +E_total = E_bar + E_facet + E_fold + +E_bar = sum_bars (1/2) * k_axial * (L - L0)^2 # stretching +E_facet = sum_facets (1/2) * k_facet * l * (theta - pi)^2 # panel bending +E_fold = sum_folds (1/2) * k_fold * l * (rho - rho_target)^2 # crease folding + +# Stiffness parameters (from material properties) +k_axial = E * t * w / L0 +k_facet = E * t^3 / (12 * (1 - nu^2)) +k_fold = kappa # crease torsional stiffness +``` + +### Strain Computation (Ghassaei's formula) + +```python +def compute_strain(vertices, edges, rest_lengths): + """Per-vertex Cauchy strain = avg percent deviation of edge lengths.""" + strain = np.zeros(len(vertices)) + for v_idx in range(len(vertices)): + neighbor_edges = get_edges_at_vertex(v_idx, edges) + deviations = [] + for e_idx in neighbor_edges: + v1, v2 = edges[e_idx] + L = np.linalg.norm(vertices[v1] - vertices[v2]) + L0 = rest_lengths[e_idx] + deviations.append(abs(L - L0) / L0) + strain[v_idx] = np.mean(deviations) if deviations else 0.0 + return strain +``` + +--- + +## 4. Reward Functions + +Three reward functions (same pattern as 2048): + +### Reward 1: `code_valid(completions)` + +Does the LLM output compile and produce valid fold instructions? + +| Condition | Score | +|-----------|-------| +| Valid function returning fold list | +1.0 | +| Correct structure but exec fails | -0.5 | +| No function / syntax error | -2.0 | +| Non-stdlib imports | -20.0 | + +### Reward 2: `physically_valid(completions)` + +Are the folds physically possible? + +| Condition | Score | +|-----------|-------| +| All folds valid, no violations | +1.0 | +| Per Kawasaki violation | -2.0 each | +| Per Maekawa violation | -2.0 each | +| Any self-intersection | -5.0 | +| Strain exceeds material limit | -1.0 | +| Function broken / can't run | 0.0 | + +### Reward 3: `fold_quality(completions)` + +How good is the folding solution? + +| Condition | Score | +|-----------|-------| +| Compactness (1 - deployment_ratio) | +20.0 * compactness | +| Meets volume constraint (fits in target box) | +10.0 bonus | +| Deployable (can unfold cleanly) | +5.0 bonus | +| Per fold (efficiency penalty) | -0.5 each | +| High strain (material stress) | -3.0 * (max_strain / limit) | +| Timeout (>5 sec) | -1.0 | +| Exception during execution | -3.0 | + +--- + +## 5. OpenEnv Integration + +### Server: OrigamiEnvironment + +```python +class OrigamiEnvironment(Environment[OrigamiAction, OrigamiObservation, OrigamiState]): + + def reset(self, seed=None, episode_id=None, **kwargs): + task = self._sample_task() + self._paper = create_flat_sheet(task["width"], task["height"], task["material"]) + self._task = task + self._fold_history = [] + return self._make_observation() + + def step(self, action: OrigamiAction, **kwargs): + # Extract and sandbox the fold strategy code + strategy_fn = sandbox_execute(action.fold_code) + folds = strategy_fn(self._paper.to_dict()) + + # Apply each fold + for fold in folds: + result = self._engine.apply_fold(self._paper, fold) + if not result.valid: + return self._make_observation(error=result.error, done=True, reward=-5.0) + self._paper = result.new_state + self._fold_history.append(fold) + + # Compute final metrics and reward + metrics = self._compute_metrics() + reward = self._compute_reward(metrics) + return self._make_observation(done=True, reward=reward) +``` + +### Task Pool (Curriculum) + +```python +TASK_POOL = [ + # Level 1: Simple folds + {"name": "half_fold", "width": 1.0, "height": 1.0, + "material": "paper", "target_ratio": 0.5, "max_folds": 3}, + + # Level 2: Multi-fold packing + {"name": "letter_fold", "width": 1.0, "height": 1.0, + "material": "paper", "target_ratio": 0.33, "max_folds": 5}, + + # Level 3: Miura-ori discovery + {"name": "solar_panel", "width": 1.0, "height": 1.0, + "material": "mylar", "target_ratio": 0.05, "max_folds": 20, + "must_deploy": True, "target_box": [0.15, 0.15, 0.05]}, + + # Level 4: Constrained engineering + {"name": "stent_fold", "width": 0.1, "height": 0.03, + "material": "nitinol", "target_shape": "cylinder", + "deployed_diameter": 0.01, "compressed_diameter": 0.003}, +] +``` + +--- + +## 6. Rendering Pipeline + +### Training Time (Server-Side, Headless) + +```python +# matplotlib — fast, no GPU needed +def render_crease_pattern_2d(state) -> Image: + """M=red dashed, V=blue dash-dot, B=black solid""" + +def render_folded_3d(state) -> Image: + """3D wireframe with strain colors (blue->red)""" +``` + +### Demo Time (Client-Side, React + Three.js) + +``` +React App (Docker Space on HF) ++-- CreasePatternPanel (SVG, left) +| +-- Edges colored by M/V/B assignment ++-- FoldedView3D (@react-three/fiber, right) +| +-- BufferGeometry with vertex colors (strain heatmap) +| +-- OrbitControls for rotation +| +-- Animation: step through fold sequence ++-- MetricsDashboard (bottom) +| +-- Compactness, fold count, strain, validity ++-- MaterialSelector (sidebar) + +-- Paper, Mylar, Aluminum, Nitinol +``` + +### Tech Stack + +| Component | Library | +|-----------|---------| +| 3D scene | @react-three/fiber | +| Controls | @react-three/drei | +| Strain heatmap | Three.js Lut + vertex colors | +| 2D crease pattern | Inline SVG | +| Screenshots | canvas.toDataURL() | +| Recording | CCapture.js / MediaRecorder | +| HF Spaces | Docker Space (FastAPI + static React build) | + +--- + +## 7. Project Structure + +``` +origami/ + research/ # All research docs + research.md # Index + openenv/ # OpenEnv framework research + origami/ # Domain research + plan/ # Architecture docs + + engine/ # Core simulation (numpy/scipy only) + __init__.py + paper.py # Paper data structure, FOLD I/O + fold_engine.py # Apply folds (quaternion rotation) + physics.py # Bar-and-hinge energy, strain + validation.py # Kawasaki, Maekawa, self-intersection + metrics.py # Deployment ratio, compactness + materials.py # Material definitions + + environment/ # OpenEnv server + __init__.py + models.py # Action, Observation, State + origami_environment.py # Environment (reset/step/state) + tasks.py # Task pool / curriculum + app.py # create_app() + Dockerfile + requirements.txt + + client/ # OpenEnv client + training bridge + __init__.py + client.py # EnvClient subclass + reward_functions.py # code_valid, physically_valid, fold_quality + + renderer/ # Visualization + server_render.py # matplotlib headless + web/ # React app + package.json + src/ + App.tsx + CreasePattern.tsx # 2D SVG view + FoldedView3D.tsx # R3F 3D view + StrainHeatmap.tsx # Vertex color mapping + FoldAnimation.tsx # Step-through animation + MetricsDashboard.tsx # Scores display + + training/ # Colab notebook + train_origami.ipynb # GRPO training (Unsloth + TRL) + prompts.py # LLM prompt templates + + openenv.yaml # Manifest + pyproject.toml + README.md +``` + +--- + +## 8. Implementation Order + +### Phase 1: Engine (first) +1. `paper.py` — Paper class, flat sheet creation, FOLD JSON serialize +2. `fold_engine.py` — Valley/mountain folds via quaternion rotation +3. `validation.py` — Kawasaki check, Maekawa check, basic self-intersection +4. `metrics.py` — Bounding box, deployment ratio, fold count +5. Test: fold a sheet in half, verify metrics + +### Phase 2: OpenEnv Server +1. `models.py` — Pydantic models +2. `origami_environment.py` — reset/step +3. `app.py` + `Dockerfile` +4. `tasks.py` — 3-4 tasks +5. Test: curl the server, verify reset/step + +### Phase 3: Reward + Training +1. `reward_functions.py` — three reward functions +2. `prompts.py` — prompt template +3. `train_origami.ipynb` — Colab GRPO notebook +4. Test: few training steps, verify rewards + +### Phase 4: Rendering + Demo +1. `server_render.py` — matplotlib 2D + 3D +2. React app scaffold — R3F + SVG +3. Docker Space deployment +4. Record 1-minute demo video + +--- + +## 9. Decisions (Locked) + +| Decision | Choice | Why | +|----------|--------|-----| +| LLM interaction | Code-as-policy | Proven with 2048, hackathon expects it | +| Action space | Named fold ops + line + angle | Right level for LLM code gen | +| State format | FOLD-compatible JSON | Industry standard | +| Physics | Bar-and-hinge (NumPy) | Fast for RL, captures strain | +| Validation | Kawasaki + Maekawa + tri-tri intersection | Sound, polynomial time | +| Primary task | Solar panel packing | Unique, real-world, great demo | +| Training render | matplotlib headless | No GPU needed | +| Demo render | React + @react-three/fiber | Interactive, strain heatmap | +| Training | GRPO via TRL + Unsloth | Required by hackathon | +| Deployment | Docker Space on HF | Full control | + +--- + +## 10. Why This Wins + +1. **Unique** — nobody else doing origami RL +2. **Real-world** — NASA solar panels, medical stents, deployable shelters +3. **Demoable** — visual folding animation, strain heatmap, 1-min video +4. **Technically deep** — bar-and-hinge physics, Kawasaki/Maekawa math, material science +5. **Scalable** — FOLD format standard, material system, task curriculum +6. **Multi-statement** — Statement 2 (long-horizon planning) + Statement 3.1 (world modeling) + Statement 4 (self-improvement via curriculum) diff --git a/research/plan/openenv_arch.md b/research/plan/openenv_arch.md new file mode 100644 index 0000000000000000000000000000000000000000..61c9c738a96a388f32c75563cfde5387befc07a7 --- /dev/null +++ b/research/plan/openenv_arch.md @@ -0,0 +1,1200 @@ +```markdown +# OpenEnv Environment Architecture — Origami RL + +> Updated plan reflecting actual OpenEnv patterns (from 2048 reference), +> proper rendering strategy (Three.js viewer, not matplotlib), +> and clear separation between training vs demo contexts. + +--- + +## 1. Overview + +Two distinct contexts use the SAME server code: + +``` +CONTEXT 1: RL TRAINING (Colab/GPU machine) +┌──────────────────────────────────────────────────────────┐ +│ Colab Notebook │ +│ │ +│ ┌──────────────────┐ ┌────────────────────────────┐ │ +│ │ GRPOTrainer │ │ OpenEnv Server (subprocess)│ │ +│ │ │ │ port 9000 │ │ +│ │ LLM generates │ │ │ │ +│ │ fold_strategy() │───▶│ reset() → step() → state │ │ +│ │ │◀───│ returns: paper_state + │ │ +│ │ Reward functions │ │ metrics + reward │ │ +│ │ score the result │ │ │ │ +│ └──────────────────┘ │ NO RENDERING │ │ +│ │ Just geometry + numbers │ │ +│ └────────────────────────────┘ │ +└──────────────────────────────────────────────────────────┘ + +CONTEXT 2: DEMO / HACKATHON (HF Space + Browser) +┌──────────────────────────────────────────────────────────┐ +│ HF Space (Docker) │ +│ │ +│ ┌────────────────────────────────────────────────────┐ │ +│ │ FastAPI via create_app() │ │ +│ │ │ │ +│ │ /ws → OpenEnv WebSocket protocol │ │ +│ │ /reset, /step, /state → OpenEnv HTTP (stateless) │ │ +│ │ /health, /schema → OpenEnv metadata │ │ +│ │ /web → OpenEnv built-in generic UI │ │ +│ │ /viewer → Three.js origami viewer │ │ +│ └──────────────────┬─────────────────────────────────┘ │ +│ │ │ +│ ┌──────────────────▼─────────────────────────────────┐ │ +│ │ OrigamiEnvironment │ │ +│ │ reset() / step() / state │ │ +│ │ │ │ +│ │ ┌──────────┐ ┌──────────────────┐ │ │ +│ │ │ Engine │ │ Task System │ │ │ +│ │ │ │ │ │ │ │ +│ │ │ paper │ │ task pool │ │ │ +│ │ │ fold │ │ materials │ │ │ +│ │ │ physics │ │ curriculum │ │ │ +│ │ │ validate │ │ │ │ │ +│ │ │ metrics │ │ │ │ │ +│ │ └──────────┘ └──────────────────┘ │ │ +│ └────────────────────────────────────────────────────┘ │ +│ │ +│ ┌────────────────────────────────────────────────────┐ │ +│ │ Three.js Viewer (static HTML/JS, served by same │ │ +│ │ FastAPI at /viewer) │ │ +│ │ │ │ +│ │ Connects to /ws → receives paper_state │ │ +│ │ Renders: 2D crease (Canvas) + 3D mesh (WebGL) │ │ +│ │ + strain heatmap (vertex colors) + animation │ │ +│ └────────────────────────────────────────────────────┘ │ +└──────────────────────────────────────────────────────────┘ + +Browser opens /viewer → sees origami fold live in 3D +``` + +### Key Design Decisions + +1. **No server-side image rendering.** No matplotlib, no Pillow, no imageio. + The server returns FOLD JSON data (vertices, edges, faces, strain) in every + observation. Rendering happens in the browser via Three.js (demo) or not at + all (training). + +2. **`render_urls` removed from Observation.** The old design saved PNGs to disk + and returned file paths — nobody fetched them during training (wasted CPU/disk). + Instead, `paper_state` IS the render data. The Three.js viewer reads it directly. + +3. **Same server code for both contexts.** The only difference is who consumes it: + - Training: Python reward functions read `paper_state.metrics` → compute reward + - Demo: Three.js reads `paper_state.vertices_coords` → renders 3D mesh + +4. **`openenv push`** deploys to HF Spaces. Sets `ENABLE_WEB_INTERFACE=true` + which gives us the built-in generic UI at `/web`. Our custom Three.js viewer + is served as static files at `/viewer`. + +--- + +## 2. Repository Structure + +``` +origami_env/ # THE deliverable — one package +│ +├── server/ # Python backend (OpenEnv server) +│ │ +│ ├── engine/ # Origami simulation core +│ │ ├── __init__.py +│ │ ├── paper.py # PaperState dataclass, FOLD I/O, create_flat_sheet() +│ │ ├── fold.py # apply_fold() — quaternion rotation, face splitting +│ │ ├── physics.py # Bar-and-hinge Verlet solver, strain computation +│ │ ├── validation.py # Kawasaki, Maekawa, self-intersection detection +│ │ ├── metrics.py # ALL metrics — compactness, strain, shape, deployability +│ │ └── materials.py # Material presets + stiffness parameter derivation +│ │ +│ ├── renderer/ # Minimal — FOLD JSON export only (no images) +│ │ ├── __init__.py +│ │ └── exporter.py # FOLD JSON export, OBJ export +│ │ +│ ├── models.py # OpenEnv types: OrigamiAction, OrigamiObservation, OrigamiState +│ ├── origami_environment.py # Environment class (subclasses openenv Environment) +│ ├── tasks.py # Task pool, curriculum levels, difficulty sampling +│ ├── app.py # create_app() + mount static viewer +│ ├── __init__.py +│ ├── requirements.txt # openenv-core, numpy, scipy, pydantic (NO matplotlib) +│ └── Dockerfile +│ +├── viewer/ # Three.js origami viewer (static files) +│ ├── index.html # Single page: 2D + 3D + metrics + controls +│ ├── origami-viewer.js # Three.js rendering from FOLD data +│ └── style.css # Layout styles +│ +├── client/ # OpenEnv client (for RL training) +│ ├── __init__.py +│ ├── client.py # OrigamiEnvClient (EnvClient subclass, WebSocket) +│ └── reward_functions.py # code_valid, no_cheating, fold_quality (GRPO rewards) +│ +├── training/ # GRPO training script (runs on Colab) +│ └── train_grpo.py # Launches server, runs GRPOTrainer (2048 pattern) +│ +├── openenv.yaml # Manifest for openenv push +├── pyproject.toml +└── README.md +``` + +### What Changed from Previous Plan + +| Before | After | Why | +|--------|-------|-----| +| `renderer/render_2d.py` (matplotlib) | REMOVED | Browser renders via Three.js | +| `renderer/render_3d.py` (matplotlib) | REMOVED | Browser renders via Three.js | +| `renderer/screenshots.py` (PNG capture) | REMOVED | No server-side images | +| `renderer/recorder.py` (GIF via imageio) | REMOVED | Browser can record (MediaRecorder) | +| `web/` (React + R3F) | `viewer/` (plain HTML + Three.js) | Simpler, no build step, same quality | +| `render_urls` in Observation | REMOVED | paper_state IS the render data | +| matplotlib, Pillow, imageio deps | REMOVED | Lighter Docker image | + +--- + +## 3. Pydantic Models (`server/models.py`) + +### OrigamiAction + +```python +class OrigamiAction(Action): + """One fold operation. Sent by the client each step.""" + # metadata: Dict[str, Any] (inherited from Action) + + fold_type: str = "valley" # "valley" | "mountain" | "pleat" | "crimp" | "stop" + fold_line: Dict[str, List[float]] # {"start": [x,y], "end": [x,y]} (normalized 0-1) + fold_angle: float = 180.0 # degrees, 0-180 + layer_select: str = "all" # "all" | "top" | "bottom" +``` + +### OrigamiObservation + +```python +class OrigamiObservation(Observation): + """Everything the LLM and Three.js viewer need.""" + # done: bool (inherited from Observation) + # reward: float|None (inherited from Observation) + # metadata: Dict (inherited from Observation) + + task: Dict[str, Any] # Task definition + paper_state: Dict[str, Any] # FOLD-compatible geometry + physics + # { + # "vertices_coords": [[x,y,z], ...], + # "edges_vertices": [[v1,v2], ...], + # "faces_vertices": [[v0,v1,v2,...], ...], + # "edges_assignment": ["M","V","B","F",...], + # "edges_foldAngle": [180, -180, 0, ...], + # "num_vertices": 36, "num_edges": 85, "num_faces": 50, + # "bounding_box": [0.5, 1.0, 0.02], + # "num_layers": 2, + # "width": 1.0, "height": 1.0, + # "material": {"name": "paper", ...}, + # "strain_per_vertex": [0.001, 0.005, ...], + # "energy": {"total": 0.12, "bar": 0.05, "facet": 0.03, "fold": 0.04}, + # "fold_count": 2, + # } + metrics: Dict[str, Any] # All computed metrics + fold_history: List[Dict[str, Any]] # History of folds applied + error: Optional[str] = None # Error message if fold failed +``` + +**Note:** No `render_urls`. The `paper_state` dict contains all geometry data +needed for Three.js to render. During training, reward functions read `metrics`. +During demo, the viewer reads `paper_state.vertices_coords` etc. + +### OrigamiState + +```python +class OrigamiState(State): + # episode_id: Optional[str] (inherited from State) + # step_count: int (inherited from State) + + task_name: str = "" + num_folds_applied: int = 0 + is_valid: bool = True + total_reward: float = 0.0 +``` + +### Wire Format (what goes over WebSocket) + +OpenEnv's `serialize_observation()` extracts `done`, `reward`, `metadata` to top level: + +```json +{ + "observation": { + "task": {"name": "half_fold", "width": 1.0, ...}, + "paper_state": { + "vertices_coords": [[0,0,0], [1,0,0], ...], + "edges_vertices": [[0,1], [1,2], ...], + "edges_assignment": ["B", "B", "V", ...], + "strain_per_vertex": [0.001, 0.005, ...], + ... + }, + "metrics": {"compactness": 0.45, "is_valid": true, ...}, + "fold_history": [{"type": "valley", "step": 1, ...}], + "error": null + }, + "reward": null, + "done": false +} +``` + +The Three.js viewer reads `observation.paper_state` → builds mesh. +The reward functions read `observation.metrics` → compute score. +Same data, different consumers. + +--- + +## 4. Engine (`server/engine/`) + +*Unchanged from previous plan. All engine code is already implemented and working.* + +### 4.1 Paper State (`paper.py`) + +FOLD-format compatible dataclass. Key fields: `vertices_coords` (N,3), +`edges_vertices` (E,2), `faces_vertices` (ragged), `edges_assignment`, +`edges_foldAngle`, `rest_lengths`, `rest_positions`, `strain_per_vertex`, +`energy`, `material`, `face_orders`, `num_layers`. + +Key methods: `create_flat_sheet()`, `to_fold_json()`, `from_fold_json()`, +`to_observation_dict()`, `bounding_box`, `triangulated_faces`. + +### 4.2 Fold Operations (`fold.py`) + +10-step pipeline: validate → split faces → classify vertices → quaternion +rotation → update assignments → update angles → update topology → compute +rest lengths → update layers → increment fold_count. + +Pleat = valley + mountain. Crimp = mountain + valley. + +### 4.3 Physics Solver (`physics.py`) + +Bar-and-hinge Verlet integration. Three energy components: +- E_bar (axial springs, prevents stretching) +- E_facet (panel bending, keeps faces flat) +- E_fold (crease rotation, drives folding) + +Numerical stability: force clamping, NaN detection, stiffness caps, +reduced dt=0.005, damping=0.15. + +### 4.4 Validation (`validation.py`) + +- Kawasaki-Justin: alternating angle sum at interior vertices +- Maekawa-Justin: |M - V| = 2 at interior vertices +- Self-intersection: Z-separation + normal alignment check (not simple overlap) +- Strain limits: per-vertex strain vs material.max_strain + +### 4.5 Metrics (`metrics.py`) + +20+ metrics: compactness, deployment_ratio, volume_compaction, packing_efficiency, +fits_target_box, max/mean strain, energy breakdown, fold_count, folding_efficiency, +crease_complexity, is_deployable, deployment_force_estimate, chamfer/hausdorff distance. + +### 4.6 Materials (`materials.py`) + +Four presets: paper, mylar, aluminum, nitinol. Each has thickness, Young's modulus, +max strain, Poisson ratio, density. Derived stiffness properties for physics. + +--- + +## 5. Renderer (`server/renderer/`) + +### What's LEFT (kept) + +```python +# exporter.py — FOLD JSON + OBJ export (lightweight, no image deps) + +def save_fold_json(paper: PaperState, path: str, fold_history: list): + """Export FOLD-format JSON with metadata.""" + +def export_obj(paper: PaperState) -> str: + """Wavefront OBJ for external renderers / 3D printing.""" +``` + +### What's REMOVED + +| File | Was | Why Removed | +|------|-----|-------------| +| `render_2d.py` | matplotlib crease pattern PNG | Three.js viewer renders 2D in browser | +| `render_3d.py` | matplotlib 3D wireframe PNG | Three.js viewer renders 3D in browser | +| `screenshots.py` | Per-step PNG capture to disk | No server-side images needed | +| `recorder.py` | GIF assembly via imageio | Browser can use MediaRecorder API | + +### Dependencies REMOVED from requirements.txt + +``` +matplotlib>=3.7 ← REMOVED +imageio>=2.31 ← REMOVED +Pillow>=10.0 ← REMOVED +``` + +--- + +## 6. Three.js Viewer (`viewer/`) + +Static HTML + JS served by FastAPI at `/viewer`. No build step. No React. +Just one HTML file with embedded Three.js from CDN. + +### Architecture + +``` +Browser opens /viewer + │ + ├── Loads index.html (contains Three.js via CDN) + │ + ├── Connects to /ws (OpenEnv WebSocket) + │ + ├── Sends: {"type": "reset", "task_name": "solar_panel"} + │ + ├── Receives: observation with paper_state + │ + └── Three.js renders: + ├── LEFT PANEL: 2D Crease Pattern (Canvas2D) + │ - edges colored by assignment (M=red, V=blue, B=black, F=gray) + │ - vertices as dots + │ - uses rest_positions[:, :2] + │ + ├── RIGHT PANEL: 3D Folded State (WebGL) + │ - BufferGeometry from vertices_coords + triangulated faces + │ - Vertex colors from strain_per_vertex (blue→red gradient) + │ - OrbitControls (rotate, zoom, pan) + │ - DoubleSide material + │ - Edge overlay (M=red, V=blue, B=black lines) + │ + ├── BOTTOM: Metrics Dashboard + │ - Compactness, strain, fold count, validity, energy + │ + └── CONTROLS + - Task selector dropdown + - Fold input (type, line start/end, angle) + - Reset / Step / Stop buttons + - Animation slider (fold_percent 0→1) +``` + +### Data Flow (Same FOLD Data, Browser Renders) + +``` +Server: env.step(action) + → paper_state = { + vertices_coords: [[x,y,z], ...], ← Three.js positions + faces_vertices: [[0,1,2], ...], ← Three.js index buffer + edges_assignment: ["M","V","B",...], ← Edge colors + strain_per_vertex: [0.01, ...], ← Vertex colors + edges_foldAngle: [180, -180, ...], ← Fold visualization + } + → sent via WebSocket as JSON + +Browser: viewer receives paper_state + → positions = new Float32Array(vertices_coords.flat()) + → indices = new Uint16Array(triangulated_faces.flat()) + → colors = strainToColor(strain_per_vertex) // blue→red + → geometry.setAttribute('position', ...) + → geometry.setIndex(...) + → geometry.setAttribute('color', ...) + → renderer.render(scene, camera) +``` + +### Key Three.js Pattern (from origami simulator reference) + +```javascript +// Build mesh from FOLD data +function updateMesh(paperState) { + const vertices = paperState.vertices_coords; + const faces = paperState.faces_vertices; + const strain = paperState.strain_per_vertex; + + // Triangulate faces (server already provides triangulated) + const positions = new Float32Array(vertices.flat()); + const indices = []; + for (const face of faces) { + // Fan triangulation for polygons > 3 vertices + for (let i = 1; i < face.length - 1; i++) { + indices.push(face[0], face[i], face[i + 1]); + } + } + + // Strain → vertex colors (blue=0, red=max) + const colors = new Float32Array(vertices.length * 3); + const maxStrain = Math.max(...strain, 0.001); + for (let i = 0; i < vertices.length; i++) { + const t = Math.min(strain[i] / maxStrain, 1.0); + colors[i * 3] = t; // R + colors[i * 3 + 1] = 0.2; // G + colors[i * 3 + 2] = 1.0 - t; // B + } + + geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3)); + geometry.setIndex(indices); + geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3)); + geometry.computeVertexNormals(); +} + +// Draw crease edges +function drawCreaseEdges(paperState) { + const edgeColors = { M: 0xe74c3c, V: 0x3498db, B: 0x2c3e50 }; + for (let i = 0; i < paperState.edges_vertices.length; i++) { + const [v1, v2] = paperState.edges_vertices[i]; + const assignment = paperState.edges_assignment[i]; + if (assignment in edgeColors) { + // Draw line from vertices[v1] to vertices[v2] + } + } +} +``` + +--- + +## 7. Environment (`server/origami_environment.py`) + +```python +class OrigamiEnvironment(Environment[OrigamiAction, OrigamiObservation, OrigamiState]): + SUPPORTS_CONCURRENT_SESSIONS = False + + def __init__(self, renders_dir: str = "renders", **kwargs): + super().__init__(**kwargs) + self._paper = None + self._task = None + self._fold_history = [] + self._metrics = {} + self._error = None + self._episode_id = None + self._step_count = 0 + self._total_reward = 0.0 + + def reset(self, seed=None, episode_id=None, **kwargs) -> OrigamiObservation: + self._episode_id = episode_id or str(uuid.uuid4()) + self._step_count = 0 + self._fold_history = [] + self._error = None + self._total_reward = 0.0 + + # Sample task + task_name = kwargs.get("task_name") + self._task = get_task_by_name(task_name) or sample_task(seed=seed) + + # Create flat sheet + self._paper = create_flat_sheet( + self._task["width"], self._task["height"], + MATERIALS[self._task["material"]] + ) + + # Initial validation + metrics + self._validation = validate_state(self._paper) + self._metrics = compute_all_metrics(self._paper, self._task, self._validation) + + return self._make_observation(done=False, reward=None) + + def step(self, action: OrigamiAction, timeout_s=None, **kwargs) -> OrigamiObservation: + self._step_count += 1 + self._error = None + + if action.fold_type == "stop": + return self._finalize_episode() + + # Apply fold → physics → validate → metrics + try: + self._paper = apply_fold(self._paper, fold_dict) + self._fold_history.append({**fold_dict, "step": self._step_count}) + except FoldError as e: + self._error = str(e) + return self._make_observation(done=True, reward=-5.0) + + self._paper = simulate(self._paper, fold_percent=1.0) + self._validation = validate_state(self._paper) + self._metrics = compute_all_metrics(self._paper, self._task, self._validation) + + done = self._step_count >= self._task.get("max_folds", 50) + if done: + return self._finalize_episode() + + return self._make_observation(done=False, reward=None) + + @property + def state(self) -> OrigamiState: + return OrigamiState( + episode_id=self._episode_id, + step_count=self._step_count, + task_name=self._task.get("name", "") if self._task else "", + num_folds_applied=len(self._fold_history), + is_valid=self._metrics.get("is_valid", True), + total_reward=self._total_reward, + ) + + def _make_observation(self, done, reward) -> OrigamiObservation: + return OrigamiObservation( + done=done, + reward=reward, + task=self._task or {}, + paper_state=self._paper.to_observation_dict() if self._paper else {}, + metrics=self._metrics, + fold_history=self._fold_history, + error=self._error, + ) +``` + +**Key change:** No `render_urls`, no `capture_step()`, no `capture_episode_summary()`. +The observation contains `paper_state` (all geometry) and `metrics` (all numbers). +That's all anyone needs. + +--- + +## 8. App + Docker (`server/app.py` + `server/Dockerfile`) + +### `app.py` + +```python +"""FastAPI entry point — OpenEnv create_app() + static viewer.""" +import os +from openenv.core.env_server.http_server import create_app +from .origami_environment import OrigamiEnvironment +from .models import OrigamiAction, OrigamiObservation + +app = create_app( + env=lambda: OrigamiEnvironment(), + action_cls=OrigamiAction, + observation_cls=OrigamiObservation, + env_name="origami_env", + max_concurrent_envs=1, +) + +# Serve Three.js viewer as static files +from fastapi.staticfiles import StaticFiles +viewer_dir = os.path.join(os.path.dirname(__file__), "..", "viewer") +if os.path.isdir(viewer_dir): + app.mount("/viewer", StaticFiles(directory=viewer_dir, html=True), name="viewer") +``` + +### `Dockerfile` + +```dockerfile +FROM python:3.11-slim + +WORKDIR /app + +# Python dependencies (lightweight — no matplotlib/Pillow/imageio) +COPY server/requirements.txt ./server/ +RUN pip install --no-cache-dir -r server/requirements.txt + +# Copy server code +COPY server/ ./server/ + +# Copy Three.js viewer (static HTML/JS) +COPY viewer/ ./viewer/ + +WORKDIR /app + +EXPOSE 8000 +CMD ["uvicorn", "server.app:app", "--host", "0.0.0.0", "--port", "8000"] +``` + +When `openenv push` deploys this, it: +1. Moves Dockerfile to repo root +2. Injects `ENV ENABLE_WEB_INTERFACE=true` → enables `/web` (generic OpenEnv UI) +3. Our `/viewer` is the custom Three.js origami viewer + +### `requirements.txt` + +``` +openenv-core>=0.2.1 +numpy>=1.24 +scipy>=1.10 +pydantic>=2.0 +fastapi>=0.100 +uvicorn>=0.22 +websockets>=11.0 +``` + +No matplotlib. No Pillow. No imageio. Docker image drops from ~500MB to ~200MB. + +### `openenv.yaml` + +```yaml +spec_version: 1 +name: origami_env +type: space +runtime: fastapi +app: server.app:app +port: 8000 +``` + +--- + +## 9. RL Training (`training/train_grpo.py`) + +Follows the exact 2048 Unsloth pattern. Runs on Colab with GPU. + +### Flow + +``` +1. Launch OpenEnv server as local subprocess (port 9000) +2. Load LLM model (e.g., gpt-oss-20b with LoRA) +3. Define prompt: "Write a fold_strategy(paper_state) function..." +4. Define 3 reward functions: + - code_valid: Does the code parse? (+1 / -2) + - no_cheating: Only stdlib imports? (+1 / -20) + - fold_quality: Does strategy produce good folds? (scored from metrics) +5. GRPOTrainer trains with these rewards +6. Each reward eval: reset env → run strategy → check metrics +``` + +### The Prompt + +```python +prompt = """ +Write a Python function that folds origami to maximize compactness. +You are given a paper_state dict with vertices, edges, and faces. +Return a fold dict or None to stop: + +```python +def fold_strategy(paper_state): + # paper_state has: vertices_coords, edges_vertices, edges_assignment, + # bounding_box, num_layers, material, strain_per_vertex, fold_count + return { + "type": "valley", # or "mountain" + "line": {"start": [x1, y1], "end": [x2, y2]}, + "angle": 180, + } + # Return None when done folding +``` +Only output the short function `fold_strategy`. +""".strip() +``` + +### Reward Functions + +```python +def fold_quality(completions, **kwargs): + """ + Execute strategy against live environment, score from metrics. + +20.0 if compactness > 0.8 AND valid (optimal folding!) + +5.0 if compactness > 0.5 + +2.0 if function runs but poor result + -1.0 timeout + -3.0 exception + 0 broken function + """ + scores = [] + for completion in completions: + function = extract_function(completion) + if function is None: + scores.append(0) + continue + try: + strategy = create_locked_down_function(function) + # Reset OpenEnv + port, process = launch_openenv(port, process) + result = process.reset() + obs = result.observation + + # Run strategy loop (same as 2048) + while not obs.done: + fold = execute_with_time_limit(5)(strategy)(obs.paper_state) + if fold is None: + action = OrigamiAction(fold_type="stop") + else: + action = OrigamiAction(**fold) + result = process.step(action) + obs = result.observation + + # Score from final metrics + m = obs.metrics + if m.get("compactness", 0) > 0.8 and m.get("is_valid", False): + scores.append(20.0) + elif m.get("compactness", 0) > 0.5: + scores.append(5.0) + else: + scores.append(2.0) + except TimeoutError: + scores.append(-1.0) + except Exception: + scores.append(-3.0) + return scores +``` + +### Key Difference from 2048 + +2048: LLM generates `strategy(board) → action_id` (one action per call, game loops externally) +Origami: LLM generates `fold_strategy(paper_state) → fold_dict | None` (one fold per call, loops externally) + +Same pattern. The reward function resets the env, loops strategy, scores the outcome. + +--- + +## 10. Client (`client/`) + +### `client.py` + +```python +class OrigamiEnvClient(EnvClient[OrigamiAction, OrigamiObservation, OrigamiState]): + + def _step_payload(self, action: OrigamiAction) -> Dict[str, Any]: + return action.model_dump() + + def _parse_result(self, payload: Dict[str, Any]) -> StepResult[OrigamiObservation]: + return StepResult( + observation=OrigamiObservation(**payload.get("observation", {})), + reward=payload.get("reward"), + done=payload.get("done", False), + ) + + def _parse_state(self, payload: Dict[str, Any]) -> OrigamiState: + return OrigamiState(**payload) +``` + +### `reward_functions.py` + +Three reward functions for GRPO: `code_valid`, `no_cheating`, `fold_quality`. +Run on Colab client side, NOT on the server. + +--- + +## 11. Task System (`server/tasks.py`) + +### Curriculum (4 difficulty levels) + +| Level | Task | Material | Target Ratio | Max Folds | Key Challenge | +|-------|------|----------|-------------|-----------|---------------| +| 1 | half_fold | paper | 0.50 | 3 | Learn the format | +| 1 | quarter_fold | paper | 0.25 | 5 | Two perpendicular folds | +| 2 | letter_fold | paper | 0.33 | 5 | Tri-fold, parallel lines | +| 2 | map_fold | paper | 0.125 | 8 | Grid fold, must deploy | +| 3 | solar_panel | mylar | 0.05 | 20 | Miura-ori discovery, deployability | +| 3 | shelter_wall | aluminum | 0.10 | 15 | Rigid material, strain limits | +| 4 | stent | nitinol | 0.09 | 25 | Cylindrical target shape, superelastic | + +--- + +## 12. API Reference + +### Endpoints (auto-generated by create_app()) + +| Endpoint | Method | Source | Purpose | +|----------|--------|--------|---------| +| `/health` | GET | OpenEnv | `{"status": "healthy"}` | +| `/ws` | WebSocket | OpenEnv | Persistent session (reset/step/state) | +| `/reset` | POST | OpenEnv | Stateless reset (creates new env per call) | +| `/step` | POST | OpenEnv | Stateless step (creates new env per call) | +| `/state` | GET | OpenEnv | Get current state | +| `/schema` | GET | OpenEnv | Action + Observation JSON schemas | +| `/metadata` | GET | OpenEnv | Environment name, description, version | +| `/web` | GET | OpenEnv | Built-in generic web UI (when ENABLE_WEB_INTERFACE=true) | +| `/viewer` | GET | Custom | Three.js origami viewer (static files) | + +**Important:** HTTP `/reset` and `/step` are stateless — each creates a fresh env. +For multi-step episodes, use WebSocket `/ws`. This is OpenEnv's design. + +### WebSocket Message Format + +```json +// Client → Server (reset) +{"type": "reset", "task_name": "solar_panel"} + +// Client → Server (step) +{ + "type": "step", + "action": { + "fold_type": "valley", + "fold_line": {"start": [0, 0.5], "end": [1, 0.5]}, + "fold_angle": 180, + "layer_select": "all" + } +} + +// Server → Client (observation) +{ + "type": "observation", + "data": { + "observation": { + "task": {"name": "solar_panel", ...}, + "paper_state": { + "vertices_coords": [[0,0,0], [1,0,0], ...], + "edges_vertices": [[0,1], ...], + "edges_assignment": ["B", "V", ...], + "strain_per_vertex": [0.001, ...], + ... + }, + "metrics": {"compactness": 0.45, ...}, + "fold_history": [...], + "error": null + }, + "reward": null, + "done": false + } +} +``` + +--- + +## 13. Deployment + +### Push to HF Spaces + +```bash +cd origami_env/ +huggingface-cli login +openenv push --repo-id /origami-env +``` + +`openenv push` does: +1. Validates `openenv.yaml` +2. Moves `server/Dockerfile` → root `Dockerfile` +3. Injects `ENV ENABLE_WEB_INTERFACE=true` +4. Adds HF Space frontmatter to README +5. Uploads to HF Spaces (Docker SDK) + +### Or manually via Docker + +```bash +docker build -t origami-env -f server/Dockerfile . +docker run -p 8000:8000 origami-env +curl http://localhost:8000/health +# Open http://localhost:8000/viewer in browser → Three.js origami viewer +``` + +### HF Space README header + +```yaml +--- +title: Origami RL Environment +sdk: docker +app_port: 8000 +base_path: /web +tags: + - openenv +--- +``` + +--- + +## 14. What's Already Implemented vs TODO + +### DONE (engine + server + client) + +- [x] `engine/paper.py` — PaperState, create_flat_sheet, FOLD I/O +- [x] `engine/fold.py` — apply_fold with full 10-step pipeline +- [x] `engine/physics.py` — Bar-and-hinge Verlet solver (stabilized) +- [x] `engine/validation.py` — Kawasaki, Maekawa, self-intersection +- [x] `engine/metrics.py` — 20+ metrics computation +- [x] `engine/materials.py` — 4 material presets +- [x] `models.py` — OpenEnv Action/Observation/State subclasses +- [x] `origami_environment.py` — Environment subclass with reset/step/state +- [x] `tasks.py` — 7 tasks across 4 difficulty levels +- [x] `app.py` — create_app() integration +- [x] `client/client.py` — EnvClient subclass +- [x] `client/reward_functions.py` — GRPO reward functions +- [x] `renderer/exporter.py` — FOLD JSON + OBJ export +- [x] `openenv.yaml`, `pyproject.toml`, `Dockerfile` + +### TODO + +- [x] Remove matplotlib rendering (render_2d, render_3d, screenshots, recorder) +- [x] Remove render_urls from OrigamiObservation +- [x] Remove matplotlib/Pillow/imageio from requirements.txt +- [x] Update origami_environment.py to not call capture_step() +- [x] Build Three.js viewer (`viewer/index.html`) +- [x] Update Dockerfile to copy viewer/ +- [x] Write `training/train_grpo.py` (2048 pattern) +- [x] Test openenv validate (passes: "Ready for multi-mode deployment") + +--- + +## 15. Training Grid Viewer — Live Spectator for RL Training + +### 15.1 Concept + +During GRPO training, the trainer generates G completions (strategies) per prompt. +Each strategy runs a full episode (reset → fold → fold → ... → stop). +The **Training Grid Viewer** shows ALL G episodes simultaneously as a live grid: + +``` +┌──────────┬──────────┬──────────┬──────────┐ +│ EP 1 │ EP 2 │ EP 3 │ EP 4 │ G=4 strategies +│ [3D] │ [3D] │ [3D] │ [3D] │ each cell = mini +│ 📄 fold │ 📄 fold │ ✅ done │ 📄 fold │ Three.js renderer +│ step 2 │ step 5 │ r=20.0 │ step 3 │ + status badge +│ c=0.31 │ c=0.52 │ c=0.85 │ c=0.28 │ + key metrics +└──────────┴──────────┴──────────┴──────────┘ + ↓ click EP 2 +┌────────────────────────────────────────────┐ +│ EP 2 — FULLSCREEN │ +│ [2D crease] [3D folded mesh] │ +│ Full metrics dashboard │ +│ Fold history list │ +│ [Back to Grid] │ +└────────────────────────────────────────────┘ + +Training ends → grid clears → switches to regular /viewer for demo +``` + +### 15.2 Why This Works (Not Computationally Complex) + +| Concern | Reality | +|---------|---------| +| Server CPU | Each episode = pure math (36 vertices, 50 faces). G=8 episodes ~0.8ms total | +| Network | Each observation ~3KB JSON. G=8 × 20 steps = ~480KB per prompt. Negligible | +| Browser GPU | G=8 mini renderers × 36 vertices = 288 vertices total. A game does 100K+ | +| Browser memory | 8 Three.js scenes ≈ 10MB. Tab uses 200MB baseline. Trivial | +| WebGL contexts | Browsers support 8-16 active contexts. G=8 fits. G>8 → use single canvas with viewports | + +### 15.3 Architecture + +``` +COLAB (Training Process) +┌──────────────────────────────────────────────────────┐ +│ │ +│ GRPOTrainer generates G completions per prompt │ +│ ↓ │ +│ TrainingRunner (new) │ +│ ┌──────────────────────────────────────────────┐ │ +│ │ For each completion (can run parallel): │ │ +│ │ env = OrigamiEnvironment() ← in-process │ │ +│ │ obs = env.reset() │ │ +│ │ broadcast(ep_id, obs) ───────────────────┐ │ │ +│ │ while not done: │ │ │ +│ │ fold = strategy(paper_state) │ │ │ +│ │ obs = env.step(action) │ │ │ +│ │ broadcast(ep_id, obs) ─────────────────┤ │ │ +│ │ score = compute_reward(obs.metrics) │ │ │ +│ │ broadcast(ep_id, {done, score}) ─────────┤ │ │ +│ └──────────────────────────────────────────────┘ │ │ +│ │ │ │ +│ ▼ │ │ +│ TrainingBroadcastServer (new, same FastAPI) │ │ +│ ┌────────────────────────────────────────────┐ │ │ +│ │ /ws/training ← viewers connect here │ │ │ +│ │ │ │ │ +│ │ episode_registry: { │ │ │ +│ │ ep_id → {status, obs, score, task} │ │ │ +│ │ } │ │ │ +│ │ │◀──┘ │ +│ │ On update: broadcast to all viewers │ │ +│ │ On viewer connect: send full registry │ │ +│ └────────────────────────────────────────────┘ │ +│ │ +└──────────────────────────────────────────────────────┘ + │ WebSocket + ▼ +BROWSER (Training Grid Viewer) +┌──────────────────────────────────────────────────────┐ +│ /viewer/training.html │ +│ │ +│ Connects to /ws/training │ +│ Receives: {type, episode_id, observation, status} │ +│ │ +│ ┌────────────────────────────────────────────────┐ │ +│ │ CSS Grid: auto-fit, minmax(250px, 1fr) │ │ +│ │ Each cell: │ │ +│ │ - Mini Three.js scene (3D mesh only) │ │ +│ │ - Status badge: 🔄 running / ✅ done / ❌ │ │ +│ │ - Key metrics: compactness, folds, reward │ │ +│ │ - Click → fullscreen (same as /viewer) │ │ +│ └────────────────────────────────────────────────┘ │ +│ │ +│ Header: training progress, batch #, avg reward │ +│ Auto-resize: G=4 → 2×2, G=8 → 4×2, G=16 → 4×4 │ +│ Episode lifecycle: │ +│ new → animate in (fade) → running (blue border) │ +│ → done+good (green) / done+bad (red) │ +│ → next batch → clear + new episodes │ +└──────────────────────────────────────────────────────┘ +``` + +### 15.4 Key Design Decision: In-Process Envs, Not HTTP + +During training, the reward function does NOT call the HTTP server. +It instantiates `OrigamiEnvironment()` directly in Python — zero network overhead. +The broadcast is one-way: training process → viewers. Viewers are read-only spectators. + +```python +# Training runs G episodes in-process (fast) +env = OrigamiEnvironment() +obs = env.reset(task_name="half_fold") + +# After each step, push observation to broadcast queue (async, non-blocking) +broadcast_queue.put_nowait({"episode_id": ep_id, "observation": obs.model_dump()}) + +# Separate asyncio task drains queue → pushes to viewer WebSockets +``` + +This means: +- Training speed is NOT affected by viewers (broadcast is fire-and-forget) +- Viewers can connect/disconnect freely without impacting training +- If no viewers are connected, observations are simply dropped (no queue buildup) + +### 15.5 WebSocket Protocol: `/ws/training` + +``` +Viewer → Server: + (no messages — viewer is read-only spectator) + +Server → Viewer (on connect): + { + "type": "registry", + "batch_id": 12, + "episodes": { + "ep_abc": {"status": "running", "task": "half_fold", "step": 3, + "observation": {...}, "metrics": {...}}, + "ep_def": {"status": "done", "task": "half_fold", "step": 5, + "observation": {...}, "metrics": {...}, "score": 20.0}, + ... + } + } + +Server → Viewer (on episode update): + { + "type": "episode_update", + "episode_id": "ep_abc", + "step": 4, + "status": "running", + "observation": { + "paper_state": {...}, ← Three.js renders this + "metrics": {...}, + "fold_history": [...] + } + } + +Server → Viewer (on episode complete): + { + "type": "episode_done", + "episode_id": "ep_abc", + "status": "success", ← or "timeout", "error" + "score": 20.0, + "final_metrics": {...} + } + +Server → Viewer (on new batch): + { + "type": "batch_start", + "batch_id": 13, + "num_episodes": 4, + "prompt_index": 42 + } + +Server → Viewer (on batch complete): + { + "type": "batch_done", + "batch_id": 13, + "scores": [20.0, 5.0, 2.0, -1.0], + "best_episode_id": "ep_xyz", + "avg_score": 6.5 + } + +Server → Viewer (on training end): + { + "type": "training_done", + "total_batches": 100, + "best_score": 20.0 + } +``` + +### 15.6 New Files Needed + +``` +origami_env/ +├── server/ +│ ├── app.py # UPDATE: mount training.html, add /ws/training +│ └── training_broadcast.py # NEW: TrainingBroadcastServer class +│ - episode_registry: Dict[str, EpisodeInfo] +│ - spectator_clients: List[WebSocket] +│ - publish(episode_id, data) → broadcast to all spectators +│ - connect_spectator(ws) → send registry snapshot +│ - disconnect_spectator(ws) +│ - clear_batch() → reset registry for next batch +│ +├── training/ +│ ├── train_grpo.py # UPDATE: integrate TrainingRunner +│ └── runner.py # NEW: parallel episode executor with broadcast +│ - run_episode(strategy_fn, task, broadcast_fn) → score +│ - run_batch(strategies: List, broadcast_fn) → scores +│ - Uses ThreadPoolExecutor for G parallel episodes +│ - Each step calls broadcast_fn(ep_id, obs) +│ +└── viewer/ + ├── index.html # UNCHANGED — single session demo viewer + └── training.html # NEW — training grid viewer + - CSS grid layout (auto-fit columns) + - Mini Three.js renderer per episode cell + - Status badges + key metrics per cell + - Click-to-fullscreen with [Back to Grid] button + - Training progress header bar + - Auto-clear on batch_start, auto-populate on episode_update +``` + +### 15.7 Changes to Existing Files + +**`server/app.py`** — Add training broadcast endpoint: +```python +from .training_broadcast import TrainingBroadcastServer + +broadcast = TrainingBroadcastServer() + +@app.websocket("/ws/training") +async def training_ws(websocket): + await broadcast.connect_spectator(websocket) + +# Mount training viewer +app.mount("/viewer", StaticFiles(directory=viewer_dir, html=True), name="viewer") +# training.html served at /viewer/training.html automatically +``` + +**`training/train_grpo.py`** — Add broadcast hook to fold_quality: +```python +from origami_env.server.training_broadcast import TrainingBroadcastServer + +# In fold_quality reward function: +# After each env.step(), call: +# broadcast.publish(episode_id, obs) +# This is fire-and-forget; if no viewers, it's a no-op +``` + +### 15.8 Grid Viewer Rendering Strategy + +For G ≤ 8: **One WebGL context per cell** +- Each cell gets a small Three.js renderer (250×200px) +- 8 contexts × 36 vertices = trivial +- Orbit controls disabled in grid (too small), enabled in fullscreen + +For G > 8 (unlikely but handled): **Single canvas with viewport splitting** +- One large Three.js renderer +- Use `renderer.setScissor()` + `renderer.setViewport()` per cell +- Render each scene into its own region +- More efficient, one WebGL context + +**Fullscreen transition:** +``` +Click cell → CSS class "fullscreen" on that cell + → cell expands to 100vw × 100vh (CSS transition) + → renderer.setSize(window.innerWidth, window.innerHeight) + → show 2D crease panel + full metrics (hidden in grid mode) + → show [Back to Grid] button +Click [Back to Grid] → remove "fullscreen" class → shrink back +``` + +### 15.9 Episode Cell Layout (Grid Mode) + +``` +┌─────────────────────────┐ +│ EP abc 🔄 running │ ← header: ID + status badge +│ ┌─────────────────────┐ │ +│ │ │ │ +│ │ Mini 3D Mesh │ │ ← Three.js renderer (~200px tall) +│ │ (strain colors) │ │ +│ │ │ │ +│ └─────────────────────┘ │ +│ step 3 │ c=0.52 │ ✓ │ ← footer: step count, compactness, valid +└─────────────────────────┘ +``` + +### 15.10 TODO + +- [ ] Create `server/training_broadcast.py` (broadcast server + episode registry) +- [ ] Create `training/runner.py` (parallel episode executor with broadcast hooks) +- [ ] Create `viewer/training.html` (grid viewer with mini Three.js renderers) +- [ ] Update `server/app.py` (add `/ws/training` endpoint, mount training viewer) +- [ ] Update `training/train_grpo.py` (integrate runner + broadcast) +- [ ] Test: G=4 parallel episodes broadcasting to grid viewer +- [ ] Test: fullscreen toggle on cell click +- [ ] Test: batch transitions (clear → new episodes → populate) + +``` + diff --git a/research/research.md b/research/research.md new file mode 100644 index 0000000000000000000000000000000000000000..012c2c2a7f077b0f6cfc783e62c483e1edf69f32 --- /dev/null +++ b/research/research.md @@ -0,0 +1,74 @@ +# Origami RL Environment — Research Index + +## What We're Building +An OpenEnv environment where an LLM learns to design optimal origami fold patterns — solar panel packing, deployable structures, medical stents. LLM generates a `fold_strategy()` function (code-as-policy), executed against a bar-and-hinge physics simulation. + +--- + +## Architecture (START HERE) + +| File | What's In It | +|------|-------------| +| **[plan/architecture.md](plan/architecture.md)** | **Full architecture: action space, state, physics, rewards, rendering, project structure, implementation order** | +| **[plan/openenv_arch.md](plan/openenv_arch.md)** | **Complete OpenEnv environment: repo structure, Pydantic models, engine (paper/fold/physics/validation/metrics/materials), renderer (2D/3D/screenshots/GIF recording/export), environment class, React frontend, app+Docker, client, task system, API reference, deployment, testing** | + +### Decisions (Locked) + +| Decision | Choice | +|----------|--------| +| LLM interaction | Code-as-policy (LLM writes `fold_strategy()` function) | +| Action space | Named fold ops (valley/mountain + fold line + angle) | +| State format | FOLD-compatible JSON | +| Physics engine | Bar-and-hinge model (NumPy port of Ghassaei) | +| Validation | Kawasaki + Maekawa + triangle-triangle intersection | +| Primary task | Solar panel packing (Miura-ori discovery) | +| Training render | matplotlib headless | +| Demo render | React + @react-three/fiber | +| Training | GRPO via TRL + Unsloth on Colab | +| Deployment | Docker Space on HF Spaces | + +--- + +## OpenEnv (The Framework) + +| File | What's In It | +|------|-------------| +| [openenv/overview.md](openenv/overview.md) | OpenEnv architecture, API, types, project structure, deployment | +| [openenv/2048_pattern.md](openenv/2048_pattern.md) | Code-as-policy pattern, reward functions, GRPO training | +| [openenv/2048_example.py](openenv/2048_example.py) | Full extracted code from Unsloth 2048 Colab (636 lines) | + +--- + +## Origami Domain Knowledge + +### Quick Reference +| File | What's In It | +|------|-------------| +| [origami/fold_types_deep.md](origami/fold_types_deep.md) | **All fold operations**, Huzita-Justin axioms, crane step-by-step (31 steps), compression patterns (Miura-ori, Kresling, flasher), complexity scaling | +| [origami/math_physics_deep.md](origami/math_physics_deep.md) | **Kawasaki/Maekawa theorems** with code, bar-and-hinge model, energy formulas, strain computation, rigid foldability, computational complexity table | +| [origami/rendering_research.md](origami/rendering_research.md) | **Rendering options**: Ghassaei simulator, OrigamiOdyssey (R3F), Three.js in React, Gradio integration, recording | +| [origami/applications_deep.md](origami/applications_deep.md) | **Real-world apps**: NASA solar panels, JWST, stents, self-folding robots, metamaterials | + +### Earlier Research (Summaries) +| File | What's In It | +|------|-------------| +| [origami/simulation_engines.md](origami/simulation_engines.md) | Ghassaei, rigid-origami Gym env, SWOMPS, Tachi | +| [origami/fold_format.md](origami/fold_format.md) | FOLD file format — JSON standard for crease patterns | +| [origami/physics.md](origami/physics.md) | Physics summary (Kawasaki, Maekawa, simulation approaches) | +| [origami/materials.md](origami/materials.md) | Material properties (paper, mylar, aluminum), stress viz | +| [origami/metrics.md](origami/metrics.md) | All metrics: validity, compactness, stress, shape similarity | +| [origami/existing_work.md](origami/existing_work.md) | Prior work: IJCAI 2023, Nature 2022, UCLA robotics | +| [origami/python_tools.md](origami/python_tools.md) | Libraries: rigid-origami, PyOri, numpy, trimesh | + +--- + +## Deliverables Checklist + +- [ ] Engine: paper.py, fold_engine.py, physics.py, validation.py, metrics.py +- [ ] OpenEnv server: models.py, origami_environment.py, app.py, Dockerfile +- [ ] Reward functions: code_valid, physically_valid, fold_quality +- [ ] Training notebook: Colab with GRPO + Unsloth/TRL +- [ ] Rendering: matplotlib (training) + React/R3F (demo) +- [ ] Deploy to HF Spaces +- [ ] 1-minute demo video on YouTube +- [ ] Public GitHub repo diff --git a/trainer/__init__.py b/server/__init__.py similarity index 100% rename from trainer/__init__.py rename to server/__init__.py diff --git a/server/app.py b/server/app.py new file mode 100644 index 0000000000000000000000000000000000000000..c8ad1c139159e5b95519ff8dd250e2fb66078778 --- /dev/null +++ b/server/app.py @@ -0,0 +1,162 @@ +""" +server/app.py — Training WebSocket server for Colab environment. + +Provides /ws/training for live streaming of RL training episodes to browsers. +Mount at a publicly accessible URL in Colab (e.g., via ngrok or Colab's proxy). + +Usage in training: + from server.app import broadcast + broadcast.publish(episode_id, {"type": "episode_update", ...}) +""" +from __future__ import annotations + +from pathlib import Path + +import uvicorn +from fastapi import FastAPI, HTTPException, WebSocket +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import HTMLResponse +from fastapi.staticfiles import StaticFiles + +from server.training_broadcast import TrainingBroadcastServer + +app = FastAPI(title="Optigami Training Server", version="1.0") + +# Allow cross-origin connections (Colab public URL → browser) +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# Global broadcast server — import and use from training code +broadcast = TrainingBroadcastServer() + + +@app.on_event("startup") +async def _store_loop() -> None: + """Capture the asyncio event loop so training threads can schedule coroutines.""" + import asyncio + broadcast._loop = asyncio.get_running_loop() + + +@app.websocket("/ws/training") +async def training_ws(websocket: WebSocket) -> None: + """Spectator WebSocket endpoint. Viewers connect here to watch training.""" + await broadcast.connect_spectator(websocket) + + +@app.get("/health") +def health() -> dict: + return { + "status": "ok", + "spectators": broadcast.spectator_count, + "active_episodes": broadcast.active_episodes, + } + + +# ── Demo endpoints (same as openenv_server/app.py so the React UI works) ── + +@app.get("/targets") +def get_targets() -> dict: + from server.tasks import available_task_names, get_task_by_name + return { + name: { + "name": name, + "level": t["difficulty"], + "description": t.get("description", ""), + "n_creases": t.get("max_folds", 3), + "difficulty": t["difficulty"], + "material": t.get("material", "paper"), + } + for name in available_task_names() + if (t := get_task_by_name(name)) + } + + +_DEMO_SEQUENCES: dict[str, list[dict]] = { + "half_fold": [{"type": "valley", "line": {"start": [0.0, 0.5], "end": [1.0, 0.5]}, "angle": 180.0}], + "quarter_fold": [{"type": "valley", "line": {"start": [0.0, 0.5], "end": [1.0, 0.5]}, "angle": 180.0}, + {"type": "valley", "line": {"start": [0.5, 0.0], "end": [0.5, 1.0]}, "angle": 180.0}], + "letter_fold": [{"type": "valley", "line": {"start": [0.0, 0.333], "end": [1.0, 0.333]}, "angle": 180.0}, + {"type": "mountain", "line": {"start": [0.0, 0.667], "end": [1.0, 0.667]}, "angle": 180.0}], + "map_fold": [{"type": "valley", "line": {"start": [0.0, 0.5], "end": [1.0, 0.5]}, "angle": 180.0}, + {"type": "mountain", "line": {"start": [0.5, 0.0], "end": [0.5, 1.0]}, "angle": 180.0}], + "solar_panel": [{"type": "valley", "line": {"start": [0.0, 0.25], "end": [1.0, 0.25]}, "angle": 180.0}, + {"type": "mountain", "line": {"start": [0.0, 0.5], "end": [1.0, 0.5]}, "angle": 180.0}, + {"type": "valley", "line": {"start": [0.0, 0.75], "end": [1.0, 0.75]}, "angle": 180.0}], +} + + +@app.get("/episode/demo") +def demo_episode(target: str = "half_fold") -> dict: + from server.origami_environment import OrigamiEnvironment + from server.models import OrigamiAction as NewAction + from server.tasks import get_task_by_name + + folds = _DEMO_SEQUENCES.get(target, _DEMO_SEQUENCES["half_fold"]) + env = OrigamiEnvironment() + obs = env.reset(task_name=target) + steps: list[dict] = [] + + for i, fold_dict in enumerate(folds): + action = NewAction( + fold_type=fold_dict["type"], + fold_line=fold_dict["line"], + fold_angle=float(fold_dict.get("angle", 180.0)), + ) + obs = env.step(action) + steps.append({"step": i + 1, "fold": fold_dict, + "paper_state": obs.paper_state, "metrics": obs.metrics, + "done": obs.done}) + if obs.done: + break + + return {"task_name": target, "task": get_task_by_name(target) or {}, + "steps": steps, "final_metrics": obs.metrics if steps else {}} + + +@app.get("/episode/replay/{ep_id}") +def replay_episode(ep_id: str) -> dict: + """Return a stored training episode in the same format as /episode/demo.""" + from server.tasks import get_task_by_name + ep = broadcast._registry.get(ep_id) + if not ep: + raise HTTPException(status_code=404, detail=f"Episode '{ep_id}' not found in registry") + return { + "task_name": ep.task_name, + "task": get_task_by_name(ep.task_name) or {}, + "steps": ep.steps, + "final_metrics": ep.final_metrics or (ep.steps[-1]["metrics"] if ep.steps else {}), + } + + +# ── Static files — viewer first, then React app (LAST, catch-all) ── + +_VIEWER_DIR = Path(__file__).resolve().parent.parent / "viewer" +_BUILD_DIR = Path(__file__).resolve().parent.parent / "build" + +if _VIEWER_DIR.exists(): + app.mount("/viewer", StaticFiles(directory=str(_VIEWER_DIR), html=True), name="viewer") + + +if _BUILD_DIR.exists(): + app.mount("/", StaticFiles(directory=str(_BUILD_DIR), html=True), name="react") +else: + @app.get("/", include_in_schema=False) + def _no_build() -> HTMLResponse: + return HTMLResponse( + "

React build not found. Run npm run build in the frontend directory.

" + "

Training viewer: /viewer/training.html

" + ) + + +def run(host: str = "0.0.0.0", port: int = 9001) -> None: + """Start the training server. Call from Colab notebook.""" + uvicorn.run(app, host=host, port=port) + + +if __name__ == "__main__": + run() diff --git a/server/models.py b/server/models.py new file mode 100644 index 0000000000000000000000000000000000000000..6d468ca73921b45db9d77ed28f0ba951a2787449 --- /dev/null +++ b/server/models.py @@ -0,0 +1,72 @@ +""" +OpenEnv Pydantic models for the origami RL environment. + +OrigamiAction — one fold per step +OrigamiObservation — everything the LLM and Three.js viewer need +OrigamiState — server-side episode tracking +""" +from __future__ import annotations + +from typing import Any, Optional + +from pydantic import BaseModel, Field + +# openenv base classes — use them if available, fall back to plain Pydantic +try: + from openenv.core.env_server.types import Action, Observation, State +except ImportError: + Action = BaseModel + class State(BaseModel): + """Minimal stand-in for openenv State base class.""" + episode_id: Optional[str] = None + step_count: int = 0 + + class Observation(BaseModel): + """Minimal stand-in for openenv Observation base class.""" + done: bool = False + reward: Optional[float] = None + + +class OrigamiAction(Action): + """One fold operation sent by the client each step.""" + + fold_type: str = Field( + default="valley", + description="'valley' | 'mountain' | 'pleat' | 'crimp' | 'stop'", + ) + fold_line: dict[str, list[float]] = Field( + default_factory=lambda: {"start": [0.0, 0.5], "end": [1.0, 0.5]}, + description="{'start': [x, y], 'end': [x, y]} normalized 0-1", + ) + fold_angle: float = Field( + default=180.0, + description="Fold angle in degrees, 0-180", + ) + layer_select: str = Field( + default="all", + description="'all' | 'top' | 'bottom'", + ) + + +class OrigamiObservation(Observation): + """Everything the LLM and Three.js viewer need. + + paper_state contains FOLD-compatible geometry + physics data. + metrics contains all computed quality metrics. + No render_urls — the browser renders from paper_state directly. + """ + + task: dict[str, Any] = Field(default_factory=dict) + paper_state: dict[str, Any] = Field(default_factory=dict) + metrics: dict[str, Any] = Field(default_factory=dict) + fold_history: list[dict[str, Any]] = Field(default_factory=list) + error: Optional[str] = Field(default=None) + + +class OrigamiState(State): + """Server-side episode tracking.""" + + task_name: str = Field(default="") + num_folds_applied: int = Field(default=0) + is_valid: bool = Field(default=True) + total_reward: float = Field(default=0.0) diff --git a/server/origami_environment.py b/server/origami_environment.py new file mode 100644 index 0000000000000000000000000000000000000000..886e7c97b2b6379d09fa0b8caeb86fa80f70a99c --- /dev/null +++ b/server/origami_environment.py @@ -0,0 +1,221 @@ +""" +OrigamiEnvironment — OpenEnv environment wrapping the origami physics engine. + +Implements reset() / step() / state following the OpenEnv interface. +Engine (physics, fold, validation, metrics) lives in engine/. +No server-side image rendering — paper_state contains all geometry data. +""" +from __future__ import annotations + +import json +import os +import uuid +from typing import Any, Optional + +# openenv base class — fall back to plain object if not installed +try: + from openenv.core.env_server.interfaces import Environment +except ImportError: + from typing import Generic, TypeVar + A = TypeVar("A") + O = TypeVar("O") + S = TypeVar("S") + class Environment(Generic[A, O, S]): + """Minimal stand-in for openenv.core.env_server.interfaces.Environment.""" + def __init__(self, **kwargs): pass + +from engine.paper import Paper +from engine.fold_engine import apply_fold +from engine.physics import simulate +from engine.validation import validate_state +from engine.metrics import compute_all_metrics +from server.models import OrigamiAction, OrigamiObservation, OrigamiState +from server.tasks import get_task_by_name, sample_task + + +def _get_material(name: str): + """Get material by name, falling back to paper.""" + try: + from engine.materials import get_material + return get_material(name) + except Exception: + from engine.materials import get_material + return get_material("paper") + + +class OrigamiEnvironment(Environment[OrigamiAction, OrigamiObservation, OrigamiState]): + """Origami folding RL environment. + + Each episode: agent receives paper_state + task, applies folds one at a + time via step(), receives metrics + reward, ends with 'stop' action or + when max_folds is reached. + """ + + SUPPORTS_CONCURRENT_SESSIONS = False + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self._paper: Optional[Paper] = None + self._task: Optional[dict] = None + self._fold_history: list[dict] = [] + self._metrics: dict = {} + self._validation: dict = {} + self._error: Optional[str] = None + self._episode_id: Optional[str] = None + self._step_count: int = 0 + self._total_reward: float = 0.0 + + # ── reset ───────────────────────────────────────────────────────── + + def reset( + self, + seed: Optional[int] = None, + episode_id: Optional[str] = None, + **kwargs: Any, + ) -> OrigamiObservation: + self._episode_id = episode_id or str(uuid.uuid4()) + self._step_count = 0 + self._fold_history = [] + self._error = None + self._total_reward = 0.0 + + # Select task + task_name = kwargs.get("task_name") + if task_name: + self._task = get_task_by_name(task_name) + if not self._task: + self._task = sample_task(seed=seed) + + # Create flat sheet + mat = _get_material(self._task["material"]) + self._paper = Paper.create_flat_sheet( + width=self._task["width"], + height=self._task["height"], + material=mat, + ) + + # Initial validation + metrics (no physics needed for flat sheet) + self._validation = validate_state(self._paper) + self._metrics = compute_all_metrics(self._paper, self._task, self._validation) + + return self._make_observation(done=False, reward=None) + + # ── step ────────────────────────────────────────────────────────── + + def step( + self, + action: OrigamiAction, + timeout_s: Optional[float] = None, + **kwargs: Any, + ) -> OrigamiObservation: + if self._paper is None or self._task is None: + return self._make_observation(done=True, reward=-5.0) + + self._step_count += 1 + self._error = None + + # ── Stop action ─────────────────────────────────────────────── + if action.fold_type == "stop": + return self._finalize_episode() + + # ── Build fold dict ─────────────────────────────────────────── + fold_dict = { + "type": action.fold_type, + "line": action.fold_line, + "angle": action.fold_angle, + } + + # ── Apply fold ──────────────────────────────────────────────── + new_paper, err = apply_fold(self._paper, fold_dict) + if err: + self._error = err + return self._make_observation(done=True, reward=-5.0) + + self._paper = new_paper + self._fold_history.append({**fold_dict, "step": self._step_count}) + + # ── Physics relaxation ──────────────────────────────────────── + try: + self._paper = simulate(self._paper, fold_percent=1.0) + except Exception as exc: + self._error = f"Physics failed: {exc}" + # Continue — don't abort episode on physics failure + + # ── Validate ────────────────────────────────────────────────── + self._validation = validate_state(self._paper) + + # ── Metrics ─────────────────────────────────────────────────── + self._metrics = compute_all_metrics(self._paper, self._task, self._validation) + + # ── Check termination ───────────────────────────────────────── + max_folds = self._task.get("max_folds", 50) + if self._step_count >= max_folds: + return self._finalize_episode() + + if self._validation.get("self_intersections", 0) > 0: + self._error = "Self-intersection detected" + return self._finalize_episode() + + return self._make_observation(done=False, reward=None) + + # ── state ───────────────────────────────────────────────────────── + + @property + def state(self) -> OrigamiState: + return OrigamiState( + episode_id=self._episode_id, + step_count=self._step_count, + task_name=self._task.get("name", "") if self._task else "", + num_folds_applied=len(self._fold_history), + is_valid=self._metrics.get("is_valid", True), + total_reward=self._total_reward, + ) + + # ── internals ───────────────────────────────────────────────────── + + def _finalize_episode(self) -> OrigamiObservation: + reward = self._compute_reward() + self._total_reward = reward + return self._make_observation(done=True, reward=reward) + + def _make_observation(self, done: bool, reward: Optional[float]) -> OrigamiObservation: + return OrigamiObservation( + done=done, + reward=reward, + task=self._task or {}, + paper_state=self._paper.to_observation_dict() if self._paper else {}, + metrics=self._metrics, + fold_history=self._fold_history, + error=self._error, + ) + + def _compute_reward(self) -> float: + m = self._metrics + reward = 0.0 + + # Compactness is the main signal + reward += m.get("compactness", 0.0) * 20.0 + + # Bonus for fitting in target box + if m.get("fits_target_box", False): + reward += 10.0 + + # Bonus for deployability (if task requires it) + if m.get("is_deployable", False): + reward += 5.0 + + # Penalties for violations + reward -= m.get("kawasaki_violations", 0) * 2.0 + reward -= m.get("maekawa_violations", 0) * 2.0 + reward -= m.get("self_intersections", 0) * 5.0 + + # Penalty for too many folds (encourage efficiency) + reward -= m.get("fold_count", 0) * 0.5 + + # Penalty for exceeding material strain limit + max_strain = m.get("max_strain", 0.0) + strain_limit = self._paper.material.max_strain if self._paper else 0.05 + if max_strain > strain_limit: + reward -= 3.0 * (max_strain / strain_limit) + + return float(reward) diff --git a/server/tasks.py b/server/tasks.py new file mode 100644 index 0000000000000000000000000000000000000000..bbcaa8add7105bd162c0d2bc00b135c303a45a9c --- /dev/null +++ b/server/tasks.py @@ -0,0 +1,123 @@ +""" +Task pool and curriculum for the origami RL environment. + +7 tasks across 4 difficulty levels. +""" +from __future__ import annotations + +import random +from typing import Optional + + +TASKS: dict[str, dict] = { + "half_fold": { + "name": "half_fold", + "description": "Fold a 1x1 paper sheet in half along the horizontal midline.", + "width": 1.0, + "height": 1.0, + "material": "paper", + "target_ratio": 0.50, + "max_folds": 3, + "target_box": [1.0, 0.5, 0.02], + "must_deploy": False, + "difficulty": 1, + }, + "quarter_fold": { + "name": "quarter_fold", + "description": "Fold a 1x1 paper sheet into quarters using two perpendicular folds.", + "width": 1.0, + "height": 1.0, + "material": "paper", + "target_ratio": 0.25, + "max_folds": 5, + "target_box": [0.5, 0.5, 0.04], + "must_deploy": False, + "difficulty": 1, + }, + "letter_fold": { + "name": "letter_fold", + "description": "Fold a 1x1 paper into thirds (letter fold) using two parallel folds.", + "width": 1.0, + "height": 1.0, + "material": "paper", + "target_ratio": 0.33, + "max_folds": 5, + "target_box": [1.0, 0.34, 0.03], + "must_deploy": False, + "difficulty": 2, + }, + "map_fold": { + "name": "map_fold", + "description": "Fold a 1x1 paper into eighths using a grid fold pattern. Must be re-deployable.", + "width": 1.0, + "height": 1.0, + "material": "paper", + "target_ratio": 0.125, + "max_folds": 8, + "target_box": [0.5, 0.25, 0.08], + "must_deploy": True, + "difficulty": 2, + }, + "solar_panel": { + "name": "solar_panel", + "description": "Pack a 1x1 Mylar solar panel into a compact configuration using a Miura-ori style fold. Must deploy.", + "width": 1.0, + "height": 1.0, + "material": "mylar", + "target_ratio": 0.05, + "max_folds": 20, + "target_box": [0.25, 0.25, 0.05], + "must_deploy": True, + "difficulty": 3, + }, + "shelter_wall": { + "name": "shelter_wall", + "description": "Fold a 1x1 aluminum sheet into a compact structural panel within strain limits.", + "width": 1.0, + "height": 1.0, + "material": "aluminum", + "target_ratio": 0.10, + "max_folds": 15, + "target_box": [0.5, 0.25, 0.1], + "must_deploy": False, + "difficulty": 3, + }, + "stent": { + "name": "stent", + "description": "Fold a 0.5x1.5 nitinol sheet into a compact tube configuration for a medical stent. Superelastic material.", + "width": 0.5, + "height": 1.5, + "material": "nitinol", + "target_ratio": 0.09, + "max_folds": 25, + "target_box": [0.1, 0.1, 0.15], + "must_deploy": True, + "difficulty": 4, + }, +} + + +def get_task_by_name(name: str) -> Optional[dict]: + """Return task dict by name, or None if not found.""" + return TASKS.get(name) + + +def sample_task(seed: Optional[int] = None, difficulty: Optional[int] = None) -> dict: + """Sample a random task, optionally filtered by difficulty level.""" + rng = random.Random(seed) + pool = list(TASKS.values()) + if difficulty is not None: + pool = [t for t in pool if t["difficulty"] == difficulty] + if not pool: + pool = list(TASKS.values()) + return dict(rng.choice(pool)) + + +def get_tasks_by_difficulty(level: int) -> list[dict]: + """Return all tasks at a given difficulty level.""" + return [dict(t) for t in TASKS.values() if t["difficulty"] == level] + + +def available_task_names() -> list[str]: + """Return sorted list of all task names.""" + return sorted(TASKS.keys()) diff --git a/server/training_broadcast.py b/server/training_broadcast.py new file mode 100644 index 0000000000000000000000000000000000000000..1d1a2518a0425fa41a41fb450a225fc6e2bc970e --- /dev/null +++ b/server/training_broadcast.py @@ -0,0 +1,216 @@ +""" +TrainingBroadcastServer — fire-and-forget broadcast hub for live training viewer. + +The RL training process calls publish() after each env.step(). +Spectator browsers connect via /ws/training WebSocket. +Broadcast is async and non-blocking: if no viewers are connected, observations are dropped. +""" +from __future__ import annotations + +import asyncio +import json +import logging +from dataclasses import dataclass, field +from typing import Any, Optional + +from fastapi import WebSocket, WebSocketDisconnect + +logger = logging.getLogger(__name__) + + +@dataclass +class EpisodeInfo: + episode_id: str + task_name: str + status: str = "running" # "running" | "done" | "timeout" | "error" + step: int = 0 + observation: dict = field(default_factory=dict) + metrics: dict = field(default_factory=dict) + fold_history: list = field(default_factory=list) + steps: list = field(default_factory=list) # full step history for replay + score: Optional[float] = None + final_metrics: Optional[dict] = None + + +class TrainingBroadcastServer: + """Central hub for broadcasting RL training observations to spectator WebSockets. + + Thread-safe: publish() can be called from training threads (ThreadPoolExecutor). + WebSocket handlers run in the asyncio event loop. + """ + + def __init__(self) -> None: + self._spectators: list[WebSocket] = [] + self._registry: dict[str, EpisodeInfo] = {} + self._batch_id: int = 0 + self._loop: Optional[asyncio.AbstractEventLoop] = None + self._lock = asyncio.Lock() + + # ── Episode publishing (called from training thread / async context) ── + + def publish(self, episode_id: str, data: dict) -> None: + """Fire-and-forget: push an update from the training process. + + Safe to call from any thread. Schedules onto the stored event loop + (set by the FastAPI startup handler). No-op if no loop is available. + """ + loop = self._loop + if loop is None or loop.is_closed(): + return + asyncio.run_coroutine_threadsafe(self._async_publish(episode_id, data), loop) + + async def _async_publish(self, episode_id: str, data: dict) -> None: + msg_type = data.get("type", "episode_update") + + async with self._lock: + if msg_type == "batch_start": + self._batch_id = data.get("batch_id", self._batch_id + 1) + self._registry.clear() + await self._broadcast(data) + return + + if msg_type == "batch_done": + await self._broadcast(data) + return + + if msg_type == "training_done": + await self._broadcast(data) + return + + # episode_update or episode_done + ep = self._registry.setdefault( + episode_id, + EpisodeInfo(episode_id=episode_id, task_name=data.get("task_name", "")), + ) + + if msg_type == "episode_done": + ep.status = data.get("status", "done") + ep.score = data.get("score") + ep.final_metrics = data.get("final_metrics") + else: + step_num = data.get("step", ep.step) + ep.step = step_num + ep.status = "running" + obs = data.get("observation", {}) + ep.observation = obs + ep.metrics = obs.get("metrics", {}) + ep.fold_history = obs.get("fold_history", ep.fold_history) + # Accumulate full step history for /episode/replay + if step_num > 0: + fold_hist = obs.get("fold_history", []) + latest_fold = fold_hist[-1] if fold_hist else {} + ep.steps.append({ + "step": step_num, + "fold": latest_fold, + "paper_state": obs.get("paper_state", {}), + "metrics": obs.get("metrics", {}), + "done": obs.get("done", False), + }) + + await self._broadcast({"episode_id": episode_id, **data}) + + # ── Spectator management ── + + async def connect_spectator(self, websocket: WebSocket) -> None: + """Accept a new viewer WebSocket and serve it until disconnect.""" + await websocket.accept() + + async with self._lock: + self._spectators.append(websocket) + + # Send current registry snapshot immediately + await self._send_registry(websocket) + + try: + while True: + # Viewers are read-only; drain any incoming messages (pings etc) + await asyncio.wait_for(websocket.receive_text(), timeout=30.0) + except (WebSocketDisconnect, asyncio.TimeoutError, Exception): + pass + finally: + await self.disconnect_spectator(websocket) + + async def disconnect_spectator(self, websocket: WebSocket) -> None: + async with self._lock: + self._spectators = [s for s in self._spectators if s is not websocket] + + # ── Batch control ── + + async def start_batch(self, batch_id: int, num_episodes: int, prompt_index: int = 0) -> None: + """Call before starting a new training batch.""" + data = { + "type": "batch_start", + "batch_id": batch_id, + "num_episodes": num_episodes, + "prompt_index": prompt_index, + } + await self._async_publish("__batch__", data) + + async def finish_batch( + self, + batch_id: int, + scores: list[float], + best_episode_id: str = "", + ) -> None: + """Call after all episodes in a batch complete.""" + data = { + "type": "batch_done", + "batch_id": batch_id, + "scores": scores, + "best_episode_id": best_episode_id, + "avg_score": sum(scores) / len(scores) if scores else 0.0, + } + await self._async_publish("__batch__", data) + + async def clear_batch(self) -> None: + """Reset episode registry for next batch.""" + async with self._lock: + self._registry.clear() + + # ── Internals ── + + async def _broadcast(self, message: dict) -> None: + """Send message to all spectators, removing dead connections.""" + if not self._spectators: + return + payload = json.dumps(message, default=str) + dead: list[WebSocket] = [] + for ws in list(self._spectators): + try: + await ws.send_text(payload) + except Exception: + dead.append(ws) + for ws in dead: + self._spectators = [s for s in self._spectators if s is not ws] + + async def _send_registry(self, websocket: WebSocket) -> None: + """Send the full episode registry to a newly connected viewer.""" + async with self._lock: + episodes = { + ep_id: { + "status": ep.status, + "task": ep.task_name, + "step": ep.step, + "observation": ep.observation, + "metrics": ep.metrics, + "score": ep.score, + } + for ep_id, ep in self._registry.items() + } + payload = { + "type": "registry", + "batch_id": self._batch_id, + "episodes": episodes, + } + try: + await websocket.send_text(json.dumps(payload, default=str)) + except Exception: + pass + + @property + def spectator_count(self) -> int: + return len(self._spectators) + + @property + def active_episodes(self) -> int: + return sum(1 for ep in self._registry.values() if ep.status == "running") diff --git a/src/App.css b/src/App.css index 74b5e053450a48a6bdb4d71aad648e7af821975c..1631274e73a4fbc2f4fde20e54234f4eadc07b91 100644 --- a/src/App.css +++ b/src/App.css @@ -1,38 +1,572 @@ -.App { - text-align: center; +:root { + --bg: #0d0d14; + --surface: #13131d; + --surface-2: #1a1a2e; + --paper-white: #fafaf5; + --paper-edge: #2a2a3a; + --mountain: #f59e0b; + --valley: #38bdf8; + --target-ghost: rgba(124, 58, 237, 0.20); + --target-ghost-stroke: rgba(124, 58, 237, 0.45); + --validity: #22d3ee; + --progress: #22c55e; + --economy: #a78bfa; + --text-primary: #f8fafc; + --text-dim: #64748b; + --border: #2a2a3a; + --border-bright: #3a3a5a; + --font-display: 'JetBrains Mono', monospace; + --font-mono: 'IBM Plex Mono', monospace; +} + +.app { + display: flex; + flex-direction: column; + height: 100vh; + background: var(--bg); + overflow: hidden; +} + +/* ─── HEADER ─── */ +.app-header { + display: flex; + align-items: center; + gap: 24px; + padding: 0 20px; + height: 48px; + border-bottom: 1px solid var(--border); + background: var(--surface); + flex-shrink: 0; + z-index: 10; +} + +.app-title { + font-family: var(--font-display); + font-size: 14px; + font-weight: 700; + letter-spacing: 0.12em; + color: var(--text-primary); + white-space: nowrap; +} + +.app-title .title-accent { + color: var(--mountain); +} + +.header-sep { + width: 1px; + height: 24px; + background: var(--border); + flex-shrink: 0; +} + +.header-right { + display: flex; + align-items: center; + gap: 16px; + margin-left: auto; +} + +.replay-badge { + font-size: 10px; + font-family: var(--font-display); + letter-spacing: 0.1em; + color: #38bdf8; + background: rgba(56, 189, 248, 0.1); + border: 1px solid rgba(56, 189, 248, 0.3); + padding: 3px 8px; + border-radius: 3px; +} + +.back-to-grid-btn { + font-size: 10px; + font-family: var(--font-display); + letter-spacing: 0.08em; + color: #64748b; + background: transparent; + border: 1px solid #1e2a3a; + padding: 3px 10px; + border-radius: 3px; + cursor: pointer; } +.back-to-grid-btn:hover { color: #e2e8f0; border-color: #64748b; } -.App-logo { - height: 40vmin; - pointer-events: none; +.api-status { + font-size: 11px; + font-family: var(--font-display); + letter-spacing: 0.08em; + display: flex; + align-items: center; + gap: 6px; +} + +.api-status-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--text-dim); +} + +.api-status-dot.ok { + background: var(--progress); + box-shadow: 0 0 6px var(--progress); } -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } +.api-status-dot.err { + background: #ef4444; + box-shadow: 0 0 6px #ef4444; +} + +/* ─── MAIN LAYOUT ─── */ +.app-body { + display: grid; + grid-template-columns: 1fr 280px; + flex: 1; + overflow: hidden; +} + +.app-left { + display: flex; + flex-direction: column; + overflow: hidden; + border-right: 1px solid var(--border); } -.App-header { - background-color: #282c34; - min-height: 100vh; +.app-right { display: flex; flex-direction: column; + overflow: hidden; + background: var(--surface); +} + +/* ─── CANVAS ROW ─── */ +.canvas-row { + display: flex; + gap: 0; + padding: 16px; + flex-shrink: 0; + border-bottom: 1px solid var(--border); + overflow-x: auto; +} + +.canvas-wrap { + display: flex; + flex-direction: column; + gap: 8px; + flex: 1; + min-width: 280px; +} + +.canvas-wrap + .canvas-wrap { + margin-left: 16px; +} + +.canvas-label { + font-family: var(--font-display); + font-size: 10px; + font-weight: 500; + letter-spacing: 0.14em; + color: var(--text-dim); + text-transform: uppercase; +} + +.canvas-svg { + display: block; + background: var(--paper-white); +} + +.canvas-3d { + display: block; + background: linear-gradient(180deg, #1a1a2e 0%, #0f101a 100%); + border: 1px solid var(--border); +} + +.canvas-label-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; +} + +.fold-mode-toggle { + display: inline-flex; + border: 1px solid var(--border); + background: var(--surface); +} + +.fold-mode-btn { + border: none; + background: transparent; + color: var(--text-dim); + font-family: var(--font-display); + font-size: 9px; + letter-spacing: 0.08em; + padding: 3px 7px; + cursor: pointer; +} + +.fold-mode-btn + .fold-mode-btn { + border-left: 1px solid var(--border); +} + +.fold-mode-btn.active { + color: var(--text-primary); + background: #1f2538; +} + +/* ─── STEP FEED ─── */ +.step-feed-section { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.section-header { + font-family: var(--font-display); + font-size: 10px; + font-weight: 500; + letter-spacing: 0.14em; + color: var(--text-dim); + text-transform: uppercase; + padding: 8px 16px; + border-bottom: 1px solid var(--border); + flex-shrink: 0; +} + +.step-feed { + overflow-y: auto; + flex: 1; + padding: 4px 0; +} + +.step-entry { + display: flex; + flex-direction: column; + gap: 2px; + padding: 8px 16px; + border-bottom: 1px solid var(--border); + cursor: default; + transition: background 0.1s; +} + +.step-entry:hover { + background: var(--surface); +} + +.step-entry.active { + background: var(--surface-2); + border-left: 2px solid var(--valley); + padding-left: 14px; +} + +.step-entry-top { + display: flex; + align-items: center; + gap: 8px; +} + +.step-num { + font-family: var(--font-display); + font-size: 10px; + font-weight: 700; + color: var(--text-dim); + width: 24px; + flex-shrink: 0; +} + +.step-instruction { + font-size: 12px; + color: var(--text-primary); + flex: 1; +} + +.assign-badge { + font-family: var(--font-display); + font-size: 10px; + font-weight: 700; + padding: 1px 5px; + line-height: 1.4; + flex-shrink: 0; +} + +.assign-badge.M { + background: var(--mountain); + color: #0d0d14; +} + +.assign-badge.V { + background: var(--valley); + color: #0d0d14; +} + +.assign-badge.B { + background: var(--border-bright); + color: var(--text-dim); +} + +.step-reward-delta { + font-size: 11px; + color: var(--text-dim); + padding-left: 32px; +} + +.step-reward-delta .delta-positive { + color: var(--progress); +} + +.step-reward-delta .delta-negative { + color: #ef4444; +} + +/* ─── REWARD PANEL ─── */ +.reward-panel { + padding: 12px 16px; + border-bottom: 1px solid var(--border); + flex-shrink: 0; +} + +.reward-row { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 6px; +} + +.reward-row:last-child { + margin-bottom: 0; +} + +.reward-label { + font-family: var(--font-display); + font-size: 10px; + font-weight: 500; + letter-spacing: 0.06em; + color: var(--text-dim); + width: 72px; + flex-shrink: 0; + text-transform: uppercase; +} + +.reward-track { + flex: 1; + height: 8px; + background: var(--bg); + border: 1px solid var(--border); + overflow: hidden; +} + +.reward-bar { + height: 100%; + transition: width 0.4s ease; +} + +.reward-value { + font-family: var(--font-display); + font-size: 11px; + font-weight: 500; + color: var(--text-primary); + width: 36px; + text-align: right; + flex-shrink: 0; +} + +.reward-value.dim { + color: var(--text-dim); +} + +.reward-divider { + height: 1px; + background: var(--border); + margin: 6px 0; +} + +/* ─── INFO BADGES ─── */ +.info-badges { + padding: 12px 16px; + display: flex; + flex-direction: column; + gap: 8px; +} + +.info-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; +} + +.info-key { + font-family: var(--font-display); + font-size: 10px; + font-weight: 500; + letter-spacing: 0.06em; + color: var(--text-dim); + text-transform: uppercase; +} + +.info-val { + font-family: var(--font-display); + font-size: 11px; + font-weight: 700; + color: var(--text-primary); +} + +.info-val.bool-true { + color: var(--progress); +} + +.info-val.bool-false { + color: #ef4444; +} + +.info-val.dim { + color: var(--text-dim); +} + +/* ─── TARGET SELECTOR ─── */ +.target-selector { + display: flex; + align-items: center; + gap: 8px; +} + +.target-selector-label { + font-family: var(--font-display); + font-size: 10px; + font-weight: 500; + letter-spacing: 0.10em; + color: var(--text-dim); + text-transform: uppercase; + white-space: nowrap; +} + +.target-select { + background: var(--surface-2); + border: 1px solid var(--border-bright); + color: var(--text-primary); + font-family: var(--font-display); + font-size: 11px; + padding: 4px 8px; + outline: none; + cursor: pointer; + min-width: 180px; +} + +.target-select:focus { + border-color: var(--valley); +} + +optgroup { + background: var(--surface); + color: var(--text-dim); + font-family: var(--font-display); + font-size: 10px; +} + +option { + background: var(--surface-2); + color: var(--text-primary); + font-family: var(--font-display); +} + +/* ─── PLAYER CONTROLS ─── */ +.player-controls { + display: flex; + align-items: center; + gap: 6px; + flex-shrink: 0; +} + +.ctrl-btn { + background: var(--surface-2); + border: 1px solid var(--border-bright); + color: var(--text-primary); + font-family: var(--font-display); + font-size: 11px; + font-weight: 500; + padding: 4px 10px; + cursor: pointer; + white-space: nowrap; + line-height: 1.4; + letter-spacing: 0.04em; + transition: background 0.1s, border-color 0.1s; +} + +.ctrl-btn:hover:not(:disabled) { + background: var(--surface); + border-color: var(--text-dim); +} + +.ctrl-btn:disabled { + opacity: 0.35; + cursor: not-allowed; +} + +.ctrl-btn.play { + border-color: var(--valley); + color: var(--valley); +} + +.ctrl-btn.play:hover:not(:disabled) { + background: rgba(56, 189, 248, 0.1); +} + +.ctrl-step-display { + font-family: var(--font-display); + font-size: 11px; + color: var(--text-dim); + padding: 4px 8px; + border: 1px solid var(--border); + background: var(--bg); + white-space: nowrap; + min-width: 72px; + text-align: center; +} + +/* ─── LOADING / ERROR ─── */ +.app-overlay { + position: fixed; + inset: 0; + display: flex; align-items: center; justify-content: center; - font-size: calc(10px + 2vmin); - color: white; + background: var(--bg); + z-index: 100; +} + +.overlay-message { + font-family: var(--font-display); + font-size: 13px; + letter-spacing: 0.1em; + color: var(--text-dim); + display: flex; + align-items: center; + gap: 12px; } -.App-link { - color: #61dafb; +.pulse-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--valley); + animation: pulse 1.2s ease-in-out infinite; } -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } +@keyframes pulse { + 0%, 100% { opacity: 0.2; transform: scale(0.8); } + 50% { opacity: 1; transform: scale(1); } +} + +/* ─── MISC ─── */ +.episode-loading { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 12px 16px; + font-family: var(--font-display); + font-size: 11px; + color: var(--text-dim); + letter-spacing: 0.08em; } diff --git a/src/App.js b/src/App.js index 37845757234ccb68531c10cf7a2ffc589c47e342..5b5842f6787d369c34cd3e280637d38071b9c2b7 100644 --- a/src/App.js +++ b/src/App.js @@ -1,23 +1,239 @@ -import logo from './logo.svg'; +import { useState, useEffect, useCallback, useRef } from 'react'; import './App.css'; +import CreaseCanvas from './components/CreaseCanvas'; +import RewardPanel from './components/RewardPanel'; +import StepFeed from './components/StepFeed'; +import InfoBadges from './components/InfoBadges'; +import TargetSelector from './components/TargetSelector'; +import PlayerControls from './components/PlayerControls'; +import Fold3DCanvas from './components/Fold3DCanvas'; + +const API_BASE = ''; + +// Read ?ep= from URL — set when navigating from training grid +const _urlParams = new URLSearchParams(window.location.search); +const REPLAY_EP_ID = _urlParams.get('ep') || null; function App() { + const [targets, setTargets] = useState({}); + const [selectedTarget, setSelectedTarget] = useState('half_fold'); + const [episode, setEpisode] = useState(null); + const [currentStep, setCurrentStep] = useState(0); + const [playing, setPlaying] = useState(false); + const [apiStatus, setApiStatus] = useState('connecting'); + const [episodeLoading, setEpisodeLoading] = useState(false); + const intervalRef = useRef(null); + + const isReplayMode = REPLAY_EP_ID !== null; + + const fetchTargets = useCallback(async () => { + try { + const res = await fetch(`${API_BASE}/targets`); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + const data = await res.json(); + setTargets(data); + setApiStatus('ok'); + } catch { + setApiStatus('err'); + } + }, []); + + const fetchDemoEpisode = useCallback(async (targetName) => { + setEpisodeLoading(true); + setPlaying(false); + setCurrentStep(0); + try { + const res = await fetch(`${API_BASE}/episode/demo?target=${targetName}`); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + const data = await res.json(); + setEpisode(data); + setApiStatus('ok'); + } catch { + setEpisode(null); + setApiStatus('err'); + } finally { + setEpisodeLoading(false); + } + }, []); + + const fetchReplayEpisode = useCallback(async (epId) => { + setEpisodeLoading(true); + setPlaying(false); + setCurrentStep(0); + try { + const res = await fetch(`${API_BASE}/episode/replay/${epId}`); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + const data = await res.json(); + setEpisode(data); + setApiStatus('ok'); + } catch { + setEpisode(null); + setApiStatus('err'); + } finally { + setEpisodeLoading(false); + } + }, []); + + useEffect(() => { + fetchTargets(); + }, [fetchTargets]); + + useEffect(() => { + if (isReplayMode) { + fetchReplayEpisode(REPLAY_EP_ID); + } else { + fetchDemoEpisode(selectedTarget); + } + }, [isReplayMode, selectedTarget, fetchDemoEpisode, fetchReplayEpisode]); + + const totalSteps = episode ? episode.steps.length : 0; + + // currentStep is 1-indexed for display (0 = "empty paper before any folds") + // steps array is 0-indexed: steps[0] = result of fold 1 + const activeStepData = episode && currentStep > 0 ? episode.steps[currentStep - 1] : null; + + useEffect(() => { + if (playing) { + intervalRef.current = setInterval(() => { + setCurrentStep(prev => { + if (prev >= totalSteps) { + setPlaying(false); + return prev; + } + return prev + 1; + }); + }, 1500); + } + return () => clearInterval(intervalRef.current); + }, [playing, totalSteps]); + + const handlePlay = () => { + if (currentStep >= totalSteps) setCurrentStep(0); + setPlaying(true); + }; + const handlePause = () => setPlaying(false); + const handleNext = () => { + setPlaying(false); + setCurrentStep(prev => Math.min(prev + 1, totalSteps)); + }; + const handlePrev = () => { + setPlaying(false); + setCurrentStep(prev => Math.max(prev - 1, 0)); + }; + const handleReset = () => { + setPlaying(false); + setCurrentStep(0); + }; + + const targetDef = targets[selectedTarget] || null; + return ( -
-
- logo -

- Edit src/App.js and save to reload. -

- - Learn React - +
+
+ + OPTIGAMI RL + +
+ {isReplayMode ? ( + <> + REPLAY — {REPLAY_EP_ID} + + + ) : ( + setSelectedTarget(name)} + /> + )} +
+ +
+
+ + {apiStatus === 'ok' ? 'API OK' : apiStatus === 'err' ? 'API ERR' : 'CONNECTING'} +
+
+ +
+
+
+
+ + TASK — {targetDef ? targetDef.name.replace(/_/g, ' ').toUpperCase() : '—'} + + +
+
+ + {currentStep === 0 ? 'INITIAL STATE' : `STEP ${currentStep} / ${totalSteps}`} + + +
+
+
+ 3D FOLD PREVIEW +
+ +
+
+ +
+
FOLD SEQUENCE
+ {episodeLoading ? ( +
+
+ FETCHING EPISODE... +
+ ) : ( + + )} +
+
+ +
+
METRICS
+ +
EPISODE INFO
+ +
+
); } diff --git a/src/App.test.js b/src/App.test.js index 1f03afeece5ac28064fa3c73a29215037465f789..2e69bb5de9e34aea82df890e820f68617509faf2 100644 --- a/src/App.test.js +++ b/src/App.test.js @@ -1,8 +1 @@ -import { render, screen } from '@testing-library/react'; -import App from './App'; - -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); +// Tests removed — observability dashboard diff --git a/src/components/CreaseCanvas.js b/src/components/CreaseCanvas.js new file mode 100644 index 0000000000000000000000000000000000000000..6cf97ac33f173ca45c431bfe3fcecdf4ff52d532 --- /dev/null +++ b/src/components/CreaseCanvas.js @@ -0,0 +1,99 @@ +const MOUNTAIN = '#f59e0b'; +const VALLEY = '#38bdf8'; + +function toSvg(x, y, dim) { + return [x * dim, (1 - y) * dim]; +} + +function GhostEdges({ target, dim }) { + if (!target) return null; + const { vertices_coords, edges_vertices, edges_assignment } = target; + if (!vertices_coords || !edges_vertices || !edges_assignment) return null; + + return edges_vertices.map((ev, i) => { + const asgn = edges_assignment[i]; + if (asgn === 'B') return null; + const v1 = vertices_coords[ev[0]]; + const v2 = vertices_coords[ev[1]]; + if (!v1 || !v2) return null; + const [x1, y1] = toSvg(v1[0], v1[1], dim); + const [x2, y2] = toSvg(v2[0], v2[1], dim); + const color = asgn === 'M' ? MOUNTAIN : VALLEY; + return ( + + ); + }); +} + +function CurrentEdges({ paperState, dim }) { + if (!paperState) return null; + const { vertices_coords, edges_vertices, edges_assignment } = paperState; + if (!vertices_coords || !edges_vertices || !edges_assignment) return null; + + return edges_vertices.map((ev, i) => { + const asgn = edges_assignment[i]; + if (asgn === 'B' || asgn === 'F') return null; + const v1 = vertices_coords[ev[0]]; + const v2 = vertices_coords[ev[1]]; + if (!v1 || !v2) return null; + // vertices_coords are 3D [x, y, z] — use only x and y + const [x1, y1] = toSvg(v1[0], v1[1], dim); + const [x2, y2] = toSvg(v2[0], v2[1], dim); + const color = asgn === 'M' ? MOUNTAIN : VALLEY; + return ( + + ); + }); +} + +export default function CreaseCanvas({ paperState, target, dim = 280, ghostOnly = false }) { + const pad = 1; + const size = dim; + + return ( + + {/* Paper background */} + + + {/* Ghost target overlay */} + + + {/* Current paper state */} + {!ghostOnly && ( + + )} + + {/* Paper border */} + + + ); +} diff --git a/src/components/Fold3DCanvas.js b/src/components/Fold3DCanvas.js new file mode 100644 index 0000000000000000000000000000000000000000..885ac04e3636f0120422c3238b7a0e81154108f5 --- /dev/null +++ b/src/components/Fold3DCanvas.js @@ -0,0 +1,394 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; + +const PAPER_RGB = [250, 250, 245]; +const SENSITIVITY = 0.005; +const PITCH_MIN = -Math.PI / 2 + 0.1; +const PITCH_MAX = Math.PI / 2 - 0.1; +const ZOOM_MIN = 0.3; +const ZOOM_MAX = 5.0; +const LIGHT_DIR = normalize3([0.4, -0.45, 1.0]); +const MOUNTAIN_COLOR = 'rgba(245, 158, 11, 0.9)'; +const VALLEY_COLOR = 'rgba(56, 189, 248, 0.9)'; + +function clamp(value, min, max) { + return Math.min(Math.max(value, min), max); +} + +function normalize3(v) { + const mag = Math.hypot(v[0], v[1], v[2]); + if (mag < 1e-12) return [0, 0, 0]; + return [v[0] / mag, v[1] / mag, v[2] / mag]; +} + +function cross3(a, b) { + return [ + a[1] * b[2] - a[2] * b[1], + a[2] * b[0] - a[0] * b[2], + a[0] * b[1] - a[1] * b[0], + ]; +} + +function sub3(a, b) { + return [a[0] - b[0], a[1] - b[1], a[2] - b[2]]; +} + +function dot3(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +} + +function shadePaper(intensity) { + const lit = clamp(0.3 + 0.7 * Math.abs(intensity), 0.0, 1.0); + const r = Math.round(PAPER_RGB[0] * lit); + const g = Math.round(PAPER_RGB[1] * lit); + const b = Math.round(PAPER_RGB[2] * lit); + return `rgb(${r}, ${g}, ${b})`; +} + +const SIDE_EPS = 1e-10; +const MAX_FOLD_RAD = Math.PI; + +function buildGridMesh(resolution = 18) { + const vertices = []; + for (let y = 0; y <= resolution; y += 1) { + for (let x = 0; x <= resolution; x += 1) { + vertices.push([x / resolution, y / resolution, 0]); + } + } + + const triangles = []; + const stride = resolution + 1; + for (let y = 0; y < resolution; y += 1) { + for (let x = 0; x < resolution; x += 1) { + const a = y * stride + x; + const b = a + 1; + const c = a + stride; + const d = c + 1; + triangles.push([a, b, d]); + triangles.push([a, d, c]); + } + } + + return { vertices, triangles, resolution }; +} + +function rotateAroundAxis(point, axisPoint, axisDir, angleRad) { + const px = point[0] - axisPoint[0]; + const py = point[1] - axisPoint[1]; + const pz = point[2] - axisPoint[2]; + + const kx = axisDir[0]; + const ky = axisDir[1]; + const kz = axisDir[2]; + + const cosA = Math.cos(angleRad); + const sinA = Math.sin(angleRad); + + const crossX = ky * pz - kz * py; + const crossY = kz * px - kx * pz; + const crossZ = kx * py - ky * px; + + const dotVal = px * kx + py * ky + pz * kz; + const oneMinus = 1.0 - cosA; + + return [ + axisPoint[0] + px * cosA + crossX * sinA + kx * dotVal * oneMinus, + axisPoint[1] + py * cosA + crossY * sinA + ky * dotVal * oneMinus, + axisPoint[2] + pz * cosA + crossZ * sinA + kz * dotVal * oneMinus, + ]; +} + +/** + * Pre-compute which side of each fold line every vertex falls on, + * using the ORIGINAL flat 2D positions. This avoids the bug where + * post-fold 3D coordinates corrupt the side classification for + * subsequent folds (the root cause of broken accordion rendering). + * + * Inspired by OrigamiSimulator's approach where crease assignments + * are determined from the flat state, not the deformed state. + */ +function buildFoldMasks(meshVertices, folds, resolution) { + const stride = resolution + 1; + const pointToIndex = (pt) => { + const ix = clamp(Math.round(pt[0] * resolution), 0, resolution); + const iy = clamp(Math.round(pt[1] * resolution), 0, resolution); + return iy * stride + ix; + }; + + return folds.map((fold) => { + const [x1, y1] = fold.from; + const [x2, y2] = fold.to; + const dx = x2 - x1; + const dy = y2 - y1; + const len = Math.hypot(dx, dy); + + const shouldRotate = new Uint8Array(meshVertices.length); + for (let i = 0; i < meshVertices.length; i += 1) { + const v = meshVertices[i]; + const side = dx * (v[1] - y1) - dy * (v[0] - x1); + shouldRotate[i] = side > SIDE_EPS ? 1 : 0; + } + + return { + shouldRotate, + fromIdx: pointToIndex(fold.from), + toIdx: pointToIndex(fold.to), + sign: fold.assignment === 'V' ? 1 : -1, + assignment: fold.assignment, + len, + }; + }); +} + +/** + * Apply all folds sequentially using pre-computed masks and + * tracking fold axes in current 3D space. Each fold's rotation + * axis is found by looking up where the fold-line endpoints + * have moved to (via previous folds), rather than using the + * original 2D coordinates. + */ +function applyAllFolds(vertices, foldMasks, progresses) { + for (let i = 0; i < foldMasks.length; i += 1) { + const p = progresses[i]; + if (p <= 0) continue; + + const mask = foldMasks[i]; + if (mask.len < 1e-8) continue; + + const axisFrom = vertices[mask.fromIdx]; + const axisTo = vertices[mask.toIdx]; + const axisDir = normalize3(sub3(axisTo, axisFrom)); + + const angle = mask.sign * MAX_FOLD_RAD * p; + + for (let j = 0; j < vertices.length; j += 1) { + if (!mask.shouldRotate[j]) continue; + vertices[j] = rotateAroundAxis(vertices[j], axisFrom, axisDir, angle); + } + + } +} + +function projectVertex(vertex, dim, pitch, yaw, zoom) { + let x = vertex[0] - 0.5; + let y = vertex[1] - 0.5; + let z = vertex[2] || 0; + + const cp = Math.cos(pitch); + const sp = Math.sin(pitch); + const y1 = y * cp - z * sp; + const z1 = y * sp + z * cp; + + const cy = Math.cos(yaw); + const sy = Math.sin(yaw); + const x2 = x * cy + z1 * sy; + const z2 = -x * sy + z1 * cy; + + const camDist = 2.8; + const perspective = camDist / (camDist - z2); + const scale = 0.82 * zoom; + + return { + x: dim * 0.5 + x2 * perspective * dim * scale, + y: dim * 0.52 - y1 * perspective * dim * scale, + z: z2, + }; +} + +function stepEasing(t) { + return t < 0.5 ? 4 * t * t * t : 1 - ((-2 * t + 2) ** 3) / 2; +} + +export default function Fold3DCanvas({ + steps, + currentStep, + dim = 280, +}) { + const canvasRef = useRef(null); + const rafRef = useRef(null); + const animatedStepRef = useRef(currentStep); + const [pitch, setPitch] = useState(1.04); + const [yaw, setYaw] = useState(-0.78); + const [zoom, setZoom] = useState(1.0); + const isDraggingRef = useRef(false); + const lastMouseRef = useRef({ x: 0, y: 0 }); + const pitchRef = useRef(1.04); + const yawRef = useRef(-0.78); + const zoomRef = useRef(1.0); + + pitchRef.current = pitch; + yawRef.current = yaw; + zoomRef.current = zoom; + + const folds = useMemo( + () => (steps || []) + .map((s) => s.fold) + .filter(Boolean) + .map((fold) => ({ + from: [Number(fold.from[0]), Number(fold.from[1])], + to: [Number(fold.to[0]), Number(fold.to[1])], + assignment: fold.assignment === 'M' ? 'M' : 'V', + })), + [steps], + ); + + const mesh = useMemo(() => buildGridMesh(18), []); + + const foldMasks = useMemo( + () => buildFoldMasks(mesh.vertices, folds, mesh.resolution), + [mesh, folds], + ); + + const draw = useCallback((stepValue) => { + const canvas = canvasRef.current; + if (!canvas) return; + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + ctx.clearRect(0, 0, dim, dim); + ctx.fillStyle = '#121220'; + ctx.fillRect(0, 0, dim, dim); + + const vertices = mesh.vertices.map((v) => [v[0], v[1], v[2]]); + + const progresses = new Array(folds.length).fill(0); + for (let i = 0; i < folds.length; i += 1) { + if (stepValue >= i + 1) progresses[i] = 1; + else if (stepValue > i) progresses[i] = clamp(stepValue - i, 0, 1); + } + + applyAllFolds(vertices, foldMasks, progresses); + + const proj = (v) => projectVertex(v, dim, pitchRef.current, yawRef.current, zoomRef.current); + const projected = vertices.map(proj); + + const tris = mesh.triangles.map((tri) => { + const p0 = projected[tri[0]]; + const p1 = projected[tri[1]]; + const p2 = projected[tri[2]]; + const avgZ = (p0.z + p1.z + p2.z) / 3; + + const v0 = vertices[tri[0]]; + const v1 = vertices[tri[1]]; + const v2 = vertices[tri[2]]; + const normal = normalize3(cross3(sub3(v1, v0), sub3(v2, v0))); + const intensity = dot3(normal, LIGHT_DIR); + + return { tri, avgZ, shade: shadePaper(intensity) }; + }); + + tris.sort((a, b) => a.avgZ - b.avgZ); + + for (const triInfo of tris) { + const [a, b, c] = triInfo.tri; + const p0 = projected[a]; + const p1 = projected[b]; + const p2 = projected[c]; + + ctx.beginPath(); + ctx.moveTo(p0.x, p0.y); + ctx.lineTo(p1.x, p1.y); + ctx.lineTo(p2.x, p2.y); + ctx.closePath(); + ctx.fillStyle = triInfo.shade; + ctx.fill(); + ctx.strokeStyle = 'rgba(42, 42, 58, 0.22)'; + ctx.lineWidth = 0.55; + ctx.stroke(); + } + + for (let i = 0; i < foldMasks.length; i += 1) { + if (progresses[i] <= 0.02) continue; + + const mask = foldMasks[i]; + const pa = projected[mask.fromIdx]; + const pb = projected[mask.toIdx]; + + ctx.beginPath(); + ctx.moveTo(pa.x, pa.y); + ctx.lineTo(pb.x, pb.y); + ctx.strokeStyle = mask.assignment === 'M' ? MOUNTAIN_COLOR : VALLEY_COLOR; + ctx.globalAlpha = clamp(0.35 + 0.65 * progresses[i], 0, 1); + ctx.lineWidth = 2.15; + ctx.stroke(); + ctx.globalAlpha = 1; + } + }, [dim, folds, mesh, foldMasks]); + + useEffect(() => { + draw(animatedStepRef.current); + }, [draw, pitch, yaw, zoom]); + + useEffect(() => { + cancelAnimationFrame(rafRef.current); + const startValue = animatedStepRef.current; + const endValue = currentStep; + const durationMs = 420; + const startAt = performance.now(); + + const tick = (now) => { + const t = clamp((now - startAt) / durationMs, 0, 1); + const eased = stepEasing(t); + const value = startValue + (endValue - startValue) * eased; + animatedStepRef.current = value; + draw(value); + if (t < 1) rafRef.current = requestAnimationFrame(tick); + }; + + rafRef.current = requestAnimationFrame(tick); + return () => cancelAnimationFrame(rafRef.current); + }, [currentStep, draw]); + + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + + const handleWheel = (e) => { + e.preventDefault(); + setZoom((z) => clamp(z * (e.deltaY > 0 ? 0.9 : 1.1), ZOOM_MIN, ZOOM_MAX)); + }; + + const handleMouseDown = (e) => { + isDraggingRef.current = true; + lastMouseRef.current = { x: e.clientX, y: e.clientY }; + canvas.style.cursor = 'grabbing'; + }; + + const handleMouseMove = (e) => { + if (!isDraggingRef.current) return; + const dx = e.clientX - lastMouseRef.current.x; + const dy = e.clientY - lastMouseRef.current.y; + lastMouseRef.current = { x: e.clientX, y: e.clientY }; + setYaw((y) => y + dx * SENSITIVITY); + setPitch((p) => clamp(p - dy * SENSITIVITY, PITCH_MIN, PITCH_MAX)); + }; + + const handleMouseUp = () => { + isDraggingRef.current = false; + canvas.style.cursor = 'grab'; + }; + + canvas.addEventListener('wheel', handleWheel, { passive: false }); + canvas.addEventListener('mousedown', handleMouseDown); + window.addEventListener('mousemove', handleMouseMove); + window.addEventListener('mouseup', handleMouseUp); + + return () => { + canvas.removeEventListener('wheel', handleWheel); + canvas.removeEventListener('mousedown', handleMouseDown); + window.removeEventListener('mousemove', handleMouseMove); + window.removeEventListener('mouseup', handleMouseUp); + canvas.style.cursor = ''; + }; + }, []); + + return ( + + ); +} diff --git a/src/components/InfoBadges.js b/src/components/InfoBadges.js new file mode 100644 index 0000000000000000000000000000000000000000..00cdd83017407a8cabd195587a9047df312323e4 --- /dev/null +++ b/src/components/InfoBadges.js @@ -0,0 +1,73 @@ +function BoolVal({ value }) { + if (value === null || value === undefined) { + return ; + } + return ( + + {value ? 'TRUE' : 'FALSE'} + + ); +} + +function NumVal({ value, decimals = 0 }) { + if (value === null || value === undefined) { + return ; + } + return {decimals > 0 ? Number(value).toFixed(decimals) : value}; +} + +export default function InfoBadges({ metrics, paperState, targetDef }) { + const format = metrics?.format; + const anchored = metrics?.anchored; + const novelty = metrics?.novelty; + const completion = metrics?.completion; + const regression = metrics?.regression; + const efficiency = metrics?.efficiency; + + return ( +
+
+ format + +
+
+ anchored + +
+
+ novelty + +
+
+ completion + +
+
+ regression + +
+
+ efficiency + +
+ {targetDef && ( + <> +
+ level + LVL {targetDef.level} +
+
+ creases + {targetDef.n_creases} +
+
+ task + + {(targetDef.name || '').replace(/_/g, ' ').toUpperCase()} + +
+ + )} +
+ ); +} diff --git a/src/components/PlayerControls.js b/src/components/PlayerControls.js new file mode 100644 index 0000000000000000000000000000000000000000..74e01e39e9b87bc9b848d7b0783d29a662e37d61 --- /dev/null +++ b/src/components/PlayerControls.js @@ -0,0 +1,54 @@ +export default function PlayerControls({ + playing, + onPlay, + onPause, + onNext, + onPrev, + onReset, + currentStep, + totalSteps, + disabled, +}) { + const atStart = currentStep === 0; + const atEnd = currentStep >= totalSteps; + + return ( +
+ + + + {disabled ? '—/—' : `${currentStep} / ${totalSteps}`} + + + +
+ ); +} diff --git a/src/components/RewardPanel.js b/src/components/RewardPanel.js new file mode 100644 index 0000000000000000000000000000000000000000..bf1acfd24fd4863ed7cd025359b1c123e21142ef --- /dev/null +++ b/src/components/RewardPanel.js @@ -0,0 +1,106 @@ +const METRIC_FIELDS = [ + { + key: 'progress', + label: 'progress', + color: 'var(--progress)', + normalize: (v) => Math.min(Math.max(v || 0, 0), 1), + format: (v) => (v != null ? v.toFixed(3) : '—'), + }, + { + key: 'delta', + label: 'delta', + color: '#6ec6ff', + normalize: (v) => Math.min(Math.max(v || 0, 0), 1), + format: (v) => (v != null ? (v >= 0 ? '+' : '') + v.toFixed(3) : '—'), + }, + { + key: 'kawasaki', + label: 'kawasaki', + color: 'var(--validity)', + normalize: (v) => Math.min(Math.max(v || 0, 0), 1), + format: (v) => (v != null ? v.toFixed(3) : '—'), + }, + { + key: 'maekawa', + label: 'maekawa', + color: 'var(--validity)', + normalize: (v) => Math.min(Math.max(v || 0, 0), 1), + format: (v) => (v != null ? v.toFixed(3) : '—'), + }, + { + key: 'blb', + label: 'blb', + color: 'var(--validity)', + normalize: (v) => Math.min(Math.max(v || 0, 0), 1), + format: (v) => (v != null ? v.toFixed(3) : '—'), + }, + { + key: 'assignment_accuracy', + label: 'assign acc', + color: '#ffb74d', + normalize: (v) => Math.min(Math.max(v || 0, 0), 1), + format: (v) => (v != null ? v.toFixed(3) : '—'), + }, + { + key: 'economy', + label: 'economy', + color: '#81c784', + normalize: (v) => Math.min(Math.max(v || 0, 0), 1), + format: (v) => (v != null ? v.toFixed(3) : '—'), + }, + { + key: 'degree_sanity', + label: 'deg sanity', + color: 'var(--validity)', + normalize: (v) => Math.min(Math.max(v || 0, 0), 1), + format: (v) => (v != null ? v.toFixed(3) : '—'), + }, + { + key: 'total', + label: 'total', + color: '#e0e0e0', + normalize: (v) => Math.min(Math.max((v || 0) / 1.5, 0), 1), + format: (v) => (v != null ? v.toFixed(3) : '—'), + }, +]; + +function RewardRow({ label, color, pct, formattedValue, isDash, inverted }) { + const barColor = inverted && pct > 0 ? 'var(--validity)' : color; + return ( +
+ {label} +
+
+
+ + {formattedValue} + +
+ ); +} + +export default function RewardPanel({ metrics }) { + return ( +
+ {METRIC_FIELDS.map(({ key, label, color, normalize, format, inverted }) => { + const raw = metrics ? metrics[key] : undefined; + const isDash = raw === null || raw === undefined; + const pct = isDash ? 0 : normalize(raw) * 100; + return ( + + ); + })} +
+ ); +} diff --git a/src/components/StepFeed.js b/src/components/StepFeed.js new file mode 100644 index 0000000000000000000000000000000000000000..0171a35f65e14616707dfd9d8cbbc6da49b79709 --- /dev/null +++ b/src/components/StepFeed.js @@ -0,0 +1,94 @@ +import { useEffect, useRef } from 'react'; + +function compactnessDelta(step, prevStep) { + if (!step || !step.metrics) return null; + const curr = step.metrics.compactness; + if (curr == null) return null; + if (prevStep && prevStep.metrics && prevStep.metrics.compactness != null) { + return curr - prevStep.metrics.compactness; + } + return curr; +} + +function foldAssignment(fold) { + if (!fold) return null; + const t = fold.type || ''; + if (t === 'valley') return 'V'; + if (t === 'mountain') return 'M'; + if (t === 'pleat') return 'P'; + if (t === 'crimp') return 'C'; + return t.charAt(0).toUpperCase() || null; +} + +function foldLabel(fold) { + if (!fold) return ''; + const type = fold.type || 'fold'; + const angle = fold.angle != null ? ` ${fold.angle}°` : ''; + return `${type.toUpperCase()} FOLD${angle}`; +} + +export default function StepFeed({ steps, currentStep }) { + const feedRef = useRef(null); + const activeRef = useRef(null); + + useEffect(() => { + if (activeRef.current) { + activeRef.current.scrollIntoView({ block: 'nearest', behavior: 'smooth' }); + } + }, [currentStep]); + + if (!steps || steps.length === 0) { + return ( +
+
+ NO STEPS LOADED +
+
+ ); + } + + return ( +
+ {steps.map((step, idx) => { + const stepNum = idx + 1; + const isActive = currentStep === stepNum; + const delta = compactnessDelta(step, idx > 0 ? steps[idx - 1] : null); + const asgn = foldAssignment(step.fold); + const label = foldLabel(step.fold); + const m = step.metrics || {}; + + return ( +
+
+ #{stepNum} + {label} + {asgn && ( + {asgn} + )} +
+ {delta !== null && ( +
+ {'\u0394'} compact:{' '} + = 0 ? 'delta-positive' : 'delta-negative'}> + {delta >= 0 ? '+' : ''}{delta.toFixed(3)} + + {m.max_strain != null && ( + + {' '}| strain: {m.max_strain.toFixed(4)} + {m.is_valid != null && ( + | {m.is_valid ? '✓' : '✗'} + )} + + )} +
+ )} +
+ ); + })} +
+ ); +} diff --git a/src/components/TargetSelector.js b/src/components/TargetSelector.js new file mode 100644 index 0000000000000000000000000000000000000000..b7822c56bf51d27c2b4773cb378bae8edb89d9fb --- /dev/null +++ b/src/components/TargetSelector.js @@ -0,0 +1,38 @@ +function groupByLevel(targets) { + const levels = {}; + Object.values(targets).forEach(t => { + if (!levels[t.level]) levels[t.level] = []; + levels[t.level].push(t); + }); + return levels; +} + +export default function TargetSelector({ targets, selected, onChange }) { + const levels = groupByLevel(targets); + const sortedLevels = Object.keys(levels).sort((a, b) => Number(a) - Number(b)); + + return ( +
+ TARGET + +
+ ); +} diff --git a/src/index.css b/src/index.css index ec2585e8c0bb8188184ed1e0703c4c8f2a8419b0..bd577de0611e61395f5ac151db2c3d23b69df803 100644 --- a/src/index.css +++ b/src/index.css @@ -1,13 +1,34 @@ -body { +@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@300;400;500;700&family=IBM+Plex+Mono:wght@300;400;500&display=swap'); + +*, *::before, *::after { + box-sizing: border-box; margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; + padding: 0; +} + +body { + background: #0d0d14; + color: #f8fafc; + font-family: 'IBM Plex Mono', monospace; + font-size: 13px; + line-height: 1.5; -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; + overflow-x: hidden; +} + +::-webkit-scrollbar { + width: 4px; + height: 4px; +} + +::-webkit-scrollbar-track { + background: #0d0d14; +} + +::-webkit-scrollbar-thumb { + background: #2a2a3a; } -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; +::-webkit-scrollbar-thumb:hover { + background: #3a3a5a; } diff --git a/src/reportWebVitals.js b/src/reportWebVitals.js index 5253d3ad9e6be6690549cb255f5952337b02401d..2950497bb9ec2dc32d6e4488060a6535651e2fbd 100644 --- a/src/reportWebVitals.js +++ b/src/reportWebVitals.js @@ -1,13 +1 @@ -const reportWebVitals = onPerfEntry => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; +export default function reportWebVitals() {} diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/tests/test_graph.py b/tests/test_graph.py new file mode 100644 index 0000000000000000000000000000000000000000..20b261c270a2d9158b500e4a56f9b630901d800d --- /dev/null +++ b/tests/test_graph.py @@ -0,0 +1,115 @@ +import numpy as np +import pytest +from env.graph import CreaseGraph, VERTEX_TOL + + +def test_init_boundary(): + g = CreaseGraph() + assert len(g.vertices) == 4 + assert len(g.edges) == 4 + for eid, (v1, v2, assignment) in g.edges.items(): + assert assignment == 'B' + assert g.interior_vertices() == [] + + +def test_add_vertex_dedup(): + g = CreaseGraph() + id1 = g.add_vertex(0.5, 0.5) + id2 = g.add_vertex(0.5, 0.5) + assert id1 == id2 + + +def test_add_vertex_dedup_near(): + g = CreaseGraph() + id1 = g.add_vertex(0.5, 0.5) + id2 = g.add_vertex(0.5 + VERTEX_TOL * 0.5, 0.5) + assert id1 == id2 + + +def test_cyclic_order(): + g = CreaseGraph() + center_id = g.add_vertex(0.5, 0.5) + + right_id = g.add_vertex(0.8, 0.5) # 0 degrees + top_id = g.add_vertex(0.5, 0.8) # 90 degrees + left_id = g.add_vertex(0.2, 0.5) # 180 degrees + bottom_id = g.add_vertex(0.5, 0.2) # 270 degrees / -90 degrees + + e_right = g.add_edge(center_id, right_id, 'M') + e_top = g.add_edge(center_id, top_id, 'M') + e_left = g.add_edge(center_id, left_id, 'M') + e_bottom = g.add_edge(center_id, bottom_id, 'M') + + cyclic = g.get_cyclic_edges(center_id) + # Sorted by angle ascending: right(0), top(90), left(180), bottom(-90 → 270) + # arctan2 for bottom gives -pi/2 which sorts before 0 in ascending order + # So actual ascending order: bottom(-pi/2), right(0), top(pi/2), left(pi) + assert len(cyclic) == 4 + + def edge_angle(eid): + ev1, ev2, _ = g.edges[eid] + other_id = ev2 if ev1 == center_id else ev1 + ox, oy = g.vertices[other_id] + cx, cy = g.vertices[center_id] + return float(np.arctan2(oy - cy, ox - cx)) + + angles = [edge_angle(eid) for eid in cyclic] + assert angles == sorted(angles), "Edges should be sorted by ascending angle" + + assert e_right in cyclic + assert e_top in cyclic + assert e_left in cyclic + assert e_bottom in cyclic + + # Verify specific order: bottom < right < top < left in angle space + pos = {eid: i for i, eid in enumerate(cyclic)} + assert pos[e_bottom] < pos[e_right] < pos[e_top] < pos[e_left] + + +def test_interior_vertices_empty(): + g = CreaseGraph() + assert g.interior_vertices() == [] + + +def test_interior_vertices_with_crease_intersection(): + g = CreaseGraph() + center_id = g.add_vertex(0.5, 0.5) + assert center_id in g.interior_vertices() + + +def test_split_edge(): + g = CreaseGraph() + # Find the bottom boundary edge (0,0)-(1,0) which is edge 0: v0-v1 + original_edge_id = None + for eid, (v1, v2, assignment) in g.edges.items(): + x1, y1 = g.vertices[v1] + x2, y2 = g.vertices[v2] + if {(x1, y1), (x2, y2)} == {(0.0, 0.0), (1.0, 0.0)}: + original_edge_id = eid + original_v1 = v1 + original_v2 = v2 + break + + assert original_edge_id is not None + + mid_id = g.add_vertex(0.5, 0.0) + eid1, eid2 = g.split_edge(original_edge_id, mid_id) + + assert original_edge_id not in g.edges + + assert eid1 in g.edges + assert eid2 in g.edges + + _, _, a1 = g.edges[eid1] + _, _, a2 = g.edges[eid2] + assert a1 == 'B' + assert a2 == 'B' + + def edge_vertex_set(eid): + v1, v2, _ = g.edges[eid] + return {v1, v2} + + assert mid_id in edge_vertex_set(eid1) + assert mid_id in edge_vertex_set(eid2) + assert original_v1 in edge_vertex_set(eid1) or original_v1 in edge_vertex_set(eid2) + assert original_v2 in edge_vertex_set(eid1) or original_v2 in edge_vertex_set(eid2) diff --git a/tests/test_openenv_adapter.py b/tests/test_openenv_adapter.py new file mode 100644 index 0000000000000000000000000000000000000000..7e10e1c02eced478cccc36ea44cbc80f4d301fdb --- /dev/null +++ b/tests/test_openenv_adapter.py @@ -0,0 +1,49 @@ +from openenv_runtime.environment import OpenEnvOrigamiEnvironment +from openenv_runtime.models import OrigamiAction, OrigamiObservation + + +def test_openenv_reset_returns_observation(): + env = OpenEnvOrigamiEnvironment(mode="step", max_steps=8) + obs = env.reset(target_name="half_horizontal") + + assert isinstance(obs, OrigamiObservation) + assert obs.done is False + assert obs.target_name == "half_horizontal" + assert hasattr(obs, "prompt") and obs.prompt + + +def test_openenv_step_single_fold_completes_simple_target(): + env = OpenEnvOrigamiEnvironment(mode="step", max_steps=8) + env.reset(target_name="half_horizontal") + + action = OrigamiAction( + from_point=[0.0, 0.5], + to_point=[1.0, 0.5], + assignment="V", + ) + obs = env.step(action) + + assert obs.reward is not None + assert obs.reward > 1.0 + assert obs.done is True + + +def test_openenv_action_alias_from_to(): + """Client can send 'from' and 'to' (JSON-friendly) instead of from_point/to_point.""" + action = OrigamiAction.model_validate({ + "from": [0.0, 0.5], + "to": [1.0, 0.5], + "assignment": "V", + }) + assert action.from_point == [0.0, 0.5] + assert action.to_point == [1.0, 0.5] + + +def test_openenv_state_contains_target_and_step(): + env = OpenEnvOrigamiEnvironment(mode="step", max_steps=8) + env.reset(target_name="half_horizontal") + + state = env.state() + assert "paper" in state + assert state.get("target") == "half_horizontal" + assert state.get("step") == 0 diff --git a/tests/test_paper_state.py b/tests/test_paper_state.py new file mode 100644 index 0000000000000000000000000000000000000000..86507660b7736857eabe81759c9326015dde397a --- /dev/null +++ b/tests/test_paper_state.py @@ -0,0 +1,97 @@ +import pytest +from env.paper_state import PaperState, UNIT_SQUARE_CORNERS +from env.graph import VERTEX_TOL + + +def test_single_crease_no_interior_vertices(): + paper = PaperState() + result = paper.add_crease([0.0, 0.5], [1.0, 0.5], 'V') + assert result['valid'] is True + interior = paper.graph.interior_vertices() + assert interior == [], f"Expected no interior vertices, got {interior}" + + +def test_anchor_points_initial(): + paper = PaperState() + anchors = paper.anchor_points() + for corner in UNIT_SQUARE_CORNERS: + assert any( + abs(ax - corner[0]) < VERTEX_TOL and abs(ay - corner[1]) < VERTEX_TOL + for ax, ay in anchors + ), f"Corner {corner} not found in anchor_points" + + +def test_anchor_points_grow(): + paper = PaperState() + result = paper.add_crease([0.0, 0.5], [1.0, 0.5], 'V') + assert result['valid'] is True + + anchors = paper.anchor_points() + + def has_point(px, py): + return any(abs(ax - px) < VERTEX_TOL and abs(ay - py) < VERTEX_TOL for ax, ay in anchors) + + assert has_point(0.0, 0.5), "(0, 0.5) should be in anchor_points after crease" + assert has_point(1.0, 0.5), "(1, 0.5) should be in anchor_points after crease" + + +def test_invalid_assignment(): + paper = PaperState() + result = paper.add_crease([0.0, 0.5], [1.0, 0.5], 'X') + assert result['valid'] is False + assert 'invalid_assignment' in result['errors'] + + +def test_fold_history(): + paper = PaperState() + paper.add_crease([0.0, 0.5], [1.0, 0.5], 'M') + assert len(paper.fold_history) == 1 + + +def test_unanchored_returns_false_anchored(): + paper = PaperState() + result = paper.add_crease([0.3, 0.3], [0.7, 0.7], 'M') + assert result['anchored'] is False + + +def test_crease_edges_returned(): + paper = PaperState() + paper.add_crease([0.0, 0.5], [1.0, 0.5], 'M') + edges = paper.crease_edges() + assert len(edges) >= 1 + for e in edges: + assert e['assignment'] in ('M', 'V') + assert 'v1' in e + assert 'v2' in e + + +def test_two_intersecting_creases(): + paper = PaperState() + r1 = paper.add_crease([0.0, 0.5], [1.0, 0.5], 'M') + r2 = paper.add_crease([0.5, 0.0], [0.5, 1.0], 'V') + assert r1['valid'] is True + assert r2['valid'] is True + interior = paper.graph.interior_vertices() + assert len(interior) >= 1 + coords = [paper.graph.vertices[vid] for vid in interior] + assert any(abs(x - 0.5) < VERTEX_TOL and abs(y - 0.5) < VERTEX_TOL for x, y in coords) + + +def test_duplicate_crease_detection(): + """Adding the same crease twice → first duplicate=False, second duplicate=True.""" + paper = PaperState() + r1 = paper.add_crease([0.0, 0.5], [1.0, 0.5], 'M') + assert r1['valid'] is True + assert r1['duplicate'] is False + + r2 = paper.add_crease([0.0, 0.5], [1.0, 0.5], 'V') # same endpoints, different assignment + assert r2['valid'] is True + assert r2['duplicate'] is True + + +def test_error_returns_have_duplicate_false(): + """Error return paths include duplicate=False.""" + paper = PaperState() + r_invalid = paper.add_crease([0.0, 0.5], [1.0, 0.5], 'X') + assert r_invalid['valid'] is False + assert r_invalid['duplicate'] is False diff --git a/tests/test_verifier.py b/tests/test_verifier.py new file mode 100644 index 0000000000000000000000000000000000000000..11cfca8d85db157628a8d754b771ae5dc52252a9 --- /dev/null +++ b/tests/test_verifier.py @@ -0,0 +1,314 @@ +import pytest +import numpy as np +from env.graph import CreaseGraph +from env.paper_state import PaperState +from env.verifier import ( + check_kawasaki_at_vertex, + check_maekawa_at_vertex, + check_blb_at_vertex, + geometric_crease_coverage, + check_all_vertices, + check_degree_sanity, +) + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def make_cross_graph(center_coords=(0.5, 0.5), assignment='M') -> tuple[CreaseGraph, int]: + """ + Degree-4 vertex at center with 4 spokes pointing N/S/E/W. + All spokes have the given assignment. + """ + g = CreaseGraph() + cx, cy = center_coords + vid = g.add_vertex(cx, cy) + + neighbors = [ + (0.0, cy), # left (180°) + (1.0, cy), # right (0°) + (cx, 0.0), # down (-90°) + (cx, 1.0), # up (90°) + ] + for nx, ny in neighbors: + nid = g.add_vertex(nx, ny) + g.add_edge(vid, nid, assignment) + + return g, vid + + +# --------------------------------------------------------------------------- +# Kawasaki tests +# --------------------------------------------------------------------------- + +def test_kawasaki_no_interior_vertices(): + paper = PaperState() + paper.add_crease([0, 0.5], [1, 0.5], 'V') + assert paper.graph.interior_vertices() == [] + result = check_all_vertices(paper.graph) + assert result['kawasaki'] == 1.0 + assert result['n_interior'] == 0 + + +def test_kawasaki_valid_degree4_vertex(): + """Equal 90° sectors → alternating sum = 0 → Kawasaki satisfied.""" + g, vid = make_cross_graph() + ok, err = check_kawasaki_at_vertex(vid, g) + assert ok == True + assert err == pytest.approx(0.0, abs=1e-9) + + +def test_kawasaki_invalid_vertex(): + """ + Manually construct a degree-4 vertex whose sectors are 60°,120°,80°,100°. + Alternating sum = 60 - 120 + 80 - 100 = -80° ≠ 0 → should fail. + """ + g = CreaseGraph() + cx, cy = 0.5, 0.5 + vid = g.add_vertex(cx, cy) + + # Place neighbours at specific angles so sectors are exactly as desired. + # Sectors are measured CCW between consecutive rays. + # We choose ray angles (from center) in ascending arctan2 order: + # a0 = 0° + # a1 = 60° (sector0 = 60°) + # a2 = 180° (sector1 = 120°) + # a3 = 260° = -100° (sector2 = 80°) + # sector3 (wraparound to a0) = 360° - 260° = 100° + # alt_sum = 60 - 120 + 80 - 100 = -80° → |alt_sum| ≈ 1.396 rad + r = 0.3 + angles_deg = [0.0, 60.0, 180.0, 260.0] + for deg in angles_deg: + rad = np.deg2rad(deg) + nx = cx + r * np.cos(rad) + ny = cy + r * np.sin(rad) + nid = g.add_vertex(nx, ny) + g.add_edge(vid, nid, 'M') + + ok, err = check_kawasaki_at_vertex(vid, g) + assert ok == False + expected_err = abs(np.deg2rad(60 - 120 + 80 - 100)) + assert err == pytest.approx(expected_err, abs=1e-6) + + +# --------------------------------------------------------------------------- +# Maekawa tests +# --------------------------------------------------------------------------- + +def test_maekawa_excludes_boundary(): + """ + Boundary edges at a vertex should NOT count toward M/V tally. + A corner vertex has only boundary edges; Maekawa should return True + (fewer than 4 fold edges → vacuously satisfied). + """ + g = CreaseGraph() + corner_id = 0 # vertex (0,0) + assert check_maekawa_at_vertex(corner_id, g) is True + + +def test_maekawa_valid(): + """3 M + 1 V → |3-1| = 2 → True.""" + g = CreaseGraph() + cx, cy = 0.5, 0.5 + vid = g.add_vertex(cx, cy) + + r = 0.3 + angles_deg = [0.0, 90.0, 180.0, 270.0] + assignments = ['M', 'M', 'M', 'V'] + for deg, asgn in zip(angles_deg, assignments): + rad = np.deg2rad(deg) + nid = g.add_vertex(cx + r * np.cos(rad), cy + r * np.sin(rad)) + g.add_edge(vid, nid, asgn) + + assert check_maekawa_at_vertex(vid, g) is True + + +def test_maekawa_invalid(): + """2 M + 2 V → |2-2| = 0 → False.""" + g = CreaseGraph() + cx, cy = 0.5, 0.5 + vid = g.add_vertex(cx, cy) + + r = 0.3 + angles_deg = [0.0, 90.0, 180.0, 270.0] + assignments = ['M', 'M', 'V', 'V'] + for deg, asgn in zip(angles_deg, assignments): + rad = np.deg2rad(deg) + nid = g.add_vertex(cx + r * np.cos(rad), cy + r * np.sin(rad)) + g.add_edge(vid, nid, asgn) + + assert check_maekawa_at_vertex(vid, g) is False + + +# --------------------------------------------------------------------------- +# BLB tests +# --------------------------------------------------------------------------- + +def test_blb_no_violations_equal_sectors(): + """Equal 90° sectors → no strict local minimum → BLB returns [].""" + g, vid = make_cross_graph() + violations = check_blb_at_vertex(vid, g) + assert violations == [] + + +def test_blb_violation_detected(): + """ + Create a vertex with a strict local-minimum sector whose bounding edges + share the same MV assignment → BLB violation. + + Use angles 0°, 10°, 180°, 270° so sector[0]=10° is the strict local min + relative to sector[3] (90°) and sector[1] (170°). The two bounding edges + are at 0° and 10°; assign both 'M' → violation. + """ + g = CreaseGraph() + cx, cy = 0.5, 0.5 + vid = g.add_vertex(cx, cy) + + r = 0.3 + # angles ascending (arctan2 order): 0°, 10°, 180°, 270° (= -90°) + # sorted arctan2: -90°, 0°, 10°, 180° + # sectors: 90°, 10°, 170°, 90° (sum=360°) + # sector at index 1 (between 0° and 10°) = 10° is strict local min (90 > 10 < 170) + angles_deg = [0.0, 10.0, 180.0, 270.0] + edge_ids = [] + for deg in angles_deg: + rad = np.deg2rad(deg) + nid = g.add_vertex(cx + r * np.cos(rad), cy + r * np.sin(rad)) + eid = g.add_edge(vid, nid, 'M') + edge_ids.append(eid) + + violations = check_blb_at_vertex(vid, g) + assert len(violations) > 0 + + +def test_blb_no_violation_when_opposite_assignments(): + """ + Same geometry as above but with opposite assignments on the two edges + bounding the small sector → no BLB violation. + """ + g = CreaseGraph() + cx, cy = 0.5, 0.5 + vid = g.add_vertex(cx, cy) + + r = 0.3 + angles_deg = [0.0, 10.0, 180.0, 270.0] + # sorted arctan2: -90°(270°), 0°, 10°, 180° + # small sector is between 0° and 10° (index 1 and 2 in sorted order) + # assign them opposite assignments + assignments_by_angle = { + 0.0: 'M', + 10.0: 'V', + 180.0: 'M', + 270.0: 'V', + } + for deg in angles_deg: + rad = np.deg2rad(deg) + nid = g.add_vertex(cx + r * np.cos(rad), cy + r * np.sin(rad)) + g.add_edge(vid, nid, assignments_by_angle[deg]) + + violations = check_blb_at_vertex(vid, g) + assert violations == [] + + +# --------------------------------------------------------------------------- +# Coverage tests +# --------------------------------------------------------------------------- + +def test_coverage_exact_match(): + """Add exact crease matching target → coverage = 1.0, economy = 1.0.""" + paper = PaperState() + paper.add_crease([0.0, 0.5], [1.0, 0.5], 'M') + + target = [{'v1': (0.0, 0.5), 'v2': (1.0, 0.5), 'assignment': 'M'}] + coverage, economy, assignment_accuracy = geometric_crease_coverage(paper, target) + assert coverage == pytest.approx(1.0) + assert economy == pytest.approx(1.0) + assert assignment_accuracy == pytest.approx(1.0) + + +def test_coverage_no_match(): + """No creases added → coverage = 0.0.""" + paper = PaperState() + target = [{'v1': (0.0, 0.5), 'v2': (1.0, 0.5), 'assignment': 'M'}] + coverage, economy, assignment_accuracy = geometric_crease_coverage(paper, target) + assert coverage == pytest.approx(0.0) + assert assignment_accuracy == pytest.approx(1.0) # vacuous: no positional matches + + +def test_coverage_excess_penalty(): + """ + Target has 1 crease. Add 3 non-intersecting creases, one matching target. + coverage = 1.0, economy = 1 - 2/1 → clamped to 0.0 (economy < 1.0). + Uses non-intersecting extras to avoid PaperState edge splitting the target crease. + """ + paper = PaperState() + paper.add_crease([0.0, 0.5], [1.0, 0.5], 'M') # matches target (midpoint 0.5,0.5) + paper.add_crease([0.0, 0.3], [0.5, 0.3], 'V') # extra, no intersection + paper.add_crease([0.0, 0.7], [0.5, 0.7], 'V') # extra, no intersection + + target = [{'v1': (0.0, 0.5), 'v2': (1.0, 0.5), 'assignment': 'M'}] + coverage, economy, assignment_accuracy = geometric_crease_coverage(paper, target) + assert coverage == pytest.approx(1.0) + assert economy < 1.0 + assert assignment_accuracy == pytest.approx(1.0) + + +def test_coverage_assignment_mismatch_partial_credit(): + """ + Position matches but assignment doesn't → coverage = 0.5 (partial), + assignment_accuracy = 0.0 (no correct assignments among matched). + """ + paper = PaperState() + paper.add_crease([0.0, 0.5], [1.0, 0.5], 'V') # paper has V, target expects M + + target = [{'v1': (0.0, 0.5), 'v2': (1.0, 0.5), 'assignment': 'M'}] + coverage, economy, assignment_accuracy = geometric_crease_coverage(paper, target) + assert coverage == pytest.approx(0.5) + assert assignment_accuracy == pytest.approx(0.0) + + +# --------------------------------------------------------------------------- +# check_degree_sanity tests +# --------------------------------------------------------------------------- + +def test_check_degree_sanity_no_interior(): + """No interior vertices → returns 1.0 (vacuous).""" + paper = PaperState() + paper.add_crease([0.0, 0.5], [1.0, 0.5], 'V') + assert check_degree_sanity(paper.graph) == pytest.approx(1.0) + + +def test_check_degree_sanity_even_degree(): + """Degree-4 interior vertex → even degree → returns 1.0.""" + g, _ = make_cross_graph() + assert check_degree_sanity(g) == pytest.approx(1.0) + + +def test_check_degree_sanity_odd_degree(): + """Degree-3 interior vertex → odd degree → returns 0.0.""" + g = CreaseGraph() + cx, cy = 0.5, 0.5 + vid = g.add_vertex(cx, cy) + r = 0.3 + for deg in [0.0, 120.0, 240.0]: + rad = np.deg2rad(deg) + nid = g.add_vertex(cx + r * np.cos(rad), cy + r * np.sin(rad)) + g.add_edge(vid, nid, 'M') + assert check_degree_sanity(g) == pytest.approx(0.0) + + +# --------------------------------------------------------------------------- +# check_all_vertices vacuous test +# --------------------------------------------------------------------------- + +def test_check_all_vertices_vacuous(): + """Single horizontal crease → no interior vertices → all scores = 1.0.""" + paper = PaperState() + paper.add_crease([0.0, 0.5], [1.0, 0.5], 'V') + result = check_all_vertices(paper.graph) + assert result['kawasaki'] == 1.0 + assert result['maekawa'] == 1.0 + assert result['blb'] == 1.0 + assert result['n_interior'] == 0 + assert result['per_vertex'] == [] diff --git a/train.py b/train.py new file mode 100644 index 0000000000000000000000000000000000000000..3af33977c2fba88baafb85e61a449fe96890b86d --- /dev/null +++ b/train.py @@ -0,0 +1,261 @@ +""" +OrigamiRL — GRPO Training Script +Code-as-policy: model generates complete fold sequence, gets terminal reward. + +Base model: SpatialThinker (Qwen2.5-VL-7B fine-tuned for spatial reasoning) +or any Unsloth-compatible model. + +Usage: + python train.py + python train.py --model unsloth/Qwen2.5-VL-7B-Instruct --epochs 3 + python train.py --model OX-PIXL/SpatialThinker-Qwen2.5-VL-7B --epochs 3 + python train.py --dry_run # test rewards without GPU + python train.py --no_semantic # use coordinate-based prompts instead of semantic +""" +import argparse +import random + +# VL (vision-language) model identifiers — use FastVisionModel for these +_VL_MODEL_PATTERNS = ['VL', 'vl', 'Vision', 'vision', 'SpatialThinker', 'SpaceThinker'] + + +def _is_vl_model(model_name: str) -> bool: + return any(p in model_name for p in _VL_MODEL_PATTERNS) + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('--model', default='unsloth/Qwen2.5-VL-7B-Instruct', + help='Base model. Use unsloth/Qwen2.5-VL-7B-Instruct or ' + 'OX-PIXL/SpatialThinker-Qwen2.5-VL-7B for spatial reasoning') + parser.add_argument('--max_seq_length', type=int, default=2048) + parser.add_argument('--epochs', type=int, default=3) + parser.add_argument('--batch_size', type=int, default=2) + parser.add_argument('--grad_accum', type=int, default=4) + parser.add_argument('--lr', type=float, default=5e-6) + parser.add_argument('--n_generations', type=int, default=8) + parser.add_argument('--max_folds', type=int, default=8) + parser.add_argument('--output', default='origami-grpo') + parser.add_argument('--level', type=int, default=1, help='Target difficulty level (1-3)') + parser.add_argument('--no_semantic', action='store_true', + help='Disable semantic prompts; use coordinate-based target (default: semantic)') + parser.add_argument('--dry_run', action='store_true', help='Test reward function without training') + return parser.parse_args() + + +def build_dataset(env, level: int = 1, max_folds: int = 8, semantic: bool = True) -> list[dict]: + """ + Build a training dataset of prompts from available targets. + Each item: {'prompt': str, 'target_name': str} + Repeats each target multiple times to give enough training steps. + When semantic=True, uses get_semantic_description for task descriptions. + """ + from env.prompts import get_semantic_description, code_as_policy_prompt + + all_names = env.available_targets() + + # Filter by level; fall back to all targets if none match + level_names = [ + name for name in all_names + if env._targets[name].get('level', 1) == level + ] + if not level_names: + level_names = all_names + + items = [] + for name in level_names: + target = env._targets[name] + if semantic: + desc = get_semantic_description(name, target) + prompt = code_as_policy_prompt(target, max_folds=max_folds, semantic_description=desc) + else: + prompt = code_as_policy_prompt(target, max_folds=max_folds, semantic_description=None) + items.append({'prompt': prompt, 'target_name': name}) + + # Repeat each target 10x; ensure at least 50 examples + repeat = max(10, (50 + len(items) - 1) // len(items)) + items = items * repeat + + random.shuffle(items) + return items + + +def make_reward_fn(env_template, max_folds: int): + """ + Returns a reward function compatible with trl GRPOTrainer. + + Signature: reward_fn(completions, prompts=None, **kwargs) -> list[float] + + For each completion: + 1. Clone the environment (fresh paper state) + 2. Reset to the target embedded in the prompt (use target_name from kwargs if available) + 3. Execute the completion as a fold sequence + 4. Return the total reward + """ + def reward_fn(completions, prompts=None, **kwargs): + rewards = [] + target_names = kwargs.get('target_names', [None] * len(completions)) + + for completion, target_name in zip(completions, target_names): + try: + env = env_template.clone() + env.reset(target_name=target_name) + _, reward_dict, _, _ = env.step(completion) + rewards.append(float(reward_dict['total'])) + except Exception: + rewards.append(-0.1) + + return rewards + + return reward_fn + + +def make_detailed_reward_fns(env_template, max_folds: int) -> list: + """ + Returns a list of reward functions, one per reward component. + Used for detailed W&B logging of each component separately. + Components: kawasaki, maekawa, blb, progress, economy, completion + """ + components = ['kawasaki', 'maekawa', 'blb', 'progress', 'economy', 'completion'] + + def make_component_fn(component: str): + def component_fn(completions, prompts=None, **kwargs): + rewards = [] + target_names = kwargs.get('target_names', [None] * len(completions)) + + for completion, target_name in zip(completions, target_names): + try: + env = env_template.clone() + env.reset(target_name=target_name) + _, reward_dict, _, _ = env.step(completion) + rewards.append(float(reward_dict.get(component, 0.0))) + except Exception: + rewards.append(0.0) + + return rewards + + component_fn.__name__ = f'reward_{component}' + return component_fn + + return [make_component_fn(c) for c in components] + + +def main(): + args = parse_args() + + # Import here to allow dry_run without GPU + from env.environment import OrigamiEnvironment + + env = OrigamiEnvironment(mode='code_as_policy', max_steps=args.max_folds) + + # Build dataset + use_semantic = not args.no_semantic + dataset_items = build_dataset(env, level=args.level, max_folds=args.max_folds, semantic=use_semantic) + print(f"Dataset: {len(dataset_items)} examples from level-{args.level} targets (semantic={'on' if use_semantic else 'off'})") + print(f"Targets: {env.available_targets()}") + + # Dry run: test reward function without loading model + if args.dry_run: + reward_fn = make_reward_fn(env, args.max_folds) + test_completions = [ + '[{"instruction": "Valley fold along horizontal center", "from": [0, 0.5], "to": [1, 0.5], "assignment": "V"}]', + '[{"instruction": "Invalid fold", "from": [0.3, 0.3], "to": [0.7, 0.7], "assignment": "V"}]', + 'this is not valid JSON at all', + ] + target_names = [dataset_items[0]['target_name']] * 3 + rewards = reward_fn(test_completions, target_names=target_names) + print(f"\nDry run rewards: {rewards}") + print("Dry run complete — reward function works.") + return + + # Load model via unsloth + # VL models (SpatialThinker, Qwen2.5-VL) use FastVisionModel + # Text-only models use FastLanguageModel + is_vl = _is_vl_model(args.model) + + try: + if is_vl: + from unsloth import FastVisionModel as ModelLoader + print(f"Loading VL model (vision-language): {args.model}") + else: + from unsloth import FastLanguageModel as ModelLoader + print(f"Loading text model: {args.model}") + except ImportError: + print("ERROR: unsloth not installed. Run: pip install unsloth") + print("Or run with --dry_run to test the reward function without a model.") + return + + model, tokenizer = ModelLoader.from_pretrained( + model_name=args.model, + max_seq_length=args.max_seq_length, + load_in_4bit=True, + ) + + model = ModelLoader.get_peft_model( + model, + r=32, + target_modules=["q_proj", "k_proj", "v_proj", "o_proj", + "gate_proj", "up_proj", "down_proj"], + lora_alpha=32, + lora_dropout=0, + use_gradient_checkpointing="unsloth", + ) + + # Convert dataset to HuggingFace Dataset format + from datasets import Dataset + + # GRPOTrainer expects 'prompt' column and optionally others. + # We embed target_name in the dataset so the reward fn can use it. + hf_dataset = Dataset.from_list(dataset_items) + + # Build main reward function + reward_fn = make_reward_fn(env, args.max_folds) + + from trl import GRPOConfig, GRPOTrainer + + config = GRPOConfig( + output_dir=args.output, + num_train_epochs=args.epochs, + per_device_train_batch_size=args.batch_size, + gradient_accumulation_steps=args.grad_accum, + learning_rate=args.lr, + max_completion_length=512, + num_generations=args.n_generations, + temperature=1.0, + logging_steps=1, + report_to="trackio", + run_name="origami-grpo", + ) + + # GRPOTrainer passes all dataset columns as kwargs to reward_funcs. + # The 'target_name' column arrives as a list (one per completion in the batch). + def wrapped_reward_fn(completions, target_name=None, **kwargs): + """Wrapper that extracts target_name from batch columns.""" + target_names = target_name if isinstance(target_name, list) else [target_name] * len(completions) + return reward_fn(completions, target_names=target_names) + + trainer = GRPOTrainer( + model=model, + config=config, + train_dataset=hf_dataset, + reward_funcs=[wrapped_reward_fn], + tokenizer=tokenizer, + ) + + print(f"\nStarting GRPO training...") + print(f" Model: {args.model}") + print(f" Level: {args.level} targets") + print(f" Epochs: {args.epochs}") + print(f" Generations per prompt: {args.n_generations}") + print(f" Output: {args.output}/") + + trainer.train() + + # Save + model.save_pretrained(args.output) + tokenizer.save_pretrained(args.output) + print(f"\nModel saved to {args.output}/") + + +if __name__ == '__main__': + main() diff --git a/train_origami.ipynb b/train_origami.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..75abc7d7a0f567b06b8032c43c8d6e8e1d58180c --- /dev/null +++ b/train_origami.ipynb @@ -0,0 +1,184 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8smrrb11v84", + "source": "# Optigami — Origami RL Training (GRPO)\n\n**Train an LLM to generate valid origami fold sequences using verifiable geometric rewards.**\n\nArchitecture:\n- **Environment**: `env/` — CreaseGraph + Kawasaki/Maekawa/BLB verifiers + target matching\n- **Policy model**: SpatialThinker (Qwen2.5-VL-7B) or vanilla Qwen2.5-VL-7B\n- **Training**: Unsloth GRPO — model generates complete fold sequences, gets terminal reward\n- **Tracking**: Trackio — real-time reward curves on HF Spaces\n\n| Reward Component | Weight | What it measures |\n|---|---|---|\n| `progress` | 0.45 | Geometric crease coverage vs target |\n| `economy` | 0.10 | Penalty for excess creases |\n| `kawasaki` | 0.08 | Kawasaki theorem satisfaction |\n| `maekawa` | 0.07 | Maekawa theorem satisfaction |\n| `blb` | 0.05 | Big-Little-Big lemma |\n| `anchored` | 0.05 | Valid anchor point usage |\n| `completion` | +10.0 | Bonus when target reached |", + "metadata": {} + }, + { + "cell_type": "markdown", + "id": "kn1k9d357j", + "source": "## 1. Setup\n\n**GPU**: H100 80GB (Northflank/CoreWeave) or A100/T4 (Colab)\n\nInstall dependencies. Unsloth handles efficient model loading + LoRA.", + "metadata": {} + }, + { + "cell_type": "code", + "id": "d10vqzep5b6", + "source": "%%capture\n!pip install unsloth trackio shapely numpy datasets\n!pip install --upgrade trl transformers\n\n# Check GPU\nimport torch\nprint(f\"GPU: {torch.cuda.get_device_name(0)}\")\nprint(f\"VRAM: {torch.cuda.get_device_properties(0).total_mem / 1e9:.1f} GB\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "y6wsagz8h", + "source": "## 2. Configuration\n\nChoose base model and hyperparameters. Two options:\n- **SpatialThinker** (`OX-PIXL/SpatialThinker-Qwen2.5-VL-7B`): Pre-trained for spatial reasoning via RL\n- **Vanilla Qwen2.5-VL** (`unsloth/Qwen2.5-VL-7B-Instruct`): Standard vision-language model\n\nWe'll compare both to see which learns origami folding faster.", + "metadata": {} + }, + { + "cell_type": "code", + "id": "dh1zapl0w5s", + "source": "# ── Config ──────────────────────────────────────────────────────────────────\n# Toggle MODEL_NAME to switch between SpatialThinker and vanilla Qwen2.5-VL\n\nMODEL_NAME = \"OX-PIXL/SpatialThinker-Qwen2.5-VL-7B\"\n# MODEL_NAME = \"unsloth/Qwen2.5-VL-7B-Instruct\" # uncomment for vanilla\n\nMAX_SEQ_LENGTH = 2048\nLORA_R = 32\nLORA_ALPHA = 32\nEPOCHS = 3\nBATCH_SIZE = 2\nGRAD_ACCUM = 4\nLR = 5e-6\nN_GENERATIONS = 8 # completions sampled per prompt (GRPO group size)\nMAX_FOLDS = 8 # max folds per episode\nLEVEL = 1 # target difficulty (1=simple, 2=medium, 3=hard)\nMAX_COMPLETION_LEN = 512\nOUTPUT_DIR = \"origami-grpo\"\n\n# Trackio — set your HF Space ID for live dashboard\nTRACKIO_SPACE_ID = None # e.g. \"your-username/optigami-training\"\n\nprint(f\"Model: {MODEL_NAME}\")\nprint(f\"Config: {EPOCHS} epochs, batch={BATCH_SIZE}, grad_accum={GRAD_ACCUM}, lr={LR}\")\nprint(f\"GRPO: {N_GENERATIONS} generations, max_folds={MAX_FOLDS}, level={LEVEL}\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "o5hhfbp0wb", + "source": "## 3. Clone Repo & Test Environment\n\nClone the optigami repo (skip if running locally) and verify the environment works.", + "metadata": {} + }, + { + "cell_type": "code", + "id": "94cemjucczl", + "source": "import os\n\n# Clone repo if not already present (Colab/Northflank)\nif not os.path.exists(\"env/environment.py\"):\n !git clone https://huggingface.co/spaces/openenv-community/optigami /content/optigami 2>/dev/null || true\n os.chdir(\"/content/optigami\")\n\n# Verify env/ is accessible\nfrom env.environment import OrigamiEnvironment\nfrom env.rewards import compute_reward\nfrom env.prompts import parse_fold_list\n\nenv = OrigamiEnvironment(mode=\"code_as_policy\", max_steps=MAX_FOLDS)\nprint(f\"Available targets: {env.available_targets()}\")\nprint(f\"Environment mode: {env.mode}\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "id": "2j9mccejyfx", + "source": "# ── Dry run: test reward function ───────────────────────────────────────────\n# Verify rewards work before loading the model\n\nimport copy\n\ndef make_reward_fn(env_template, max_folds):\n \"\"\"Reward function: clone env, run completion, return total reward.\"\"\"\n def reward_fn(completions, prompts=None, **kwargs):\n rewards = []\n target_names = kwargs.get(\"target_names\", [None] * len(completions))\n for completion, target_name in zip(completions, target_names):\n try:\n e = env_template.clone()\n e.reset(target_name=target_name)\n _, reward_dict, _, _ = e.step(completion)\n rewards.append(float(reward_dict[\"total\"]))\n except Exception:\n rewards.append(-0.1)\n return rewards\n return reward_fn\n\nreward_fn = make_reward_fn(env, MAX_FOLDS)\n\ntest_completions = [\n '[{\"instruction\": \"Valley fold along horizontal center\", \"from\": [0, 0.5], \"to\": [1, 0.5], \"assignment\": \"V\"}]',\n '[{\"instruction\": \"Bad fold\", \"from\": [0.3, 0.3], \"to\": [0.7, 0.7], \"assignment\": \"V\"}]',\n 'not valid JSON',\n]\ntarget_names = [\"half_horizontal\"] * 3\nrewards = reward_fn(test_completions, target_names=target_names)\n\nfor comp, r in zip([\"perfect fold\", \"partial fold\", \"garbage\"], rewards):\n print(f\" {comp}: reward = {r:.3f}\")\nprint(\"\\nReward function OK ✓\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "46gs2p1cy4", + "source": "## 4. Load Model + LoRA\n\nLoad the VL model with Unsloth's `FastVisionModel` (4-bit quantized) and apply LoRA adapters.", + "metadata": {} + }, + { + "cell_type": "code", + "id": "82f76od6d2k", + "source": "from unsloth import FastVisionModel\n\nmodel, tokenizer = FastVisionModel.from_pretrained(\n model_name=MODEL_NAME,\n max_seq_length=MAX_SEQ_LENGTH,\n load_in_4bit=True,\n)\n\nmodel = FastVisionModel.get_peft_model(\n model,\n r=LORA_R,\n target_modules=[\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\",\n \"gate_proj\", \"up_proj\", \"down_proj\"],\n lora_alpha=LORA_ALPHA,\n lora_dropout=0,\n use_gradient_checkpointing=\"unsloth\",\n)\n\nprint(f\"Model loaded: {MODEL_NAME}\")\nprint(f\"LoRA rank: {LORA_R}, alpha: {LORA_ALPHA}\")\nprint(f\"Trainable params: {sum(p.numel() for p in model.parameters() if p.requires_grad):,}\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "67dyfrj23y", + "source": "## 5. Build Dataset\n\nGenerate prompts from all level-appropriate targets. Each prompt embeds the target crease pattern description and asks the model to output `[...]`.", + "metadata": {} + }, + { + "cell_type": "code", + "id": "1msqpzj5fwu", + "source": "import random\nfrom datasets import Dataset\n\ndef build_dataset(env, level=1):\n \"\"\"Build training dataset of prompts from env targets.\"\"\"\n all_names = env.available_targets()\n level_names = [\n n for n in all_names\n if env._targets[n].get(\"level\", 1) == level\n ]\n if not level_names:\n level_names = all_names\n\n items = []\n for name in level_names:\n obs = env.reset(target_name=name)\n items.append({\"prompt\": obs[\"prompt\"], \"target_name\": name})\n\n # Repeat each target 10x; ensure at least 50 examples\n repeat = max(10, (50 + len(items) - 1) // len(items))\n items = items * repeat\n random.shuffle(items)\n return items\n\ndataset_items = build_dataset(env, level=LEVEL)\nhf_dataset = Dataset.from_list(dataset_items)\n\nprint(f\"Dataset: {len(dataset_items)} examples\")\nprint(f\"Targets in dataset: {sorted(set(d['target_name'] for d in dataset_items))}\")\nprint(f\"\\nSample prompt (first 300 chars):\\n{dataset_items[0]['prompt'][:300]}...\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "7n3r3nsw8ae", + "source": "## 6. Trackio Setup\n\nInitialize Trackio for real-time training visualization. Trackio is a free W&B alternative that deploys a Gradio dashboard to HF Spaces.", + "metadata": {} + }, + { + "cell_type": "code", + "id": "bgru9rsw95b", + "source": "import trackio\n\n# Initialize Trackio run\ntrackio_kwargs = {\n \"project_name\": \"optigami\",\n \"run_name\": f\"grpo-{MODEL_NAME.split('/')[-1]}-level{LEVEL}\",\n}\nif TRACKIO_SPACE_ID:\n trackio_kwargs[\"space_id\"] = TRACKIO_SPACE_ID\n\ntrackio.init(**trackio_kwargs)\nprint(f\"Trackio initialized: {trackio_kwargs['run_name']}\")\nif TRACKIO_SPACE_ID:\n print(f\"Dashboard: https://huggingface.co/spaces/{TRACKIO_SPACE_ID}\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "n8aqymlszo", + "source": "## 7. GRPO Training\n\nRun GRPO with Trackio logging. The trainer samples `N_GENERATIONS` completions per prompt, computes rewards via the environment, and updates the policy using group-relative advantages.", + "metadata": {} + }, + { + "cell_type": "code", + "id": "ci4imd9ws7v", + "source": "from trl import GRPOConfig, GRPOTrainer\n\n# ── Per-component reward functions for detailed logging ─────────────────────\nREWARD_COMPONENTS = [\"kawasaki\", \"maekawa\", \"blb\", \"progress\", \"economy\", \"completion\"]\n\ndef make_component_fn(env_template, component):\n \"\"\"Create a reward function that returns a single component's value.\"\"\"\n def component_fn(completions, target_name=None, **kwargs):\n target_names = target_name if isinstance(target_name, list) else [target_name] * len(completions)\n rewards = []\n for completion, tn in zip(completions, target_names):\n try:\n e = env_template.clone()\n e.reset(target_name=tn)\n _, reward_dict, _, _ = e.step(completion)\n rewards.append(float(reward_dict.get(component, 0.0)))\n except Exception:\n rewards.append(0.0)\n return rewards\n component_fn.__name__ = f\"reward_{component}\"\n return component_fn\n\n# Main reward function (returns total reward)\ndef wrapped_reward_fn(completions, target_name=None, **kwargs):\n \"\"\"Main reward function — extracts target_name from batch columns.\"\"\"\n target_names = target_name if isinstance(target_name, list) else [target_name] * len(completions)\n return reward_fn(completions, target_names=target_names)\n\n# Build list of all reward functions: [total, kawasaki, maekawa, blb, progress, economy, completion]\nall_reward_fns = [wrapped_reward_fn] + [\n make_component_fn(env, c) for c in REWARD_COMPONENTS\n]\n\n# ── GRPO Config ─────────────────────────────────────────────────────────────\nconfig = GRPOConfig(\n output_dir=OUTPUT_DIR,\n num_train_epochs=EPOCHS,\n per_device_train_batch_size=BATCH_SIZE,\n gradient_accumulation_steps=GRAD_ACCUM,\n learning_rate=LR,\n max_completion_length=MAX_COMPLETION_LEN,\n num_generations=N_GENERATIONS,\n temperature=1.0,\n logging_steps=1,\n save_steps=50,\n report_to=\"trackio\",\n run_name=f\"grpo-{MODEL_NAME.split('/')[-1]}-level{LEVEL}\",\n)\n\ntrainer = GRPOTrainer(\n model=model,\n config=config,\n train_dataset=hf_dataset,\n reward_funcs=all_reward_fns,\n tokenizer=tokenizer,\n)\n\nprint(f\"Trainer ready. Starting GRPO training...\")\nprint(f\" Model: {MODEL_NAME}\")\nprint(f\" Dataset: {len(hf_dataset)} examples\")\nprint(f\" Reward functions: total + {REWARD_COMPONENTS}\")\nprint(f\" Logging to: Trackio\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "id": "mwy1i7d509", + "source": "# ── Train! ──────────────────────────────────────────────────────────────────\ntrainer.train()\n\n# Save model + tokenizer\nmodel.save_pretrained(OUTPUT_DIR)\ntokenizer.save_pretrained(OUTPUT_DIR)\nprint(f\"\\nTraining complete. Model saved to {OUTPUT_DIR}/\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "54iu59w1ipb", + "source": "## 8. Evaluation\n\nRun the trained model on all targets and measure solve rates + average rewards.", + "metadata": {} + }, + { + "cell_type": "code", + "id": "7loiy5mrsi3", + "source": "# ── Evaluate trained model on all targets ───────────────────────────────────\nfrom transformers import TextStreamer\n\nFastVisionModel.for_inference(model)\n\neval_results = {}\nn_samples = 5 # generations per target\n\nfor target_name in env.available_targets():\n obs = env.reset(target_name=target_name)\n prompt = obs[\"prompt\"]\n\n # Tokenize prompt\n messages = [{\"role\": \"user\", \"content\": prompt}]\n input_ids = tokenizer.apply_chat_template(messages, return_tensors=\"pt\").to(model.device)\n\n target_rewards = []\n target_solved = 0\n\n for _ in range(n_samples):\n outputs = model.generate(\n input_ids=input_ids,\n max_new_tokens=MAX_COMPLETION_LEN,\n temperature=0.7,\n do_sample=True,\n )\n completion = tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True)\n\n # Score completion\n e = env.clone()\n e.reset(target_name=target_name)\n try:\n _, reward_dict, _, _ = e.step(completion)\n total = float(reward_dict[\"total\"])\n solved = reward_dict.get(\"completion\", 0) > 0\n except Exception:\n total = -0.1\n solved = False\n\n target_rewards.append(total)\n if solved:\n target_solved += 1\n\n eval_results[target_name] = {\n \"avg_reward\": sum(target_rewards) / len(target_rewards),\n \"max_reward\": max(target_rewards),\n \"solve_rate\": target_solved / n_samples,\n }\n print(f\" {target_name:20s} avg={eval_results[target_name]['avg_reward']:.3f} \"\n f\"max={eval_results[target_name]['max_reward']:.3f} \"\n f\"solved={target_solved}/{n_samples}\")\n\n# Summary\navg_solve = sum(r[\"solve_rate\"] for r in eval_results.values()) / len(eval_results)\navg_reward = sum(r[\"avg_reward\"] for r in eval_results.values()) / len(eval_results)\nprint(f\"\\nOverall: avg_reward={avg_reward:.3f}, solve_rate={avg_solve:.1%}\")\n\n# Log to Trackio\ntrackio.log({\"eval/avg_reward\": avg_reward, \"eval/solve_rate\": avg_solve})\nfor name, res in eval_results.items():\n trackio.log({f\"eval/{name}_reward\": res[\"avg_reward\"], f\"eval/{name}_solved\": res[\"solve_rate\"]})", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "c9dr4ht05r", + "source": "## 9. A/B Comparison: SpatialThinker vs Vanilla Qwen2.5-VL\n\nTo compare both models, run this notebook twice:\n1. First run with `MODEL_NAME = \"OX-PIXL/SpatialThinker-Qwen2.5-VL-7B\"`\n2. Second run with `MODEL_NAME = \"unsloth/Qwen2.5-VL-7B-Instruct\"`\n\nBoth runs log to the same Trackio project (`optigami`) with different run names, so you can overlay the reward curves directly in the dashboard.\n\nThe cell below loads saved eval results from both runs for comparison (run after both trainings complete).", + "metadata": {} + }, + { + "cell_type": "code", + "id": "qwwd4wyuhnq", + "source": "# ── Save eval results for comparison ────────────────────────────────────────\nimport json\n\nmodel_tag = MODEL_NAME.split(\"/\")[-1]\neval_path = f\"eval_results_{model_tag}_level{LEVEL}.json\"\n\nwith open(eval_path, \"w\") as f:\n json.dump(eval_results, f, indent=2)\nprint(f\"Eval results saved to {eval_path}\")\n\n# ── Compare (run after both models are trained) ────────────────────────────\nspatial_path = f\"eval_results_SpatialThinker-Qwen2.5-VL-7B_level{LEVEL}.json\"\nvanilla_path = f\"eval_results_Qwen2.5-VL-7B-Instruct_level{LEVEL}.json\"\n\nif os.path.exists(spatial_path) and os.path.exists(vanilla_path):\n with open(spatial_path) as f:\n spatial = json.load(f)\n with open(vanilla_path) as f:\n vanilla = json.load(f)\n\n print(f\"\\n{'Target':<22} {'SpatialThinker':>16} {'Vanilla Qwen':>16} {'Delta':>10}\")\n print(\"-\" * 66)\n for target in sorted(set(list(spatial.keys()) + list(vanilla.keys()))):\n s_r = spatial.get(target, {}).get(\"avg_reward\", 0)\n v_r = vanilla.get(target, {}).get(\"avg_reward\", 0)\n delta = s_r - v_r\n print(f\" {target:<20} {s_r:>14.3f} {v_r:>14.3f} {delta:>+8.3f}\")\n\n s_avg = sum(r[\"avg_reward\"] for r in spatial.values()) / len(spatial)\n v_avg = sum(r[\"avg_reward\"] for r in vanilla.values()) / len(vanilla)\n print(f\"\\n {'OVERALL':<20} {s_avg:>14.3f} {v_avg:>14.3f} {s_avg - v_avg:>+8.3f}\")\n\n s_solve = sum(r[\"solve_rate\"] for r in spatial.values()) / len(spatial)\n v_solve = sum(r[\"solve_rate\"] for r in vanilla.values()) / len(vanilla)\n print(f\" {'Solve Rate':<20} {s_solve:>13.1%} {v_solve:>13.1%} {s_solve - v_solve:>+7.1%}\")\nelse:\n print(f\"Run both models to compare. Looking for:\\n {spatial_path}\\n {vanilla_path}\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "812csd43vxk", + "source": "## 10. Push to HuggingFace Hub (optional)\n\nUpload the trained LoRA adapter to HF for deployment or further fine-tuning.", + "metadata": {} + }, + { + "cell_type": "code", + "id": "h38kp70n16q", + "source": "# ── Push to HF Hub (uncomment and set your repo) ───────────────────────────\n# from huggingface_hub import login\n# login(token=\"hf_...\") # or use HF_TOKEN env var\n#\n# HF_REPO = \"your-username/optigami-grpo-spatialthinker\"\n# model.push_to_hub(HF_REPO)\n# tokenizer.push_to_hub(HF_REPO)\n# print(f\"Model pushed to https://huggingface.co/{HF_REPO}\")\n\ntrackio.finish()\nprint(\"Done! Check your Trackio dashboard for training curves.\")", + "metadata": {}, + "execution_count": null, + "outputs": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.10.0" + }, + "colab": { + "provenance": [], + "gpuType": "A100" + }, + "accelerator": "GPU" + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/trainer/mock_env.py b/trainer/mock_env.py deleted file mode 100644 index e1360d105ad111bd36b6b2f1c99c37a0269ba31f..0000000000000000000000000000000000000000 --- a/trainer/mock_env.py +++ /dev/null @@ -1,233 +0,0 @@ -""" -Mock origami environment for trainer development. - -Returns fake PaperState responses so we can iterate on the GRPO loop -without waiting for the real physics engine. The mock applies geometric -transforms (vertex rotations around fold lines) but skips energy/strain -computation — those return plausible dummy values. -""" - -import math -import numpy as np -from dataclasses import dataclass, field - - -@dataclass -class Material: - name: str = "paper" - thickness_mm: float = 0.1 - youngs_modulus_gpa: float = 2.0 - max_strain: float = 0.03 # 3% - - -@dataclass -class PaperState: - vertices: np.ndarray # (N, 3) - edges: np.ndarray # (E, 2) - faces: list[list[int]] - assignments: list[str] # M/V/B per edge - fold_angles: np.ndarray # (E,) degrees - - rest_lengths: np.ndarray # (E,) - strain: np.ndarray # (N,) - energy: float = 0.0 - - face_orders: list[tuple] = field(default_factory=list) - num_layers: int = 1 - - material: Material = field(default_factory=Material) - - bounding_box: np.ndarray = field(default_factory=lambda: np.array([1.0, 1.0, 0.0])) - deployment_ratio: float = 1.0 - is_valid: bool = True - kawasaki_violation: float = 0.0 - maekawa_violation: float = 0.0 - self_intersections: int = 0 - - def to_dict(self) -> dict: - return { - "width": float(self.bounding_box[0]), - "height": float(self.bounding_box[1]), - "material": { - "name": self.material.name, - "thickness_mm": self.material.thickness_mm, - "youngs_modulus_gpa": self.material.youngs_modulus_gpa, - }, - "vertices": self.vertices.tolist(), - "edges": self.edges.tolist(), - "assignments": self.assignments, - "fold_angles": self.fold_angles.tolist(), - "num_layers_at_center": self.num_layers, - "bounding_box": { - "x": float(self.bounding_box[0]), - "y": float(self.bounding_box[1]), - "z": float(self.bounding_box[2]), - }, - } - - -def create_flat_sheet(width: float = 1.0, height: float = 1.0, - material: Material | None = None) -> PaperState: - """Create a flat rectangular sheet with 4 vertices, 5 edges (incl diagonal), 2 faces.""" - verts = np.array([ - [0, 0, 0], - [width, 0, 0], - [width, height, 0], - [0, height, 0], - ], dtype=float) - - edges = np.array([ - [0, 1], [1, 2], [2, 3], [3, 0], # boundary - [0, 2], # diagonal - ], dtype=int) - - faces = [[0, 1, 2], [0, 2, 3]] - assignments = ["B", "B", "B", "B", "F"] # boundary + flat diagonal - fold_angles = np.zeros(len(edges)) - rest_lengths = np.array([np.linalg.norm(verts[e[1]] - verts[e[0]]) for e in edges]) - strain = np.zeros(len(verts)) - - mat = material or Material() - return PaperState( - vertices=verts, edges=edges, faces=faces, - assignments=assignments, fold_angles=fold_angles, - rest_lengths=rest_lengths, strain=strain, - material=mat, - bounding_box=np.array([width, height, 0.0]), - ) - - -def _rotate_points(points: np.ndarray, axis_point: np.ndarray, - axis_dir: np.ndarray, angle_rad: float) -> np.ndarray: - """Rotate points around an arbitrary axis using Rodrigues' formula.""" - k = axis_dir / np.linalg.norm(axis_dir) - translated = points - axis_point - cos_a = math.cos(angle_rad) - sin_a = math.sin(angle_rad) - rotated = (translated * cos_a + - np.cross(k, translated) * sin_a + - k * (np.dot(translated, k).reshape(-1, 1)) * (1 - cos_a)) - return rotated + axis_point - - -def apply_fold_mock(state: PaperState, fold: dict) -> tuple[PaperState, str | None]: - """ - Apply a single fold operation to the paper state (mock version). - - fold = { - "type": "valley" | "mountain", - "line": {"start": [x, y], "end": [x, y]}, - "angle": 0-180 - } - - Returns (new_state, error_string_or_None). - """ - fold_type = fold.get("type", "valley") - line = fold.get("line", {}) - angle_deg = fold.get("angle", 180) - - start = np.array(line.get("start", [0, 0]), dtype=float) - end = np.array(line.get("end", [0, 0]), dtype=float) - - if np.allclose(start, end): - return state, "Fold line has zero length" - - if fold_type not in ("valley", "mountain"): - return state, f"Unknown fold type: {fold_type}" - - if not (0 < angle_deg <= 180): - return state, f"Angle must be in (0, 180], got {angle_deg}" - - # Fold direction: valley folds up (+z), mountain folds down (-z) - sign = 1.0 if fold_type == "valley" else -1.0 - angle_rad = sign * math.radians(angle_deg) - - # Determine which vertices are on the "folding" side of the line - line_dir_2d = end - start - normal_2d = np.array([-line_dir_2d[1], line_dir_2d[0]]) # perpendicular - - new_verts = state.vertices.copy() - for i, v in enumerate(new_verts): - point_2d = v[:2] - start - side = np.dot(point_2d, normal_2d) - if side > 1e-9: # on the positive side → rotate - axis_point = np.array([start[0], start[1], 0.0]) - axis_dir = np.array([line_dir_2d[0], line_dir_2d[1], 0.0]) - new_verts[i] = _rotate_points( - v.reshape(1, -1), axis_point, axis_dir, angle_rad - ).flatten() - - # Update bounding box (clamp near-zero values from floating point) - bb = np.ptp(new_verts, axis=0) # max - min per axis - bb = np.where(np.abs(bb) < 1e-10, 0.0, bb) - # Add minimum thickness per layer (material thickness) - thickness = state.material.thickness_mm / 1000.0 # convert mm to m - num_layers = state.num_layers + 1 - bb[2] = max(bb[2], thickness * num_layers) - - # Mock strain: small random value per vertex - new_strain = np.random.uniform(0, 0.01, len(new_verts)) - - # Mock energy - new_energy = state.energy + 0.1 * angle_deg / 180.0 - - # Update assignments — add new edge as M or V - new_assignments = state.assignments.copy() - - # Deployment ratio estimate: each full fold (180°) halves the area in one direction. - # Partial folds reduce proportionally. This is a mock approximation — - # the real engine will compute from actual face overlaps. - fold_factor = angle_deg / 180.0 # 1.0 for full fold, 0.5 for 90°, etc. - deploy_ratio = state.deployment_ratio * (1.0 - 0.5 * fold_factor) - - new_state = PaperState( - vertices=new_verts, - edges=state.edges.copy(), - faces=state.faces.copy(), - assignments=new_assignments, - fold_angles=state.fold_angles.copy(), - rest_lengths=state.rest_lengths.copy(), - strain=new_strain, - energy=new_energy, - material=state.material, - bounding_box=bb, - deployment_ratio=deploy_ratio, - num_layers=state.num_layers + 1, - is_valid=True, - kawasaki_violation=0.0, - maekawa_violation=0.0, - self_intersections=0, - ) - return new_state, None - - -def execute_fold_strategy(strategy_fn, paper_state: PaperState, - max_folds: int = 20) -> tuple[PaperState, list[dict], str | None]: - """ - Execute a fold_strategy function against the mock environment. - - Returns (final_state, applied_folds, error_or_None). - """ - state_dict = paper_state.to_dict() - try: - folds = strategy_fn(state_dict) - except Exception as e: - return paper_state, [], f"Strategy function raised: {e}" - - if not isinstance(folds, list): - return paper_state, [], "Strategy must return a list of fold dicts" - - applied = [] - current = paper_state - for i, fold in enumerate(folds): - if i >= max_folds: - break - if not isinstance(fold, dict): - return current, applied, f"Fold {i} is not a dict" - - current, error = apply_fold_mock(current, fold) - if error: - return current, applied, f"Fold {i} failed: {error}" - applied.append(fold) - - return current, applied, None diff --git a/trainer/prompts.py b/trainer/prompts.py deleted file mode 100644 index cde29f9d14221f613066bdae84371bc3af2136f0..0000000000000000000000000000000000000000 --- a/trainer/prompts.py +++ /dev/null @@ -1,169 +0,0 @@ -""" -Prompt templates for origami fold strategy generation. - -The LLM receives a task description and paper state, then generates -a fold_strategy(paper_state) function that returns fold operations. -""" - -SYSTEM_PROMPT = """\ -You are an origami engineer. You design fold patterns for real-world applications \ -like solar panel packing, deployable shelters, and medical stents. - -You will be given a folding task with material constraints. Write a Python function \ -`fold_strategy(paper_state)` that returns a list of fold operations to achieve the goal. - -Rules: -- Only use native Python (no imports except math, itertools, functools) -- Each fold: {"type": "valley"|"mountain", "line": {"start": [x,y], "end": [x,y]}, "angle": 0-180} -- Fold lines must intersect the paper boundaries -- Fewer folds is better (efficiency matters) -- Respect material strain limits -- Output ONLY the function in ```python ... ``` backticks\ -""" - - -TASK_TEMPLATES = { - "half_fold": { - "name": "half_fold", - "prompt": """\ -TASK: Fold a {width}m x {height}m {material} sheet in half to minimize one dimension. - -MATERIAL: {material} (thickness: {thickness_mm}mm, max strain: {max_strain_pct}%) -CONSTRAINTS: Maximum {max_folds} fold operations. -TARGET: Deployment ratio <= 0.5 (folded area is half or less of original) - -CURRENT STATE: - Sheet: {width}m x {height}m, flat (0 folds applied) - Bounding box: {width}m x {height}m x 0.0m - -Write a fold_strategy(paper_state) function that returns a list of fold operations. -Each fold: {{"type": "valley"|"mountain", "line": {{"start": [x,y], "end": [x,y]}}, "angle": 0-180}} - -```python -def fold_strategy(paper_state): - # Your code here - return [...] -```""", - "target_ratio": 0.5, - "max_folds": 3, - }, - - "letter_fold": { - "name": "letter_fold", - "prompt": """\ -TASK: Fold a {width}m x {height}m {material} sheet into thirds (like a letter). - -MATERIAL: {material} (thickness: {thickness_mm}mm, max strain: {max_strain_pct}%) -CONSTRAINTS: Maximum {max_folds} fold operations. -TARGET: Deployment ratio <= 0.33 - -CURRENT STATE: - Sheet: {width}m x {height}m, flat (0 folds applied) - -Write a fold_strategy(paper_state) function that returns a list of fold operations. -Each fold: {{"type": "valley"|"mountain", "line": {{"start": [x,y], "end": [x,y]}}, "angle": 0-180}} - -```python -def fold_strategy(paper_state): - # Your code here - return [...] -```""", - "target_ratio": 0.33, - "max_folds": 5, - }, - - "solar_panel": { - "name": "solar_panel", - "prompt": """\ -TASK: Fold a {width}m x {height}m Mylar sheet to minimize packed volume for a solar panel. -The folded panel must be deployable (unfold cleanly to near-original area). - -MATERIAL: Mylar (thickness: 0.05mm, Young's modulus: 4 GPa, max strain: 3%) -CONSTRAINTS: - - Maximum {max_folds} fold operations - - Must pack into bounding box <= 15cm x 15cm x 5cm - - Must deploy to >= 80% of original area - - No self-intersections - -TARGET: Deployment ratio <= 0.05 (95% volume reduction) - -CURRENT STATE: - Sheet: {width}m x {height}m, flat (0 folds applied) - Bounding box: {width}m x {height}m x 0.0m - -HINT: Consider tessellated patterns like Miura-ori — alternating mountain and valley -folds in a grid create a highly compact, single-DOF deployable structure. - -Write a fold_strategy(paper_state) function that returns a list of fold operations. -Each fold: {{"type": "valley"|"mountain", "line": {{"start": [x,y], "end": [x,y]}}, "angle": 0-180}} - -```python -def fold_strategy(paper_state): - # Your code here - return [...] -```""", - "target_ratio": 0.05, - "max_folds": 20, - }, - - "stent_fold": { - "name": "stent_fold", - "prompt": """\ -TASK: Fold a {width}m x {height}m Nitinol sheet into a compact cylinder for a medical stent. - -MATERIAL: Nitinol (thickness: 0.1mm, Young's modulus: 75 GPa, max strain: 8%) -CONSTRAINTS: - - Maximum {max_folds} fold operations - - Compressed diameter: 3mm - - Deployed diameter: 10mm - - Must be radially deployable - -TARGET: Minimize packed cross-section while maintaining deployability. - -Write a fold_strategy(paper_state) function that returns a list of fold operations. - -```python -def fold_strategy(paper_state): - # Your code here - return [...] -```""", - "target_ratio": 0.1, - "max_folds": 15, - }, -} - - -# Default task configs for each level -TASK_CONFIGS = { - "half_fold": { - "width": 1.0, "height": 1.0, "material": "paper", - "thickness_mm": 0.1, "max_strain_pct": 3, "max_folds": 3, - }, - "letter_fold": { - "width": 1.0, "height": 1.0, "material": "paper", - "thickness_mm": 0.1, "max_strain_pct": 3, "max_folds": 5, - }, - "solar_panel": { - "width": 1.0, "height": 1.0, "material": "mylar", - "thickness_mm": 0.05, "max_strain_pct": 3, "max_folds": 20, - }, - "stent_fold": { - "width": 0.1, "height": 0.03, "material": "nitinol", - "thickness_mm": 0.1, "max_strain_pct": 8, "max_folds": 15, - }, -} - - -def build_prompt(task_name: str = "half_fold", **overrides) -> str: - """Build a complete user prompt for a given task.""" - task = TASK_TEMPLATES[task_name] - config = {**TASK_CONFIGS[task_name], **overrides} - return task["prompt"].format(**config) - - -def get_task_target_ratio(task_name: str) -> float: - return TASK_TEMPLATES[task_name]["target_ratio"] - - -def get_task_max_folds(task_name: str) -> int: - return TASK_TEMPLATES[task_name]["max_folds"] diff --git a/trainer/rewards.py b/trainer/rewards.py deleted file mode 100644 index 34d006beaf41550c29f47403e30694f491b957fe..0000000000000000000000000000000000000000 --- a/trainer/rewards.py +++ /dev/null @@ -1,388 +0,0 @@ -""" -Reward functions for origami GRPO training. - -Three reward functions following the 2048 pattern: - 1. code_valid — Does the generated code parse and produce fold instructions? - 2. physically_valid — Are the folds geometrically/physically valid? - 3. fold_quality — How good is the folding solution (compactness, efficiency)? - -Lexicographic gating (from SpatialThinker): if code doesn't parse, -all downstream rewards are 0. This prevents reward hacking. -""" - -import ast -import sys -import math -import traceback -from typing import Callable - -# Use real engine if available, fall back to mock -try: - from engine.paper import Paper - from engine.fold_engine import execute_fold_strategy - from engine.materials import Material, get_material - from engine.validation import validate_paper - from engine.metrics import compute_metrics - - def _create_sheet(width, height, material): - return Paper.create_flat_sheet(width, height, material) - - USE_REAL_ENGINE = True -except ImportError: - from trainer.mock_env import ( - PaperState as Paper, create_flat_sheet, execute_fold_strategy, Material - ) - - def _create_sheet(width, height, material): - return create_flat_sheet(width, height, material) - - def validate_paper(p): - from types import SimpleNamespace - return SimpleNamespace( - is_valid=p.is_valid, kawasaki_valid=True, maekawa_valid=True, - kawasaki_violation=p.kawasaki_violation, - maekawa_violation=p.maekawa_violation, - self_intersection_count=p.self_intersections, - ) - - def compute_metrics(p, orig): - return { - "deployment_ratio": p.deployment_ratio, - "fold_count": sum(1 for a in p.assignments if a in ("M", "V")), - "max_strain": float(p.strain.max()) if len(p.strain) > 0 else 0.0, - } - - USE_REAL_ENGINE = False - - -# --------------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------------- - -def extract_function(text: str) -> str | None: - """Extract a Python function from triple-backtick code blocks.""" - if text.count("```") < 2: - return None - first = text.find("```") + 3 - second = text.find("```", first) - fx = text[first:second].strip() - fx = fx.removeprefix("python\n").removeprefix("python\r\n") - # Find the def statement - def_idx = fx.find("def ") - if def_idx == -1: - return None - fx = fx[def_idx:] - if fx.startswith("def fold_strategy("): - return fx - return None - - -def check_imports_stdlib_only(code: str) -> tuple[bool, str]: - """Check that code only imports from Python stdlib.""" - try: - tree = ast.parse(code) - except SyntaxError as e: - return False, f"syntax error: {e}" - - ALLOWED_MODULES = { - "math", "itertools", "functools", "collections", "copy", - "operator", "typing", "random", "heapq", "bisect", - } - - for node in ast.walk(tree): - if isinstance(node, ast.Import): - for alias in node.names: - root = alias.name.split(".")[0] - if root not in ALLOWED_MODULES: - return False, f"non-stdlib import: {alias.name}" - elif isinstance(node, ast.ImportFrom): - if node.module: - root = node.module.split(".")[0] - if root not in ALLOWED_MODULES: - return False, f"non-stdlib import: {node.module}" - - return True, "ok" - - -def create_sandboxed_function(code: str) -> Callable: - """ - Execute the function code in a restricted namespace. - Returns the fold_strategy function object. - """ - allowed_builtins = { - "range", "len", "int", "float", "str", "list", "dict", "tuple", - "set", "bool", "abs", "min", "max", "sum", "sorted", "reversed", - "enumerate", "zip", "map", "filter", "round", "isinstance", - "True", "False", "None", "print", - } - safe_builtins = {k: __builtins__[k] if isinstance(__builtins__, dict) - else getattr(__builtins__, k) - for k in allowed_builtins - if (k in __builtins__ if isinstance(__builtins__, dict) - else hasattr(__builtins__, k))} - safe_builtins["__import__"] = __import__ # needed for stdlib imports - - namespace = {"__builtins__": safe_builtins} - exec(code, namespace) - - if "fold_strategy" not in namespace: - raise ValueError("No fold_strategy function defined") - - return namespace["fold_strategy"] - - -# --------------------------------------------------------------------------- -# State for strategy execution -# --------------------------------------------------------------------------- - -# Current task config (set by train.py before training starts) -if USE_REAL_ENGINE: - _default_material = get_material("paper") -else: - _default_material = Material() - -_current_task = { - "width": 1.0, - "height": 1.0, - "material": _default_material, - "target_ratio": 0.5, - "max_folds": 3, -} - -PRINT_EVERY = 5 -_print_counter = 0 - - -def set_task_config(width=1.0, height=1.0, material=None, - target_ratio=0.5, max_folds=3): - global _current_task - _current_task = { - "width": width, - "height": height, - "material": material or Material(), - "target_ratio": target_ratio, - "max_folds": max_folds, - } - - -# --------------------------------------------------------------------------- -# Reward 1: code_valid -# --------------------------------------------------------------------------- - -def code_valid(completions, **kwargs) -> list[float]: - """ - Does the generated code parse as valid Python and produce a callable? - - +1.0 — valid function that can be created - -0.5 — correct structure but exec/sandbox fails - -2.0 — no function found or syntax error - -20.0 — non-stdlib imports (heavy penalty) - """ - scores = [] - for completion in completions: - response = completion[0]["content"] - function_code = extract_function(response) - - if function_code is None: - scores.append(-2.0) - continue - - ok, info = check_imports_stdlib_only(function_code) - if not ok: - if "syntax error" in info: - scores.append(-2.0) - else: - scores.append(-20.0) # non-stdlib imports - continue - - try: - create_sandboxed_function(function_code) - scores.append(1.0) - except Exception: - scores.append(-0.5) - - return scores - - -# --------------------------------------------------------------------------- -# Reward 2: physically_valid -# --------------------------------------------------------------------------- - -def physically_valid(completions, **kwargs) -> list[float]: - """ - Are the folds physically possible? - - +1.0 — all folds valid, no violations - -2.0 — per Kawasaki/Maekawa violation - -5.0 — any self-intersection - -1.0 — strain exceeds material limit - 0.0 — function broken / can't run - """ - scores = [] - for completion in completions: - response = completion[0]["content"] - function_code = extract_function(response) - - if function_code is None: - scores.append(0.0) - continue - - ok, info = check_imports_stdlib_only(function_code) - if not ok: - scores.append(0.0) - continue - - try: - strategy_fn = create_sandboxed_function(function_code) - except Exception: - scores.append(0.0) - continue - - try: - paper = _create_sheet( - _current_task["width"], - _current_task["height"], - _current_task["material"], - ) - original = paper - final_state, applied, error = execute_fold_strategy( - strategy_fn, paper, _current_task["max_folds"] - ) - - if error: - scores.append(0.0) - continue - - if len(applied) == 0: - scores.append(0.0) - continue - - # Score based on validity using engine validation - val = validate_paper(final_state) - metrics = compute_metrics(final_state, original) - - score = 1.0 - score -= 2.0 * val.kawasaki_violation - score -= 2.0 * val.maekawa_violation - if val.self_intersection_count > 0: - score -= 5.0 - max_strain = metrics.get("max_strain", 0.0) - if max_strain > _current_task["material"].max_strain: - score -= 1.0 - - scores.append(score) - - except TimeoutError: - scores.append(-1.0) - except Exception: - scores.append(0.0) - - return scores - - -# --------------------------------------------------------------------------- -# Reward 3: fold_quality -# --------------------------------------------------------------------------- - -def fold_quality(completions, **kwargs) -> list[float]: - """ - How good is the folding solution? - - +20.0 * compactness — main reward (1 - deployment_ratio) - +10.0 bonus — if meets target ratio - -0.5 per fold — efficiency penalty - -3.0 * overstrain — material stress penalty - -1.0 — timeout - -3.0 — exception - 0.0 — function broken - """ - global _print_counter - scores = [] - - for completion in completions: - response = completion[0]["content"] - function_code = extract_function(response) - - should_print = (_print_counter % PRINT_EVERY == 0) - _print_counter += 1 - - if should_print: - print(f"\n--- Strategy (sample {_print_counter}) ---") - print(function_code if function_code else "[no function extracted]") - - if function_code is None: - scores.append(0.0) - continue - - ok, info = check_imports_stdlib_only(function_code) - if not ok: - scores.append(0.0) - continue - - try: - strategy_fn = create_sandboxed_function(function_code) - except Exception: - scores.append(0.0) - continue - - try: - paper = _create_sheet( - _current_task["width"], - _current_task["height"], - _current_task["material"], - ) - original = paper - final_state, applied, error = execute_fold_strategy( - strategy_fn, paper, _current_task["max_folds"] - ) - - if error: - if should_print: - print(f"Error: {error}") - scores.append(0.0) - continue - - num_folds = len(applied) - if num_folds == 0: - scores.append(0.0) - continue - - # Use engine metrics - metrics = compute_metrics(final_state, original) - deploy_ratio = metrics.get("deployment_ratio", 1.0) - max_strain = metrics.get("max_strain", 0.0) - - # Compactness: main reward signal - compactness = 1.0 - deploy_ratio - score = 20.0 * compactness - - # Bonus for meeting target - if deploy_ratio <= _current_task["target_ratio"]: - score += 10.0 - - # Fold efficiency penalty - score -= 0.5 * num_folds - - # Strain penalty - mat_limit = _current_task["material"].max_strain - if max_strain > mat_limit: - score -= 3.0 * (max_strain / mat_limit) - - if should_print: - print(f"Folds: {num_folds}, Ratio: {deploy_ratio:.3f}, " - f"Compactness: {compactness:.3f}, Score: {score:.2f}") - bb = metrics.get("bounding_box", {}) - print(f"BBox: {bb.get('x',0):.3f} x {bb.get('y',0):.3f} x {bb.get('z',0):.3f}") - - scores.append(score) - - except TimeoutError: - if should_print: - print("Timeout!") - scores.append(-1.0) - except Exception as e: - if should_print: - print(f"Exception: {e}") - scores.append(-3.0) - - return scores diff --git a/trainer/train.py b/trainer/train.py deleted file mode 100644 index a781ad7f931d9bedc0227c1144fe42c073965acf..0000000000000000000000000000000000000000 --- a/trainer/train.py +++ /dev/null @@ -1,208 +0,0 @@ -""" -Origami GRPO Training Script - -Usage (Colab with T4/A100): - python trainer/train.py - -Or in a notebook: - %run trainer/train.py - -Requires: unsloth, trl>=0.22.2, transformers>=4.56.2, trackio, datasets -""" - -import os -import sys - -# Ensure project root is on path -PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -if PROJECT_ROOT not in sys.path: - sys.path.insert(0, PROJECT_ROOT) - -from trainer.prompts import build_prompt, SYSTEM_PROMPT, get_task_target_ratio, get_task_max_folds -from trainer.rewards import code_valid, physically_valid, fold_quality, set_task_config - -try: - from engine.materials import get_material - Material = type(get_material("paper")) # get the Material class -except ImportError: - from trainer.mock_env import Material - def get_material(name): - return Material() - -# ============================================================================ -# Config -# ============================================================================ - -MODEL_NAME = "unsloth/Qwen2.5-7B-Instruct" -MAX_SEQ_LENGTH = 2048 -LORA_RANK = 4 - -# Start with the simplest task -TASK_NAME = "half_fold" - -# GRPO hyperparameters (from 2048 reference, adapted for origami) -LEARNING_RATE = 2e-4 -MAX_STEPS = 600 -NUM_GENERATIONS = 2 -TEMPERATURE = 1.0 -BATCH_SIZE = 1 -GRAD_ACCUM = 1 -DATASET_SIZE = 1000 # replicated prompt dataset - - -def main(): - # ======================================================================== - # 1. Load model with Unsloth - # ======================================================================== - from unsloth import FastLanguageModel - - print(f"Loading model: {MODEL_NAME}") - model, tokenizer = FastLanguageModel.from_pretrained( - model_name=MODEL_NAME, - load_in_4bit=True, - max_seq_length=MAX_SEQ_LENGTH, - ) - - # ======================================================================== - # 2. Apply LoRA adapters - # ======================================================================== - model = FastLanguageModel.get_peft_model( - model, - r=LORA_RANK, - target_modules=[ - "q_proj", "k_proj", "v_proj", "o_proj", - "gate_proj", "up_proj", "down_proj", - ], - lora_alpha=LORA_RANK * 2, - use_gradient_checkpointing="unsloth", - random_state=3407, - ) - - # ======================================================================== - # 3. Build prompt and dataset - # ======================================================================== - user_prompt = build_prompt(TASK_NAME) - target_ratio = get_task_target_ratio(TASK_NAME) - max_folds = get_task_max_folds(TASK_NAME) - - # Configure reward functions with task parameters - set_task_config( - width=1.0, - height=1.0, - material=get_material("paper"), - target_ratio=target_ratio, - max_folds=max_folds, - ) - - # Create replicated prompt dataset (same pattern as 2048) - from datasets import Dataset - - dataset = Dataset.from_list([ - { - "prompt": [ - {"role": "system", "content": SYSTEM_PROMPT}, - {"role": "user", "content": user_prompt}, - ], - } - ] * DATASET_SIZE) - - # Calculate prompt token length for max_completion_length - prompt_tokens = tokenizer.apply_chat_template( - [ - {"role": "system", "content": SYSTEM_PROMPT}, - {"role": "user", "content": user_prompt}, - ], - add_generation_prompt=True, - tokenize=True, - ) - max_prompt_length = len(prompt_tokens) + 1 - max_completion_length = MAX_SEQ_LENGTH - max_prompt_length - print(f"Prompt tokens: {max_prompt_length}, Max completion: {max_completion_length}") - - # ======================================================================== - # 4. Test inference before training - # ======================================================================== - print("\n=== Pre-training inference test ===") - text = tokenizer.apply_chat_template( - [ - {"role": "system", "content": SYSTEM_PROMPT}, - {"role": "user", "content": user_prompt}, - ], - tokenize=False, - add_generation_prompt=True, - ) - - from transformers import TextStreamer - _ = model.generate( - **tokenizer(text, return_tensors="pt").to("cuda"), - temperature=TEMPERATURE, - max_new_tokens=min(512, max_completion_length), - streamer=TextStreamer(tokenizer, skip_prompt=True), - ) - - # ======================================================================== - # 5. Configure GRPO training - # ======================================================================== - from trl import GRPOConfig, GRPOTrainer - - training_args = GRPOConfig( - temperature=TEMPERATURE, - learning_rate=LEARNING_RATE, - weight_decay=0.001, - warmup_ratio=0.1, - lr_scheduler_type="linear", - optim="adamw_8bit", - logging_steps=1, - per_device_train_batch_size=BATCH_SIZE, - gradient_accumulation_steps=GRAD_ACCUM, - num_generations=NUM_GENERATIONS, - max_prompt_length=max_prompt_length, - max_completion_length=max_completion_length, - max_steps=MAX_STEPS, - save_steps=100, - report_to="trackio", - output_dir="outputs", - ) - - # ======================================================================== - # 6. Create trainer and start training - # ======================================================================== - trainer = GRPOTrainer( - model=model, - processing_class=tokenizer, - reward_funcs=[ - code_valid, # Reward 1: valid Python? - physically_valid, # Reward 2: physically possible folds? - fold_quality, # Reward 3: how good is the solution? - ], - args=training_args, - train_dataset=dataset, - ) - - print(f"\n=== Starting GRPO training: {TASK_NAME} ===") - print(f"Steps: {MAX_STEPS}, Generations: {NUM_GENERATIONS}, LR: {LEARNING_RATE}") - trainer.train() - - # ======================================================================== - # 7. Post-training inference - # ======================================================================== - print("\n=== Post-training inference ===") - _ = model.generate( - **tokenizer(text, return_tensors="pt").to("cuda"), - temperature=TEMPERATURE, - max_new_tokens=min(1024, max_completion_length), - streamer=TextStreamer(tokenizer, skip_prompt=True), - ) - - # ======================================================================== - # 8. Save model (optional) - # ======================================================================== - save_path = "outputs/origami-fold-lora" - print(f"\nSaving LoRA adapter to {save_path}") - model.save_pretrained(save_path) - tokenizer.save_pretrained(save_path) - print("Done!") - - -if __name__ == "__main__": - main() diff --git a/training/__init__.py b/training/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/training/demo.py b/training/demo.py new file mode 100644 index 0000000000000000000000000000000000000000..3e72332772ce3edfa9e8d68412b2c56b942189ce --- /dev/null +++ b/training/demo.py @@ -0,0 +1,251 @@ +""" +training/demo.py — Run 8 zero-shot rollouts and stream them to the grid viewer. + +Usage: + cd /path/to/optigami + python -m training.demo + +Then open: http://localhost:9001/viewer/training.html + +Each of the 8 "strategies" is a heuristic that mimics what a pretrained LLM might +produce for different tasks — varying from near-optimal to poor. This exercises +the full broadcast → grid viewer pipeline without requiring an LLM API key. +""" +from __future__ import annotations + +import asyncio +import time +import uuid +from typing import Callable + +import uvicorn + +from server.app import app, broadcast +from training.runner import run_batch + + +# ── 8 zero-shot heuristic strategies ────────────────────────────────────────── +# Each is a callable: paper_state (dict) → fold_dict +# These represent the range of strategies a pretrained LLM might generate. + +def strategy_perfect_half(paper_state: dict) -> dict: + """Valley fold exactly at horizontal midline — optimal for half_fold.""" + return {"type": "valley", "line": {"start": [0.0, 0.5], "end": [1.0, 0.5]}, "angle": 180.0} + + +def strategy_slight_offset(paper_state: dict) -> dict: + """Valley fold slightly off-center — almost optimal.""" + return {"type": "valley", "line": {"start": [0.0, 0.48], "end": [1.0, 0.48]}, "angle": 180.0} + + +def strategy_thirds(paper_state: dict) -> dict: + """Letter fold at one-third — wrong for half_fold, generates interesting geometry.""" + fold_count = paper_state.get("fold_count", 0) + positions = [0.333, 0.667] + if fold_count >= len(positions): + return {"type": "stop", "line": {"start": [0.0, 0.5], "end": [1.0, 0.5]}, "angle": 0.0} + return { + "type": "valley" if fold_count == 0 else "mountain", + "line": {"start": [0.0, positions[fold_count]], "end": [1.0, positions[fold_count]]}, + "angle": 180.0, + } + + +def strategy_vertical(paper_state: dict) -> dict: + """Vertical fold — gets compactness but in wrong dimension for target_box.""" + return {"type": "valley", "line": {"start": [0.5, 0.0], "end": [0.5, 1.0]}, "angle": 180.0} + + +def strategy_mountain(paper_state: dict) -> dict: + """Mountain fold at midline — same geometry, different assignment.""" + return {"type": "mountain", "line": {"start": [0.0, 0.5], "end": [1.0, 0.5]}, "angle": 180.0} + + +def strategy_accordion(paper_state: dict) -> dict: + """Accordion 3-fold — overfolds, achieves high compactness but more folds.""" + fold_count = paper_state.get("fold_count", 0) + positions = [0.25, 0.5, 0.75] + assignments = ["valley", "mountain", "valley"] + if fold_count >= len(positions): + return {"type": "stop", "line": {"start": [0.0, 0.5], "end": [1.0, 0.5]}, "angle": 0.0} + return { + "type": assignments[fold_count], + "line": {"start": [0.0, positions[fold_count]], "end": [1.0, positions[fold_count]]}, + "angle": 180.0, + } + + +def strategy_diagonal(paper_state: dict) -> dict: + """Diagonal fold — achieves compactness but irregular bounding box.""" + return {"type": "valley", "line": {"start": [0.0, 0.0], "end": [1.0, 1.0]}, "angle": 180.0} + + +def strategy_quarter(paper_state: dict) -> dict: + """Two perpendicular folds — 4x compactness for quarter_fold task.""" + fold_count = paper_state.get("fold_count", 0) + if fold_count == 0: + return {"type": "valley", "line": {"start": [0.0, 0.5], "end": [1.0, 0.5]}, "angle": 180.0} + if fold_count == 1: + return {"type": "valley", "line": {"start": [0.5, 0.0], "end": [0.5, 1.0]}, "angle": 180.0} + return {"type": "stop", "line": {"start": [0.0, 0.5], "end": [1.0, 0.5]}, "angle": 0.0} + + +STRATEGIES: list[tuple[str, Callable]] = [ + ("perfect_half", strategy_perfect_half), + ("slight_offset", strategy_slight_offset), + ("thirds_fold", strategy_thirds), + ("vertical_fold", strategy_vertical), + ("mountain_fold", strategy_mountain), + ("accordion_3", strategy_accordion), + ("diagonal", strategy_diagonal), + ("quarter_fold", strategy_quarter), +] + + +# ── Demo runner ──────────────────────────────────────────────────────────────── + +async def run_demo(task_name: str = "half_fold", delay_s: float = 0.5) -> None: + """Wait for server to be ready, then fire 8 episodes.""" + # Give uvicorn time to bind and call startup hook (sets broadcast._loop) + await asyncio.sleep(1.5) + + batch_id = 1 + names, fns = zip(*STRATEGIES) + ep_ids = [f"ep_{name}" for name in names] + + print(f"\n[demo] Starting batch {batch_id} — task: {task_name}") + print(f"[demo] Open http://localhost:9001/viewer/training.html\n") + + # Signal grid to clear and show G=8 + await broadcast.start_batch(batch_id, len(fns)) + + await asyncio.sleep(delay_s) + + # Run all 8 episodes in the thread pool; broadcast_fn fires into this loop + results = await asyncio.gather(*[ + asyncio.to_thread( + _run_one, + fn, + task_name, + ep_id, + broadcast.publish, + ) + for fn, ep_id in zip(fns, ep_ids) + ]) + + scores = [r["score"] for r in results] + best_idx = max(range(len(scores)), key=lambda i: scores[i]) + + await broadcast.finish_batch(batch_id, scores, best_episode_id=ep_ids[best_idx]) + + print("\n[demo] Results:") + for name, result in zip(names, results): + print(f" {name:20s} score={result['score']:+.2f} status={result['status']}") + print(f"\n[demo] Best: {names[best_idx]} (score={scores[best_idx]:+.2f})") + print("\n[demo] Grid viewer running. Press Ctrl+C to stop.\n") + + +def _run_one( + strategy_fn: Callable, + task_name: str, + ep_id: str, + broadcast_fn: Callable, +) -> dict: + """Thin wrapper: adds a small sleep between steps so the viewer can animate.""" + from server.models import OrigamiAction + from server.origami_environment import OrigamiEnvironment + + env = OrigamiEnvironment() + obs = env.reset(task_name=task_name) + + broadcast_fn(ep_id, { + "type": "episode_update", + "episode_id": ep_id, + "task_name": task_name, + "step": 0, + "observation": _obs_dict(obs), + }) + + max_steps = env._task.get("max_folds", 10) if env._task else 10 + status = "done" + + for step_idx in range(max_steps): + if obs.done: + break + + time.sleep(0.3) # pace so the viewer can animate each step + + fold_dict = strategy_fn(obs.paper_state) + + if fold_dict.get("type") == "stop": + break + + action = OrigamiAction( + fold_type=fold_dict["type"], + fold_line=fold_dict["line"], + fold_angle=float(fold_dict.get("angle", 180.0)), + ) + obs = env.step(action) + + broadcast_fn(ep_id, { + "type": "episode_update", + "episode_id": ep_id, + "task_name": task_name, + "step": step_idx + 1, + "observation": _obs_dict(obs), + }) + + if obs.done: + break + else: + status = "timeout" + + score = obs.reward if obs.reward is not None else env._total_reward or 0.0 + + broadcast_fn(ep_id, { + "type": "episode_done", + "episode_id": ep_id, + "status": status, + "score": float(score), + "final_metrics": obs.metrics, + }) + + return { + "episode_id": ep_id, + "score": float(score), + "final_metrics": obs.metrics, + "status": status, + } + + +def _obs_dict(obs) -> dict: + try: + return obs.model_dump() + except AttributeError: + return { + "paper_state": getattr(obs, "paper_state", {}), + "metrics": getattr(obs, "metrics", {}), + "fold_history": getattr(obs, "fold_history", []), + "done": getattr(obs, "done", False), + "reward": getattr(obs, "reward", None), + } + + +# ── Entry point ──────────────────────────────────────────────────────────────── + +async def _main() -> None: + config = uvicorn.Config(app, host="0.0.0.0", port=9001, log_level="warning") + server = uvicorn.Server(config) + + # Run demo concurrently with the uvicorn server + await asyncio.gather( + server.serve(), + run_demo(task_name="half_fold"), + ) + + +if __name__ == "__main__": + try: + asyncio.run(_main()) + except KeyboardInterrupt: + print("\n[demo] Stopped.") diff --git a/training/demo_llm.py b/training/demo_llm.py new file mode 100644 index 0000000000000000000000000000000000000000..6c05a78d6af5225de45957451b1bc6245b944299 --- /dev/null +++ b/training/demo_llm.py @@ -0,0 +1,232 @@ +""" +training/demo_llm.py — 8 rollouts using Claude as the zero-shot fold strategist. + +Usage: + cd /path/to/optigami + ANTHROPIC_API_KEY=sk-... python -m training.demo_llm + +Each of the 8 episodes calls Claude (claude-haiku-4-5) once per fold step. +Claude sees the current paper_state metrics and decides the next fold. +""" +from __future__ import annotations + +import asyncio +import json +import os +import re +import time +from typing import Any + +import anthropic +import uvicorn + +from server.app import app, broadcast +from server.models import OrigamiAction +from server.origami_environment import OrigamiEnvironment +from server.tasks import get_task_by_name + + +TASK_NAME = "half_fold" +NUM_EPISODES = 8 +MODEL = "claude-haiku-4-5-20251001" + + +# ── LLM strategy factory ─────────────────────────────────────────────────────── + +def make_llm_strategy(client: anthropic.Anthropic, task: dict, episode_num: int): + """Return a strategy_fn for one episode. Each episode gets its own call history.""" + history: list[dict[str, Any]] = [] + + def strategy(paper_state: dict) -> dict: + fold_count = paper_state.get("fold_count", 0) + compactness = paper_state.get("compactness", 0) + bb = paper_state.get("bounding_box", [1, 1, 0]) + target_box = task.get("target_box", [1, 0.5, 0.02]) + max_folds = task.get("max_folds", 3) + + user_msg = f"""You are folding a {task['width']}x{task['height']} sheet of {task['material']}. +Task: {task['description']} +Target box to fit inside: {target_box} +Max folds allowed: {max_folds} + +Current state (fold {fold_count}/{max_folds}): + compactness: {compactness:.3f} (1.0 = fully packed, 0.0 = flat) + bounding_box: [{bb[0]:.3f}, {bb[1]:.3f}, {bb[2]:.4f}] + fits_target_box: {paper_state.get('fits_target_box', False)} + +Choose the next fold. Respond with ONLY valid JSON, no other text: +{{ + "type": "valley" or "mountain" or "stop", + "line": {{"start": [x, y], "end": [x, y]}}, + "angle": 180 +}} + +Coordinates are normalized 0-1. Use "stop" if done.""" + + history.append({"role": "user", "content": user_msg}) + + response = client.messages.create( + model=MODEL, + max_tokens=120, + messages=history, + ) + reply = response.content[0].text.strip() + history.append({"role": "assistant", "content": reply}) + + # Extract JSON — handle markdown code blocks + match = re.search(r'\{[^{}]+\}', reply, re.DOTALL) + if not match: + return {"type": "stop", "line": {"start": [0, 0.5], "end": [1, 0.5]}, "angle": 0.0} + + fold_dict = json.loads(match.group()) + # Normalize: ensure required keys + fold_dict.setdefault("type", "valley") + fold_dict.setdefault("line", {"start": [0.0, 0.5], "end": [1.0, 0.5]}) + fold_dict.setdefault("angle", 180.0) + return fold_dict + + return strategy + + +# ── Episode runner ───────────────────────────────────────────────────────────── + +def run_episode_llm( + strategy_fn, + task_name: str, + ep_id: str, + broadcast_fn, +) -> dict: + env = OrigamiEnvironment() + obs = env.reset(task_name=task_name) + task = env._task or {} + + broadcast_fn(ep_id, { + "type": "episode_update", + "episode_id": ep_id, + "task_name": task_name, + "step": 0, + "observation": _obs_dict(obs), + }) + + max_steps = task.get("max_folds", 5) + status = "done" + + for step_idx in range(max_steps): + if obs.done: + break + + # Build a flat paper_state dict for the LLM (add metrics inline) + ps = dict(obs.paper_state) + ps.update(obs.metrics) # compactness, fits_target_box, etc. + ps["fold_count"] = step_idx + + try: + fold_dict = strategy_fn(ps) + except Exception as exc: + broadcast_fn(ep_id, { + "type": "episode_done", "episode_id": ep_id, + "status": "error", "score": 0.0, + "final_metrics": obs.metrics, "error": str(exc), + }) + return {"episode_id": ep_id, "score": 0.0, "status": "error"} + + if fold_dict.get("type") == "stop": + break + + time.sleep(0.4) # pace for viewer animation + + action = OrigamiAction( + fold_type=fold_dict["type"], + fold_line=fold_dict["line"], + fold_angle=float(fold_dict.get("angle", 180.0)), + ) + obs = env.step(action) + + broadcast_fn(ep_id, { + "type": "episode_update", + "episode_id": ep_id, + "task_name": task_name, + "step": step_idx + 1, + "observation": _obs_dict(obs), + }) + + if obs.done: + break + else: + status = "timeout" + + score = obs.reward if obs.reward is not None else (env._total_reward or 0.0) + broadcast_fn(ep_id, { + "type": "episode_done", + "episode_id": ep_id, + "status": status, + "score": float(score), + "final_metrics": obs.metrics, + }) + + return {"episode_id": ep_id, "score": float(score), "status": status} + + +def _obs_dict(obs) -> dict: + try: + return obs.model_dump() + except AttributeError: + return { + "paper_state": getattr(obs, "paper_state", {}), + "metrics": getattr(obs, "metrics", {}), + "fold_history": getattr(obs, "fold_history", []), + "done": getattr(obs, "done", False), + "reward": getattr(obs, "reward", None), + } + + +# ── Main ────────────────────────────────────────────────────────────────────── + +async def run_demo() -> None: + api_key = os.environ.get("ANTHROPIC_API_KEY") + if not api_key: + raise RuntimeError("Set ANTHROPIC_API_KEY environment variable") + + client = anthropic.Anthropic(api_key=api_key) + task = get_task_by_name(TASK_NAME) + + await asyncio.sleep(1.5) # wait for server startup + + print(f"\n[llm-demo] Model: {MODEL}") + print(f"[llm-demo] Task: {TASK_NAME} — {task['description']}") + print(f"[llm-demo] Open: http://localhost:9001/viewer/training.html\n") + + await broadcast.start_batch(1, NUM_EPISODES) + + ep_ids = [f"ep_{i:02d}" for i in range(NUM_EPISODES)] + strategies = [make_llm_strategy(client, task, i) for i in range(NUM_EPISODES)] + + # Run all episodes concurrently (each makes its own Claude API calls) + results = await asyncio.gather(*[ + asyncio.to_thread(run_episode_llm, fn, TASK_NAME, ep_id, broadcast.publish) + for fn, ep_id in zip(strategies, ep_ids) + ]) + + scores = [r["score"] for r in results] + best_idx = max(range(len(scores)), key=lambda i: scores[i]) + + await broadcast.finish_batch(1, scores, best_episode_id=ep_ids[best_idx]) + + print("\n[llm-demo] Results:") + for i, result in enumerate(results): + print(f" ep_{i:02d} score={result['score']:+.2f} status={result['status']}") + print(f"\n[llm-demo] Best: ep_{best_idx:02d} (score={scores[best_idx]:+.2f})") + print("\n[llm-demo] Press Ctrl+C to stop.\n") + + +async def _main() -> None: + config = uvicorn.Config(app, host="0.0.0.0", port=9001, log_level="warning") + server = uvicorn.Server(config) + await asyncio.gather(server.serve(), run_demo()) + + +if __name__ == "__main__": + try: + asyncio.run(_main()) + except KeyboardInterrupt: + print("\n[llm-demo] Stopped.") diff --git a/training/runner.py b/training/runner.py new file mode 100644 index 0000000000000000000000000000000000000000..bf4de2f41ef42d781b5af158dafc08e77db49d34 --- /dev/null +++ b/training/runner.py @@ -0,0 +1,191 @@ +""" +TrainingRunner — parallel episode executor for GRPO training. + +Each episode runs in a ThreadPoolExecutor thread. +After every env.step(), observations are pushed to the broadcast server (fire-and-forget). +""" +from __future__ import annotations + +import uuid +from concurrent.futures import ThreadPoolExecutor, as_completed +from typing import Any, Callable, Optional + +from server.models import OrigamiAction +from server.origami_environment import OrigamiEnvironment + + +BroadcastFn = Callable[[str, dict], None] + + +def run_episode( + strategy_fn: Callable[[dict], dict], + task_name: str, + ep_id: Optional[str] = None, + broadcast_fn: Optional[BroadcastFn] = None, + max_steps: Optional[int] = None, +) -> dict: + """Run a single origami episode with a given strategy function. + + Args: + strategy_fn: Callable that receives paper_state dict and returns a fold dict: + {"type": "valley"|"mountain"|"pleat"|"crimp"|"stop", + "line": {"start": [x, y], "end": [x, y]}, + "angle": 180.0} + task_name: Name of the task (from server/tasks.py) + ep_id: Episode identifier for broadcast; auto-generated if None + broadcast_fn: Optional callback(ep_id, data) for live streaming + max_steps: Override task's max_folds if provided + + Returns: + dict with keys: episode_id, score, final_metrics, fold_history, status + """ + ep_id = ep_id or str(uuid.uuid4())[:8] + env = OrigamiEnvironment() + + obs = env.reset(task_name=task_name) + + if broadcast_fn: + broadcast_fn(ep_id, { + "type": "episode_update", + "episode_id": ep_id, + "task_name": task_name, + "step": 0, + "observation": _obs_to_dict(obs), + }) + + step_limit = max_steps or env._task.get("max_folds", 20) if env._task else 20 + status = "done" + + for step_idx in range(step_limit): + if obs.done: + break + + # Strategy generates a fold dict + try: + fold_dict = strategy_fn(obs.paper_state) + except Exception as exc: + status = "error" + if broadcast_fn: + broadcast_fn(ep_id, { + "type": "episode_done", + "episode_id": ep_id, + "status": "error", + "score": obs.reward or 0.0, + "final_metrics": obs.metrics, + "error": str(exc), + }) + break + + fold_type = fold_dict.get("type", "valley") + fold_line = fold_dict.get("line", {"start": [0, 0.5], "end": [1, 0.5]}) + fold_angle = float(fold_dict.get("angle", 180.0)) + + action = OrigamiAction( + fold_type=fold_type, + fold_line=fold_line, + fold_angle=fold_angle, + ) + obs = env.step(action) + + if broadcast_fn: + broadcast_fn(ep_id, { + "type": "episode_update", + "episode_id": ep_id, + "task_name": task_name, + "step": step_idx + 1, + "observation": _obs_to_dict(obs), + }) + + if obs.done: + break + else: + status = "timeout" + + score = obs.reward if obs.reward is not None else (env._total_reward or 0.0) + + if broadcast_fn: + broadcast_fn(ep_id, { + "type": "episode_done", + "episode_id": ep_id, + "status": status, + "score": float(score), + "final_metrics": obs.metrics, + }) + + return { + "episode_id": ep_id, + "score": float(score), + "final_metrics": obs.metrics, + "fold_history": obs.fold_history, + "status": status, + } + + +def run_batch( + strategy_fns: list[Callable[[dict], dict]], + task_name: str, + broadcast_fn: Optional[BroadcastFn] = None, + batch_id: Optional[int] = None, + max_workers: int = 8, +) -> list[dict]: + """Run G episodes in parallel with a ThreadPoolExecutor. + + Args: + strategy_fns: List of G strategy callables (one per completion) + task_name: Task to use for all episodes + broadcast_fn: Optional broadcast callback, called after each step + batch_id: Batch identifier for broadcast + max_workers: Max parallel threads (bounded by G) + + Returns: + List of episode result dicts, in same order as strategy_fns + """ + n = len(strategy_fns) + ep_ids = [f"ep_{(batch_id or 0):04d}_{i:02d}" for i in range(n)] + workers = min(max_workers, n) + + results: list[dict] = [{}] * n + + with ThreadPoolExecutor(max_workers=workers) as pool: + futures = { + pool.submit( + run_episode, + fn, + task_name, + ep_ids[i], + broadcast_fn, + ): i + for i, fn in enumerate(strategy_fns) + } + + for future in as_completed(futures): + idx = futures[future] + try: + results[idx] = future.result() + except Exception as exc: + results[idx] = { + "episode_id": ep_ids[idx], + "score": 0.0, + "final_metrics": {}, + "fold_history": [], + "status": "error", + "error": str(exc), + } + + return results + + +def _obs_to_dict(obs) -> dict: + """Convert OrigamiObservation to a JSON-serializable dict.""" + try: + return obs.model_dump() + except AttributeError: + return { + "task": obs.task if hasattr(obs, "task") else {}, + "paper_state": obs.paper_state if hasattr(obs, "paper_state") else {}, + "metrics": obs.metrics if hasattr(obs, "metrics") else {}, + "fold_history": obs.fold_history if hasattr(obs, "fold_history") else [], + "done": obs.done if hasattr(obs, "done") else False, + "reward": obs.reward if hasattr(obs, "reward") else None, + "error": obs.error if hasattr(obs, "error") else None, + } diff --git a/viewer/training.html b/viewer/training.html new file mode 100644 index 0000000000000000000000000000000000000000..672931688a8de725f6f4e0373f421ecfef68eccc --- /dev/null +++ b/viewer/training.html @@ -0,0 +1,761 @@ + + + + + +OPTIGAMI — TRAINING GRID VIEWER + + + + +
+ +
+
IDLE
+
+
BATCH
+
EPISODES 0
+
AVG REWARD
+
+
WS
+
+ +
+
+
+ WAITING FOR TRAINING... +
+ +
+ + + +