launchframe 0.2.6 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +76 -102
- package/launchframe.config.json +14 -0
- package/package.json +54 -52
- package/bin/launchframe.mjs +0 -315
- package/template/README.md +0 -121
- package/template/package-lock.json +0 -8795
- package/template/package.json +0 -63
- /package/{template/.aider.conf.yml → .aider.conf.yml} +0 -0
- /package/{template/.amazonq → .amazonq}/cli-agents/clone-website.json +0 -0
- /package/{template/.amazonq → .amazonq}/rules/project.md +0 -0
- /package/{template/.augment → .augment}/commands/clone-website.md +0 -0
- /package/{template/.claude → .claude}/skills/clone-website/SKILL.md +0 -0
- /package/{template/.claude → .claude}/skills/marketing-social-proof-motion/SKILL.md +0 -0
- /package/{template/.clinerules → .clinerules} +0 -0
- /package/{template/.codex → .codex}/skills/clone-website/SKILL.md +0 -0
- /package/{template/.continue → .continue}/commands/clone-website.md +0 -0
- /package/{template/.continue → .continue}/rules/project.md +0 -0
- /package/{template/.cursor → .cursor}/commands/clone-website.md +0 -0
- /package/{template/.cursor → .cursor}/commands/marketing-social-proof-motion.md +0 -0
- /package/{template/.cursor → .cursor}/rules/project.mdc +0 -0
- /package/{template/.dockerignore → .dockerignore} +0 -0
- /package/{template/.gemini → .gemini}/commands/clone-website.toml +0 -0
- /package/{template/.gitattributes → .gitattributes} +0 -0
- /package/{template/.github → .github}/ISSUE_TEMPLATE/bug_report.yml +0 -0
- /package/{template/.github → .github}/ISSUE_TEMPLATE/config.yml +0 -0
- /package/{template/.github → .github}/ISSUE_TEMPLATE/feature_request.yml +0 -0
- /package/{template/.github → .github}/PULL_REQUEST_TEMPLATE.md +0 -0
- /package/{template/.github → .github}/copilot-instructions.md +0 -0
- /package/{template/.github → .github}/copilot-setup-steps.yml +0 -0
- /package/{template/.github → .github}/skills/clone-website/SKILL.md +0 -0
- /package/{template/.github → .github}/workflows/ci.yml +0 -0
- /package/{template/.nvmrc → .nvmrc} +0 -0
- /package/{template/.opencode → .opencode}/commands/clone-website.md +0 -0
- /package/{template/.windsurf → .windsurf}/workflows/clone-website.md +0 -0
- /package/{template/.windsurfrules → .windsurfrules} +0 -0
- /package/{template/AGENTS.md → AGENTS.md} +0 -0
- /package/{template/CHANGELOG.md → CHANGELOG.md} +0 -0
- /package/{template/CLAUDE.md → CLAUDE.md} +0 -0
- /package/{template/Dockerfile → Dockerfile} +0 -0
- /package/{template/Dockerfile.dev → Dockerfile.dev} +0 -0
- /package/{template/GEMINI.md → GEMINI.md} +0 -0
- /package/{template/START_HERE.md → START_HERE.md} +0 -0
- /package/{template/components.json → components.json} +0 -0
- /package/{template/docker-compose.yml → docker-compose.yml} +0 -0
- /package/{template/docs → docs}/design-references/.gitkeep +0 -0
- /package/{template/docs → docs}/design-references/comparison.png +0 -0
- /package/{template/docs → docs}/design-references/playwright-example.com-1440px.png +0 -0
- /package/{template/docs → docs}/design-references/playwright-example.com-390px.png +0 -0
- /package/{template/docs → docs}/research/INSPECTION_GUIDE.md +0 -0
- /package/{template/eslint.config.mjs → eslint.config.mjs} +0 -0
- /package/{template/next.config.ts → next.config.ts} +0 -0
- /package/{template/postcss.config.mjs → postcss.config.mjs} +0 -0
- /package/{template/public → public}/images/.gitkeep +0 -0
- /package/{template/public → public}/seo/.gitkeep +0 -0
- /package/{template/public → public}/videos/.gitkeep +0 -0
- /package/{template/scripts → scripts}/.gitkeep +0 -0
- /package/{template/scripts → scripts}/recon-playwright.mjs +0 -0
- /package/{template/scripts → scripts}/sync-agent-rules.sh +0 -0
- /package/{template/scripts → scripts}/sync-skills.mjs +0 -0
- /package/{template/src → src}/app/favicon.ico +0 -0
- /package/{template/src → src}/app/globals.css +0 -0
- /package/{template/src → src}/app/layout.tsx +0 -0
- /package/{template/src → src}/app/page.tsx +0 -0
- /package/{template/src → src}/components/marketing/scribewise-landing.tsx +0 -0
- /package/{template/src → src}/components/ui/button.tsx +0 -0
- /package/{template/src → src}/hooks/.gitkeep +0 -0
- /package/{template/src → src}/lib/utils.ts +0 -0
- /package/{template/src → src}/types/.gitkeep +0 -0
- /package/{template/tsconfig.json → tsconfig.json} +0 -0
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2025 JCodesMore
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -1,86 +1,36 @@
|
|
|
1
|
-
# Launchframe
|
|
1
|
+
# Launchframe Project
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This project was scaffolded by **[Launchframe](https://github.com/evangruhlkey/launchframe)** — an AI-powered website cloner + SaaS rebrander.
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
npx launchframe@latest <url> "<saas idea>"
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Dependencies were installed for you. Files were written to **this directory** (project root) so **`.cursor`**, **`.claude`**, etc. work when you open this folder in your editor. Config lives in **`launchframe.config.json`** (`url` + SaaS `idea`).
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
---
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
## Quick start (two steps)
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
- ✅ Get a buildable Next.js codebase in seconds, ready for your AI agent to clone + rebrand
|
|
15
|
+
1. **Open this folder** in [Cursor](https://cursor.com/) — the directory that **contains** `.cursor/` (not a parent folder).
|
|
16
|
+
2. In chat, say: **Build it.**
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
Your AI reads [`launchframe.config.json`](./launchframe.config.json) and [`AGENTS.md`](./AGENTS.md) and runs the full clone + rebrand pipeline (same as **`/clone-website`**).
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
Rather read a postcard? See [`START_HERE.md`](./START_HERE.md).
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
## What `/clone-website` does
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
mkdir my-saas && cd my-saas
|
|
27
|
-
npx launchframe@latest https://linear.app "AI-powered customer feedback platform"
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
Then open **this folder** in [Cursor](https://cursor.com/) and chat: **Build it.**
|
|
24
|
+
A multi-phase pipeline runs inside your AI agent:
|
|
31
25
|
|
|
32
|
-
|
|
26
|
+
1. **Reconnaissance** — screenshots, design-token extraction, **image/video inventory** (`MEDIA_MANIFEST.md`), interaction sweep (scroll, click, hover, responsive)
|
|
27
|
+
2. **Foundation** — fonts, globals, **`framer-motion`**, **download images & videos** to `public/` before most UI build
|
|
28
|
+
3. **Component Specs** — writes detailed spec files (`docs/research/components/`) with exact CSS, **local media paths**, and **Motion** (CSS vs Framer)
|
|
29
|
+
4. **Parallel Build** — dispatches builder agents in git worktrees, one per section
|
|
30
|
+
5. **SaaS Rebrand Pass** — swaps product name, headlines, feature copy, CTAs, and brand marks to match `launchframe.config.json#idea`. Visuals stay 1:1.
|
|
31
|
+
6. **Assembly & Visual QA** — merges worktrees, wires up the page, runs visual diff against the original
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
```bash
|
|
37
|
-
npx launchframe@latest https://linear.app "My idea" --skip-install
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## What gets generated
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
my-saas/ (or use --dir to create a subfolder)
|
|
44
|
-
├─ START_HERE.md ← "open Cursor, say Build it"
|
|
45
|
-
├─ launchframe.config.json ← url + saas idea (the directive)
|
|
46
|
-
├─ AGENTS.md ← agent instructions (single source of truth)
|
|
47
|
-
├─ .cursor/ ← at project root (Cursor rules + /clone-website)
|
|
48
|
-
├─ .claude/ ← Claude Code skill
|
|
49
|
-
├─ .codex/ .gemini/ .opencode/ .windsurf/ .github/ .augment/
|
|
50
|
-
│ .continue/ .amazonq/ ← every other agent gets the same skill, format-adapted
|
|
51
|
-
├─ src/ ← Next.js 16 + shadcn/ui + Tailwind v4 scaffold
|
|
52
|
-
├─ public/ ← becomes populated by the cloner with real assets
|
|
53
|
-
├─ docs/research/ ← extraction artifacts the cloner writes during the run
|
|
54
|
-
└─ scripts/ ← asset download + sync scripts
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## CLI Reference
|
|
58
|
-
|
|
59
|
-
```
|
|
60
|
-
npx launchframe@latest <url> "<saas idea>" [options]
|
|
61
|
-
|
|
62
|
-
Arguments:
|
|
63
|
-
<url> URL of the site you want to clone (e.g. https://linear.app)
|
|
64
|
-
<saas idea> One-line description of the SaaS you're building
|
|
65
|
-
|
|
66
|
-
Options:
|
|
67
|
-
--dir <path> Output folder (default: . — current directory / project root)
|
|
68
|
-
--force Merge into a non-empty directory (use with care)
|
|
69
|
-
--skip-install Skip npm install (for CI / debugging only)
|
|
70
|
-
--help, -h Show this message
|
|
71
|
-
--version, -v Show the version
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Examples
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
npx launchframe@latest https://linear.app "AI-powered customer feedback platform"
|
|
78
|
-
|
|
79
|
-
npx launchframe@latest https://vercel.com "DevOps for ML" --dir launchframe-app
|
|
80
|
-
|
|
81
|
-
# Hostname-only — launchframe will prepend https://
|
|
82
|
-
npx launchframe@latest stripe.com "B2B billing for AI agent companies"
|
|
83
|
-
```
|
|
33
|
+
Each builder agent receives the full component spec inline — exact `getComputedStyle()` values, interaction models, multi-state content, responsive breakpoints, asset paths. No guessing.
|
|
84
34
|
|
|
85
35
|
## Supported AI Agents
|
|
86
36
|
|
|
@@ -88,60 +38,84 @@ npx launchframe@latest stripe.com "B2B billing for AI agent companies"
|
|
|
88
38
|
| ------------------------------------------------------------- | -------------------------- |
|
|
89
39
|
| [Claude Code](https://docs.anthropic.com/en/docs/claude-code) | **Recommended** — Opus 4.7 |
|
|
90
40
|
| [Codex CLI](https://github.com/openai/codex) | Supported |
|
|
91
|
-
| [Cursor](https://cursor.com/) | Supported |
|
|
92
|
-
| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | Supported |
|
|
93
|
-
| [GitHub Copilot](https://github.com/features/copilot) | Supported |
|
|
94
41
|
| [OpenCode](https://opencode.ai/) | Supported |
|
|
42
|
+
| [GitHub Copilot](https://github.com/features/copilot) | Supported |
|
|
43
|
+
| [Cursor](https://cursor.com/) | Supported |
|
|
95
44
|
| [Windsurf](https://codeium.com/windsurf) | Supported |
|
|
96
|
-
| [
|
|
45
|
+
| [Gemini CLI](https://github.com/google-gemini/gemini-cli) | Supported |
|
|
46
|
+
| [Cline](https://github.com/cline/cline) | Supported |
|
|
47
|
+
| [Roo Code](https://github.com/RooCodeInc/Roo-Code) | Supported |
|
|
97
48
|
| [Continue](https://continue.dev/) | Supported |
|
|
98
49
|
| [Amazon Q](https://aws.amazon.com/q/developer/) | Supported |
|
|
99
50
|
| [Augment Code](https://www.augmentcode.com/) | Supported |
|
|
100
51
|
| [Aider](https://aider.chat/) | Supported |
|
|
101
52
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
## How `/clone-website` Works
|
|
53
|
+
## Tech Stack
|
|
105
54
|
|
|
106
|
-
|
|
55
|
+
- **Next.js 16** — App Router, React 19, TypeScript strict
|
|
56
|
+
- **shadcn/ui** — Radix primitives + Tailwind CSS v4
|
|
57
|
+
- **Tailwind CSS v4** — oklch design tokens
|
|
58
|
+
- **Framer Motion** — default for non-trivial marketing animation (scroll reveals, staggers, layout); see `AGENTS.md`
|
|
59
|
+
- **Lucide React** — default icons (replaced by extracted SVGs during cloning)
|
|
60
|
+
- **Media** — targets download to `public/images/` & `public/videos/` per `docs/research/MEDIA_MANIFEST.md` (see `INSPECTION_GUIDE.md`)
|
|
107
61
|
|
|
108
|
-
|
|
109
|
-
2. **Foundation** — updates fonts, colors, globals.css; downloads all assets; extracts SVG icons
|
|
110
|
-
3. **Component Specs** — writes detailed `.spec.md` files for every section with exact `getComputedStyle()` values
|
|
111
|
-
4. **Parallel Build** — dispatches builder agents in git worktrees, one per section/component
|
|
112
|
-
5. **SaaS Rebrand Pass** — swaps product name, headlines, feature copy, CTAs, and brand marks to match `launchframe.config.json#idea`. Spacing, color, typography, animations stay 1:1
|
|
113
|
-
6. **Assembly + Visual QA** — merges worktrees, wires `src/app/page.tsx`, runs side-by-side diff against the original
|
|
114
|
-
|
|
115
|
-
Each builder agent gets the full component spec inline. No guessing.
|
|
62
|
+
## Prerequisites
|
|
116
63
|
|
|
117
|
-
|
|
64
|
+
- [Node.js](https://nodejs.org/) 24+
|
|
65
|
+
- An AI coding agent with browser automation MCP **or** [Playwright](https://playwright.dev/) for `npm run recon` when MCP is unavailable
|
|
66
|
+
- **First-time Playwright browsers:** after `npm install`, run `npx playwright install chromium`
|
|
118
67
|
|
|
119
|
-
|
|
68
|
+
## Project Structure
|
|
120
69
|
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
70
|
+
```
|
|
71
|
+
src/
|
|
72
|
+
app/ # Next.js routes
|
|
73
|
+
components/ # React components
|
|
74
|
+
ui/ # shadcn/ui primitives
|
|
75
|
+
icons.tsx # Extracted SVG icons
|
|
76
|
+
lib/utils.ts # cn() utility
|
|
77
|
+
types/ # TypeScript interfaces
|
|
78
|
+
hooks/ # Custom React hooks
|
|
79
|
+
public/
|
|
80
|
+
images/ # Downloaded images from target
|
|
81
|
+
videos/ # Downloaded videos from target
|
|
82
|
+
seo/ # Favicons, OG images
|
|
83
|
+
docs/
|
|
84
|
+
research/ # Extraction output, component specs, REBRAND.md
|
|
85
|
+
design-references/ # Screenshots
|
|
86
|
+
scripts/
|
|
87
|
+
sync-agent-rules.sh # Regenerate agent instruction files
|
|
88
|
+
sync-skills.mjs # Regenerate /clone-website for all platforms
|
|
89
|
+
launchframe.config.json # ← URL + SaaS idea (single source of truth)
|
|
90
|
+
AGENTS.md # Agent instructions (single source of truth)
|
|
91
|
+
START_HERE.md # "Open Cursor → say Build it"
|
|
92
|
+
CLAUDE.md # Claude Code config (imports AGENTS.md)
|
|
93
|
+
GEMINI.md # Gemini CLI config (imports AGENTS.md)
|
|
126
94
|
```
|
|
127
95
|
|
|
128
|
-
##
|
|
96
|
+
## Commands
|
|
129
97
|
|
|
130
|
-
|
|
131
|
-
|
|
98
|
+
```bash
|
|
99
|
+
npm run dev # Start dev server
|
|
100
|
+
npm run build # Production build
|
|
101
|
+
npm run lint # ESLint check
|
|
102
|
+
npm run typecheck # TypeScript check
|
|
103
|
+
npm run check # Run lint + typecheck + build
|
|
104
|
+
```
|
|
132
105
|
|
|
133
|
-
##
|
|
106
|
+
## Use Cases
|
|
134
107
|
|
|
135
|
-
-
|
|
136
|
-
-
|
|
137
|
-
-
|
|
108
|
+
- **Launch a SaaS faster** — start from a proven landing page, not a blank canvas
|
|
109
|
+
- **Platform migration** — rebuild a site you own from WordPress/Webflow/Squarespace into a modern Next.js codebase
|
|
110
|
+
- **Lost source code** — your site is live but the repo is gone; get the code back in a modern format
|
|
111
|
+
- **Learning** — deconstruct how production sites achieve specific layouts, animations, and responsive behavior
|
|
138
112
|
|
|
139
113
|
## Not Intended For
|
|
140
114
|
|
|
141
|
-
- Phishing or impersonation
|
|
142
|
-
- Passing off someone
|
|
143
|
-
- Violating terms of service
|
|
115
|
+
- **Phishing or impersonation** — this project must not be used for deceptive purposes, impersonation, or any activity that breaks the law
|
|
116
|
+
- **Passing off someone's design as your own** — logos, brand assets, and original copy belong to their owners
|
|
117
|
+
- **Violating terms of service** — some sites prohibit scraping or reproduction. Check first
|
|
144
118
|
|
|
145
119
|
## License
|
|
146
120
|
|
|
147
|
-
MIT
|
|
121
|
+
MIT
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://launchframe.dev/schema/launchframe.config.json",
|
|
3
|
+
"url": "https://vercel.com/",
|
|
4
|
+
"idea": "saas-idea",
|
|
5
|
+
"createdAt": "2026-05-15T00:27:49.833Z",
|
|
6
|
+
"launchframeVersion": "0.2.6",
|
|
7
|
+
"notes": [
|
|
8
|
+
"The /clone-website skill reads this file at the start of every run.",
|
|
9
|
+
"After scaffold: open this folder in Cursor (or your AI editor) and say **Build it** — same workflow.",
|
|
10
|
+
"`url` is the visual source-of-truth (clone its layout, spacing, tokens, motion).",
|
|
11
|
+
"`idea` is the rebranding directive applied AFTER the pixel-perfect clone.",
|
|
12
|
+
"Edit either field and re-invoke the skill to re-run."
|
|
13
|
+
]
|
|
14
|
+
}
|
package/package.json
CHANGED
|
@@ -1,52 +1,54 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "launchframe",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "launchframe",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "clone any website into a clean, modern Next.js codebase using AI coding agents",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"claude-code",
|
|
9
|
+
"website-clone",
|
|
10
|
+
"reverse-engineering",
|
|
11
|
+
"nextjs",
|
|
12
|
+
"ai",
|
|
13
|
+
"template",
|
|
14
|
+
"tailwindcss",
|
|
15
|
+
"shadcn-ui"
|
|
16
|
+
],
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=24"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"dev": "next dev",
|
|
22
|
+
"build": "next build",
|
|
23
|
+
"start": "next start",
|
|
24
|
+
"lint": "eslint",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"check": "npm run lint && npm run typecheck && npm run build",
|
|
27
|
+
"recon": "node scripts/recon-playwright.mjs",
|
|
28
|
+
"recon:headed": "node scripts/recon-playwright.mjs --headed"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@base-ui/react": "^1.3.0",
|
|
32
|
+
"class-variance-authority": "^0.7.1",
|
|
33
|
+
"clsx": "^2.1.1",
|
|
34
|
+
"framer-motion": "^12.4.0",
|
|
35
|
+
"lucide-react": "^1.6.0",
|
|
36
|
+
"next": "16.2.1",
|
|
37
|
+
"react": "19.2.4",
|
|
38
|
+
"react-dom": "19.2.4",
|
|
39
|
+
"shadcn": "^4.1.0",
|
|
40
|
+
"tailwind-merge": "^3.5.0",
|
|
41
|
+
"tw-animate-css": "^1.4.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@tailwindcss/postcss": "^4",
|
|
45
|
+
"@types/node": "^24",
|
|
46
|
+
"@types/react": "^19",
|
|
47
|
+
"@types/react-dom": "^19",
|
|
48
|
+
"eslint": "^9",
|
|
49
|
+
"eslint-config-next": "16.2.1",
|
|
50
|
+
"playwright": "^1.49.1",
|
|
51
|
+
"tailwindcss": "^4",
|
|
52
|
+
"typescript": "^5"
|
|
53
|
+
}
|
|
54
|
+
}
|