Showing preview only (2,756K chars total). Download the full file or copy to clipboard to get everything.
Repository: Caldis/Mos
Branch: master
Commit: 757f3509c126
Files: 259
Total size: 2.6 MB
Directory structure:
gitextract_eih3fj_1/
├── .github/
│ └── ISSUE_TEMPLATE/
│ ├── bug-report-------.md
│ └── feature-request-------.md
├── .gitignore
├── .last-release-commit
├── .skills/
│ └── release-preparation/
│ ├── SKILL.md
│ └── scripts/
│ ├── create_gh_draft.sh
│ ├── prepare_zip.sh
│ └── update_appcast.sh
├── CHANGELOG.md
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── ISSUE_TEMPLATE.md
├── LICENSE
├── LOCALIZATION.md
├── Mos/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── AppStatusBarIcon.imageset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── Donate/
│ │ │ ├── AlipayLogo.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── AlipayQR.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── BuyMeACoffee.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ ├── MEOW.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── PaypalLogo.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── WechatpayLogo.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── WechatpayQR.imageset/
│ │ │ └── Contents.json
│ │ ├── Guidance/
│ │ │ ├── Contents.json
│ │ │ ├── drag-arrow.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── manual-remove.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── sparkle.imageset/
│ │ │ └── Contents.json
│ │ ├── Monitor/
│ │ │ ├── Contents.json
│ │ │ └── SF.arrow.clockwise.imageset/
│ │ │ └── Contents.json
│ │ ├── Preferences/
│ │ │ ├── Contents.json
│ │ │ ├── SF.app.background.dotted.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.arrow.triangle.capsulepath.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.button.horizontal.top.press.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.circle.dotted.circle.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.ellipsis.circle.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.gearshape.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.lasso.badge.sparkles.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.minus.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.person.crop.circle.dashed.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.plus.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.scribble.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.tray.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── SF.wand.and.rays.inverse.imageset/
│ │ │ └── Contents.json
│ │ └── StatusItem/
│ │ ├── Contents.json
│ │ ├── SF.escape.imageset/
│ │ │ └── Contents.json
│ │ ├── SF.gauge.imageset/
│ │ │ └── Contents.json
│ │ ├── SF.hidpp.imageset/
│ │ │ └── Contents.json
│ │ └── SF.square.stack.3d.down.right.imageset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── Main.storyboard
│ ├── ButtonCore/
│ │ ├── ButtonCore.swift
│ │ ├── ButtonFilter.swift
│ │ └── ButtonUtils.swift
│ ├── Components/
│ │ ├── AdaptivePopover.swift
│ │ ├── BrandTag.swift
│ │ ├── DraggingImageView.swift
│ │ └── PrimaryButton.swift
│ ├── Extension/
│ │ ├── CGEvent+Extensions.swift
│ │ └── NSColor+Extensions.swift
│ ├── Info.plist
│ ├── InputEvent/
│ │ ├── MosInputEvent.swift
│ │ └── MosInputProcessor.swift
│ ├── Keys/
│ │ ├── KeyCode.swift
│ │ ├── KeyPopover.swift
│ │ ├── KeyPreview.swift
│ │ └── KeyRecorder.swift
│ ├── Localizable.xcstrings
│ ├── LogitechHID/
│ │ ├── LogitechDeviceSession.swift
│ │ ├── LogitechHIDDebugPanel.swift
│ │ └── LogitechHIDManager.swift
│ ├── Managers/
│ │ ├── StatusItemManager.swift
│ │ ├── UpdateManager.swift
│ │ └── WindowManager.swift
│ ├── MosRelease.entitlements
│ ├── Options/
│ │ └── Options.swift
│ ├── ScrollCore/
│ │ ├── Interpolator.swift
│ │ ├── ScrollCore.swift
│ │ ├── ScrollDispatchContext.swift
│ │ ├── ScrollEvent.swift
│ │ ├── ScrollFilter.swift
│ │ ├── ScrollPhase.swift
│ │ ├── ScrollPoster.swift
│ │ └── ScrollUtils.swift
│ ├── Shortcut/
│ │ ├── ShortcutExecutor.swift
│ │ ├── ShortcutManager.swift
│ │ └── SystemShortcut.swift
│ ├── Utils/
│ │ ├── Archieve.swift
│ │ ├── Constants.swift
│ │ ├── EnhanceArray.swift
│ │ ├── Interceptor.swift
│ │ └── Utils.swift
│ ├── Windows/
│ │ ├── IntroductionWindow/
│ │ │ ├── IntroductionViewController.swift
│ │ │ └── IntroductionWindowController.swift
│ │ ├── MonitorWindow/
│ │ │ ├── Logger.swift
│ │ │ ├── MonitorViewController.swift
│ │ │ └── MonitorWindowController.swift
│ │ ├── PreferencesWindow/
│ │ │ ├── AboutView/
│ │ │ │ ├── PreferencesAboutViewController.swift
│ │ │ │ ├── PreferencesContributorsViewController.swift
│ │ │ │ └── PreferencesDonateViewController.swift
│ │ │ ├── ApplicationView/
│ │ │ │ ├── Application.swift
│ │ │ │ └── PreferencesApplicationViewController.swift
│ │ │ ├── ButtonsView/
│ │ │ │ ├── ButtonTableCellView.swift
│ │ │ │ ├── PreferencesButtonsViewController.swift
│ │ │ │ └── RecordedEvent.swift
│ │ │ ├── GeneralView/
│ │ │ │ └── PreferencesGeneralViewController.swift
│ │ │ ├── PreferencesTabViewController.swift
│ │ │ ├── PreferencesWindowController.swift
│ │ │ ├── ScrollingView/
│ │ │ │ ├── PreferencesScrollingViewController.swift
│ │ │ │ ├── PreferencesScrollingWithApplicationViewController.swift
│ │ │ │ ├── ScrollOptionsContextProviding.swift
│ │ │ │ ├── ScrollReverseDetailSettingsPopoverViewController.swift
│ │ │ │ └── ScrollSmoothDetailSettingsPopoverViewController.swift
│ │ │ └── UpdateView/
│ │ │ └── PreferencesUpdatesViewController.swift
│ │ └── WelcomeWindow/
│ │ ├── WelcomeViewController.swift
│ │ └── WelcomeWindowController.swift
│ └── mul.lproj/
│ └── Main.xcstrings
├── Mos.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ ├── IDEWorkspaceChecks.plist
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── swiftpm/
│ │ └── Package.resolved
│ └── xcshareddata/
│ └── xcschemes/
│ ├── Debug.xcscheme
│ └── Profile.xcscheme
├── README.enUS.md
├── README.id.md
├── README.md
├── README.ru.md
├── Resource/
│ ├── Icon/
│ │ └── SFIcon/
│ │ └── IconGrops.sketch
│ └── designs.sketch
├── dmg/
│ ├── README.md
│ ├── archive/
│ │ ├── Intro.psd
│ │ └── dmgBackground.psd
│ └── create-dmg.command
├── docs/
│ ├── .nojekyll
│ ├── 404/
│ │ └── index.html
│ ├── 404.html
│ ├── CNAME
│ ├── __next.__PAGE__.txt
│ ├── __next._full.txt
│ ├── __next._head.txt
│ ├── __next._index.txt
│ ├── __next._tree.txt
│ ├── _next/
│ │ └── static/
│ │ ├── 4xlWUdmYkOQZmVpTO2yEI/
│ │ │ ├── _buildManifest.js
│ │ │ ├── _clientMiddlewareManifest.json
│ │ │ └── _ssgManifest.js
│ │ └── chunks/
│ │ ├── 12c422bc11762090.js
│ │ ├── 19717b1d18b1c046.js
│ │ ├── 2f0565a65fa02d97.js
│ │ ├── 543732a8392562b4.css
│ │ ├── a6dad97d9634a72d.js
│ │ ├── b4611851359555bd.js
│ │ ├── b492b32695e3b282.js
│ │ ├── c62ecb7f1a587007.js
│ │ ├── d95bda38d1a9ce53.js
│ │ ├── f1a98b44d1dc31f1.js
│ │ └── turbopack-98aeb181aa636c3c.js
│ ├── _not-found/
│ │ ├── __next._full.txt
│ │ ├── __next._head.txt
│ │ ├── __next._index.txt
│ │ ├── __next._not-found.__PAGE__.txt
│ │ ├── __next._not-found.txt
│ │ ├── __next._tree.txt
│ │ ├── index.html
│ │ └── index.txt
│ ├── appcast.xml
│ ├── index.html
│ ├── index.txt
│ ├── llms.txt
│ ├── release-notes/
│ │ ├── 4.0.0-beta-20260108.1.en.html
│ │ ├── 4.0.0-beta-20260108.1.zh.html
│ │ ├── 4.0.0-beta-20260201.1.en.html
│ │ ├── 4.0.0-beta-20260201.1.md
│ │ ├── 4.0.0-beta-20260201.1.zh.html
│ │ ├── 4.0.0-beta-20260203.1.en.html
│ │ ├── 4.0.0-beta-20260203.1.zh.html
│ │ ├── beta.en.html
│ │ └── beta.zh.html
│ ├── robots.txt
│ ├── sitemap.xml
│ └── superpowers/
│ ├── plans/
│ │ └── 2026-03-16-logitech-hid-integration.md
│ └── specs/
│ └── 2026-03-16-logitech-hid-integration-design.md
├── tools/
│ ├── hidpp-divert-debug.swift
│ ├── hidpp-divert-fix.swift
│ ├── hidpp-full-test.swift
│ ├── hidpp-probe.swift
│ ├── hidpp-undivert-test.swift
│ └── hidpp-verify-final.swift
└── website/
├── .nvmrc
├── CNAME
├── README.md
├── app/
│ ├── components/
│ │ ├── BentoCard/
│ │ │ └── BentoCard.tsx
│ │ ├── CopyButton/
│ │ │ └── CopyButton.tsx
│ │ ├── EasingPlayground/
│ │ │ └── EasingPlayground.tsx
│ │ ├── FlowField/
│ │ │ └── FlowField.tsx
│ │ ├── HeroCurvePanel/
│ │ │ └── HeroCurvePanel.tsx
│ │ ├── LanguageSelector/
│ │ │ └── LanguageSelector.tsx
│ │ ├── Magnetic/
│ │ │ └── Magnetic.tsx
│ │ ├── Modal/
│ │ │ ├── Modal.tsx
│ │ │ └── hooks.ts
│ │ └── Reveal/
│ │ └── Reveal.tsx
│ ├── globals.css
│ ├── home-client.tsx
│ ├── i18n/
│ │ ├── context.tsx
│ │ ├── de.ts
│ │ ├── el.ts
│ │ ├── en.ts
│ │ ├── format.ts
│ │ ├── id.ts
│ │ ├── ja.ts
│ │ ├── ko.ts
│ │ ├── pl.ts
│ │ ├── ru.ts
│ │ ├── tr.ts
│ │ ├── uk.ts
│ │ ├── zh-Hant.ts
│ │ └── zh.ts
│ ├── layout.tsx
│ ├── page.tsx
│ ├── providers.tsx
│ ├── robots.ts
│ ├── services/
│ │ ├── github.ts
│ │ └── utils.ts
│ ├── site.ts
│ └── sitemap.ts
├── archive/
│ ├── v0/
│ │ ├── index.css
│ │ ├── index.html
│ │ ├── index.js
│ │ ├── indexCN.html
│ │ └── reset.css
│ └── v1/
│ ├── assets/
│ │ └── fonts/
│ │ └── ubuntu/
│ │ └── font.css
│ ├── index.html
│ ├── index.template.html
│ ├── package.json
│ ├── src/
│ │ ├── i18n/
│ │ │ ├── image.js
│ │ │ └── text.js
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── parallaxButton/
│ │ │ ├── index.css
│ │ │ └── index.js
│ │ ├── releases/
│ │ │ └── index.js
│ │ └── reset.css
│ └── webpack.config.js
├── backup/
│ └── openclaw-memory-2026-02-11-0132.tgz
├── docs/
│ └── plans/
│ ├── 2026-02-25-taste-redesign-design.md
│ └── 2026-02-25-taste-redesign.md
├── eslint.config.mjs
├── next-env.d.ts
├── next.config.ts
├── package.json
├── pnpm-workspace.yaml
├── postcss.config.mjs
├── public/
│ └── llms.txt
├── scripts/
│ └── publish-docs.sh
├── tailwind.config.ts
├── tsconfig.json
└── tsconfig.tsbuildinfo
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report-------.md
================================================
---
name: Bug report | 故障报告
about: To help us improve | 帮助我们变得更好
title: ''
labels: ''
assignees: ''
---
**Describe the bug | 问题描述**
**To Reproduce | 如何重现**
**Expected behavior | 期望结果**
**Screenshots | 相关截图**
**System Info | 系统信息:**
- Mouse: [e.g. Logitech MX Master]
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. v69]
- Application [e.g. Safari, Chrome, Whole System]
**Additional context | 额外说明**
================================================
FILE: .github/ISSUE_TEMPLATE/feature-request-------.md
================================================
---
name: Feature request | 功能请求
about: Suggest an idea for this project | 提出你的新点子
title: ''
labels: ''
assignees: ''
---
**这个问题是否源自某个缺陷?如果是,可于此处描述一下 | Is your feature request related to a problem? Please describe.**
**说说你的新点子 | Describe the solution you'd like**
**还有别的替代方案吗? | Describe alternatives you've considered**
**额外说明 | Additional context**
================================================
FILE: .gitignore
================================================
# docs
website/.idea
website/.next
website/node_modules
website/out
# macOS
.DS_Store
# XCode
xcuserdata
*.xcuserstate
*.xcuserdated
# Sparkle signing keys (keep private!)
sparkle_private_key.txt
# build
build/*.zip
/build
/spec
================================================
FILE: .last-release-commit
================================================
428607d00ab65498e548b2d942bf675069cf40a2
================================================
FILE: .skills/release-preparation/SKILL.md
================================================
---
name: release-preparation
description: Use when preparing a new Mos release (stable, beta, or alpha) - covers version bump, xcodebuild archive, Developer ID signing, notarization, zip packaging, changelog generation, Sparkle appcast signing, and GitHub release draft creation. Trigger this skill whenever the user mentions releasing, publishing, shipping a new version, bumping version, updating appcast, or creating a release build of Mos.
---
# Release Preparation
Full release pipeline: bump version → build → sign → notarize → package zip → generate changelog → sign appcast → create GH draft.
## Inputs
| Input | Source |
|-------|--------|
| Mos.app | Built via xcodebuild archive + Developer ID export (Step 0) |
| Version / Build | `MARKETING_VERSION` / `CURRENT_PROJECT_VERSION` in `Mos.xcodeproj/project.pbxproj` |
| Channel | User specifies: `stable`, `beta`, or `alpha` |
| Signing key | macOS Keychain — Apple Developer ID (code signing) + Sparkle EdDSA (appcast) |
| Notarization | macOS Keychain profile `notarytool` (stores Apple ID + app-specific password) |
## Flow
```dot
digraph release {
rankdir=TB;
node [shape=box];
"0. Build, sign & notarize" -> "1. Package zip";
"1. Package zip" -> "2. Generate changelog";
"2. Generate changelog" -> "3. Interactive confirm";
"3. Interactive confirm" -> "4. Sign & update appcast";
"4. Sign & update appcast" -> "5. Commit appcast";
"5. Commit appcast" -> "6. Create GH draft";
"6. Create GH draft" -> "7. Verify";
"7. Verify" -> "8. User publishes + git push";
}
```
### Step 0: Build, Sign & Notarize
1. **Bump version** in `Mos.xcodeproj/project.pbxproj`:
- `MARKETING_VERSION` — e.g., `4.0.2` (appears twice, use `replace_all`)
- `CURRENT_PROJECT_VERSION` — build number in `YYYYMMDD.N` format (appears twice, use `replace_all`).
**CRITICAL**: Every release MUST have a unique `CURRENT_PROJECT_VERSION`. Sparkle uses this value (`sparkle:version`) to detect updates — if two releases share the same build number, users on the older version will never see the update. Always bump this even for hotfix releases.
- Commit the version bump.
2. **Archive**:
```bash
xcodebuild archive \
-scheme Debug \
-project Mos.xcodeproj \
-configuration Release \
-archivePath /tmp/Mos.xcarchive
```
Note: The scheme is named "Debug" but `-configuration Release` ensures Release build settings.
3. **Export with Developer ID** (Direct Distribution):
```bash
cat > /tmp/ExportOptions.plist << 'PLIST'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key><string>developer-id</string>
<key>teamID</key><string>N7Z52F27XK</string>
<key>signingStyle</key><string>automatic</string>
</dict>
</plist>
PLIST
xcodebuild -exportArchive \
-archivePath /tmp/Mos.xcarchive \
-exportOptionsPlist /tmp/ExportOptions.plist \
-exportPath /tmp/MosExport \
-allowProvisioningUpdates
```
If export fails with "network connection was lost", retry — Apple's notarization service can be flaky.
4. **Notarize** (`xcodebuild -exportArchive` does NOT auto-notarize via CLI — must always do manually):
```bash
# Note: this zip is only for notarization submission, not for distribution.
# AppleDouble flags (--norsrc --noextattr) are not needed here — only in prepare_zip.sh for the release zip.
ditto -c -k --keepParent /tmp/MosExport/Mos.app /tmp/Mos-notarize.zip
xcrun notarytool submit /tmp/Mos-notarize.zip --keychain-profile "notarytool" --wait
xcrun stapler staple /tmp/MosExport/Mos.app
```
5. **Verify**:
```bash
codesign -dvv /tmp/MosExport/Mos.app 2>&1 | grep Authority
# Should show: Developer ID Application: BIAO CHEN (N7Z52F27XK)
spctl --assess --type execute --verbose /tmp/MosExport/Mos.app
# Should show: accepted, source=Notarized Developer ID
```
The notarized app at `/tmp/MosExport/Mos.app` is used for Step 1.
### Step 1: Package Zip
```bash
bash .skills/release-preparation/scripts/prepare_zip.sh /tmp/MosExport/Mos.app [--channel beta]
```
Returns JSON with `zip_path`, `version`, `build`, `tag`, `zip_name`, `length`.
**IMPORTANT — AppleDouble / Gatekeeper**: The script uses `ditto -c -k --norsrc --noextattr --keepParent` to create the zip. The `--norsrc --noextattr` flags are **mandatory** — without them, `ditto` serializes macOS extended attributes as AppleDouble (`._*`) files inside the zip. When users extract via Finder/Archive Utility (not `ditto -x -k`), these `._*` entries appear as real files in embedded framework root directories (e.g., `Sparkle.framework/._Autoupdate`), causing Gatekeeper to reject with "unsealed contents present in the root directory of an embedded framework". This issue is **not detectable** by `spctl --assess` on the build machine because `ditto -x -k` correctly reconverts `._*` files back to xattrs — only Finder extraction triggers the failure.
After packaging, verify the zip is clean:
```bash
# Must show NO ._* entries
zipinfo -1 "$ZIP_PATH" | grep '/\._' && echo "ERROR: AppleDouble files found!" || echo "OK: no AppleDouble files"
```
### Step 2: Generate Changelog
**This is AI work, not scripted.** Follow these rules:
1. Find last release tag:
```bash
gh release list --repo Caldis/Mos --limit 1 --json tagName,isPrerelease
git rev-parse <tag> # get exact commit SHA
```
2. Get changes: `git log <last_tag>..HEAD --no-merges --oneline` excluding `website/`, `docs/`, `.issues-archive/`, `CLAUDE.md`, `LOCALIZATION.md`, `build/`, `dmg/`, `CRASH_FIX_DESIGN*`.
3. Categorize into: 新功能/New Features, 优化/Improvements, 修复/Fixes.
4. Find contributors: cross-reference `git log --format="%an"` with `gh api repos/.../commits/<sha> --jq '.author.login'`. Inline credit in the relevant section (e.g., "修复鼠标中键映射问题, 感谢 @GonzFC"), NOT in a separate section.
5. Match tone of `CHANGELOG.md` — bilingual (Chinese first, `---` separator, then English).
6. Write both formats:
- **Markdown** → `~/Desktop/release-notes-{version}.md` (for GH release body). Must include wiki links header before each language section:
```markdown
> 如果应用无法启动或遇到权限问题, 请参考 [Wiki: 如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C)
## 修复
- ...
---
> If the application fails to start or encounters permission issues, please refer [Wiki: If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)
## Fixes
- ...
```
- **HTML** → `/tmp/changelog-{version}.html` (for appcast CDATA). Use `<h2>` + `<ul><li>`, with `<hr/>` separating Chinese and English:
```html
<h2>修复</h2>
<ul>
<li>修复平滑滚动导致的崩溃问题</li>
</ul>
<hr/>
<h2>Fixes</h2>
<ul>
<li>Fix crash caused by smooth scrolling</li>
</ul>
```
### Step 3: Interactive Confirm
**MUST use `AskUserQuestion`** to confirm changelog items. Never list items as text and ask user to type numbers.
After confirmation, sync any user edits from markdown back to HTML. Always keep both formats in sync.
### Step 4: Sign & Update Appcast
```bash
bash .skills/release-preparation/scripts/update_appcast.sh <zip_path> /tmp/changelog-{version}.html [--tag TAG]
```
Uses Sparkle `sign_update` from Xcode DerivedData (reads EdDSA key from Keychain). If key missing, guide user:
```bash
# Find generate_keys tool
find ~/Library/Developer/Xcode/DerivedData -name "generate_keys" -not -path "*/checkouts/*" | head -1
# Import: generate_keys -f <key_file>
# Export: generate_keys -x <output_file>
```
The script writes to both `build/appcast.xml` and `docs/appcast.xml`.
### Step 5: Commit Appcast
Only `docs/appcast.xml` is tracked by git (`build/` is gitignored):
```bash
git add docs/appcast.xml
git commit -m "chore: update appcast for {version}"
```
### Step 6: Create GitHub Draft
```bash
bash .skills/release-preparation/scripts/create_gh_draft.sh <tag> <zip_path> ~/Desktop/release-notes-{version}.md [--prerelease]
```
Add `--prerelease` for beta/alpha channels. This creates a **draft** — never publish without user approval.
### Step 7: Verify
```bash
gh release view <tag> --repo Caldis/Mos --json tagName,isDraft,assets \
--jq '{tag: .tagName, draft: .isDraft, assets: [.assets[] | {name: .name, size: .size}]}'
```
Confirm asset URL matches appcast `<enclosure url="...">`.
### Step 8: User Publishes
User reviews draft on GitHub and publishes. After publishing:
```bash
git push origin master
```
This pushes the appcast update so Sparkle auto-update can find it.
## Naming Conventions
| | Stable | Beta/Alpha |
|---|---|---|
| Zip | `Mos.Versions.{ver}-{YYYYMMDD.N}.zip` | `Mos.Versions.{ver}-beta-{YYYYMMDD.N}.zip` |
| Tag | `{ver}` | `{ver}-beta-{YYYYMMDD.N}` |
| Download URL | `.../download/{ver}/Mos.Versions...zip` | `.../download/{ver}-beta-.../Mos.Versions...zip` |
## Common Issues
| Problem | Fix |
|---------|-----|
| Export fails with "network connection was lost" | Retry — Apple notarization service can be intermittent |
| `spctl --assess` rejected after export | Notarization not auto-applied; manually submit with `notarytool` + `stapler staple` |
| `sign_update` not found | Build project in Xcode first to fetch Sparkle SPM package |
| Signing key not in Keychain | Use `generate_keys -f <key_file>` to import Sparkle EdDSA key |
| Developer ID cert missing from `security find-identity` | Download from Apple Developer portal or use Xcode → Settings → Accounts → Manage Certificates |
| Appcast URL mismatch | Verify GH release tag matches appcast `<enclosure>` URL path |
| Changelog out of sync | Always edit markdown first, then regenerate HTML before updating appcast |
| Sparkle update not detected | Each release MUST have a unique `CURRENT_PROJECT_VERSION` (= `sparkle:version`). Sparkle compares this value, not `MARKETING_VERSION`. If two releases share the same build number, users will never see the update. |
| Gatekeeper rejects downloaded app ("Apple 无法验证") | Zip likely contains AppleDouble `._*` files. Verify with `zipinfo -1 <zip> \| grep '/\._'`. Fix: use `ditto -c -k --norsrc --noextattr --keepParent` (already in `prepare_zip.sh`). Note: `spctl --assess` on build machine won't catch this — only Finder extraction triggers failure. |
| `COPYFILE_DISABLE=1` doesn't work with `ditto` | This env var only works with `cp`, `tar`, etc. For `ditto`, use `--norsrc --noextattr` flags instead. |
================================================
FILE: .skills/release-preparation/scripts/create_gh_draft.sh
================================================
#!/usr/bin/env bash
# create_gh_draft.sh - Create a GitHub release draft
# Usage: create_gh_draft.sh <tag> <zip_path> <release_notes_md_file> [--prerelease]
set -euo pipefail
GITHUB_REPO="Caldis/Mos"
die() { echo "Error: $*" >&2; exit 1; }
command -v gh >/dev/null 2>&1 || die "gh CLI not found"
TAG="${1:-}"
ZIP_PATH="${2:-}"
NOTES_FILE="${3:-}"
PRERELEASE=()
shift 3 2>/dev/null || true
while [[ $# -gt 0 ]]; do
case "$1" in
--prerelease) PRERELEASE=(--prerelease); shift ;;
*) die "Unknown arg: $1" ;;
esac
done
[[ -n "$TAG" ]] || die "Usage: create_gh_draft.sh <tag> <zip_path> <notes_md_file> [--prerelease]"
[[ -f "$ZIP_PATH" ]] || die "Zip not found: $ZIP_PATH"
[[ -f "$NOTES_FILE" ]] || die "Notes file not found: $NOTES_FILE"
# Check if release already exists
if gh release view "$TAG" --repo "$GITHUB_REPO" >/dev/null 2>&1; then
echo "Release $TAG already exists. Updating..."
gh release edit "$TAG" \
--repo "$GITHUB_REPO" \
--draft \
--title "$TAG" \
--notes-file "$NOTES_FILE" \
${PRERELEASE[@]+"${PRERELEASE[@]}"}
# Upload/replace asset
gh release upload "$TAG" "$ZIP_PATH" --repo "$GITHUB_REPO" --clobber
else
gh release create "$TAG" "$ZIP_PATH" \
--repo "$GITHUB_REPO" \
--draft \
--notes-file "$NOTES_FILE" \
--title "$TAG" \
${PRERELEASE[@]+"${PRERELEASE[@]}"}
fi
echo "[release] Draft created: https://github.com/${GITHUB_REPO}/releases/tag/${TAG}"
================================================
FILE: .skills/release-preparation/scripts/prepare_zip.sh
================================================
#!/usr/bin/env bash
# prepare_zip.sh - Package Mos.app into a release zip
# Usage: prepare_zip.sh <path-to-Mos.app> [--channel stable|beta|alpha]
# Output: JSON with zip_path, version, build, tag, zip_name
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd)"
BUILD_DIR="$ROOT_DIR/build"
die() { echo "Error: $*" >&2; exit 1; }
APP_PATH="${1:-}"
CHANNEL="stable"
shift || true
while [[ $# -gt 0 ]]; do
case "$1" in
--channel) CHANNEL="$2"; shift 2 ;;
*) die "Unknown arg: $1" ;;
esac
done
[[ -n "$APP_PATH" ]] || die "Usage: prepare_zip.sh <path-to-Mos.app> [--channel stable|beta|alpha]"
[[ -d "$APP_PATH" ]] || die "Not found: $APP_PATH"
# Read version from app's Info.plist
PLIST="$APP_PATH/Contents/Info.plist"
[[ -f "$PLIST" ]] || die "Missing Info.plist: $PLIST"
SHORT_VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$PLIST" 2>/dev/null) || die "Cannot read CFBundleShortVersionString"
BUNDLE_VERSION=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$PLIST" 2>/dev/null) || die "Cannot read CFBundleVersion"
# Build zip filename: Mos.Versions.{version}[-(alpha|beta)]-{YYYYMMDD.N}.zip
CHANNEL_SUFFIX=""
TAG="$SHORT_VERSION"
if [[ "$CHANNEL" != "stable" ]]; then
CHANNEL_SUFFIX="-${CHANNEL}"
TAG="${SHORT_VERSION}-${CHANNEL}-${BUNDLE_VERSION}"
fi
ZIP_NAME="Mos.Versions.${SHORT_VERSION}${CHANNEL_SUFFIX}-${BUNDLE_VERSION}.zip"
mkdir -p "$BUILD_DIR"
ZIP_PATH="$BUILD_DIR/$ZIP_NAME"
# Create zip without AppleDouble (._*) resource fork metadata.
# ditto -c -k serializes extended attributes as ._* files inside the zip.
# When extracted via Finder/Archive Utility, these appear as real files in
# embedded framework root directories, causing Gatekeeper to reject with
# "unsealed contents present in the root directory of an embedded framework".
# --norsrc --noextattr prevent this entirely.
ditto -c -k --norsrc --noextattr --keepParent "$APP_PATH" "$ZIP_PATH"
FILE_LENGTH=$(wc -c < "$ZIP_PATH" | tr -d '[:space:]')
cat <<EOF
{
"zip_path": "$ZIP_PATH",
"zip_name": "$ZIP_NAME",
"version": "$SHORT_VERSION",
"build": "$BUNDLE_VERSION",
"channel": "$CHANNEL",
"tag": "$TAG",
"length": $FILE_LENGTH
}
EOF
================================================
FILE: .skills/release-preparation/scripts/update_appcast.sh
================================================
#!/usr/bin/env bash
# update_appcast.sh - Sign zip and update appcast.xml
# Usage: update_appcast.sh <zip_path> <changelog_html_file> [--tag TAG]
# Reads signing key from macOS Keychain via Sparkle sign_update tool
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../../../.." && pwd)"
BUILD_DIR="$ROOT_DIR/build"
DOCS_DIR="$ROOT_DIR/docs"
GITHUB_REPO="Caldis/Mos"
die() { echo "Error: $*" >&2; exit 1; }
info() { echo "[appcast] $*"; }
ZIP_PATH="${1:-}"
CHANGELOG_FILE="${2:-}"
TAG_OVERRIDE=""
shift 2 2>/dev/null || true
while [[ $# -gt 0 ]]; do
case "$1" in
--tag) TAG_OVERRIDE="$2"; shift 2 ;;
*) die "Unknown arg: $1" ;;
esac
done
[[ -n "$ZIP_PATH" && -f "$ZIP_PATH" ]] || die "Usage: update_appcast.sh <zip_path> <changelog_html_file> [--tag TAG]"
[[ -n "$CHANGELOG_FILE" && -f "$CHANGELOG_FILE" ]] || die "Changelog HTML file required"
# Find Sparkle sign_update tool (scoped to Mos project DerivedData)
SIGN_UPDATE=$(find ~/Library/Developer/Xcode/DerivedData/Mos-* -path "*/artifacts/sparkle/Sparkle/bin/sign_update" 2>/dev/null | head -1)
[[ -n "$SIGN_UPDATE" ]] || SIGN_UPDATE=$(find ~/Library/Developer/Xcode/DerivedData -name "sign_update" -not -path "*/old_dsa_scripts/*" -not -path "*/checkouts/*" 2>/dev/null | head -1)
[[ -n "$SIGN_UPDATE" ]] || die "Sparkle sign_update not found. Build the project in Xcode first."
# Sign the zip (reads EdDSA key from Keychain)
SIGN_OUTPUT=$("$SIGN_UPDATE" "$ZIP_PATH" 2>&1) || die "Signing failed. Import key first: generate_keys -f <key_file>"
ED_SIGNATURE=$(echo "$SIGN_OUTPUT" | grep -o 'sparkle:edSignature="[^"]*"' | sed 's/sparkle:edSignature="//;s/"//')
FILE_LENGTH=$(echo "$SIGN_OUTPUT" | grep -o 'length="[^"]*"' | sed 's/length="//;s/"//')
[[ -n "$ED_SIGNATURE" ]] || die "Failed to parse edSignature from sign_update output"
[[ -n "$FILE_LENGTH" ]] || FILE_LENGTH=$(wc -c < "$ZIP_PATH" | tr -d '[:space:]')
# Read version from zip's Info.plist
VERSION_JSON=$(python3 - "$ZIP_PATH" <<'PY'
import json, plistlib, sys, zipfile
with zipfile.ZipFile(sys.argv[1]) as z:
candidates = [n for n in z.namelist() if n.endswith(".app/Contents/Info.plist")]
if not candidates: raise SystemExit("No Info.plist in zip")
# Prefer shortest path (root app plist, not nested framework plists)
candidates.sort(key=len)
plist = plistlib.loads(z.read(candidates[0]))
print(json.dumps({
"short": plist.get("CFBundleShortVersionString", ""),
"build": plist.get("CFBundleVersion", ""),
}))
PY
)
SHORT_VERSION=$(echo "$VERSION_JSON" | python3 -c "import json,sys; print(json.load(sys.stdin)['short'])")
BUNDLE_VERSION=$(echo "$VERSION_JSON" | python3 -c "import json,sys; print(json.load(sys.stdin)['build'])")
ZIP_NAME=$(basename "$ZIP_PATH")
TAG="${TAG_OVERRIDE:-$SHORT_VERSION}"
DOWNLOAD_URL="https://github.com/${GITHUB_REPO}/releases/download/${TAG}/${ZIP_NAME}"
PUB_DATE=$(date -u "+%a, %d %b %Y %H:%M:%S %z")
CHANGELOG_HTML=$(cat "$CHANGELOG_FILE")
# Detect channel from zip name
CHANNEL_ELEMENT=""
ENCLOSURE_CHANNEL=""
if [[ "$ZIP_NAME" == *"-beta-"* ]]; then
CHANNEL_ELEMENT=$'\n <sparkle:channel>beta</sparkle:channel>'
ENCLOSURE_CHANNEL=$'\n sparkle:channel="beta"'
elif [[ "$ZIP_NAME" == *"-alpha-"* ]]; then
CHANNEL_ELEMENT=$'\n <sparkle:channel>alpha</sparkle:channel>'
ENCLOSURE_CHANNEL=$'\n sparkle:channel="alpha"'
fi
# Build new <item>
NEW_ITEM=$(cat <<EOF
<item>
<title>Mos ${SHORT_VERSION}</title>
${CHANNEL_ELEMENT}
<description><![CDATA[${CHANGELOG_HTML}]]></description>
<pubDate>${PUB_DATE}</pubDate>
<enclosure
url="${DOWNLOAD_URL}"
length="${FILE_LENGTH}"
type="application/octet-stream"
sparkle:shortVersionString="${SHORT_VERSION}"
sparkle:version="${BUNDLE_VERSION}"
sparkle:edSignature="${ED_SIGNATURE}"${ENCLOSURE_CHANNEL}
/>
</item>
EOF
)
# Merge into existing appcast (prepend new item, dedup by version)
APPCAST_BUILD="$BUILD_DIR/appcast.xml"
APPCAST_DOCS="$DOCS_DIR/appcast.xml"
BASE_APPCAST=""
[[ -s "$APPCAST_DOCS" ]] && BASE_APPCAST="$APPCAST_DOCS"
[[ -z "$BASE_APPCAST" && -s "$APPCAST_BUILD" ]] && BASE_APPCAST="$APPCAST_BUILD"
APPCAST_XML=$(NEW_ITEM="$NEW_ITEM" python3 - "$BASE_APPCAST" "$BUNDLE_VERSION" <<'PY'
import os, re, sys
base_path = sys.argv[1].strip()
new_version = sys.argv[2].strip()
new_item = os.environ.get("NEW_ITEM", "").strip()
DEFAULT = """<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Mos</title>
<link>https://mos.caldis.me/</link>
<description>Mos Updates</description>
<language>en</language>
</channel>
</rss>
"""
text = open(base_path, "r").read() if base_path and os.path.exists(base_path) else DEFAULT
item_re = re.compile(r"<item\b.*?</item>", flags=re.S)
matches = list(item_re.finditer(text))
if matches:
prefix = text[:matches[0].start()]
suffix = text[matches[-1].end():]
items = [m.group(0) for m in matches]
else:
insert_at = text.rfind("</channel>")
if insert_at == -1:
text = DEFAULT
insert_at = text.rfind("</channel>")
prefix = text[:insert_at]
suffix = text[insert_at:]
items = []
def extract_version(item):
m = re.search(r'sparkle:version="([^"]+)"', item)
return m.group(1) if m else ""
filtered = []
seen = set()
for item in items:
v = extract_version(item)
if v == new_version or v in seen:
continue
if v: seen.add(v)
filtered.append(item)
all_items = [new_item] + filtered
sep = "\n\n "
out = prefix + sep.join(i.strip() for i in all_items if i.strip()) + suffix
sys.stdout.write(out if out.endswith("\n") else out + "\n")
PY
)
mkdir -p "$BUILD_DIR" "$DOCS_DIR"
printf '%s' "$APPCAST_XML" > "$APPCAST_BUILD"
cp "$APPCAST_BUILD" "$APPCAST_DOCS"
info "Signed: $ZIP_NAME"
info "Signature: ${ED_SIGNATURE:0:20}..."
info "Tag: $TAG"
info "URL: $DOWNLOAD_URL"
info "Wrote: $APPCAST_BUILD"
info "Copied: $APPCAST_DOCS"
================================================
FILE: CHANGELOG.md
================================================
# 4.0.0
>
## 新功能
- 全新加入「按钮」模块:现在可以直接将鼠标按键绑定到你想要的快捷动作。🎉
- 加入「模拟触控板」模式,我不知道有什么用, 但有点新鲜感总不是坏事 😜
- 现在可以在「滚动」中基于垂直、水平方向独立调味了
## 优化
- 欢迎指引、辅助功能授权流程 UI 翻新。
- 翻译迁移到 string catalogs, 再也不需要面对 identify string 了
- 基于 AI 补充了一些缺失的的多语言文本。(如果你觉得翻译有任何问题, 非常欢迎帮忙纠正!)
## 修复
- 修复部分场景下的滚动平滑滚动异常问题
- 修复欢迎指引、辅助功能授权流程中偶尔不同步的问题,希望你启动时能顺顺利利。
---
## New
- Brand-new Buttons module: record mouse and bind them to whatever shortcut you like. 🎉
- Added Simulate Trackpad mode. Unsure how useful it is yet, but it seems fun. 😜
- Vertical and horizontal scrolling can now be tuned independently inside the Scroll tab.
## Improvements
- Refreshed the welcome guide and accessibility permission in intro flow.
- Translations now power by string catalogs, no more identify strings.
- Filled a few missing translationg with a little help from AI. (If you find any problems with the translation, feel free to let us know!)
## Fixes
- Fixed the smooth scrolling issue in certain scenarios.
- Fixed the intro flow sync logic, so first launch might go more smoothly.
# [3.5.0](https://github.com/Caldis/Mos/releases/tag/3.5.0)

> 由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行
若 Mos 已在辅助功能的授权列表中, 只需取消勾选后再度勾选即可; 如果仍然无效, 请尝试将其从列表中移除再添加
可以在此处查看帮助: [无法正确获取辅助功能权限](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)
> 如果在初次启动应用时被系统阻止, 你可以查看帮助: [如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)
> [如果想看大咪点这里](https://meow.caldis.me)
## 新特性
- 希腊语支持, 感谢 @Valamorde
- 乌克兰语支持, 感谢 @dittohead
- 应用图标及状态栏图标更新
## 修正
- 在 Catalyst 应用中停止滚动后立即触发滚动无法被应用正常响应的问题, 包括 Maps / Messages / Weather 等 ...
## 其他
- App 文本校对, @novialriptide @udanfacy22
- 网站文本校对, 感谢 @kant @jfrsa
---
> Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.
If Mos already in the Accessibility Control list, just uncheck it and toggle it again. If it still doesn't work, try removing it from the list and adding it again.
You can check this for help: [Can't get access to accessibility correctly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly#cant-get-access-to-accessibility-correctly)
> If the macOS preventing the application running, you can check this for help: [If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)
> [meow meow meow](https://meow.caldis.me)
## New features
- Greek language support, thanks to @Valamorde
- Ukrainian language support, thanks to @dittohead
- Updated application icon and status bar icon
## Fix
- In Catalyst apps, scrolling is not properly responded to immediately after scrolling stops, including Maps/Messages/Weather, etc...
## Other
- Wording improvement for App, @novialriptide @udanfacy22
- Wording improvement for Web, thanks to @kant @jfrsa
# [3.4.1](https://github.com/Caldis/Mos/releases/tag/3.4.1)

> 由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行
若 Mos 已在辅助功能的授权列表中, 只需取消勾选后再度勾选即可; 如果仍然无效, 请尝试将其从列表中移除再添加
可以在此处查看帮助: [无法正确获取辅助功能权限](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)
> 如果在初次启动应用时被系统阻止, 你可以查看帮助: [如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)
> [如果想看大咪点这里](https://meow.caldis.me)
## 修正
- 隐藏状态栏图标功能无效的问题
---
> Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.
If Mos already in the Accessibility Control list, just uncheck it and toggle it again. If it still doesn't work, try removing it from the list and adding it again.
You can check this for help: [Can't get access to accessibility correctly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly#cant-get-access-to-accessibility-correctly)
> If the macOS preventing the application running, you can check this for help: [If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)
> [meow meow meow](https://meow.caldis.me)
## Bug fix
- Fixed an issue will cause the hide status bar icon not working
# [3.4.0](https://github.com/Caldis/Mos/releases/tag/3.4.0)

> 由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行
若 Mos 已在辅助功能的授权列表中, 只需取消勾选后再度勾选即可; 如果仍然无效, 请尝试将其从列表中移除再添加
可以在此处查看帮助: [无法正确获取辅助功能权限](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)
> 如果在初次启动应用时被系统阻止, 你可以查看帮助: [如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)
> [如果想看大咪点这里](https://meow.caldis.me)
## 优化
- 少许性能优化
- 繁體中文 (台灣) / 繁體中文 (香港) 的文本优化, 感谢 @pan93412 @ralphchung 的贡献
- 德语文本优化, 感谢 @mmairle 的贡献
- 英文文本优化, "white list" -> "allow list", 感谢 @tmchow 的贡献
- README 更新, 感谢 @kant @Goooler 的贡献
## 修正
- 降低了一些了由于内存泄露导致应用异常崩溃的概率 (实在是找不到哪里漏了)
---
> Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.
If Mos already in the Accessibility Control list, just uncheck it and toggle it again. If it still doesn't work, try removing it from the list and adding it again.
You can check this for help: [Can't get access to accessibility correctly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly#cant-get-access-to-accessibility-correctly)
> If the macOS preventing the application running, you can check this for help: [If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)
> [meow meow meow](https://meow.caldis.me)
## Improvement
- Some performance optimizations
- Traditional Chinese (Taiwan) / Traditional Chinese (Hong Kong) language improvement, thanks to @pan93412 @ralphchung
- German language improvement, thanks to @mmairle
- English transition improvement, from term "white list" -> "allow list", thanks to @tmchow
- README update, thanks to @kant @Goooler
## Bug fix
- Slightly reduced the probability of the application crash abnormally due to a memory leak
# [3.3.2](https://github.com/Caldis/Mos/releases/tag/3.3.2)
> 由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行
若 Mos 已在辅助功能的授权列表中, 只需取消勾选后再度勾选即可; 如果仍然无效, 请尝试将其从列表中移除再添加
可以在此处查看帮助: [无法正确获取辅助功能权限](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)
> 如果在初次启动应用时被系统阻止, 你可以查看帮助: [如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E5%BA%94%E7%94%A8%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E8%BF%90%E8%A1%8C#%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AE%E8%8E%B7%E5%8F%96%E8%BE%85%E5%8A%A9%E5%8A%9F%E8%83%BD%E6%9D%83%E9%99%90)
## 修正
- 修复了禁用键无法生效的问题
- 修复恢复为预设值的状态不一致的问题
- 修复了例外列表的样式偏移问题
---
> Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.
If Mos already in the Accessibility Control list, just uncheck it and toggle it again. If it still doesn't work, try removing it from the list and adding it again.
You can check this for help: [Can't get access to accessibility correctly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly#cant-get-access-to-accessibility-correctly)
> If the macOS preventing the application running, you can check this for help: [If the App not work properly](https://github.com/Caldis/Mos/wiki/If-the-App-not-work-properly)
## Bug Fix
- Fixed an issue that the disabled key cannot take effect
- Fixed inconsistent status of restoring to preset value
- Fixed the style offset problem of exception list
# [3.3.1](https://github.com/Caldis/Mos/releases/tag/3.3.1)

---
> 由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行
若 Mos 已在辅助功能的授权列表中, 只需取消勾选后再度勾选即可
> 如果在初次启动应用时被系统阻止, 你可以查看帮助: [如果你无法执行应用](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6%9E%9C%E4%BD%A0%E6%97%A0%E6%B3%95%E6%89%A7%E8%A1%8C%E5%BA%94%E7%94%A8)
## 新特性
- 适配 BigSur 界面
- 适配 M1 芯片设备
由于我还没有相应设备, 我们仅仅重新编译了 Universual 的代码来适配, 目前尚存在一些兼容性问题, 您可以追踪 https://github.com/Caldis/Mos/issues/333 来获取最新动态, 如果您可以协助测试, 也十分欢迎在问题单内留言
- 例外应用的设置界面现在可以正确匹配其状态
- 例外应用可以正确地添加任何非 Bundle 类型的应用, 如 MineCraft 这类 Java 应用, 或某些来自 Steam 的游戏可执行文件
此外, 例外应用已经基于执行路径而不是 BundleID 匹配, 这意味着, 一旦你改变了应用的存放路径, 你需要重新配置其设置
这一变更可能会影响某些已添加的例外应用, 你或许需要重新添加并配置它们
- 例外应用现在可以修改显示的名称
- 滚动时点击鼠标左键可以停止滚动
- 俄文支持, 感谢 @mclvren 的翻译
- 韩文支持, 感谢 @readingsnail 的翻译
- 土耳其语支持, 感谢 @LeaveNhA Leav 的翻译
- 德语支持, 感谢 @lima0 Seli 的翻译
## 优化
- 滚动行为现在不会被携带到其他目标窗口
- 繁体中文文本优化, 感谢 @crizant 的翻译
- 英文文本优化, 感谢 @flash76 的翻译
- 文档支持, 感谢 @jackdcasey 的翻译
## 修正
- 修复了 BigSur 下状态栏图标无法完全隐藏的问题
- 修复了例外应用在某些情况下无法正确生效的问题
- 修复了在 Chrome 刷新时执行滚动导致页面被移出屏幕的问题
- 修复了 Logitech MX Master 系列鼠标的拇指轮无法被正确识别的问题
## 杂项
- 通过 BundleID 添加例外应用的方式被移除
- 现在使用 Swift Package 代替 CocoaPods
---
> Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.
If Mos already in the Accessibility Control list, just uncheck it and toggle it again.
> If the macOS preventing the application running, you can check this for help: [If the App isn’t allowed to open](https://github.com/Caldis/Mos/wiki/If-the-App-isn%E2%80%99t-allowed-to-open)
## New Features
- BigSur UI adaptation
- Adaptation to M1 chip
Since I don't have the latest device yet, we just recompile the Universual code for adaptation, so there are still some compatibility issues, you can track https://github.com/Caldis/Mos/issues/333 to get the latest news, if you can help to test, you are also very welcome in the questionnaire Leave a comment
- The exceptions settings screen now correctly matches its status
- Exceptions can correctly add any non-Bundle type application, such as Java applications like MineCraft, or certain game executables from Steam
In addition, the exceptions have been matched based on the execution path rather than the BundleID, which means that once you change the path where the app is stored, you will need to reconfigure its settings
This change may affect some of the exception apps that have been added, and you may need to re-add and reconfigure them
- Exceptional apps can change the displayed name now
- Scrolling can be stopped by clicking the left mouse button when scrolling
- Russian support, thanks to @mclvren for the translation
- Korean support, thanks to @readingsnail for the translation
- Turkish support, thanks to @LeaveNhA Leav for the translation
- German support, thanks to @lima0Seli for the translation
## Improvement
- Scrolling behavior is now not carried to other target windows
- Traditional Chinese text optimization, thanks to @crizant for translation
- English text optimization, thanks to @flash76 for translation
- Documentation support, thanks to @jackdcasey for the translation
## Bug Fix
- Fixed an issue that the status bar icon could not be completely hidden under BigSur
- Fixed an issue where the exception application did not work correctly in some cases
- Fixed an issue that caused pages to be moved off the screen when performing scrolling on Chrome refresh
- Fixed an issue where the thumbwheel on Logitech MX Master series mouse was not recognized correctly
## Miscellaneous
- Adding exception apps via BundleID has been removed
- Now uses Swift Package instead of CocoaPods
# [3.1.0](https://github.com/Caldis/Mos/releases/tag/3.1.0)

----
```
由于 macOS 的安全性限制, 你需要允许 Mos 访问系统的辅助功能的访问权限以确保其正常运行
如果 Mos 已在辅助功能的授权列表中却无法正常使用, 只需取消勾选后再度勾选即可
```
```
若系统提示 “程序已损坏” ,你需要在 “系统偏好设置 -> 安全性与隐私 -> 通用” 中允许程序运行
对于高版本的系统,你可能还需要借助命令行来编辑应用的 “com.apple.quarantine” 属性以允许程序的运行,请参考
https://superuser.com/questions/28384/what-should-i-do-about-com-apple-quarantine
```
## 新特性
- 现在你可以指定一个按钮为**加速键**, 按下后只需要轻轻滑动滚轮就可以在页面中来回冲刺
- 你现在可以为每个例外应用程序设定单独的滚动行为了。
- 在例外应用列表中, 你可以直接从正在运行的窗口程序中选择并添加爱。
- 在例外应用列表中, 现在可以手动输入应用程序的识别信息。如果你先前无法通过从文件选择的方式添加一个应用到例外列表中, 不妨用这个试试。不过使用这个路径添加的应用,列表将无法正确展示其图标。
- 在设置中增加了一个用于隐藏状态栏图标的选项。
## 优化
- 图标更新。
- 导览界面更新。
- 偏好设置界面更新。
- 考虑到**滚动监控**的使用频率, 现在它被雪藏了, 只有在按下 **Options** 并点击状态栏的图标后才能看到滚动监控的选项。
## 修正
- 重写了热键功能, (应该)修复了在某些情况下会卡住的问题。
- 在 macOS Catalina 下无法正常识别 Launchpad 的问题。
- 一些 UI 问题。
- 版本号过低的问题。
---
```
Limited by macOS security strategy, you need to allow Mos to access to Accessibility Control to ensure that it is working properly.
If Mos is not working properly when it's in the Accessibility Control list, just uncheck it and toggle it again.
```
```
If the system says "The program is damaged", you need to allow the program to run in "System Preferences -> Security and Privacy -> General"
For higher version systems, you may also need to edit the "com.apple.quarantine" property of the application with the help of the command line to allow the program to run, please refer to
https://superuser.com/questions/28384/what-should-i-do-about-com-apple-quarantine
```
## New Features
- Now you can specify a button for the **Acceleration button**. After enabled, you just need to scroll the wheel gracefully and you can swipe the page rapidly.
- You can now set its own independent scrolling behavior for each exception application.
- In the Exceptions application list, you can now select directly from the running window program.
- In the Exceptions application list, you can now manually enter the identification information for your application. If you can't add an app to the exception list by selecting it from a file, try this with a try. But for this reason, the list will not display its icon correctly.
- Added an option to hide the status bar icon.
## Improvement
- New icon.
- Improved introduction interface.
- Improved preferences interface.
- Since **Rolling Monitor** is used less frequently, it is now hidden. You can only see the options for scrolling monitoring when you press **Options** and click on the icon in the status bar.
## Bug Fix
- Rewritten the hotkey function, (should) fix the problem that will get stuck in some cases.
- Fix an issue with macOS Catalina that is not working properly due to its security policy
- There are some problems that are not there.
# [2.4.0-beta](https://github.com/Caldis/Mos/releases/tag/2.4.0-beta)
```
由于 macOS 10.14 的限制, Mos 只有在获取了辅助功能的访问权限后才可正常使用
更新版本后,你需要重新在设置的辅助功能中再次给 Mos 授权
如果已授权,请取消勾选并重新勾选一次
```
## 修正
亮色模式下的部分样式的问题
部分在例外应用程序列表中的应用程序无法被正确检测到的问题
- 一般情况下, Mos 会检测指针所在位置的应用程序是否在例外应用列表中, 不管该窗口是否被激活或前置显示. 但部分应用程序无法通过该方式被识别, 如 Adobe Acrobat DC 等. 对于该类应用程序, 只有在其被激活或前置显示时, 才能被识别为例外应用程序.
- https://github.com/Caldis/Mos/issues/100, https://github.com/Caldis/Mos/issues/107
---
```
Limited by macOS 10.14, you need to allow Mos to access to Accessibility control.
After update Mos, you need to go to the System Preferences to allow Mos access Accessibility again.
If the entry has been checked, uncheck it and tick again.
```
## Fixed
Fixed some style problem in brightness mode
Fixed an issue will cause the applications in the exceptions application list are not correctly detected.
- In general, Mos will detect if the application at the location of the cursor is in the exception application list, regardless of whether the window is activated. However, some applications cannot be identified in this way, such as Adobe Acrobat DC, etc. This type of application can only be recognized as an exception application when it is activated.
- https://github.com/Caldis/Mos/issues/100, https://github.com/Caldis/Mos/issues/107
# [2.3.0](https://github.com/Caldis/Mos/releases/tag/2.3.0)

```
由于 macOS 10.14 的限制, Mos 只有在获取到了辅助功能的访问权限后才可正常使用
更新版本后,你需要重新在设置的辅助功能中再次给 Mos 授权
如果已授权,请取消勾选并重新勾选一次
```
## 新功能
现已支持 MacOS 10.14 的 Dark Mode
现在, 首次启动 Mos 时将会有一个引导界面提供相关的使用指引, 并指导你开启辅助功能权限
## 优化
於偏好设置的关于页内增加了贡献者名单
翻转/禁用键现在将不会对新用户默认启用
## 修正
修正长时间使用的内存泄漏问题 https://github.com/Caldis/Mos/issues/85
---
```
Limited by macOS 10.14, you need to allow Mos to access to Accessibility control.
After update Mos, you need to go to the System Preferences to allow Mos access Accessibility again.
If the entry has been checked, uncheck it and tick again.
```
## New Feature
Support Dark Mode in macOS 10.14
Will show a Welcome Window when Mos first launch or just updated.
## Enhancement
Add contributors list in Preferences - About
The Toggle/Block Key is changed to disabled for new users
## Fixed
Fixed an issue will cause the memory leak when scrolling. https://github.com/Caldis/Mos/issues/85
# [2.2.6](https://github.com/Caldis/Mos/releases/tag/2.2.6)
```
更新版本后,你需要重新在设置的辅助功能中再次给 Mos 授权
如果已授权,请取消勾选并重新勾选一次, 否则例外应用检测功能将会失效
```
## 优化
优化了窗口检测机制,降低 CPU 占用,同时减少了平滑滚动失效的概率
优化了英文的界面文本,非常感谢 🎉 @godly-devotion 👏
你现在可以直接在偏好设置面板中直接输入数值来调整参数
- https://github.com/Caldis/Mos/issues/76
打开偏好设置面板或监控面板时将于 Dock 显示应用图标
- https://github.com/Caldis/Mos/issues/76
---
```
After update Mos, you need to go to the System Preferences to allow Mos access Accessibility again.
If the entry has been checked, uncheck it and tick again, otherwise the Exceptional setting will not apply.
```
## Enhancement
Improved the application detection mechanism, reduced CPU usage.
Improved English translation, thanks for contribution of 🎉 @godly-devotion 👏.
You can now directly enter values in the Preferences to adjust parameters.
- https://github.com/Caldis/Mos/issues/76
Shows the app icon on the Dock when opening the Preferences and Scroll Monitor
- https://github.com/Caldis/Mos/issues/76
# [2.2.2](https://github.com/Caldis/Mos/releases/tag/2.2.2)

- via [Playstation Blog](https://blog.us.playstation.com/2018/05/09/photo-mode-comes-to-god-of-war-today)
---
### 更新版本后, 你需要重新在设置的辅助功能中给 Mos 授权, 否则例外应用将会失效
## 修正
修复了在某些情况下可能导致平滑滚动失效的问题
- https://github.com/Caldis/Mos/issues/63
- https://github.com/Caldis/Mos/issues/69
修复了水平滚动无效的问题
- https://github.com/Caldis/Mos/issues/67
---
### After you update Mos, you need to go to the System Preferences to allow Mos access Accessibility again., otherwise the Exceptional Application's setting will not apply
## Fixed
Fixed an issue will cause smooth scrolling core crash in some situation.
- https://github.com/Caldis/Mos/issues/63
- https://github.com/Caldis/Mos/issues/69
Fixed an issue will cause horizon scrolling unprocessed.
- https://github.com/Caldis/Mos/issues/67
# [2.2.0](https://github.com/Caldis/Mos/releases/tag/2.2.0)
真帅

## 新功能
你现在可以为 "变换方向", "禁用平滑" 分别设定一个热键, 当按下热键时, 相应的操作将会被触发
你可以在高级设置界面找到这个选项
- https://github.com/Caldis/Mos/issues/33
- https://github.com/Caldis/Mos/issues/15
滚动监控界面现在可以同时呈现水平与垂直方向的数据
滚动监控界面增加了图表的重置按钮, 点击即可清空图表数据
## 优化
更新了 Chart 库的版本
优化了开始滚动时的加速效果
优化了繁体中文的部分翻译文本
优化了滚动监控界面的样式与执行效率
优化了例外应用的侦测逻辑
- 我们重写了侦测例外程序的逻辑, 目前基于指针坐标侦测对应坐标的窗口信息. 因此现在, 无需目标窗口处于激活状态也可正常侦测到对应的例外程序了.
但是相应地, 由于侦测过程中使用到了更高级的系统 API [(AXUIElement)](https://developer.apple.com/documentation/applicationservices/axuielement.h). 因此, 你需要先授权 Mos 访问辅助功能的权限, 例外程序才能被启用. 当你进入设置界面的 "例外" 选项卡时, 你会看到相应的提示与引导帮助.
## 修正
修复了启动台中平滑滚动影响翻页的问题
修复了取消勾选界面上的 "开机启动" 时无法正确从用户登录项中移除的问题
- 使用了 https://github.com/Clipy/LoginServiceKit
---
## New Feature
You can now set a hotkey for "change direction" and "disable smoothing" respectively. When the hotkey is pressed, the corresponding operation will be triggered.
You can find this option in the advanced settings interface
- https://github.com/Caldis/Mos/issues/33
- https://github.com/Caldis/Mos/issues/15
The scrolling monitoring interface can now present horizontal and vertical data simultaneously
The scroll monitoring interface adds a reset button to the chart. Click to clear the chart data
## Enhance
Updated the version of the Chart library
Optimized the acceleration effect when starting scrolling
Partially translated text in Traditional Chinese is optimized
Optimize the style and execution efficiency of the scroll monitor interface
Optimized exception detection logic
- We have rewritten the logic to detect exceptions, currently based on the pointer coordinates to detect the corresponding window information. So now, the corresponding exception program can be normally detected without the target window active.
However, due to the use of the more advanced system API [(AXUIElement)](https://developer.apple.com/documentation/applicationservices/axuielement.h) in the detection process, you need to authorize Mos to access the Accessibility first. The permission of the function, the exception procedure can be enabled. When you enter the "Exceptions" tab of the settings screen, you will see the corresponding prompt and guide help.
## Fixed
Fixed issue with starting smooth scrolling in Taiwan
Fixed an issue that could not be properly removed from user login items when unchecking "Startup" on the interface
- Power by https://github.com/Clipy/LoginServiceKit
# [2.0.0](https://github.com/Caldis/Mos/releases/tag/2.0.0)
各位猎人们, 2.0 版本来啦 !
重构了所有代码, 大量的优化, 运行起来更高效.
我们还重写了主页, 欢迎造访: http://mos.caldis.me
不过, 如果不是它的话, 这次 Release 或许会来的更早一点, 一点点啦
> Monster Hunter : World


## 优化
重写了平滑滚动的插值算法, 一般情况下 CPU 占用下降较原先约 40-50%, 不过, 手感也会有所不同
- https://github.com/Caldis/Mos/issues/44
优化了内存占用, 较原先下降约 70-80%
状态栏菜单增加了图标示意, 语义更加明确了
## 新功能
现在你可以隐藏状态栏的图标了, 只需要按住 option 键, 再单击状态栏图标, 根据提示操作即可. 如果您需要重新显示状态栏的图标, 请使用活动监视器关闭 Mos, 再重新运行, 并点击通知中出现的 "显示图标" 按钮
- https://github.com/Caldis/Mos/issues/3
新增繁體中文支持, 如果您為港台地區用戶, 若發現任何語義問題, 我們非常歡迎您的反饋
## 修正
部分情况下的内存泄露
---
## Enhance
Rewrite the smooth scrolling interpolation algorithm. Under normal circumstances, the CPU usage is about 40-50% lower than the original. However, the feel will be little different.
Optimized memory footprint, about 70-80% lower than the original.
The status bar menu adds icons to clarify the semantics.
## New Feature
Now you can hide the icon of the status bar, just hold down the option key, click on the status bar icon, and follow the prompts. If you need to re-display the icon in the status bar, use the activity monitor to turn off Mos, and then Run, and click the "Show Icon" button that appears in the notification.
## Fixed
Memory leak in some cases.
# [1.7.0](https://github.com/Caldis/Mos/releases/tag/1.7.0)
## 新功能
现在支持鼠标横向滚动的平滑效果
## 修正
MacOS 10.13 下的偏好设置窗口错位问题
- https://github.com/Caldis/Mos/issues/35
切换系统用户时滚动失效的问题
- https://github.com/Caldis/Mos/issues/31
## 优化
更新了 Charts 的版本
---
## New Feature
Support handling the horizon scrolling smooth.
## Fixed
Fixed preferences window size problem in MacOS 10.13.
Fixed problem that cause system can't handling scrolling correctly when user session switched.
## Enhance
Upgrade Charts.
# [1.6.1](https://github.com/Caldis/Mos/releases/tag/1.6.1)
想起了当年玩PSP的日子
> DJMAX: Respect

## 修正
在某些应用窗口中 Mos 会异常崩溃的问题
- 由于某些应用窗口是以子进程方式执行(如 Android Studio 的模拟器窗口, 感谢 @CasparGX 的反馈) 而子进程本身并不拥有 BundleID, 其 BundleID 是依赖其父进程的 , 导致无法在忽略列表中找到对应的排除项而导致应用异常退出
## Fixed
Fixed a problem that could cause Mos to crash.
- When the target application was running in a child process state.
# [1.6.0](https://github.com/Caldis/Mos/releases/tag/1.6.0)
隔了几个月看回之前写的代码, 真的是一泡污... ... 得找个时间重写一次
> 塞尔达传说:荒野之息
> The Legend of Zelda:Breath of the Wild

> https://dribbble.com/shots/3488659-Hero-of-the-Wild
## 新功能
忽略的面板改成了 "例外", 且新增了白名单模式
- 白名单模式在启用之后 Mos 就仅针对列表内的应用有效, 然后你可以基于此再来调整是不是要禁用 Mos 的平滑或者翻转滚动效果
高级设置内加了个峰值位置调整, 你可以用它来调整加速曲线什么时候该加速什么时候该减速
- 如果你想滚动启动时反应更灵敏, 停止时更为缓慢, 就往小了调
- 如果你想滚动在启动开始时更为平缓, 停止时更迅速, 就往大了整
## 修正
开机启动勾选框的状态无法保存的问题
## 优化
现在在Launchpad中会始终禁用平滑滚动
稍微改进了下写的很烂的判断逻辑
提高了可以最大滚动的峰值
---
## New Feature
Add allow list mode in Ignore panel.
Add Peak setting in Advance panel.
## Fixed
Fix the issue of checkbox's state can't be save currently which in General panel of Launch on login.
## Enhance
The smooth scrolling will always disabled on launchpad.
Increase the maximum value of the Speed Setting and Time Setting on advance panel.
# [1.5.0](https://github.com/Caldis/Mos/releases/tag/1.5.0)
久违的双休...

## 新功能
您现在可以在设置面板中直接将Mos设为开机启动
## 修正
修正了滚动监控界面的布局样式问题
修正了Launchpad添加到忽略列表后无效的问题
修正了忽略列表中的应用程序在特定情况下忽略翻转滚动失效的问题
---
## New Feature
Now you can directly add Mos to login item from preferences panel.
## Fixed
Fix a layout issue on Scroll Monitor
Fix a issue that will cause Launchpad.app could not be handled properly in ignore list.
Fix a issue that scroll reverse option in ignore list could not be handled properly.
# [1.4.4](https://github.com/Caldis/Mos/releases/tag/1.4.2)
## 修正
修正了在 MacOS El Capitan (10.11) 下无法正常使用的问题 (仅在10.11.6下测试)
---
## Fixed
Fixed a problem will cause the Mos could not be handled properly while using MacOS El Capitan (Test on 10.11.6).
# [1.4.2](https://github.com/Caldis/Mos/releases/tag/1.4.2)
## 修正
(或许) 修正了部分鼠标在缓慢滚动时无法正确处理的问题
---
## Fixed
(Maybe) Fixed a problem where some of the mouse wheel could not be handled properly while scrolling slowly.
# [1.4.0](https://github.com/Caldis/Mos/releases/tag/1.4.0)
现已采用DMG打包方式
## 新功能
鼠标滚动事件的Log功能, 用户可以通过在滚动监视器内的记录功能来记录自己的问题滚动数据, 便于反馈修正问题
## 修正
部分英文翻译语法错误
---
Now using DMG file to package the application.
## New Feature
Scroll Event Recorder, user now can record the scroll event and feedback to us.
## Fixed
Some translation mistake.
# [1.3.1](https://github.com/Caldis/Mos/releases/tag/1.3.1)
## 修正
部分英文翻译语法错误, 感谢 @OrcaXS 对英文国际化的支持
忽略应用列表中的应用名称乱码问题
---
## Fixed
Some translation mistake, special thanks to @OrcaXS support for English localization.
Ignore list characters garbled.
# [1.3.0](https://github.com/Caldis/Mos/releases/tag/1.3.0)
## 新功能
应用程序忽略列表功能, 可以在设置-忽略中将特定的程序禁用平滑滚动/反转滚动
## 修正
平滑滚动的部分判断逻辑
---
## New Feature
Added new feature "Application Ignored List", you can disable the smooth/reverse scroll in specific application.
## Fixed
SmoothScroll performance improved.
# [1.0.0](https://github.com/Caldis/Mos/releases/tag/1.0.0)
第一版发布 !
---
First version released !
================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## IMPORTANT
This Project's macoOS Deployment Target 10.13+, so every API should be compatible with it.
## Project Overview
Mos is a macOS utility application that provides smooth scrolling for mouse wheels, making them behave more like trackpads. Built with Swift and Xcode, it's a menu bar application that intercepts and modifies scroll events in real-time.
## Build System & Development Commands
### Building the Application
- **Primary IDE**: Xcode (requires Xcode 9.0+, Swift 4.0+)
- **Project File**: `Mos.xcodeproj`
- **Build Target**: macOS application bundle
### Dependencies
- **Charts**: Data visualization for the monitor window
- **LoginServiceKit**: Auto-launch functionality
- Dependencies are managed via Swift Package Manager (SPM)
### Creating Distribution Package
```bash
cd dmg/
# Requires create-dmg tool: https://github.com/create-dmg/create-dmg
# Requires Mos.app in dmg/ directory (copy from build output)
./create-dmg.command
```
The script automatically:
- Reads version from Info.plist
- Creates DMG with custom background and icon
- Generates versioned DMG filename (Mos.X.X.X.dmg)
- Includes application and Applications folder link
### Running and Development
**First-time setup:**
```bash
# 1. Open the project
open Mos.xcodeproj
# 2. Xcode will automatically resolve SPM dependencies (Charts, LoginServiceKit)
# 3. Wait for package resolution to complete (shown in top status bar)
# 4. Build and run (⌘+R)
```
**Runtime requirements:**
- App requires Accessibility permissions to intercept events
- On first launch, grant permissions in System Preferences → Security & Privacy → Accessibility
- Use the Monitor window during development to visualize scroll events in real-time
## Architecture Overview
Minimum macOS version: 10.13, all API should be compatible with it
### Core Components
**ScrollCore Engine** (`Mos/ScrollCore/`):
- **ScrollCore.swift**: Main scrolling interception and processing engine
- **ScrollPoster.swift**: Smooth scroll event posting using CVDisplayLink
- **Interpolator.swift**: Smooth scrolling interpolation algorithms
- **ScrollEvent.swift**: Event data structures
- **ScrollFilter.swift**: Event filtering and processing logic
**ButtonCore System** (`Mos/ButtonCore/`):
- **ButtonCore.swift**: Core mouse button event interception and processing
- **ButtonFilter.swift**: Event filtering logic for button actions
- **ButtonUtils.swift**: Button binding configuration utilities
- **ShortcutExecutor.swift**: System shortcut execution engine
**Key Recording System** (`Mos/Keys/`):
- **KeyRecorder.swift**: Event recording orchestrator with timeout protection
- **KeyPopover.swift**: Popover UI component for displaying recording status
- **KeyPreview.swift**: Visual preview of recorded key combinations
- **KeyCode.swift**: Comprehensive keyboard and mouse button code mappings
- **SystemShortcut.swift**: System shortcut definitions and management
**Manager Pattern** (`Mos/Managers/`):
- **WindowManager**: Controls window lifecycle and presentation
- **StatusItemManager**: Menu bar status item and menu management
- **ShortcutManager**: Global shortcut registration and management
**Configuration System** (`Mos/Options/`):
- **Options.swift**: Centralized configuration using UserDefaults
- **Application.swift**: Per-application settings and exception handling
### Window Architecture
The app uses multiple specialized windows:
**IntroductionWindow**: First-time setup and permission requests
**PreferencesWindow**: Complex tabbed preferences with multiple view controllers:
- GeneralView: Basic scrolling settings
- ScrollingView: Advanced scrolling configuration options
- ButtonsView: Mouse button recording and action binding
- ApplicationView: Per-application exception rules
- AboutView: Application information and credits
- UpdateView: Update checking and management
**MonitorWindow**: Real-time scroll event visualization using Charts framework
**WelcomeWindow**: User onboarding experience
Each window follows the WindowController + ViewController pattern.
### Key Technical Details
**Event Interception**: Uses `Interceptor` utility (wraps CGEventTap) for low-level event capture
- ScrollCore: Captures scroll wheel events (scrollWheel)
- ButtonCore: Captures mouse button events (leftMouseDown, rightMouseDown, otherMouseDown) and key events
**Smooth Scrolling**: CVDisplayLink-based event posting for 60fps smoothness via ScrollPoster
**Event Recording**: `KeyRecorder` orchestrates event capture with timeout protection and visual feedback
**Permissions**: Requires accessibility permissions (LSUIElement=true for menu bar app)
**Localization**: Supports 11 languages + English with dual .xcstrings system
**Per-App Settings**: `Application` class enables different scroll behaviors per application
**Singleton Pattern**: Core systems (ScrollCore, ButtonCore, Options, managers) use singleton pattern
## File Structure Patterns
**Managers**: Singleton pattern for system integration (WindowManager, StatusItemManager, ShortcutManager)
**Windows**: WindowController + ViewController pairs, each in separate subdirectories
**ScrollCore**: Core scrolling logic and algorithms (ScrollCore, ScrollPoster, Interpolator, ScrollFilter)
**ButtonCore**: Mouse button event handling and shortcut execution
**Keys**: Key/mouse event recording system (KeyRecorder, KeyPopover, KeyPreview, KeyCode, SystemShortcut)
**Utils**: Utility classes (Interceptor for CGEventTap, EventMonitor, Logger, Constants)
**Extension**: Swift extensions for CGEvent and other system types
**Options**: Configuration management (Options, Application)
**Components**: Reusable UI components (PrimaryButton)
## Development Guidelines
### Adding New Features
1. Follow the manager pattern for system integration
2. Use WindowController + ViewController for new windows
3. Add configuration options to `Options.swift`
4. Consider per-app exceptions via `Application` class
5. For button-related features, extend `ButtonCore` system and use `KeyRecorder` for event capture
6. UI components should support both Light and Dark mode with dynamic color adaptation
7. Use `Interceptor` utility (in Utils/) to wrap CGEventTap for event interception
8. Follow localization patterns - all strings must be localizable
### Modifying Scroll Behavior
- Core logic is in `ScrollCore/ScrollCore.swift`
- Interpolation algorithms in `ScrollCore/Interpolator.swift`
- Event filtering in `ScrollCore/ScrollFilter.swift`
### UI Changes
- Storyboard files are localized - modify Base.lproj first
- Follow existing popover patterns for menu bar UI
- Monitor window uses Charts framework for visualization
### Testing
- Test with various mouse types and scroll behaviors
- Verify accessibility permissions are properly requested
- Test per-application exception system
- Use Monitor window to verify scroll event processing
### Common Development Issues
**Build fails with SPM errors:**
```bash
# Clear SPM cache and DerivedData
rm -rf ~/Library/Developer/Xcode/DerivedData
# Re-resolve packages in Xcode: File → Packages → Reset Package Caches
```
**Scrolling not working at runtime:**
- Check Accessibility permissions in System Preferences → Security & Privacy → Accessibility
- Verify `ScrollCore.shared.start()` is called after permissions granted
- Use Monitor window to verify events are being captured
**Button bindings not triggering:**
- Open Monitor window to see if events are being captured
- Check `ButtonCore.shared.start()` is called
- Verify key codes in `KeyCode.swift` match expected values
**UI not updating after preference changes:**
- Options are stored in UserDefaults - verify `Options.shared` singleton is being used
- Check if NotificationCenter observers are properly registered
- Preferences window uses bindings - verify `@objc dynamic` on properties
## Localization
The app supports 12 languages using Xcode's String Catalog system (.xcstrings).
**Two separate localization files:**
- `Mos/Localizable.xcstrings` - Code strings via `NSLocalizedString()`
- `Mos/mul.lproj/Main.xcstrings` - Auto-generated from Storyboard (never merge these)
**Key requirements:**
- Use `NSLocalizedString()` (not `String(localized:)`) for macOS 10.13 compatibility
- Follow macOS official terminology (e.g., "偏好设置" not "设置")
- Preserve modifier key symbols: ⌘⌥⌃⇧
- Never translate: "Mos", person names, brand names
**For detailed translation guidelines, see `LOCALIZATION.md`**
## Important Considerations
**Accessibility**: App requires accessibility permissions to intercept events
**System Integration**: Menu bar app behavior, auto-launch functionality
**Performance**: Real-time event processing at system level
**Localization**: All UI strings must be localized following the guidelines above
**Distribution**: Cannot be uploaded to App Store per license restrictions
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at 532607446@qq.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
================================================
FILE: CONTRIBUTING.md
================================================
# How to contribute
Bug-fixes and features often come from users of the Mos, and improving it greatly. We want to keep it as easy as possible to contribute changes that improve the experience for users all around the world. There are a few guidelines that we
need contributors to follow so that we can have a chance of keeping on
top of things.
## Simple issues and bug reports
If you are reporting a bug which can be observed visually, please add to your issue either:
* Screenshots, if the bug is easily explainable
* A working sample project that we can compile, run, and immediately observe the issue
## Getting Started with Contributions
* Make sure you have a [GitHub account](https://github.com/signup/free)
* Submit a ticket for your issue, assuming one does not already exist.
* Clearly describe the issue including steps to reproduce when it is a bug.
* Make sure you fill in the earliest version (or commit number) that you know has the issue.
* Fork the repository on GitHub
## Making Changes
* Create a topic branch from where you want to base your work. This is usually the master branch.
* Make commits of logical units.
* Make sure your code conforms to the code style around it. It's easy, just look around!
* If you have made changes back and forth, or have made merges, your commit history might look messy and hard to understand. A single issue or change should still be in one commit. So please squash those commits together and rebase them however you need to - to make our lives easier when reading it later.
* Check for unnecessary whitespace with `git diff --check` before committing.
* Make sure your commit messages are in the proper format.
````
First line must be up to 50 chars (Fixes #1234)
The first line should be a short statement as to what have changed, and should also include an issue number, prefixed with a hash.
The body of the message comes after an empty new line, and describes the changes
more thoroughly, especially if there was a special case handled there,
or maybe some trickery that only code wizards can understand.
````
* Make sure you have tested your changes well.
* If your changes could theoretically affect some other component or case, which you do not necessarily use, you still have to test it.
* Create a Pull Request from your topic branch to the relevant branch in the main repo. If you go to the main repo of the framework, you'll see a big green button which pretty much prepares the PR for you. You just have to hit it.
## Making Trivial Changes
For changes of a trivial nature to comments and documentation, it is not
always necessary to create a new ticket. In this case, it is
appropriate to start the first line of a commit with '(doc)' instead of
a ticket number. Even the default commit message the GitHub generates is fine with us.
================================================
FILE: ISSUE_TEMPLATE.md
================================================
> 提供尽可能完整的内容可以让我们更快速地定位问题
- 问题描述 | Issue description:
- 如何重现 | How to reproduce it:
- 期望结果 | What is expected:
- 实际结果 | What is actually happening:
- 软件版本 | Application version:
- 系统版本 | System version:
- 您系统中的其他鼠标管理软件 | Other mouse management application in your system:
================================================
FILE: LICENSE
================================================
Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)
This is a human-readable summary of (and not a substitute for) the license. Disclaimer.
You are free to:
Share — copy and redistribute the material in any medium or format
Adapt — remix, transform, and build upon the material
The licensor cannot revoke these freedoms as long as you follow the license terms.
Under the following terms:
Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
NonCommercial — You may not use the material for commercial purposes.
No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
Notices:
You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable exception or limitation.
No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as publicity, privacy, or moral rights may limit how you use the material.
================================================
FILE: LOCALIZATION.md
================================================
# Localization Guide for Mos
This guide describes how Mos 4.0 handles localisation, how to extend it, and how to keep every language in sync with new features such as the Buttons panel and shortcut catalog.
---
## 1. String Catalog Layout
Mos ships Xcode’s string catalogs instead of legacy `.strings` files. There are **two catalogs** and they must remain separate:
| File | Scope | Notes |
|------|-------|-------|
| `Mos/Localizable.xcstrings` | Strings referenced from Swift (`NSLocalizedString`) | Keys are either human-readable phrases (`"Auth"`, `"Current Version"`) **or** camelCase identifiers that mirror code constants (e.g. `appExpose`, `categoryFunctionKeys`, shortcut identifiers in `SystemShortcut.Shortcut`). Do not rename identifiers—Swift enums and persistence depend on them. |
| `Mos/mul.lproj/Main.xcstrings` | Interface Builder (storyboards / XIBs) | Keys are Interface Builder Object IDs (`2AK-Pu-mot.title`). Xcode regenerates them on build. Never hand-edit Object IDs. |
`mul.lproj` is the canonical bundle for storyboard strings because we support many locales. Xcode fans out per-language nibs at build time, so do **not** split `Main.xcstrings` into multiple folders manually.
The project still targets macOS 10.13, so always use `NSLocalizedString(_:comment:)` in Swift rather than `String(localized:)`.
---
## 2. Current Language Coverage
Both catalogs expose the same set of locales (plus the English source column):
`de`, `el`, `ja`, `ko`, `ru`, `tr`, `uk`, `zh-Hans`, `zh-Hant`, `zh-Hant-HK`, `zh-Hant-TW`
To verify coverage and catch untranslated rows:
```bash
python3 - <<'PY'
import json, pathlib
catalog = json.loads(pathlib.Path("Mos/Localizable.xcstrings").read_text())
dupes = [(k, lang) for k, row in catalog["strings"].items()
for lang, unit in row["localizations"].items()
if lang != "en" and unit["stringUnit"]["value"] == row["localizations"]["en"]["stringUnit"]["value"]]
print(f"{len(dupes)} duplicate values (same as English). Sample:", dupes[:10])
PY
```
Run the same script against `Mos/mul.lproj/Main.xcstrings` if you suspect orphaned storyboard strings. A “duplicate” is acceptable when the official term matches English (e.g. “Launchpad”), but treat the report as a to-do list for translators.
The 4.0 release added ~40 strings across the Buttons panel, shortcut catalog, onboarding, and the refreshed Preferences UI. Make sure every locale is updated before tagging a new build.
---
## 3. Terminology Rules
### macOS Official Terms
Use the terminology Apple ships in System Preferences / System Settings. Never swap in colloquial variants.
| English | 简体中文 | 繁體中文 | 日本語 | Notes |
|---------|---------|---------|--------|-------|
| Preferences | 偏好设置 | 偏好設定 | 環境設定 | NOT “设置” or “Settings” |
| Accessibility | 辅助功能 | 輔助使用 | アクセシビリティ | System feature name |
| Mission Control | 任务控制 | Mission Control | ミッションコントロール | Use Apple’s official translation even if it matches English |
| Trackpad | 触控板 | 觸控式軌跡板 | トラックパッド | Hardware name |
### Modifier Keys
Keep modifier symbols intact and append translated names only if the locale expects it:
```
✓ "⌘ Command" "⌥ Option" "⌃ Control" "⇧ Shift"
✗ "Command" "Option键" "Ctrl"
```
### Proper Nouns
- App name “Mos”, brand names (GitHub, macOS) and contributor credits remain unchanged.
- System features (Mission Control, Spotlight) use Apple’s official localisation.
### Numbers & Symbols
- Leave numbers, mathematical operators, and special characters untouched.
- Pay attention to locale-specific punctuation (e.g. Japanese full-width brackets) only when Apple’s UI uses them.
---
## 4. Adding Strings
### 4.1 Code (`Localizable.xcstrings`)
```swift
// Step 1 – Add the string in code
button.title = NSLocalizedString("Auth", comment: "Authorization button title")
// Step 2 – Build once (⌘B) so Xcode refreshes the catalog
// Step 3 – Open Localizable.xcstrings and fill every locale column
// Step 4 – Keep the key identical; do not rename identifiers already used in code
```
**Shortcut catalog:** When adding a new `SystemShortcut.Shortcut`, make sure its `identifier` property becomes a key in `Localizable.xcstrings`. The Buttons panel and popup menus rely on `NSLocalizedString(identifier, …)` to show the translated shortcut name.
### 4.2 Storyboards (`Main.xcstrings`)
1. Modify the base storyboard/XIB under `Base.lproj`.
2. Build (⌘B); Xcode extracts new Object IDs into `mul.lproj/Main.xcstrings`.
3. Translate the generated rows in Xcode’s catalog editor.
4. Do **not** change Object IDs. If you delete a UI element, search for its Object ID and remove the stale entry manually.
---
## 5. Maintenance Checklist
- [ ] macOS terms match Apple’s official localisation.
- [ ] Modifier symbols (⌘⌥⌃⇧) are preserved in every language.
- [ ] Keys in `Localizable.xcstrings` match the Swift constants (`SystemShortcut` identifiers, category names, etc.).
- [ ] No empty strings or placeholder text in any locale column.
- [ ] Duplicate values (translation == English) are intentional and documented with translators.
- [ ] Chinese variants respect locale: 简体 (`zh-Hans`), 台湾 (`zh-Hant-TW`), 香港 (`zh-Hant-HK`).
- [ ] Japanese strings use polite です/ます form unless Apple’s UI uses dictionary form.
- [ ] Buttons panel recorder, Application tab, Welcome flow, and Monitor window were sanity-checked in the new/edited locale.
---
## 6. Adding a New Language
1. In Xcode, Project ▸ Info ▸ Localizations → add the language.
2. Ensure Xcode offers to localise both catalogs; tick every checkbox.
3. Translate *all* keys in `Localizable.xcstrings` and `Main.xcstrings`.
4. Update external documentation (README variants, website) if the language is publicly visible.
5. Switch macOS to the new language (System Preferences ▸ Language & Region) and run through:
- Welcome / Introduction windows
- Preferences tabs (General, Scrolling, Application, Buttons, Updates, About)
- Buttons recorder, shortcut pop-ups, simulated trackpad switches
6. Capture screenshots or notes for strings that require layout tweaks (long text, truncation).
---
## 7. Handy QA Commands
```bash
# Pretty-print a catalog for manual diffing
jq '.' Mos/Localizable.xcstrings | less
# List storyboard keys that no longer exist in Base.lproj
python3 Scripts/find_orphan_storyboard_keys.py # create alongside other scripts if needed
# Export catalogs for external translators (creates XLIFF)
xcodebuild -exportLocalizations -project Mos.xcodeproj -localizationPath DerivedData/Localizations
# Reimport translated XLIFF back into the project
xcodebuild -importLocalizations -project Mos.xcodeproj -localizationPath DerivedData/Localizations
```
---
## 8. Module Reference
- **Shortcuts:** `Shortcut/SystemShortcut.swift` defines identifiers used in menus and the Buttons panel.
- **Buttons panel:** Strings originate from `Windows/PreferencesWindow/ButtonsView/`, especially `ButtonTableCellView.swift` and `PreferencesButtonsViewController.swift`.
- **Welcome & Introduction:** See `Windows/WelcomeWindow` and `Windows/IntroductionWindow` for onboarding copy.
- **Monitor window:** Mixing scroll/button logs relies on keys such as `buttonsLog`, `eventMonitor`, etc. in `Localizable.xcstrings`.
When new modules land (e.g. gesture editor, theme manager), append them here so translators know where to look.
---
Keeping localisation healthy is part of every feature cycle. Touch the catalog as soon as you add UI copy, run the duplicate check before merging, and leave notes for community translators whenever the wording carries product context. That habit keeps all 12 languages launch-ready the moment we ship a new build.
================================================
FILE: Mos/AppDelegate.swift
================================================
//
// AppDelegate.swift
// Mos
//
// Created by Caldis on 2017/1/10.
// Copyright © 2017年 Caldis. All rights reserved.
//
import Cocoa
@main
class AppDelegate: NSObject, NSApplicationDelegate {
// 运行前预处理
func applicationWillFinishLaunching(_ notification: Notification) {
// 禁止重复运行, 结束正在运行的实例
Utils.preventMultiRunning(killExist: true)
// DEBUG: 清空用户设置
// UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
// 读取用户设置
Options.shared.readOptions()
// DEBUG: 直接弹出设置窗口
#if DEBUG
WindowManager.shared.showWindow(withIdentifier: WINDOW_IDENTIFIER.preferencesWindowController)
#endif
// 监听用户切换, 在切换用户 session 时停止运行
NSWorkspace.shared.notificationCenter.addObserver(
self,
selector: #selector(AppDelegate.sessionDidActive),
name: NSWorkspace.sessionDidBecomeActiveNotification,
object: nil
)
NSWorkspace.shared.notificationCenter.addObserver(
self,
selector: #selector(AppDelegate.sessionDidResign),
name: NSWorkspace.sessionDidResignActiveNotification,
object: nil
)
// 监听系统休眠/唤醒, 复用 session 生命周期方法
NSWorkspace.shared.notificationCenter.addObserver(
self,
selector: #selector(AppDelegate.sessionDidResign),
name: NSWorkspace.willSleepNotification,
object: nil
)
NSWorkspace.shared.notificationCenter.addObserver(
self,
selector: #selector(AppDelegate.sessionDidActive),
name: NSWorkspace.didWakeNotification,
object: nil
)
}
// 运行后启动滚动处理
func applicationDidFinishLaunching(_ aNotification: Notification) {
startWithAccessibilityPermissionsChecker(nil)
UpdateManager.shared.scheduleCheckOnAppStartIfNeeded()
}
// 用户双击打开应用程序
func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
guard !flag else {
return true
}
if Utils.isHadAccessibilityPermissions() {
WindowManager.shared.showWindow(withIdentifier: WINDOW_IDENTIFIER.preferencesWindowController)
}
return false
}
// 关闭前停止滚动处理
func applicationWillTerminate(_ aNotification: Notification) {
LogitechHIDManager.shared.stop()
ScrollCore.shared.disable()
ButtonCore.shared.disable()
}
// 检查是否有访问 accessibility 权限, 如果有则启动滚动处理, 并结束计时器
// 10.14(Mojave) 后, 若无该权限会直接在创建 eventTap 时报错 (https://developer.apple.com/videos/play/wwdc2018/702/)
@objc func startWithAccessibilityPermissionsChecker(_ timer: Timer?) {
if let validTimer = timer {
// 开启辅助权限后, 关闭定时器, 开始处理
if Utils.isHadAccessibilityPermissions() {
validTimer.invalidate()
NSLog("First Initialization (Accessibility Authorization Needed)")
ScrollCore.shared.enable()
ButtonCore.shared.enable()
LogitechHIDManager.shared.start()
}
} else {
if Utils.isHadAccessibilityPermissions() {
NSLog("Regular Initialization")
ScrollCore.shared.enable()
ButtonCore.shared.enable()
LogitechHIDManager.shared.start()
} else {
// 如果应用不在辅助权限列表内, 则弹出欢迎窗口
WindowManager.shared.showWindow(withIdentifier: WINDOW_IDENTIFIER.introductionWindowController, withTitle: "")
// 启动定时器检测权限, 当拥有授权时启动滚动处理
Timer.scheduledTimer(
timeInterval: 2.0,
target: self,
selector: #selector(startWithAccessibilityPermissionsChecker(_:)),
userInfo: nil,
repeats: true
)
}
}
}
// 在切换用户时停止滚动处理
@objc func sessionDidActive(notification: NSNotification){
ScrollCore.shared.enable()
ButtonCore.shared.enable()
LogitechHIDManager.shared.start()
}
@objc func sessionDidResign(notification: NSNotification){
LogitechHIDManager.shared.stop()
ScrollCore.shared.disable()
ButtonCore.shared.disable()
}
}
================================================
FILE: Mos/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"filename" : "Base-16.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"filename" : "Base-32.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"filename" : "Base-32 1.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"filename" : "Base-64.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"filename" : "Base-128.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"filename" : "Base-256.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"filename" : "Base-256 1.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"filename" : "Base-512.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"filename" : "Base-512 1.png",
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"filename" : "Base-1024.png",
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/AppStatusBarIcon.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal"
},
{
"filename" : "MenubarIcon-16 1.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "MenubarIcon-32 1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "MenubarIcon-64.png",
"idiom" : "universal",
"scale" : "3x"
},
{
"idiom" : "mac"
},
{
"filename" : "MenubarIcon-16.png",
"idiom" : "mac",
"scale" : "1x"
},
{
"filename" : "MenubarIcon-32.png",
"idiom" : "mac",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/Donate/AlipayLogo.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "AliPayForLight.png"
},
{
"idiom" : "universal",
"filename" : "AliPayForDark.png",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
]
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Mos/Assets.xcassets/Donate/AlipayQR.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "AliPayQRForLight.png"
},
{
"idiom" : "universal",
"filename" : "AliPayQRForDark.png",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
]
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Mos/Assets.xcassets/Donate/BuyMeACoffee.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "bmc-brand-logo.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/Donate/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/Donate/MEOW.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "IMG_0412.jpeg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/Donate/PaypalLogo.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "PayPalForLight.png"
},
{
"idiom" : "universal",
"filename" : "PayPalForDark.pdf",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
]
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Mos/Assets.xcassets/Donate/WechatpayLogo.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "WeChatPayForLight.png"
},
{
"idiom" : "universal",
"filename" : "WeChatPayForDark.png",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
]
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Mos/Assets.xcassets/Donate/WechatpayQR.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "WeChatPayQRForLight.png"
},
{
"idiom" : "universal",
"filename" : "WeChatPayQRForDark.png",
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
]
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Mos/Assets.xcassets/Guidance/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/Guidance/drag-arrow.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "drag-arrow.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/Guidance/manual-remove.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "manual-remove.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/Guidance/sparkle.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "sparkle.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/Monitor/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/Monitor/SF.arrow.clockwise.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "SF.arrow.clockwise.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.app.background.dotted.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "SF.app.background.dotted.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.arrow.triangle.capsulepath.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "SF.arrow.triangle.capsulepath.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.button.horizontal.top.press.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "SF.button.horizontal.top.press.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.circle.dotted.circle.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "SF.circle.dotted.circle.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.ellipsis.circle.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "SF.ellipsis.circle.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.gearshape.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "SF.gearshape.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.lasso.badge.sparkles.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "SF.lasso.badge.sparkles.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.minus.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "minus.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.person.crop.circle.dashed.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "SF.person.crop.circle.dashed.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.plus.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "plus.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.scribble.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "scribble.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.tray.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "tray.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/Preferences/SF.wand.and.rays.inverse.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "wand.and.rays.inverse.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/StatusItem/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Mos/Assets.xcassets/StatusItem/SF.escape.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "escape.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/StatusItem/SF.gauge.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "gauge.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/StatusItem/SF.hidpp.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "hidpp.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Assets.xcassets/StatusItem/SF.square.stack.3d.down.right.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "square.stack.3d.down.right.pdf"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
},
"properties" : {
"template-rendering-intent" : "template"
}
}
================================================
FILE: Mos/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="24506" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="24506"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Mos" customModuleProvider="target"/>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6"/>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="tYq-jF-nNM" customClass="StatusItemManager" customModule="Mos" customModuleProvider="target"/>
</objects>
<point key="canvasLocation" x="1086" y="-85"/>
</scene>
<!--Window Controller-->
<scene sceneID="R2V-B0-nI4">
<objects>
<windowController storyboardIdentifier="monitorWindowController" showSeguePresentationStyle="single" id="B8D-0N-5wS" customClass="MonitorWindowController" customModule="Mos" customModuleProvider="target" sceneMemberID="viewController">
<window key="window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" visibleAtLaunch="NO" animationBehavior="default" titlebarAppearsTransparent="YES" id="IQv-IB-iLA" userLabel="Monitor Window">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
<rect key="contentRect" x="0.0" y="0.0" width="480" height="271"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<connections>
<outlet property="delegate" destination="B8D-0N-5wS" id="tcQ-Cv-MfP"/>
</connections>
</window>
<connections>
<outlet property="monitorWindow" destination="IQv-IB-iLA" id="Wd4-PR-xVs"/>
<segue destination="XfG-lQ-9wD" kind="relationship" relationship="window.shadowedContentViewController" id="cq2-FE-JQM"/>
</connections>
</windowController>
<customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-34" y="-119"/>
</scene>
<!--Window Controller-->
<scene sceneID="d5U-6w-uQ6">
<objects>
<windowController storyboardIdentifier="preferencesWindowController" showSeguePresentationStyle="single" id="7TR-R5-fGE" customClass="PreferencesWindowController" customModule="Mos" customModuleProvider="target" sceneMemberID="viewController">
<window key="window" title="Preferences" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" visibleAtLaunch="NO" frameAutosaveName="" animationBehavior="default" titlebarAppearsTransparent="YES" id="cvF-hf-KVW">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<rect key="contentRect" x="13" y="0.0" width="450" height="315"/>
<rect key="screenRect" x="-412" y="1050" width="2560" height="1080"/>
<connections>
<outlet property="delegate" destination="7TR-R5-fGE" id="aq4-gh-Ch5"/>
</connections>
</window>
<connections>
<outlet property="preferenceWindow" destination="cvF-hf-KVW" id="8z2-JT-6sK"/>
<segue destination="0iY-5N-JBV" kind="relationship" relationship="window.shadowedContentViewController" id="sCL-N4-ofN"/>
</connections>
</windowController>
<customObject id="28S-c5-IKX" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1086" y="272"/>
</scene>
<!--Preferences Tab View Controller-->
<scene sceneID="fde-aU-5x8">
<objects>
<tabViewController showSeguePresentationStyle="single" selectedTabViewItemIndex="0" tabStyle="toolbar" id="0iY-5N-JBV" customClass="PreferencesTabViewController" customModule="Mos" customModuleProvider="target" sceneMemberID="viewController">
<tabViewItems>
<tabViewItem identifier="general" image="SF.gearshape" id="Qwc-OE-zHR"/>
<tabViewItem identifier="scrolling" image="SF.circle.dotted.circle" id="P9R-tX-qfW"/>
<tabViewItem identifier="buttons" image="SF.button.horizontal.top.press" id="BTN-UI-123"/>
<tabViewItem identifier="application" image="SF.app.background.dotted" id="gfS-Ix-zI5"/>
<tabViewItem identifier="updates" image="SF.arrow.triangle.capsulepath" id="1sm-Qq-6GS"/>
<tabViewItem identifier="about" image="SF.person.crop.circle.dashed" id="MrA-I8-n0Z"/>
</tabViewItems>
<viewControllerTransitionOptions key="transitionOptions"/>
<tabView key="tabView" wantsLayer="YES" misplaced="YES" type="noTabsNoBorder" id="sxC-q7-Qs6">
<rect key="frame" x="0.0" y="0.0" width="450" height="314"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<font key="font" metaFont="system"/>
<connections>
<outlet property="delegate" destination="0iY-5N-JBV" id="VmR-wj-laa"/>
</connections>
</tabView>
<connections>
<outlet property="tabView" destination="sxC-q7-Qs6" id="CNF-oh-eK6"/>
<segue destination="ITL-GD-CPd" kind="relationship" relationship="tabItems" id="z3c-tg-aDc"/>
<segue destination="iW5-CD-5OC" kind="relationship" relationship="tabItems" id="GA4-xY-65w"/>
<segue destination="BTN-VC-123" kind="relationship" relationship="tabItems" id="BTN-SG-123"/>
<segue destination="bga-wG-iim" kind="relationship" relationship="tabItems" id="QV9-il-C7g"/>
<segue destination="EWu-DP-7Gj" kind="relationship" relationship="tabItems" id="gsT-c8-cJ3"/>
<segue destination="RfV-Ow-3mF" kind="relationship" relationship="tabItems" id="djr-7D-XVN"/>
</connections>
</tabViewController>
<customObject id="Huf-MT-zgs" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1086" y="767"/>
</scene>
<!--General-->
<scene sceneID="5zC-sP-JZj">
<objects>
<viewController title="General" storyboardIdentifier="general" id="ITL-GD-CPd" customClass="PreferencesGeneralViewController" customModule="Mos" customModuleProvider="target" sceneMemberID="viewController">
<visualEffectView key="view" blendingMode="behindWindow" material="toolTip" state="followsWindowActiveState" id="LZw-qp-NWH">
<rect key="frame" x="0.0" y="0.0" width="450" height="105"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<subviews>
<box hidden="YES" verticalHuggingPriority="750" verticalCompressionResistancePriority="751" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="vPz-kM-wAq">
<rect key="frame" x="20" y="92" width="410" height="5"/>
<constraints>
<constraint firstAttribute="width" constant="410" id="KJL-ZZ-WMT"/>
</constraints>
</box>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" verifyAmbiguity="off" translatesAutoresizingMaskIntoConstraints="NO" id="WWH-56-xDd">
<rect key="frame" x="18" y="37" width="140" height="14"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="136" id="W3A-cF-zN1"/>
</constraints>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Status Bar Icon" id="AGU-43-8RD">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="Xzk-6e-mKA">
<rect key="frame" x="171" y="71" width="259" height="14"/>
<buttonCell key="cell" type="check" title="Launch Mos at Login" bezelStyle="regularSquare" imagePosition="left" inset="2" id="xoR-7p-3qj">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<constraints>
<constraint firstAttribute="height" constant="14" id="EoC-6m-csZ"/>
</constraints>
<connections>
<action selector="launchOnLoginClick:" target="ITL-GD-CPd" id="YUz-Ue-6it"/>
</connections>
</button>
<button verticalHuggingPriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="1OP-ac-77Z">
<rect key="frame" x="171" y="37" width="146" height="14"/>
<buttonCell key="cell" type="check" title="Hide Status Bar Icon" bezelStyle="regularSquare" imagePosition="left" inset="2" id="hGj-vV-zcY">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" id="PpN-tw-d3S"/>
<constraint firstAttribute="height" constant="14" id="fky-mC-gj8"/>
</constraints>
<connections>
<action selector="hideStatusBarIconClick:" target="ITL-GD-CPd" id="b1n-8N-zLk"/>
</connections>
</button>
<button horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sTG-Fn-P3P">
<rect key="frame" x="321" y="36" width="16" height="16"/>
<buttonCell key="cell" type="help" bezelStyle="helpButton" alignment="center" controlSize="mini" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="q3R-0Q-jlP">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="miniSystem"/>
</buttonCell>
<constraints>
<constraint firstAttribute="height" constant="16" id="SAG-IT-83w"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="16" id="YGZ-L6-Pta"/>
</constraints>
<connections>
<segue destination="3aa-uW-Wet" kind="popover" popoverAnchorView="sTG-Fn-P3P" popoverBehavior="t" preferredEdge="maxY" id="QkR-g6-VEC"/>
</connections>
</button>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Gt2-mv-Ris" userLabel="Launch On Login Description">
<rect key="frame" x="169" y="20" width="264" height="11"/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" title="Re-run Mos again to show the hidden Icon" id="bB5-2R-9Da">
<font key="font" metaFont="miniSystem"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" verifyAmbiguity="off" translatesAutoresizingMaskIntoConstraints="NO" id="4ng-X7-dRa">
<rect key="frame" x="18" y="71" width="140" height="14"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="136" id="TJD-cl-63A"/>
</constraints>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Startup" id="E82-7w-YCr">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="WWH-56-xDd" firstAttribute="leading" secondItem="LZw-qp-NWH" secondAttribute="leading" constant="20" id="3Oo-fz-qqM"/>
<constraint firstItem="1OP-ac-77Z" firstAttribute="centerY" secondItem="WWH-56-xDd" secondAttribute="centerY" id="5aC-Pg-ol9"/>
<constraint firstAttribute="trailing" secondItem="vPz-kM-wAq" secondAttribute="trailing" constant="20" id="A6q-H4-qFP"/>
<constraint firstItem="1OP-ac-77Z" firstAttribute="leading" secondItem="Xzk-6e-mKA" secondAttribute="leading" id="BLN-CR-xdb"/>
<constraint firstItem="sTG-Fn-P3P" firstAttribute="centerY" secondItem="1OP-ac-77Z" secondAttribute="centerY" id="CbM-Dv-tbc"/>
<constraint firstItem="sTG-Fn-P3P" firstAttribute="leading" secondItem="1OP-ac-77Z" secondAttribute="trailing" constant="4" id="ECw-uh-DpE"/>
<constraint firstItem="Xzk-6e-mKA" firstAttribute="leading" secondItem="4ng-X7-dRa" secondAttribute="trailing" constant="15" id="Eea-ai-Voa"/>
<constraint firstItem="vPz-kM-wAq" firstAttribute="leading" secondItem="LZw-qp-NWH" secondAttribute="leading" constant="20" id="Hjc-z6-JQI"/>
<constraint firstItem="WWH-56-xDd" firstAttribute="trailing" secondItem="4ng-X7-dRa" secondAttribute="trailing" id="Ilv-kY-IzH"/>
<constraint firstAttribute="bottom" secondItem="Gt2-mv-Ris" secondAttribute="bottom" constant="20" id="PEZ-EE-k79"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="sTG-Fn-P3P" secondAttribute="trailing" constant="20" symbolic="YES" id="QCs-a8-qOl"/>
<constraint firstAttribute="trailing" secondItem="Gt2-mv-Ris" secondAttribute="trailing" constant="19" id="QIz-Bj-PTh"/>
<constraint firstItem="4ng-X7-dRa" firstAttribute="leading" secondItem="LZw-qp-NWH" secondAttribute="leading" constant="20" id="RNz-ur-say"/>
<constraint firstItem="1OP-ac-77Z" firstAttribute="top" secondItem="Xzk-6e-mKA" secondAttribute="bottom" constant="20" id="XQy-uw-780"/>
<constraint firstItem="Gt2-mv-Ris" firstAttribute="top" secondItem="1OP-ac-77Z" secondAttribute="bottom" constant="6" id="XY4-ay-hRV"/>
<constraint firstItem="Gt2-mv-Ris" firstAttribute="leading" secondItem="Xzk-6e-mKA" secondAttribute="leading" id="Yvi-cN-EWJ"/>
<constraint firstItem="Xzk-6e-mKA" firstAttribute="centerY" secondItem="4ng-X7-dRa" secondAttribute="centerY" id="gza-xU-tdS"/>
<constraint firstItem="Xzk-6e-mKA" firstAttribute="top" secondItem="LZw-qp-NWH" secondAttribute="top" constant="20" id="is7-Ds-fnD"/>
<constraint firstItem="vPz-kM-wAq" firstAttribute="top" secondItem="LZw-qp-NWH" secondAttribute="top" constant="10" id="k8K-MT-aLo"/>
<constraint firstAttribute="trailing" secondItem="Xzk-6e-mKA" secondAttribute="trailing" constant="20" id="uwt-6G-UwH"/>
</constraints>
</visualEffectView>
<connections>
<outlet property="hideStatusBarIconCheckBox" destination="1OP-ac-77Z" id="eAY-em-HEE"/>
<outlet property="launchOnLoginCheckBox" destination="Xzk-6e-mKA" id="Dx6-Zs-rVj"/>
</connections>
</viewController>
<customObject id="KsC-af-ap0" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="460" y="1168"/>
</scene>
<!--Buttons-->
<scene sceneID="BTN-SC-123">
<objects>
<viewController title="Buttons" storyboardIdentifier="buttons" id="BTN-VC-123" customClass="PreferencesButtonsViewController" customModule="Mos" customModuleProvider="target" sceneMemberID="viewController">
<visualEffectView key="view" blendingMode="behindWindow" material="toolTip" state="followsWindowActiveState" id="BTN-VW-123">
<rect key="frame" x="0.0" y="0.0" width="450" height="321"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
<subviews>
<visualEffectView blendingMode="behindWindow" material="toolTip" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="2W2-hM-ME3">
<rect key="frame" x="0.0" y="291" width="450" height="30"/>
<subviews>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" verifyAmbiguity="off" translatesAutoresizingMaskIntoConstraints="NO" id="c5F-kF-CwS">
<rect key="frame" x="29" y="8" width="40" height="14"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="left" title="Button" id="AbN-7n-hF7">
<font key="font" metaFont="systemMedium" size="11"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="Wa1-F9-Eyt">
<rect key="frame" x="0.0" y="-2" width="450" height="5"/>
</box>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" verifyAmbiguity="off" translatesAutoresizingMaskIntoConstraints="NO" id="xNC-sb-7wF">
<rect key="frame" x="384" y="8" width="43" height="14"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="Action" id="sdr-Ih-rCr">
<font key="font" metaFont="systemMedium" size="11"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="c5F-kF-CwS" firstAttribute="centerY" secondItem="2W2-hM-ME3" secondAttribute="centerY" id="4XX-7s-FJL"/>
<constraint firstItem="c5F-kF-CwS" firstAttribute="leading" secondItem="2W2-hM-ME3" secondAttribute="leading" constant="31" id="8dG-MJ-pMB"/>
<constraint firstAttribute="height" constant="30" id="I6t-Sp-fUx"/>
<constraint firstAttribute="bottom" secondItem="Wa1-F9-Eyt" secondAttribute="bottom" id="bWd-WO-ava"/>
<constraint firstAttribute="trailing" secondItem="Wa1-F9-Eyt" secondAttribute="trailing" id="eZC-lp-tCf"/>
<constraint firstItem="xNC-sb-7wF" firstAttribute="centerX" secondItem="2W2-hM-ME3" secondAttribute="centerX" constant="180" id="fxl-KY-Jzc"/>
<constraint firstItem="xNC-sb-7wF" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="c5F-kF-CwS" secondAttribute="trailing" constant="8" symbolic="YES" id="g18-i4-Vrz"/>
<constraint firstItem="Wa1-F9-Eyt" firstAttribute="leading" secondItem="2W2-hM-ME3" secondAttribute="leading" id="lQj-um-iK7"/>
<constraint firstItem="xNC-sb-7wF" firstAttribute="centerY" secondItem="2W2-hM-ME3" secondAttribute="centerY" id="vl7-7z-Qn5"/>
</constraints>
</visualEffectView>
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="52" horizontalPageScroll="10" verticalLineScroll="52" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" findBarPosition="aboveHorizontalRuler" translatesAutoresizingMaskIntoConstraints="NO" id="ftV-jh-kjD">
<rect key="frame" x="0.0" y="31" width="450" height="260"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="9qm-Wz-Rwq">
<rect key="frame" x="0.0" y="0.0" width="450" height="260"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="none" tableStyle="inset" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="52" rowSizeStyle="automatic" viewBased="YES" floatsGroupRows="NO" id="tU8-ze-w7X">
<rect key="frame" x="0.0" y="0.0" width="450" height="260"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="17" height="0.0"/>
<color key="backgroundColor" red="0.11764705882352941" green="0.11764705882352941" blue="0.11764705882352941" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="Hotkey" width="418" minWidth="40" maxWidth="1000" id="gd2-WO-uk9">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Hotkey">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="aP7-2e-zd4">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView id="zV9-2l-l6k" customClass="ButtonTableCellView" customModule="Mos" customModuleProvider="target">
<rect key="frame" x="18" y="0.0" width="413" height="52"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<box boxType="custom" cornerRadius="5" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="Hcf-QN-htP">
<rect key="frame" x="0.0" y="5" width="413" height="42"/>
<view key="contentView" wantsLayer="YES" id="sUm-mF-Rt9">
<rect key="frame" x="1" y="1" width="411" height="40"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<box boxType="custom" borderWidth="0.0" cornerRadius="4" title="Box" translatesAutoresizingMaskIntoConstraints="NO" id="ei3-vh-6kV">
<rect key="frame" x="12" y="5" width="250" height="30"/>
<view key="contentView" id="UjE-iu-X41">
<rect key="frame" x="0.0" y="0.0" width="250" height="30"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
<color key="borderColor" red="1" green="1" blue="1" alpha="0.10068822230879106" colorSpace="custom" customColorSpace="sRGB"/>
<color key="fillColor" red="0.96062562677481145" green="0.96754766589999996" blue="0.93064895263721903" alpha="0.0" colorSpace="custom" customColorSpace="displayP3"/>
</box>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3eO-mD-7ue">
<rect key="frame" x="287" y="8" width="120" height="24"/>
<popUpButtonCell key="cell" type="push" title="No Action" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" selectedItem="epU-lS-atX" id="DPN-ii-WxE">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="message"/>
<menu key="menu" id="Q8S-vA-nvS">
<items>
<menuItem title="No Action" state="on" id="epU-lS-atX"/>
<menuItem isSeparatorItem="YES" id="tEC-yo-gDp"/>
</items>
</menu>
</popUpButtonCell>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="120" id="ycn-md-UBm"/>
</constraints>
</popUpButton>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="3eO-mD-7ue" secondAttribute="trailing" constant="4" id="2eY-s6-2qh"/>
<constraint firstAttribute="bottom" secondItem="ei3-vh-6kV" secondAttribute="bottom" constant="5" id="FN4-2W-Rm1"/>
<constraint firstItem="ei3-vh-6kV" firstAttribute="top" secondItem="sUm-mF-Rt9" secondAttribute="top" constant="5" id="Ga7-qB-xL0"/>
<constraint firstItem="3eO-mD-7ue" firstAttribute="centerY" secondItem="sUm-mF-Rt9" secondAttribute="centerY" id="I7g-BJ-jVc"/>
<constraint firstItem="3eO-mD-7ue" firstAttribute="leading" secondItem="ei3-vh-6kV" secondAttribute="trailing" constant="25" id="fTO-Xp-Lwf"/>
<constraint firstItem="ei3-vh-6kV" firstAttribute="leading" secondItem="sUm-mF-Rt9" secondAttribute="leading" constant="12" id="vbF-oh-1y2"/>
</constraints>
</view>
<constraints>
<constraint firstAttribute="height" constant="42" id="cDH-Mh-whs"/>
</constraints>
<color key="borderColor" red="1" green="1" blue="1" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<color key="fillColor" red="1" green="1" blue="1" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
</box>
</subviews>
<constraints>
<constraint firstItem="Hcf-QN-htP" firstAttribute="centerY" secondItem="zV9-2l-l6k" secondAttribute="centerY" id="28R-oI-28a"/>
<constraint firstAttribute="trailing" secondItem="Hcf-QN-htP" secondAttribute="trailing" id="B5f-Q7-1ek"/>
<constraint firstItem="Hcf-QN-htP" firstAttribute="leading" secondItem="zV9-2l-l6k" secondAttribute="leading" id="k9E-8E-a7l"/>
</constraints>
<connections>
<outlet property="actionPopUpButton" destination="3eO-mD-7ue" id="78f-cI-nk8"/>
<outlet property="keyDisplayContainerView" destination="UjE-iu-X41" id="kK1-dw-8ZY"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
</tableView>
</subviews>
<nil key="backgroundColor"/>
</clipView>
<constraints>
<constraint firstAttribute="width" constant="450" id="O6a-JW-Ptw"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="260" id="wgU-xJ-cqJ"/>
</constraints>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="R1g-hj-G0Y">
<rect key="frame" x="-100" y="-100" width="450" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="Hu3-iV-J5G">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="skg-W8-gS0">
<rect key="frame" x="33" y="133" width="385" height="148"/>
<subviews>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AtR-B3-Yvi">
<rect key="frame" x="18" y="20" width="349" height="14"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="Customize mouse buttons to enhance your experience" id="2hV-f7-8yO">
<font key="font" metaFont="menu" size="11"/>
<color key="textColor" name="tertiaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="EvW-FY-pRc">
<rect key="frame" x="18" y="39" width="349" height="19"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="No buttons are set up yet" id="tum-Lo-TC6">
<font key="font" metaFont="system" size="16"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView wantsLayer="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="eyA-cJ-hnJ">
<rect key="frame" x="162" y="68" width="60" height="60"/>
<constraints>
<constraint firstAttribute="height" constant="60" id="D9X-8a-rcb"/>
<constraint firstAttribute="width" constant="60" id="t4B-oR-h2k"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyDown" image="SF.scribble" id="MGl-AO-ne3"/>
</imageView>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="EvW-FY-pRc" secondAttribute="trailing" constant="20" id="1IW-Ey-cwO"/>
<constraint firstItem="eyA-cJ-hnJ" firstAttribute="top" secondItem="skg-W8-gS0" secondAttribute="top" constant="20" id="1ku-1d-HVn"/>
<constraint firstItem="AtR-B3-Yvi" firstAttribute="top" secondItem="EvW-FY-pRc" secondAttribute="bottom" constant="5" id="6Sw-S3-MQf"/>
<constraint firstItem="AtR-B3-Yvi" firstAttribute="leading" secondItem="skg-W8-gS0" secondAttribute="leading" constant="20" id="Etv-0M-Rey"/>
<constraint firstAttribute="trailing" secondItem="AtR-B3-Yvi" secondAttribute="trailing" constant="20" id="MTL-lb-t9I"/>
<constraint firstAttribute="bottom" secondItem="AtR-B3-Yvi" secondAttribute="bottom" constant="20" id="OCv-E9-E1i"/>
<constraint firstItem="EvW-FY-pRc" firstAttribute="top" secondItem="eyA-cJ-hnJ" secondAttribute="bottom" constant="10" id="WK9-vD-CeY"/>
<constraint firstItem="EvW-FY-pRc" firstAttribute="leading" secondItem="skg-W8-gS0" secondAttribute="leading" constant="20" id="pYC-kZ-WYc"/>
<constraint firstAttribute="width" constant="385" id="qqw-2g-JAd"/>
<constraint firstItem="eyA-cJ-hnJ" firstAttribute="centerX" secondItem="skg-W8-gS0" secondAttribute="centerX" id="s45-1k-j6V"/>
</constraints>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="uuZ-tE-wlr" customClass="PrimaryButton" customModule="Mos" customModuleProvider="target">
<rect key="frame" x="40" y="38" width="370" height="60"/>
<subviews>
<textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="QAD-KS-uBx">
<rect key="frame" x="13" y="31" width="91" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Record Button" id="l7O-So-nw1">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ggg-Eq-Gh7">
<rect key="frame" x="13" y="14" width="189" height="14"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Assign a button to a specific action" id="fXu-uF-M3Q">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView wantsLayer="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="djE-pP-ToX">
<rect key="frame" x="325" y="18" width="25" height="25"/>
<constraints>
<constraint firstAttribute="width" constant="25" id="0t9-Ni-YdC"/>
<constraint firstAttribute="height" constant="25" id="CWi-jr-Ib1"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyUpOrDown" image="SF.lasso.badge.sparkles" id="qFF-o8-J7D"/>
</imageView>
</subviews>
<constraints>
<constraint firstItem="QAD-KS-uBx" firstAttribute="leading" secondItem="uuZ-tE-wlr" secondAttribute="leading" constant="15" id="4oh-9p-l0q"/>
<constraint firstItem="QAD-KS-uBx" firstAttribute="centerY" secondItem="uuZ-tE-wlr" secondAttribute="centerY" constant="-9" id="8qk-QE-zQ4"/>
<constraint firstAttribute="height" constant="60" id="9cR-Bw-AYg"/>
<constraint firstItem="djE-pP-ToX" firstAttribute="centerY" secondItem="uuZ-tE-wlr" secondAttribute="centerY" id="LUw-ov-uQA"/>
<constraint firstAttribute="width" constant="370" id="ROH-M2-7yk"/>
<constraint firstItem="djE-pP-ToX" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Ggg-Eq-Gh7" secondAttribute="trailing" constant="8" symbolic="YES" id="X0h-2A-V7I"/>
<constraint firstItem="Ggg-Eq-Gh7" firstAttribute="leading" secondItem="uuZ-tE-wlr" secondAttribute="leading" constant="15" id="Zqf-v7-Q6r"/>
<constraint firstItem="Ggg-Eq-Gh7" firstAttribute="centerY" secondItem="uuZ-tE-wlr" secondAttribute="centerY" constant="9" id="Zu1-PH-kb8"/>
<constraint firstItem="djE-pP-ToX" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="QAD-KS-uBx" secondAttribute="trailing" constant="8" symbolic="YES" id="s81-tB-GM8"/>
<constraint firstAttribute="trailing" secondItem="djE-pP-ToX" secondAttribute="trailing" constant="20" id="vwG-KS-2n2"/>
</constraints>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="y2I-TF-AaH">
<rect key="frame" x="0.0" y="0.0" width="450" height="31"/>
<subviews>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="PME-e7-Shd">
<rect key="frame" x="0.0" y="28" width="450" height="5"/>
</box>
<button imageHugsTitle="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4Ef-t4-sPm">
<rect key="frame" x="36" y="4" width="30.5" height="25"/>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="NSRemoveTemplate" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" enabled="NO" state="on" inset="2" id="SGK-IN-m4l">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<constraints>
<constraint firstAttribute="height" constant="30" id="RXI-KH-wYX"/>
<constraint firstAttribute="width" constant="30" id="dun-z6-g2j"/>
</constraints>
<connections>
<action selector="removeItemClick:" target="BTN-VC-123" id="CaV-9Y-dCa"/>
</connections>
</button>
<button imageHugsTitle="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xql-gm-0mI">
<rect key="frame" x="6" y="-0.5" width="30.5" height="34"/>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="NSAddTemplate" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" state="on" inset="2" id="Io4-fW-e2U">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" constant="30" id="RUY-pE-WD4"/>
<constraint firstAttribute="height" constant="30" id="UHR-XW-1aR"/>
</constraints>
<connections>
<action selector="addItemClick:" target="BTN-VC-123" id="H66-KH-Yle"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="4Ef-t4-sPm" firstAttribute="centerY" secondItem="y2I-TF-AaH" secondAttribute="centerY" id="5YT-JK-VWp"/>
<constraint firstItem="xql-gm-0mI" firstAttribute="leading" secondItem="y2I-TF-AaH" secondAttribute="leading" constant="6" id="93f-wZ-k27"/>
<constraint firstItem="4Ef-t4-sPm" firstAttribute="leading" secondItem="xql-gm-0mI" secondAttribute="trailing" id="Cuh-Nc-tdO"/>
<constraint firstAttribute="trailing" secondItem="PME-e7-Shd" secondAttribute="trailing" id="JTG-gd-tNF"/>
<constraint firstItem="PME-e7-Shd" firstAttribute="leading" secondItem="y2I-TF-AaH" secondAttribute="leading" id="Jgf-sy-FRr"/>
<constraint firstItem="xql-gm-0mI" firstAttribute="centerY" secondItem="y2I-TF-AaH" secondAttribute="centerY" id="LNg-c8-prT"/>
<constraint firstAttribute="height" constant="31" id="r0c-BN-CCZ"/>
<constraint firstItem="PME-e7-Shd" firstAttribute="top" secondItem="y2I-TF-AaH" secondAttribute="top" id="v77-cf-5Mn"/>
</constraints>
</customView>
</subviews>
<constraints>
<constraint firstItem="ftV-jh-kjD" firstAttribute="top" secondItem="2W2-hM-ME3" secondAttribute="bottom" id="7nE-RF-MKB"/>
<constraint firstItem="skg-W8-gS0" firstAttribute="centerX" secondItem="BTN-VW-123" secondAttribute="centerX" id="8H6-YI-eq0"/>
<constraint firstItem="2W2-hM-ME3" firstAttribute="leading" secondItem="BTN-VW-123" secondAttribute="leading" id="BdG-ja-NoC"/>
<constraint firstItem="y2I-TF-AaH" firstAttribute="leading" secondItem="BTN-VW-123" secondAttribute="leading" id="Dcd-bE-nqo"/>
<constraint firstItem="2W2-hM-ME3" firstAttribute="top" secondItem="BTN-VW-123" secondAttribute="top" id="F0I-ER-NKs"/>
<constraint firstAttribute="trailing" secondItem="ftV-jh-kjD" secondAttribute="trailing" id="P8Z-6N-CpR"/>
<constraint firstAttribute="trailing" secondItem="2W2-hM-ME3" secondAttribute="trailing" id="Q4P-LZ-2vh"/>
<constraint firstItem="2W2-hM-ME3" firstAttribute="top" secondItem="BTN-VW-123" secondAttribute="top" id="R11-z5-pFR"/>
<constraint firstItem="uuZ-tE-wlr" firstAttribute="centerX" secondItem="BTN-VW-123" secondAttribute="centerX" id="SwX-zy-m7I"/>
<constraint firstItem="2W2-hM-ME3" firstAttribute="leading" secondItem="BTN-VW-123" secondAttribute="leading" id="bBi-x6-hqs"/>
<constraint firstItem="ftV-jh-kjD" firstAttribute="leading" secondItem="BTN-VW-123" secondAttribute="leading" id="eF6-ka-pvJ"/>
<constraint firstItem="y2I-TF-AaH" firstAttribute="top" secondItem="ftV-jh-kjD" secondAttribute="bottom" id="fZW-Om-hhT"/>
<constraint firstAttribute="bottom" secondItem="y2I-TF-AaH" secondAttribute="bottom" id="r1G-z8-ouo"/>
<constraint firstItem="skg-W8-gS0" firstAttribute="top" secondItem="BTN-VW-123" secondAttribute="top" constant="40" id="tBg-oX-ddF"/>
<constraint firstAttribute="trailing" secondItem="2W2-hM-ME3" secondAttribute="trailing" id="uOc-MD-2UB"/>
<constraint firstAttribute="bottom" secondItem="uuZ-tE-wlr" secondAttribute="bottom" constant="38" id="vG8-OX-AKv"/>
<constraint firstAttribute="trailing" secondItem="y2I-TF-AaH" secondAttribute="trailing" id="w3a-c5-36o"/>
</constraints>
</visualEffectView>
<connections>
<outlet property="addButton" destination="xql-gm-0mI" id="E6H-zi-qsW"/>
<outlet property="createButton" destination="uuZ-tE-wlr" id="h6U-Gs-MEr"/>
<outlet property="delButton" destination="4Ef-t4-sPm" id="80m-Qy-Vdg"/>
<outlet property="tableEmpty" destination="skg-W8-gS0" id="eHD-Fa-Gdk"/>
<outlet property="tableFoot" destination="y2I-TF-AaH" id="1nE-Ft-HI6"/>
<outlet property="tableHead" destination="2W2-hM-ME3" id="Y4J-wc-n9g"/>
<outlet property="tableView" destination="tU8-ze-w7X" id="CbL-cb-u12"/>
</connections>
</viewController>
<customObject id="BTN-FR-123" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1443" y="1277"/>
</scene>
<!--Application-->
<scene sceneID="UqT-28-MT6">
<objects>
<customObject id="l11-a0-4Xa" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
<viewController title="Application" storyboardIdentifier="application" id="bga-wG-iim" customClass="PreferencesApplicationViewController" customModule="Mos" customModuleProvider="target" sceneMemberID="viewController">
<visualEffectView key="view" wantsLayer="YES" blendingMode="behindWindow" material="toolTip" state="followsWindowActiveState" id="jc3-9p-Bfo">
<rect key="frame" x="0.0" y="0.0" width="450" height="321"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<visualEffectView appearanceType="inheritedVibrantLight" blendingMode="behindWindow" material="underWindowBackground" state="active" translatesAutoresizingMaskIntoConstraints="NO" id="VAL-LC-T3T">
<rect key="frame" x="0.0" y="291" width="450" height="30"/>
<subviews>
<visualEffectView blendingMode="behindWindow" material="toolTip" state="followsWindowActiveState" translatesAutoresizingMaskIntoConstraints="NO" id="ouh-IG-LyJ">
<rect key="frame" x="0.0" y="0.0" width="450" height="30"/>
<subviews>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" verifyAmbiguity="off" translatesAutoresizingMaskIntoConstraints="NO" id="Dph-wy-8sb">
<rect key="frame" x="35" y="8" width="65" height="14"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="left" title="Application" id="89F-B4-NIY">
<font key="font" metaFont="systemMedium" size="11"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="XUy-oo-mzG">
<rect key="frame" x="0.0" y="-2" width="450" height="5"/>
</box>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" verifyAmbiguity="off" translatesAutoresizingMaskIntoConstraints="NO" id="W4G-c6-Zmz">
<rect key="frame" x="361" y="8" width="56" height="14"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="center" title="Scrolling" id="JQK-PN-VMN">
<font key="font" metaFont="systemMedium" size="11"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="W4G-c6-Zmz" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Dph-wy-8sb" secondAttribute="trailing" constant="8" symbolic="YES" id="0ZH-vo-N8D"/>
<constraint firstItem="Dph-wy-8sb" firstAttribute="centerY" secondItem="ouh-IG-LyJ" secondAttribute="centerY" id="6H6-5z-Sht"/>
<constraint firstItem="W4G-c6-Zmz" firstAttribute="centerX" secondItem="ouh-IG-LyJ" secondAttribute="centerX" constant="164" id="9EA-0U-hrm"/>
<constraint firstItem="Dph-wy-8sb" firstAttribute="leading" secondItem="ouh-IG-LyJ" secondAttribute="leading" constant="37" id="JAN-ad-8pf"/>
<constraint firstItem="W4G-c6-Zmz" firstAttribute="centerY" secondItem="ouh-IG-LyJ" secondAttribute="centerY" id="KjP-Hk-a0i"/>
<constraint firstAttribute="height" constant="30" id="Lth-gv-sxw"/>
<constraint firstAttribute="bottom" secondItem="XUy-oo-mzG" secondAttribute="bottom" id="WI9-RH-ERQ"/>
<constraint firstItem="XUy-oo-mzG" firstAttribute="leading" secondItem="ouh-IG-LyJ" secondAttribute="leading" id="XRb-rf-T5L"/>
<constraint firstAttribute="trailing" secondItem="XUy-oo-mzG" secondAttribute="trailing" id="do1-QI-fda"/>
</constraints>
</visualEffectView>
</subviews>
<constraints>
<constraint firstAttribute="height" constant="30" id="Oci-9C-yUn"/>
<constraint firstItem="ouh-IG-LyJ" firstAttribute="top" secondItem="VAL-LC-T3T" secondAttribute="top" id="Z0o-YV-eTd"/>
<constraint firstAttribute="trailing" secondItem="ouh-IG-LyJ" secondAttribute="trailing" id="cbY-du-LsV"/>
<constraint firstItem="ouh-IG-LyJ" firstAttribute="leading" secondItem="VAL-LC-T3T" secondAttribute="leading" id="hkp-a2-qzN"/>
<constraint firstAttribute="width" constant="450" id="nVH-oK-9VM"/>
</constraints>
</visualEffectView>
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="57" horizontalPageScroll="10" verticalLineScroll="57" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" findBarPosition="aboveHorizontalRuler" translatesAutoresizingMaskIntoConstraints="NO" id="2dP-HG-cdi">
<rect key="frame" x="0.0" y="31" width="450" height="260"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="bif-Bv-tOQ">
<rect key="frame" x="0.0" y="0.0" width="450" height="260"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="none" tableStyle="inset" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="45" rowSizeStyle="automatic" viewBased="YES" floatsGroupRows="NO" id="LmV-gi-3fE">
<rect key="frame" x="0.0" y="0.0" width="450" height="260"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="0.0" height="12"/>
<color key="backgroundColor" red="0.11764705882352941" green="0.11764705882352941" blue="0.11764705882352941" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn identifier="applicationCell" width="328" minWidth="1" maxWidth="1000" id="xfG-Cd-oIk">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title=" Application">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="HEV-nL-Tno">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView id="Bh2-DX-YFF">
<rect key="frame" x="10" y="6" width="334" height="45"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView wantsLayer="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Obf-MQ-CcQ">
<rect key="frame" x="20" y="11" width="24" height="24"/>
<constraints>
<constraint firstAttribute="height" constant="24" id="0ZD-u6-p0A"/>
<constraint firstAttribute="width" constant="24" id="Rgc-hC-hLt"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSApplicationIcon" id="QQO-uS-6gC"/>
</imageView>
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Fv1-rI-t5W">
<rect key="frame" x="47" y="15" width="284" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" alignment="left" title="Application Name" id="XjY-7g-GLL">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="Fv1-rI-t5W" firstAttribute="leading" secondItem="Obf-MQ-CcQ" secondAttribute="trailing" constant="5" id="1oF-pE-Nfs"/>
<constraint firstAttribute="trailing" secondItem="Fv1-rI-t5W" secondAttribute="trailing" constant="5" id="46F-hT-feG"/>
<constraint firstItem="Obf-MQ-CcQ" firstAttribute="leading" secondItem="Bh2-DX-YFF" secondAttribute="leading" constant="20" id="I6N-WL-HiX"/>
<constraint firstItem="Fv1-rI-t5W" firstAttribute="centerY" secondItem="Bh2-DX-YFF" secondAttribute="centerY" id="Sra-f5-PzL"/>
<constraint firstItem="Obf-MQ-CcQ" firstAttribute="centerY" secondItem="Bh2-DX-YFF" secondAttribute="centerY" id="hgv-FU-MDP"/>
</constraints>
<connections>
<outlet property="imageView" destination="Obf-MQ-CcQ" id="DTP-3r-2bS"/>
<outlet property="textField" destination="Fv1-rI-t5W" id="rBc-Yi-Qh1"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
<tableColumn identifier="scrollingCell" width="90" minWidth="10" maxWidth="1000" id="8By-V1-U9w">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Scrolling">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="BDu-5m-yrr">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<prototypeCellViews>
<tableCellView id="clT-5E-IUd">
<rect key="frame" x="344" y="6" width="96" height="45"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4qv-B4-GnV">
<rect key="frame" x="29" y="10" width="39" height="25"/>
<buttonCell key="cell" type="roundRect" bezelStyle="roundedRect" image="SF.circle.dotted.circle" imagePosition="only" lineBreakMode="truncatingTail" state="on" imageScaling="proportionallyDown" inset="2" id="pZj-5N-agR">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="cellTitle"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" constant="39" id="Cb7-ZH-zto"/>
<constraint firstAttribute="height" relation="lessThanOrEqual" constant="25" id="V9r-u0-1IM"/>
</constraints>
</button>
</subviews>
<constraints>
<constraint firstItem="4qv-B4-GnV" firstAttribute="centerY" secondItem="clT-5E-IUd" secondAttribute="centerY" id="QNq-yV-bOb"/>
<constraint firstItem="4qv-B4-GnV" firstAttribute="centerX" secondItem="clT-5E-IUd" secondAttribute="centerX" id="VAV-K6-0Hb"/>
</constraints>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="bga-wG-iim" id="VYA-DC-2nz"/>
<outlet property="delegate" destination="bga-wG-iim" id="zmj-uZ-njc"/>
</connections>
</tableView>
</subviews>
<nil key="backgroundColor"/>
</clipView>
<constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="260" id="W0X-YA-7Zq"/>
</constraints>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="8dl-2h-i32">
<rect key="frame" x="-100" y="-100" width="450" height="15"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="LP2-dF-uOZ">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="LTZ-IH-4Vy">
<rect key="frame" x="33" y="133" width="385" height="148"/>
<subviews>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OKC-Nf-egM">
<rect key="frame" x="18" y="20" width="349" height="14"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="Customize individual settings for each app" id="jaq-Cb-dKM">
<font key="font" metaFont="menu" size="11"/>
<color key="textColor" name="tertiaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="JG0-5p-fCy">
<rect key="frame" x="18" y="39" width="349" height="19"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" title="No application is Special" id="ThS-Rm-st2">
<font key="font" metaFont="system" size="16"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView wantsLayer="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="D09-cG-tQf">
<rect key="frame" x="162" y="68" width="60" height="60"/>
<constraints>
<constraint firstAttribute="width" constant="60" id="40g-hZ-VbI"/>
<constraint firstAttribute="height" constant="60" id="kmg-Qg-Vty"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="SF.scribble" id="jW5-3e-gHP"/>
</imageView>
</subviews>
<constraints>
<constraint firstItem="D09-cG-tQf" firstAttribute="top" secondItem="LTZ-IH-4Vy" secondAttribute="top" constant="20" id="1WC-hR-yr1"/>
<constraint firstItem="JG0-5p-fCy" firstAttribute="leading" secondItem="LTZ-IH-4Vy" secondAttribute="leading" constant="20" id="Agl-5Y-iG0"/>
<constraint firstItem="OKC-Nf-egM" firstAttribute="top" secondItem="JG0-5p-fCy" secondAttribute="bottom" constant="5" id="BSN-Ef-Tar"/>
<constraint firstItem="JG0-5p-fCy" firstAttribute="top" secondItem="D09-cG-tQf" secondAttribute="bottom" constant="10" id="Bg1-Jl-UbB"/>
<constraint firstAttribute="bottom" secondItem="OKC-Nf-egM" secondAttribute="bottom" constant="20" id="RlD-Pn-Cfc"/>
<constraint firstItem="D09-cG-tQf" firstAttribute="centerX" secondItem="LTZ-IH-4Vy" secondAttribute="centerX" id="UoQ-eW-VJN"/>
<constraint firstAttribute="trailing" secondItem="OKC-Nf-egM" secondAttribute="trailing" constant="20" id="cv7-0n-itx"/>
<constraint firstAttribute="trailing" secondItem="JG0-5p-fCy" secondAttribute="trailing" constant="20" id="ddp-rB-PaR"/>
<constraint firstItem="OKC-Nf-egM" firstAttribute="leading" secondItem="LTZ-IH-4Vy" secondAttribute="leading" constant="20" id="yX9-qf-jqc"/>
<constraint firstAttribute="width" constant="385" id="yfO-jh-Pru"/>
</constraints>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="2yz-Bt-IMN">
<rect key="frame" x="0.0" y="0.0" width="450" height="31"/>
<subviews>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="4AF-Dk-mkc">
<rect key="frame" x="0.0" y="28" width="450" height="5"/>
</box>
<button imageHugsTitle="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ceK-ED-PfL">
<rect key="frame" x="6" y="-0.5" width="30.5" height="34"/>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="NSAddTemplate" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" state="on" inset="2" id="ivF-Bk-aLA">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" constant="30" id="8L2-mK-7u8"/>
<constraint firstAttribute="height" constant="30" id="iZQ-k2-J7Z"/>
</constraints>
<connections>
<action selector="addItemClick:" target="bga-wG-iim" id="DnW-Ss-eKk"/>
</connections>
</button>
<button imageHugsTitle="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="HZK-yc-ptT">
<rect key="frame" x="36" y="4" width="30.5" height="25"/>
<buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="NSRemoveTemplate" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" enabled="NO" state="on" inset="2" id="dnI-fa-wgE">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" constant="30" id="Q4w-np-mv4"/>
<constraint firstAttribute="height" constant="30" id="fS1-f0-DuE"/>
</constraints>
<connections>
<action selector="removeItemClick:" target="bga-wG-iim" id="NiX-aD-ohO"/>
</connections>
</button>
<button horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8FH-Zr-4mB">
<rect key="frame" x="426" y="7" width="16" height="17"/>
<buttonCell key="cell" type="help" bezelStyle="helpButton" alignment="center" controlSize="mini" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="qvR-dH-4Bl">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="miniSystem"/>
</buttonCell>
<constraints>
<constraint firstAttribute="height" constant="17" id="Wac-iP-hrm"/>
</constraints>
<connections>
<segue destination="o12-9v-Ej5" kind="popover" popoverAnchorView="8FH-Zr-4mB" popoverBehavior="t" preferredEdge="maxY" id="h3A-yE-W1x"/>
</connections>
</button>
<button imageHugsTitle="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gnb-pe-ZN5">
<rect key="frame" x="278" y="9" width="140" height="14"/>
<buttonCell key="cell" type="check" title="Allow list Mode" bezelStyle="regularSquare" imagePosition="left" alignment="right" controlSize="small" inset="2" id="Ksp-g1-48g">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="menu" size="11"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="140" id="NS2-ZW-iDh"/>
</constraints>
<connections>
<action selector="allowListModeClick:" target="bga-wG-iim" id="MZ6-m7-C6o"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="ceK-ED-PfL" firstAttribute="centerY" secondItem="2yz-Bt-IMN" secondAttribute="centerY" id="Baj-FX-zv2"/>
<constraint firstItem="4AF-Dk-mkc" firstAttribute="top" secondItem="2yz-Bt-IMN" secondAttribute="top" id="Fc7-Cz-jHm"/>
<constraint firstItem="gnb-pe-ZN5" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="HZK-yc-ptT" secondAttribute="trailing" constant="8" symbolic="YES" id="IGO-gn-q8C"/>
<constraint firstAttribute="height" constant="31" id="NnL-yN-1Ha"/>
<constraint firstAttribute="trailing" secondItem="4AF-Dk-mkc" secondAttribute="trailing" id="OMI-qV-4ya"/>
<constraint firstAttribute="trailing" secondItem="8FH-Zr-4mB" secondAttribute="trailing" constant="8" id="OQG-xJ-APd"/>
<constraint firstItem="HZK-yc-ptT" firstAttribute="centerY" secondItem="2yz-Bt-IMN" secondAttribute="centerY" id="Rq2-Wm-faI"/>
<constraint firstItem="HZK-yc-ptT" firstAttribute="leading" secondItem="ceK-ED-PfL" secondAttribute="trailing" id="SaG-wi-dX6"/>
<constraint firstItem="4AF-Dk-mkc" firstAttribute="leading" secondItem="2yz-Bt-IMN" secondAttribute="leading" id="XrE-3e-vRg"/>
<constraint firstItem="8FH-Zr-4mB" firstAttribute="leading" secondItem="gnb-pe-ZN5" secondAttribute="trailing" constant="8" id="Zid-PW-aOD"/>
<constraint firstItem="gnb-pe-ZN5" firstAttribute="centerY" secondItem="2yz-Bt-IMN" secondAttribute="centerY" id="cBf-yx-tg5"/>
<constraint firstItem="8FH-Zr-4mB" firstAttribute="centerY" secondItem="2yz-Bt-IMN" secondAttribute="centerY" id="h5p-e1-ZbB"/>
<constraint firstItem="ceK-ED-PfL" firstAttribute="leading" secondItem="2yz-Bt-IMN" secondAttribute="leading" constant="6" id="jhO-JU-hzS"/>
</constraints>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="lhT-1U-5Xh" customClass="PrimaryButton" customModule="Mos" customModuleProvider="target">
<rect key="frame" x="40" y="38" width="370" height="60"/>
<subviews>
<textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="MPG-5z-OT3">
<rect key="frame" x="13" y="31" width="100" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Add Application" id="Gmk-Ru-er7">
<font key="font" usesAppearanceFont="YES"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="V2s-M6-mOE">
<rect key="frame" x="13" y="14" width="254" height="14"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Create a custom configuration for specific apps" id="DS8-og-1pp">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<imageView wantsLayer="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="5uX-Iz-YQ7">
<rect key="frame" x="330" y="15" width="20" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="ALi-rt-jUu"/>
<constraint firstAttribute="width" constant="20" id="csf-6L-GKj"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageScaling="proportionallyUpOrDown" image="NSTouchBarSearchTemplate" id="4Mt-YO-qUx"/>
</imageView>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="5uX-Iz-YQ7" secondAttribute="trailing" constant="20" id="0lg-LB-HJa"/>
<constraint firstItem="5uX-Iz-YQ7" firstAttribute="centerY" secondItem="lhT-1U-5Xh" secondAttribute="centerY" id="6lt-qw-e8A"/>
<constraint firstItem="MPG-5z-OT3" firstAttribute="centerY" secondItem="lhT-1U-5Xh" secondAttribute="centerY" constant="-9" id="H4W-Z9-mEf"/>
<constraint firstItem="MPG-5z-OT3" firstAttribute="leading" secondItem="lhT-1U-5Xh" secondAttribute="leading" constant="15" id="TQk-wA-dY6"/>
<constraint firstItem="V2s-M6-mOE" firstAttribute="centerY" secondItem="lhT-1U-5Xh" secondAttribute="centerY" constant="9" id="W9M-LF-h7f"/>
<constraint firstItem="5uX-Iz-YQ7" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="MPG-5z-OT3" secondAttribute="trailing" constant="8" symbolic="YES" id="amL-O6-1DD"/>
<constraint firstAttribute="height" constant="60" id="bYK-jU-WEc"/>
<constraint firstAttribute="width" constant="370" id="iNf-4e-Q4K"/>
<constraint firstItem="5uX-Iz-YQ7" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="V2s-M6-mOE" secondAttribute="trailing" constant="8" symbolic="YES" id="o2M-HU-xYe"/>
<constraint firstItem="V2s-M6-mOE" firstAttribute="leading" secondItem="lhT-1U-5Xh" secondAttribute="leading" constant="15" id="qq6-jH-ejI"/>
</constraints>
</customView>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="2dP-HG-cdi" secondAttribute="trailing" id="6gh-ZQ-gJJ"/>
<constraint firstItem="VAL-LC-T3T" firstAttribute="top" secondItem="jc3-9p-Bfo" secondAttribute="top" id="9QK-kP-Jub"/>
<constraint firstAttribute="trailing" secondItem="2yz-Bt-IMN" secondAttribute="trailing" id="Fm8-bP-i1Z"/>
<constraint firstItem="LTZ-IH-4Vy" firstAttribute="centerX" secondItem="jc3-9p-Bfo" secondAttribute="centerX" id="Fu9-Mt-We0"/>
<constraint firstItem="LTZ-IH-4Vy" firstAttribute="top" secondItem="jc3-9p-Bfo" secondAttribute="top" constant="40" id="PE0-jE-Dbl"/>
<constraint firstItem="2dP-HG-cdi" firstAttribute="leading" secondItem="jc3-9p-Bfo" secondAttribute="leading" id="PmN-uQ-mSV"/>
<constraint firstAttribute="bottom" secondItem="2yz-Bt-IMN" secondAttribute="bottom" id="SIB-8x-LBj"/>
<constraint firstAttribute="bottom" secondItem="lhT-1U-5Xh" secondAttribute="bottom" constant="38" id="UI1-Tn-4WQ"/>
<constraint firstItem="2dP-HG-cdi" firstAttribute="top" secondItem="VAL-LC-T3T" secondAttribute="bottom" id="amL-Rg-EUD"/>
<constraint firstItem="2yz-Bt-IMN" firstAttribute="leading" secondItem="jc3-9p-Bfo" secondAttribute="leading" id="pKb-NR-26E"/>
<constraint firstItem="lhT-1U-5Xh" firstAttribute="centerX" secondItem="jc3-9p-Bfo" secondAttribute="centerX" id="rjQ-PW-SWC"/>
<constraint firstItem="VAL-LC-T3T" firstAttribute="leading" secondItem="jc3-9p-Bfo" secondAttribute="leading" id="sP2-Xj-nWJ"/>
<constraint firstItem="2yz-Bt-IMN" firstAttribute="top" secondItem="2dP-HG-cdi" secondAttribute="bottom" id="u7y-lk-Ug0"/>
<constraint firstAttribute="trailing" secondItem="VAL-LC-T3T" secondAttribute="trailing" id="yNN-sY-waa"/>
</constraints>
</visualEffectView>
<connections>
<outlet property="addButton" destination="ceK-ED-PfL" id="6o3-ow-6Jm"/>
<outlet property="allowlistModeCheckBox" destination="gnb-pe-ZN5" id="HTP-3G-Zme"/>
<outlet property="applicationSourceMenuControl" destination="v6G-mQ-Ddk" id="dfx-xG-DcT"/>
<outlet property="createButton" destination="lhT-1U-5Xh" id="mGX-gX-oxZ"/>
<outlet property="delButton" destination="HZK-yc-ptT" id="Kww-VP-a9A"/>
<outlet property="manuallySelectFromFinderMenuItem" destination="dhF-95-kUJ" id="Ny0-LT-dUM"/>
<outlet property="runningAndInstalledManuItem" destination="R0d-21-g6W" id="a14-sX-cP3"/>
<outlet property="tableEmpty" destination="LTZ-IH-4Vy" id="DlB-dd-xPl"/>
<outlet property="tableFoot" destination="2yz-Bt-IMN" id="p9I-Ev-m33"/>
<outlet property="tableHead" destination="VAL-LC-T3T" id="odB-4n-XWl"/>
<outlet property="tableView" destination="LmV-gi-3fE" id="GOb-17-dvX"/>
</connections>
</viewController>
<menu id="v6G-mQ-Ddk">
<items>
<menuItem title="Running Applications" id="R0d-21-g6W">
<modifierMask key="keyEquivalentModifierMask" shift="YES"/>
</menuItem>
<menuItem title="Manually Select From Finder" id="dhF-95-kUJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="addItemFromFinderClick:" target="bga-wG-iim" id="lxS-d8-5Mt"/>
</connections>
</menuItem>
</items>
</menu>
</objects>
<point key="canvasLocation" x="1928" y="1276.5"/>
</scene>
<!--Application Allowlist hint-->
<scene sceneID="57E-oo-PEW">
<objects>
<viewController id="o12-9v-Ej5" userLabel="Application Allowlist hint" customClass="AdaptivePopover" customModule="Mos" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" id="wdx-Jb-jwG">
<rect key="frame" x="0.0" y="0.0" width="224" height="62"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KGW-PK-8DX">
<rect key="frame" x="10" y="10" width="204" height="42"/>
<textFieldCell key="cell" controlSize="mini" sendsActionOnEndEditing="YES" alignment="left" title="The allow list mode will make Mos only apply to apps within the application list." id="v26-RK-BtL">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="KGW-PK-8DX" firstAttribute="leading" secondItem="wdx-Jb-jwG" secondAttribute="leading" constant="12" id="5rV-8B-s42"/>
<constraint firstItem="KGW-PK-8DX" firstAttribute="top" secondItem="wdx-Jb-jwG" secondAttribute="top" constant="10" id="Axi-G9-NcE"/>
<constraint firstAttribute="bottom" secondItem="KGW-PK-8DX" secondAttribute="bottom" constant="10" id="eB3-8M-xul"/>
<constraint firstAttribute="trailing" secondItem="KGW-PK-8DX" secondAttribute="trailing" constant="12" id="iBp-5y-gRA"/>
</constraints>
</view>
</viewController>
<customObject id="ZNV-FD-bQh" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1928" y="1653"/>
</scene>
<!--Updates-->
<scene sceneID="VTW-lQ-Mfk">
<objects>
<viewController title="Updates" storyboardIdentifier="updates" id="EWu-DP-7Gj" customClass="PreferencesUpdatesViewController" customModule="Mos" customModuleProvider="target" sceneMemberID="viewController">
<visualEffectView key="view" blendingMode="behindWindow" material="toolTip" state="followsWindowActiveState" id="YxW-TX-zxt">
<rect key="frame" x="0.0" y="0.0" width="450" height="120"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Gxs-4f-Jdz">
<rect key="frame" x="18" y="85" width="140" height="16"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="136" id="S8E-6O-qj5"/>
</constraints>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="right" title="Check for updates:" id="vdI-K4-SBh">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button wantsLayer="YES" springLoaded="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4kr-7i-Wm2">
<rect key="frame" x="171" y="82" width="130" height="18"/>
<buttonCell key="cell" type="roundRect" title="Check Now" bezelStyle="roundedRect" alignment="center" state="on" borderStyle="border" allowsMixedState="YES" imageScaling="proportionallyDown" inset="2" id="T9f-TL-GYj">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="systemLight" size="12"/>
</buttonCell>
<constraints>
<constraint firstAttribute="height" constant="18" id="eCL-n5-Cbk"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="130" id="hhf-HO-fRT"/>
</constraints>
<connections>
<action selector="checkButtonClick:" target="EWu-DP-7Gj" id="0pW-49-jYc"/>
</connections>
</button>
<textField wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="114-aw-aH2">
<rect key="frame" x="169" y="63" width="263" height="13"/>
gitextract_eih3fj_1/
├── .github/
│ └── ISSUE_TEMPLATE/
│ ├── bug-report-------.md
│ └── feature-request-------.md
├── .gitignore
├── .last-release-commit
├── .skills/
│ └── release-preparation/
│ ├── SKILL.md
│ └── scripts/
│ ├── create_gh_draft.sh
│ ├── prepare_zip.sh
│ └── update_appcast.sh
├── CHANGELOG.md
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── ISSUE_TEMPLATE.md
├── LICENSE
├── LOCALIZATION.md
├── Mos/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── AppStatusBarIcon.imageset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── Donate/
│ │ │ ├── AlipayLogo.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── AlipayQR.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── BuyMeACoffee.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ ├── MEOW.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── PaypalLogo.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── WechatpayLogo.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── WechatpayQR.imageset/
│ │ │ └── Contents.json
│ │ ├── Guidance/
│ │ │ ├── Contents.json
│ │ │ ├── drag-arrow.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── manual-remove.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── sparkle.imageset/
│ │ │ └── Contents.json
│ │ ├── Monitor/
│ │ │ ├── Contents.json
│ │ │ └── SF.arrow.clockwise.imageset/
│ │ │ └── Contents.json
│ │ ├── Preferences/
│ │ │ ├── Contents.json
│ │ │ ├── SF.app.background.dotted.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.arrow.triangle.capsulepath.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.button.horizontal.top.press.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.circle.dotted.circle.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.ellipsis.circle.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.gearshape.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.lasso.badge.sparkles.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.minus.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.person.crop.circle.dashed.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.plus.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.scribble.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── SF.tray.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── SF.wand.and.rays.inverse.imageset/
│ │ │ └── Contents.json
│ │ └── StatusItem/
│ │ ├── Contents.json
│ │ ├── SF.escape.imageset/
│ │ │ └── Contents.json
│ │ ├── SF.gauge.imageset/
│ │ │ └── Contents.json
│ │ ├── SF.hidpp.imageset/
│ │ │ └── Contents.json
│ │ └── SF.square.stack.3d.down.right.imageset/
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── Main.storyboard
│ ├── ButtonCore/
│ │ ├── ButtonCore.swift
│ │ ├── ButtonFilter.swift
│ │ └── ButtonUtils.swift
│ ├── Components/
│ │ ├── AdaptivePopover.swift
│ │ ├── BrandTag.swift
│ │ ├── DraggingImageView.swift
│ │ └── PrimaryButton.swift
│ ├── Extension/
│ │ ├── CGEvent+Extensions.swift
│ │ └── NSColor+Extensions.swift
│ ├── Info.plist
│ ├── InputEvent/
│ │ ├── MosInputEvent.swift
│ │ └── MosInputProcessor.swift
│ ├── Keys/
│ │ ├── KeyCode.swift
│ │ ├── KeyPopover.swift
│ │ ├── KeyPreview.swift
│ │ └── KeyRecorder.swift
│ ├── Localizable.xcstrings
│ ├── LogitechHID/
│ │ ├── LogitechDeviceSession.swift
│ │ ├── LogitechHIDDebugPanel.swift
│ │ └── LogitechHIDManager.swift
│ ├── Managers/
│ │ ├── StatusItemManager.swift
│ │ ├── UpdateManager.swift
│ │ └── WindowManager.swift
│ ├── MosRelease.entitlements
│ ├── Options/
│ │ └── Options.swift
│ ├── ScrollCore/
│ │ ├── Interpolator.swift
│ │ ├── ScrollCore.swift
│ │ ├── ScrollDispatchContext.swift
│ │ ├── ScrollEvent.swift
│ │ ├── ScrollFilter.swift
│ │ ├── ScrollPhase.swift
│ │ ├── ScrollPoster.swift
│ │ └── ScrollUtils.swift
│ ├── Shortcut/
│ │ ├── ShortcutExecutor.swift
│ │ ├── ShortcutManager.swift
│ │ └── SystemShortcut.swift
│ ├── Utils/
│ │ ├── Archieve.swift
│ │ ├── Constants.swift
│ │ ├── EnhanceArray.swift
│ │ ├── Interceptor.swift
│ │ └── Utils.swift
│ ├── Windows/
│ │ ├── IntroductionWindow/
│ │ │ ├── IntroductionViewController.swift
│ │ │ └── IntroductionWindowController.swift
│ │ ├── MonitorWindow/
│ │ │ ├── Logger.swift
│ │ │ ├── MonitorViewController.swift
│ │ │ └── MonitorWindowController.swift
│ │ ├── PreferencesWindow/
│ │ │ ├── AboutView/
│ │ │ │ ├── PreferencesAboutViewController.swift
│ │ │ │ ├── PreferencesContributorsViewController.swift
│ │ │ │ └── PreferencesDonateViewController.swift
│ │ │ ├── ApplicationView/
│ │ │ │ ├── Application.swift
│ │ │ │ └── PreferencesApplicationViewController.swift
│ │ │ ├── ButtonsView/
│ │ │ │ ├── ButtonTableCellView.swift
│ │ │ │ ├── PreferencesButtonsViewController.swift
│ │ │ │ └── RecordedEvent.swift
│ │ │ ├── GeneralView/
│ │ │ │ └── PreferencesGeneralViewController.swift
│ │ │ ├── PreferencesTabViewController.swift
│ │ │ ├── PreferencesWindowController.swift
│ │ │ ├── ScrollingView/
│ │ │ │ ├── PreferencesScrollingViewController.swift
│ │ │ │ ├── PreferencesScrollingWithApplicationViewController.swift
│ │ │ │ ├── ScrollOptionsContextProviding.swift
│ │ │ │ ├── ScrollReverseDetailSettingsPopoverViewController.swift
│ │ │ │ └── ScrollSmoothDetailSettingsPopoverViewController.swift
│ │ │ └── UpdateView/
│ │ │ └── PreferencesUpdatesViewController.swift
│ │ └── WelcomeWindow/
│ │ ├── WelcomeViewController.swift
│ │ └── WelcomeWindowController.swift
│ └── mul.lproj/
│ └── Main.xcstrings
├── Mos.xcodeproj/
│ ├── project.pbxproj
│ ├── project.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ ├── IDEWorkspaceChecks.plist
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── swiftpm/
│ │ └── Package.resolved
│ └── xcshareddata/
│ └── xcschemes/
│ ├── Debug.xcscheme
│ └── Profile.xcscheme
├── README.enUS.md
├── README.id.md
├── README.md
├── README.ru.md
├── Resource/
│ ├── Icon/
│ │ └── SFIcon/
│ │ └── IconGrops.sketch
│ └── designs.sketch
├── dmg/
│ ├── README.md
│ ├── archive/
│ │ ├── Intro.psd
│ │ └── dmgBackground.psd
│ └── create-dmg.command
├── docs/
│ ├── .nojekyll
│ ├── 404/
│ │ └── index.html
│ ├── 404.html
│ ├── CNAME
│ ├── __next.__PAGE__.txt
│ ├── __next._full.txt
│ ├── __next._head.txt
│ ├── __next._index.txt
│ ├── __next._tree.txt
│ ├── _next/
│ │ └── static/
│ │ ├── 4xlWUdmYkOQZmVpTO2yEI/
│ │ │ ├── _buildManifest.js
│ │ │ ├── _clientMiddlewareManifest.json
│ │ │ └── _ssgManifest.js
│ │ └── chunks/
│ │ ├── 12c422bc11762090.js
│ │ ├── 19717b1d18b1c046.js
│ │ ├── 2f0565a65fa02d97.js
│ │ ├── 543732a8392562b4.css
│ │ ├── a6dad97d9634a72d.js
│ │ ├── b4611851359555bd.js
│ │ ├── b492b32695e3b282.js
│ │ ├── c62ecb7f1a587007.js
│ │ ├── d95bda38d1a9ce53.js
│ │ ├── f1a98b44d1dc31f1.js
│ │ └── turbopack-98aeb181aa636c3c.js
│ ├── _not-found/
│ │ ├── __next._full.txt
│ │ ├── __next._head.txt
│ │ ├── __next._index.txt
│ │ ├── __next._not-found.__PAGE__.txt
│ │ ├── __next._not-found.txt
│ │ ├── __next._tree.txt
│ │ ├── index.html
│ │ └── index.txt
│ ├── appcast.xml
│ ├── index.html
│ ├── index.txt
│ ├── llms.txt
│ ├── release-notes/
│ │ ├── 4.0.0-beta-20260108.1.en.html
│ │ ├── 4.0.0-beta-20260108.1.zh.html
│ │ ├── 4.0.0-beta-20260201.1.en.html
│ │ ├── 4.0.0-beta-20260201.1.md
│ │ ├── 4.0.0-beta-20260201.1.zh.html
│ │ ├── 4.0.0-beta-20260203.1.en.html
│ │ ├── 4.0.0-beta-20260203.1.zh.html
│ │ ├── beta.en.html
│ │ └── beta.zh.html
│ ├── robots.txt
│ ├── sitemap.xml
│ └── superpowers/
│ ├── plans/
│ │ └── 2026-03-16-logitech-hid-integration.md
│ └── specs/
│ └── 2026-03-16-logitech-hid-integration-design.md
├── tools/
│ ├── hidpp-divert-debug.swift
│ ├── hidpp-divert-fix.swift
│ ├── hidpp-full-test.swift
│ ├── hidpp-probe.swift
│ ├── hidpp-undivert-test.swift
│ └── hidpp-verify-final.swift
└── website/
├── .nvmrc
├── CNAME
├── README.md
├── app/
│ ├── components/
│ │ ├── BentoCard/
│ │ │ └── BentoCard.tsx
│ │ ├── CopyButton/
│ │ │ └── CopyButton.tsx
│ │ ├── EasingPlayground/
│ │ │ └── EasingPlayground.tsx
│ │ ├── FlowField/
│ │ │ └── FlowField.tsx
│ │ ├── HeroCurvePanel/
│ │ │ └── HeroCurvePanel.tsx
│ │ ├── LanguageSelector/
│ │ │ └── LanguageSelector.tsx
│ │ ├── Magnetic/
│ │ │ └── Magnetic.tsx
│ │ ├── Modal/
│ │ │ ├── Modal.tsx
│ │ │ └── hooks.ts
│ │ └── Reveal/
│ │ └── Reveal.tsx
│ ├── globals.css
│ ├── home-client.tsx
│ ├── i18n/
│ │ ├── context.tsx
│ │ ├── de.ts
│ │ ├── el.ts
│ │ ├── en.ts
│ │ ├── format.ts
│ │ ├── id.ts
│ │ ├── ja.ts
│ │ ├── ko.ts
│ │ ├── pl.ts
│ │ ├── ru.ts
│ │ ├── tr.ts
│ │ ├── uk.ts
│ │ ├── zh-Hant.ts
│ │ └── zh.ts
│ ├── layout.tsx
│ ├── page.tsx
│ ├── providers.tsx
│ ├── robots.ts
│ ├── services/
│ │ ├── github.ts
│ │ └── utils.ts
│ ├── site.ts
│ └── sitemap.ts
├── archive/
│ ├── v0/
│ │ ├── index.css
│ │ ├── index.html
│ │ ├── index.js
│ │ ├── indexCN.html
│ │ └── reset.css
│ └── v1/
│ ├── assets/
│ │ └── fonts/
│ │ └── ubuntu/
│ │ └── font.css
│ ├── index.html
│ ├── index.template.html
│ ├── package.json
│ ├── src/
│ │ ├── i18n/
│ │ │ ├── image.js
│ │ │ └── text.js
│ │ ├── index.css
│ │ ├── index.js
│ │ ├── parallaxButton/
│ │ │ ├── index.css
│ │ │ └── index.js
│ │ ├── releases/
│ │ │ └── index.js
│ │ └── reset.css
│ └── webpack.config.js
├── backup/
│ └── openclaw-memory-2026-02-11-0132.tgz
├── docs/
│ └── plans/
│ ├── 2026-02-25-taste-redesign-design.md
│ └── 2026-02-25-taste-redesign.md
├── eslint.config.mjs
├── next-env.d.ts
├── next.config.ts
├── package.json
├── pnpm-workspace.yaml
├── postcss.config.mjs
├── public/
│ └── llms.txt
├── scripts/
│ └── publish-docs.sh
├── tailwind.config.ts
├── tsconfig.json
└── tsconfig.tsbuildinfo
SYMBOL INDEX (1540 symbols across 32 files)
FILE: docs/_next/static/chunks/12c422bc11762090.js
class u (line 1) | class u{disable(){throw i}getStore(){}run(){throw i}exit(){throw i}enter...
method disable (line 1) | disable(){throw i}
method getStore (line 1) | getStore(){}
method run (line 1) | run(){throw i}
method exit (line 1) | exit(){throw i}
method enterWith (line 1) | enterWith(){throw i}
method bind (line 1) | static bind(e){return e}
function c (line 1) | function c(){return s?new s:new u}
function a (line 1) | function a(e){return s?s.bind(e):u.bind(e)}
function l (line 1) | function l(){return s?s.snapshot():function(e,...t){return e(...t)}}
function o (line 1) | function o({error:e}){if(n){let t=n.getStore();if(t?.isStaticGeneration)...
function i (line 1) | function i(){throw Error("setTimeout has not been defined")}
function u (line 1) | function u(){throw Error("clearTimeout has not been defined")}
method disable (line 1) | disable(){throw i}
method getStore (line 1) | getStore(){}
method run (line 1) | run(){throw i}
method exit (line 1) | exit(){throw i}
method enterWith (line 1) | enterWith(){throw i}
method bind (line 1) | static bind(e){return e}
function s (line 1) | function s(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&s...
function f (line 1) | function f(){a&&n&&(a=!1,n.length?c=n.concat(c):l=-1,c.length&&p())}
function p (line 1) | function p(){if(!a){var e=s(f);a=!0;for(var t=c.length;t;){for(n=c,c=[];...
function d (line 1) | function d(e,t){this.fun=e,this.array=t}
function y (line 1) | function y(){}
function i (line 1) | function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={expo...
function o (line 1) | function o(e,t,r){var o=null;if(void 0!==r&&(o=""+r),void 0!==t.key&&(o=...
function S (line 1) | function S(e,t,r){this.props=e,this.context=t,this.refs=b,this.updater=r...
function O (line 1) | function O(){}
function j (line 1) | function j(e,t,r){this.props=e,this.context=t,this.refs=b,this.updater=r...
function w (line 1) | function w(){}
function x (line 1) | function x(e,t,r){var n=r.ref;return{$$typeof:o,type:e,key:t,ref:void 0!...
function A (line 1) | function A(e){return"object"==typeof e&&null!==e&&e.$$typeof===o}
function k (line 1) | function k(e,t){var r,n;return"object"==typeof e&&null!==e&&null!=e.key?...
function M (line 1) | function M(e,t,r){if(null==e)return e;var n=[],u=0;return!function e(t,r...
function H (line 1) | function H(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t...
function I (line 1) | function I(e){var t=P.T,r={};r.types=null!==t?t.types:null,P.T=r;try{var...
function N (line 1) | function N(e){var t=P.T;if(null!==t){var r=t.types;null===r?t.types=[e]:...
function o (line 1) | function o(e){var t="https://react.dev/errors/"+e;if(1<arguments.length)...
function i (line 1) | function i(){}
function l (line 1) | function l(e,t){return"font"===e?"":"string"==typeof t?"use-credentials"...
function n (line 1) | function n(e){if("function"!=typeof WeakMap)return null;var t=new WeakMa...
function i (line 1) | function i(){return!1}
function u (line 1) | function u(){return""}
method disable (line 1) | disable(){throw i}
method getStore (line 1) | getStore(){}
method run (line 1) | run(){throw i}
method exit (line 1) | exit(){throw i}
method enterWith (line 1) | enterWith(){throw i}
method bind (line 1) | static bind(e){return e}
function i (line 1) | function i(e){return["async","defer","noModule"].includes(e)}
function u (line 1) | function u(e,t){for(let[r,u]of Object.entries(t)){if(!t.hasOwnProperty(r...
method disable (line 1) | disable(){throw i}
method getStore (line 1) | getStore(){}
method run (line 1) | run(){throw i}
method exit (line 1) | exit(){throw i}
method enterWith (line 1) | enterWith(){throw i}
method bind (line 1) | static bind(e){return e}
FILE: docs/_next/static/chunks/19717b1d18b1c046.js
function l (line 1) | function l({children:e}){let[l,s]=(0,a.useState)("en"),c=(0,a.useRef)(!1...
function s (line 1) | function s(){let e=(0,a.useContext)(n);if(!e)throw Error("useI18n must b...
function m (line 1) | function m(e){let{strategy:t="afterInteractive"}=e;"lazyOnload"===t?wind...
function g (line 1) | function g(e){e.forEach(m),[...document.querySelectorAll('[data-nscript=...
function y (line 1) | function y(e){let{id:t,src:a="",onLoad:i=()=>{},onReady:r=null,strategy:...
function i (line 1) | function i({children:e}){return(0,t.jsx)(a.I18nProvider,{children:e})}
FILE: docs/_next/static/chunks/2f0565a65fa02d97.js
function n (line 1) | function n(e,t={}){if(t.onlyHashChange)return void e();let r=document.do...
method get (line 1) | static get(e,t,r){let n=Reflect.get(e,t,r);return"function"==typeof n?...
method set (line 1) | static set(e,t,r,n){return Reflect.set(e,t,r,n)}
method has (line 1) | static has(e,t){return Reflect.has(e,t)}
method deleteProperty (line 1) | static deleteProperty(e,t){return Reflect.deleteProperty(e,t)}
class u (line 1) | class u extends o.default.Component{constructor(e){super(e),this.state={...
method constructor (line 1) | constructor(e){super(e),this.state={triggeredStatus:void 0,previousPat...
method componentDidCatch (line 1) | componentDidCatch(){}
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isHTTPAccessFallbackError)(...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPat...
method render (line 1) | render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.pr...
method constructor (line 1) | constructor(e=null,t){this.abortSignal=e,this.hasRuntimePrefetch=t,thi...
method onStage (line 1) | onStage(e,t){if(this.currentStage>=e)t();else if(3===e)this.runtimeSta...
method canSyncInterrupt (line 1) | canSyncInterrupt(){if(1===this.currentStage)return!1;let e=this.hasRun...
method syncInterruptCurrentStageWithReason (line 1) | syncInterruptCurrentStageWithReason(e){if(1!==this.currentStage){if(th...
method getStaticInterruptReason (line 1) | getStaticInterruptReason(){return this.staticInterruptReason}
method getRuntimeInterruptReason (line 1) | getRuntimeInterruptReason(){return this.runtimeInterruptReason}
method getStaticStageEndTime (line 1) | getStaticStageEndTime(){return this.staticStageEndTime}
method getRuntimeStageEndTime (line 1) | getRuntimeStageEndTime(){return this.runtimeStageEndTime}
method abandonRender (line 1) | abandonRender(){if(!this.mayAbandon)throw Object.defineProperty(new i....
method abandonRenderImpl (line 1) | abandonRenderImpl(){let{currentStage:e}=this;switch(e){case 2:this.cur...
method advanceStage (line 1) | advanceStage(e){if(e<=this.currentStage)return;let t=this.currentStage...
method resolveRuntimeStage (line 1) | resolveRuntimeStage(){let e=this.runtimeStageListeners;for(let t=0;t<e...
method resolveDynamicStage (line 1) | resolveDynamicStage(){let e=this.dynamicStageListeners;for(let t=0;t<e...
method getStagePromise (line 1) | getStagePromise(e){switch(e){case 3:return this.runtimeStagePromise.pr...
method waitForStage (line 1) | waitForStage(e){return this.getStagePromise(e)}
method delayUntilStage (line 1) | delayUntilStage(e,t,r){var n,a,o;let i,s=(n=this.getStagePromise(e),a=...
function l (line 1) | function l({notFound:e,forbidden:t,unauthorized:r,children:n}){let s=(0,...
function a (line 1) | function a(e,t){let[r,a]=(0,n.useState)(()=>({tree:e,stateKey:t,next:nul...
function v (line 1) | function v(e,t){let r=e.getBoundingClientRect();return r.top>=0&&r.top<=t}
class O (line 1) | class O extends i.default.Component{componentDidMount(){this.handlePoten...
method componentDidMount (line 1) | componentDidMount(){this.handlePotentialScroll()}
method componentDidUpdate (line 1) | componentDidUpdate(){this.props.focusAndScrollRef.apply&&this.handlePo...
method render (line 1) | render(){return this.props.children}
method constructor (line 1) | constructor(...e){super(...e),this.handlePotentialScroll=()=>{let{focu...
function R (line 1) | function R({segmentPath:e,children:t}){let r=(0,i.useContext)(c.GlobalLa...
function E (line 1) | function E({tree:e,segmentPath:t,debugNameContext:r,cacheNode:n,params:a...
function j (line 1) | function j({name:e,loading:t,children:r}){let n;if(n="object"==typeof t&...
function w (line 1) | function w({parallelRouterKey:e,error:t,errorStyles:r,errorScripts:n,tem...
function s (line 1) | function s(){let e=(0,o.useContext)(i.TemplateContext);return(0,a.jsx)(a...
function a (line 1) | function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);retu...
function a (line 1) | function a(e){let t=n.get(e);if(t)return t;let r=Promise.resolve(e);retu...
class n (line 1) | class n{static get(e,t,r){let n=Reflect.get(e,t,r);return"function"==typ...
method get (line 1) | static get(e,t,r){let n=Reflect.get(e,t,r);return"function"==typeof n?...
method set (line 1) | static set(e,t,r,n){return Reflect.set(e,t,r,n)}
method has (line 1) | static has(e,t){return Reflect.has(e,t)}
method deleteProperty (line 1) | static deleteProperty(e,t){return Reflect.deleteProperty(e,t)}
function a (line 1) | function a(e){if("function"!=typeof WeakMap)return null;var t=new WeakMa...
function c (line 1) | function c(e){return function(...t){s(e(...t))}}
function i (line 1) | function i(e,t){return o.test(t)?`\`${e}.${t}\``:`\`${e}[${JSON.stringif...
function s (line 1) | function s(e,t){let r=JSON.stringify(t);return`\`Reflect.has(${e}, ${r})...
function s (line 1) | function s(e,t){throw Object.defineProperty(new o.StaticGenBailoutError(...
function c (line 1) | function c(e,t){let r=Object.defineProperty(Error(`Route ${e.route} used...
function u (line 1) | function u(){let e=i.afterTaskAsyncStorage.getStore();return(null==e?voi...
method constructor (line 1) | constructor(e){super(e),this.state={triggeredStatus:void 0,previousPat...
method componentDidCatch (line 1) | componentDidCatch(){}
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isHTTPAccessFallbackError)(...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPat...
method render (line 1) | render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.pr...
method constructor (line 1) | constructor(e=null,t){this.abortSignal=e,this.hasRuntimePrefetch=t,thi...
method onStage (line 1) | onStage(e,t){if(this.currentStage>=e)t();else if(3===e)this.runtimeSta...
method canSyncInterrupt (line 1) | canSyncInterrupt(){if(1===this.currentStage)return!1;let e=this.hasRun...
method syncInterruptCurrentStageWithReason (line 1) | syncInterruptCurrentStageWithReason(e){if(1!==this.currentStage){if(th...
method getStaticInterruptReason (line 1) | getStaticInterruptReason(){return this.staticInterruptReason}
method getRuntimeInterruptReason (line 1) | getRuntimeInterruptReason(){return this.runtimeInterruptReason}
method getStaticStageEndTime (line 1) | getStaticStageEndTime(){return this.staticStageEndTime}
method getRuntimeStageEndTime (line 1) | getRuntimeStageEndTime(){return this.runtimeStageEndTime}
method abandonRender (line 1) | abandonRender(){if(!this.mayAbandon)throw Object.defineProperty(new i....
method abandonRenderImpl (line 1) | abandonRenderImpl(){let{currentStage:e}=this;switch(e){case 2:this.cur...
method advanceStage (line 1) | advanceStage(e){if(e<=this.currentStage)return;let t=this.currentStage...
method resolveRuntimeStage (line 1) | resolveRuntimeStage(){let e=this.runtimeStageListeners;for(let t=0;t<e...
method resolveDynamicStage (line 1) | resolveDynamicStage(){let e=this.dynamicStageListeners;for(let t=0;t<e...
method getStagePromise (line 1) | getStagePromise(e){switch(e){case 3:return this.runtimeStagePromise.pr...
method waitForStage (line 1) | waitForStage(e){return this.getStagePromise(e)}
method delayUntilStage (line 1) | delayUntilStage(e,t,r){var n,a,o;let i,s=(n=this.getStagePromise(e),a=...
class u (line 1) | class u{constructor(e=null,t){this.abortSignal=e,this.hasRuntimePrefetch...
method constructor (line 1) | constructor(e){super(e),this.state={triggeredStatus:void 0,previousPat...
method componentDidCatch (line 1) | componentDidCatch(){}
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isHTTPAccessFallbackError)(...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPat...
method render (line 1) | render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.pr...
method constructor (line 1) | constructor(e=null,t){this.abortSignal=e,this.hasRuntimePrefetch=t,thi...
method onStage (line 1) | onStage(e,t){if(this.currentStage>=e)t();else if(3===e)this.runtimeSta...
method canSyncInterrupt (line 1) | canSyncInterrupt(){if(1===this.currentStage)return!1;let e=this.hasRun...
method syncInterruptCurrentStageWithReason (line 1) | syncInterruptCurrentStageWithReason(e){if(1!==this.currentStage){if(th...
method getStaticInterruptReason (line 1) | getStaticInterruptReason(){return this.staticInterruptReason}
method getRuntimeInterruptReason (line 1) | getRuntimeInterruptReason(){return this.runtimeInterruptReason}
method getStaticStageEndTime (line 1) | getStaticStageEndTime(){return this.staticStageEndTime}
method getRuntimeStageEndTime (line 1) | getRuntimeStageEndTime(){return this.runtimeStageEndTime}
method abandonRender (line 1) | abandonRender(){if(!this.mayAbandon)throw Object.defineProperty(new i....
method abandonRenderImpl (line 1) | abandonRenderImpl(){let{currentStage:e}=this;switch(e){case 2:this.cur...
method advanceStage (line 1) | advanceStage(e){if(e<=this.currentStage)return;let t=this.currentStage...
method resolveRuntimeStage (line 1) | resolveRuntimeStage(){let e=this.runtimeStageListeners;for(let t=0;t<e...
method resolveDynamicStage (line 1) | resolveDynamicStage(){let e=this.dynamicStageListeners;for(let t=0;t<e...
method getStagePromise (line 1) | getStagePromise(e){switch(e){case 3:return this.runtimeStagePromise.pr...
method waitForStage (line 1) | waitForStage(e){return this.getStagePromise(e)}
method delayUntilStage (line 1) | delayUntilStage(e,t,r){var n,a,o;let i,s=(n=this.getStagePromise(e),a=...
function l (line 1) | function l(){}
function p (line 1) | function p(e,t){let r=s.workUnitAsyncStorage.getStore();if(r)switch(r.ty...
function m (line 1) | function m(e,t){let r=s.workUnitAsyncStorage.getStore();if(r)switch(r.ty...
function g (line 1) | function g(e){if(e.forceStatic)return Promise.resolve({});let t=s.workUn...
function y (line 1) | function y(e,t){if(e.forceStatic)return Promise.resolve({});switch(t.typ...
function b (line 1) | function b(e,t,r){return t.forceStatic?Promise.resolve({}):v(e)}
function S (line 1) | function S(e){let t=_.get(e);if(t)return t;let r=Promise.resolve({}),n=n...
function v (line 1) | function v(e){let t=P.get(e);if(t)return t;let r=Promise.resolve(e);retu...
function h (line 1) | function h(e,t){let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.ty...
function g (line 1) | function g(e,t){let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.ty...
function y (line 1) | function y(e,t){let r=c.workUnitAsyncStorage.getStore();if(r)switch(r.ty...
function b (line 1) | function b(e){let t=o.workAsyncStorage.getStore();if(!t)throw Object.def...
function P (line 1) | function P(e,t,r){switch(r.type){case"prerender":case"prerender-client":...
function _ (line 1) | function _(e,t){return(0,s.delayUntilRuntimeStage)(t,O(e))}
function O (line 1) | function O(e){let t=S.get(e);if(t)return t;let r=Promise.resolve(e);retu...
method componentDidMount (line 1) | componentDidMount(){this.handlePotentialScroll()}
method componentDidUpdate (line 1) | componentDidUpdate(){this.props.focusAndScrollRef.apply&&this.handlePo...
method render (line 1) | render(){return this.props.children}
method constructor (line 1) | constructor(...e){super(...e),this.handlePotentialScroll=()=>{let{focu...
function u (line 1) | function u({Component:t,serverProvidedParams:r}){let u,l;if(null!==r)u=r...
method constructor (line 1) | constructor(e){super(e),this.state={triggeredStatus:void 0,previousPat...
method componentDidCatch (line 1) | componentDidCatch(){}
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isHTTPAccessFallbackError)(...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){return e.pathname!==t.previousPat...
method render (line 1) | render(){let{notFound:e,forbidden:t,unauthorized:r,children:n}=this.pr...
method constructor (line 1) | constructor(e=null,t){this.abortSignal=e,this.hasRuntimePrefetch=t,thi...
method onStage (line 1) | onStage(e,t){if(this.currentStage>=e)t();else if(3===e)this.runtimeSta...
method canSyncInterrupt (line 1) | canSyncInterrupt(){if(1===this.currentStage)return!1;let e=this.hasRun...
method syncInterruptCurrentStageWithReason (line 1) | syncInterruptCurrentStageWithReason(e){if(1!==this.currentStage){if(th...
method getStaticInterruptReason (line 1) | getStaticInterruptReason(){return this.staticInterruptReason}
method getRuntimeInterruptReason (line 1) | getRuntimeInterruptReason(){return this.runtimeInterruptReason}
method getStaticStageEndTime (line 1) | getStaticStageEndTime(){return this.staticStageEndTime}
method getRuntimeStageEndTime (line 1) | getRuntimeStageEndTime(){return this.runtimeStageEndTime}
method abandonRender (line 1) | abandonRender(){if(!this.mayAbandon)throw Object.defineProperty(new i....
method abandonRenderImpl (line 1) | abandonRenderImpl(){let{currentStage:e}=this;switch(e){case 2:this.cur...
method advanceStage (line 1) | advanceStage(e){if(e<=this.currentStage)return;let t=this.currentStage...
method resolveRuntimeStage (line 1) | resolveRuntimeStage(){let e=this.runtimeStageListeners;for(let t=0;t<e...
method resolveDynamicStage (line 1) | resolveDynamicStage(){let e=this.dynamicStageListeners;for(let t=0;t<e...
method getStagePromise (line 1) | getStagePromise(e){switch(e){case 3:return this.runtimeStagePromise.pr...
method waitForStage (line 1) | waitForStage(e){return this.getStagePromise(e)}
method delayUntilStage (line 1) | delayUntilStage(e,t,r){var n,a,o;let i,s=(n=this.getStagePromise(e),a=...
function s (line 1) | function s({Component:t,slots:r,serverProvidedParams:s}){let c;if(null!=...
FILE: docs/_next/static/chunks/a6dad97d9634a72d.js
function e (line 1) | function e(t){var e={exports:{}};return t(e,e.exports),e.exports}
function t (line 1) | function t(){}
function t (line 1) | function t(){}
function t (line 1) | function t(){}
function Jm (line 1) | function Jm(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^...
function Qm (line 1) | function Qm(t){return"string"!=typeof t&&(t=String(t)),t}
function Zm (line 1) | function Zm(t){var e={next:function(){var e=t.shift();return{done:void 0...
function tb (line 1) | function tb(t){this.map={},t instanceof tb?t.forEach(function(t,e){this....
function eb (line 1) | function eb(t){if(t.bodyUsed)return Promise.reject(new TypeError("Alread...
function rb (line 1) | function rb(t){return new Promise(function(e,r){t.onload=function(){e(t....
function nb (line 1) | function nb(t){var e=new FileReader,r=rb(e);return e.readAsArrayBuffer(t...
function ob (line 1) | function ob(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteL...
function ib (line 1) | function ib(){return this.bodyUsed=!1,this._initBody=function(t){var e;t...
function ub (line 1) | function ub(t,e){var r=(e=e||{}).body;if(t instanceof ub){if(t.bodyUsed)...
function sb (line 1) | function sb(t){var e=new FormData;return t.trim().split("&").forEach(fun...
function cb (line 1) | function cb(t,e){e||(e={}),this.type="default",this.status=void 0===e.st...
function hb (line 1) | function hb(t,e){return new Promise(function(r,n){var o=new ub(t,e);if(o...
FILE: docs/_next/static/chunks/b4611851359555bd.js
function l (line 1) | function l(){let e=document.currentScript;if(!(e instanceof HTMLScriptEl...
function a (line 1) | function a(e){var t,n;let a=(0,r.getAssetPrefix)();t=self.__next_s,n=()=...
function a (line 1) | function a(e){return Object.prototype.toString.call(e)}
function o (line 1) | function o(e){if("[object Object]"!==a(e))return!1;let t=Object.getProto...
function o (line 1) | function o(e){return"object"==typeof e&&null!==e&&"name"in e&&"message"i...
function i (line 1) | function i(e){let t;return o(e)?e:Object.defineProperty(Error((0,a.isPla...
method constructor (line 1) | constructor(e){super(e),this.state={hasError:!1},this.rootHtml="",this...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){return{hasError:!0}}
method componentDidMount (line 1) | componentDidMount(){let e=this.htmlRef.current;this.state.hasError&&e&...
method render (line 1) | render(){let{hasError:e}=this.state;return("u">typeof window&&!this.ro...
function c (line 1) | function c(e){return s.has(e)}
function r (line 1) | function r(e,t){var n=e.length;for(e.push(t);0<n;){var r=n-1>>>1,l=e[r];...
function l (line 1) | function l(e){return 0===e.length?null:e[0]}
function a (line 1) | function a(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t)...
function o (line 1) | function o(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}
function E (line 1) | function E(e){for(var t=l(d);null!==t;){if(null===t.callback)a(d);else i...
function x (line 1) | function x(e){if(y=!1,E(e),!v)if(null!==l(f))v=!0,_||(_=!0,i());else{var...
function T (line 1) | function T(){return!!b||!(n.unstable_now()-C<P)}
function O (line 1) | function O(){if(b=!1,_){var e=n.unstable_now();C=e;var t=!0;try{e:{v=!1,...
function R (line 1) | function R(e,t){N=w(function(){e(n.unstable_now())},t)}
function u (line 1) | function u(e){var t="https://react.dev/errors/"+e;if(1<arguments.length)...
function s (line 1) | function s(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}
function c (line 1) | function c(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{...
function f (line 1) | function f(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&null!==(...
function d (line 1) | function d(e){if(31===e.tag){var t=e.memoizedState;if(null===t&&null!==(...
function p (line 1) | function p(e){if(c(e)!==e)throw Error(u(188))}
function m (line 1) | function m(e,t,n,r,l,a){for(;null!==e;){if(5===e.tag&&n(e,r,l,a)||(22!==...
function h (line 1) | function h(e){for(e=e.return;null!==e;){if(3===e.tag||5===e.tag)return e...
function g (line 1) | function g(e){switch(e.tag){case 5:return e.stateNode;case 3:return e.st...
function b (line 1) | function b(e){return v=e,!0}
function w (line 1) | function w(e,t,n){return e===n||e===t&&(v=e,!0)}
function k (line 1) | function k(e,t,n){return e===n?(y=e,!1):e===t&&(null!==y&&(v=e),!0)}
function S (line 1) | function S(e){if(null===e)return null;do e=null===e?null:e.return;while(...
function E (line 1) | function E(e,t,n){for(var r=0,l=e;l;l=n(l))r++;l=0;for(var a=t;a;a=n(a))...
function H (line 1) | function H(e){return null===e||"object"!=typeof e?null:"function"==typeo...
function Y (line 1) | function Y(e){return{current:e}}
function J (line 1) | function J(e){0>G||(e.current=X[G],X[G]=null,G--)}
function Z (line 1) | function Z(e,t){X[++G]=e.current,e.current=t}
function el (line 1) | function el(e,t){switch(Z(en,t),Z(et,e),Z(ee,null),t.nodeType){case 9:ca...
function ea (line 1) | function ea(){J(ee),J(et),J(en)}
function eo (line 1) | function eo(e){var t=e.memoizedState;null!==t&&(fv._currentValue=t.memoi...
function ei (line 1) | function ei(e){et.current===e&&(J(ee),J(et)),er.current===e&&(J(er),fv._...
function eu (line 1) | function eu(e){if(void 0===tX)try{throw Error()}catch(e){var t=e.stack.t...
function ec (line 1) | function ec(e,t){if(!e||es)return"";es=!0;var n=Error.prepareStackTrace;...
function ef (line 1) | function ef(e){try{var t="",n=null;do t+=function(e,t){switch(e.tag){cas...
function eL (line 1) | function eL(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1...
function eR (line 1) | function eR(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var l=0,a=e.su...
function eM (line 1) | function eM(e,t){return 0==(e.pendingLanes&~(e.suspendedLanes&~e.pingedL...
function eI (line 1) | function eI(){var e=ez;return 0==(0x3c00000&(ez<<=1))&&(ez=4194304),e}
function eD (line 1) | function eD(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}
function eF (line 1) | function eF(e,t){e.pendingLanes|=t,0x10000000!==t&&(e.suspendedLanes=0,e...
function eA (line 1) | function eA(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-eN(t)...
function ej (line 1) | function ej(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var...
function eU (line 1) | function eU(e,t){var n=t&-t;return 0!=((n=0!=(42&n)?1:eB(n))&(e.suspende...
function eB (line 1) | function eB(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;...
function eV (line 1) | function eV(e){return 2<(e&=-e)?8<e?0!=(0x7ffffff&e)?32:0x10000000:8:2}
function eH (line 1) | function eH(){var e=q.p;return 0!==e?e:void 0===(e=window.event)?32:fL(e...
function e$ (line 1) | function e$(e,t){var n=q.p;try{return q.p=e,t()}finally{q.p=n}}
function e0 (line 1) | function e0(e){delete e[eW],delete e[eq],delete e[eX],delete e[eG],delet...
function e1 (line 1) | function e1(e){var t;if(t=e[eW])return t;for(var n=e.parentNode;n;){if(t...
function e2 (line 1) | function e2(e){if(e=e[eW]||e[eK]){var t=e.tag;if(5===t||6===t||13===t||3...
function e3 (line 1) | function e3(e){var t=e.tag;if(5===t||26===t||27===t||6===t)return e.stat...
function e4 (line 1) | function e4(e){var t=e[eJ];return t||(t=e[eJ]={hoistableStyles:new Map,h...
function e5 (line 1) | function e5(e){e[eZ]=!0}
function e9 (line 1) | function e9(e,t){e7(e,t),e7(e+"Capture",t)}
function e7 (line 1) | function e7(e,t){for(e6[e]=t,e=0;e<t.length;e++)e8.add(t[e])}
function tl (line 1) | function tl(){var e=tr;return tr=!1,e}
function ta (line 1) | function ta(e,t,n){if(ed.call(tn,t)||!ed.call(tt,t)&&(te.test(t)?tn[t]=!...
function to (line 1) | function to(e,t,n){if(null===n)e.removeAttribute(t);else{switch(typeof n...
function ti (line 1) | function ti(e,t,n,r){if(null===r)e.removeAttribute(n);else{switch(typeof...
function tu (line 1) | function tu(e){switch(typeof e){case"bigint":case"boolean":case"number":...
function ts (line 1) | function ts(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCas...
function tc (line 1) | function tc(e){if(!e._valueTracker){var t=ts(e)?"checked":"value";e._val...
function tf (line 1) | function tf(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n...
function td (line 1) | function td(e){if(void 0===(e=e||("u">typeof document?document:void 0)))...
function tm (line 1) | function tm(e){return e.replace(tp,function(e){return"\\"+e.charCodeAt(0...
function th (line 1) | function th(e,t,n,r,l,a,o,i){e.name="",null!=o&&"function"!=typeof o&&"s...
function tg (line 1) | function tg(e,t,n,r,l,a,o,i){if(null!=a&&"function"!=typeof a&&"symbol"!...
function tv (line 1) | function tv(e,t,n){"number"===t&&td(e.ownerDocument)===e||e.defaultValue...
function ty (line 1) | function ty(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l<n.length;l++)t...
function tb (line 1) | function tb(e,t,n){if(null!=t&&((t=""+tu(t))!==e.value&&(e.value=t),null...
function tw (line 1) | function tw(e,t,n,r){if(null==t){if(null!=r){if(null!=n)throw Error(u(92...
function tk (line 1) | function tk(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.n...
function tE (line 1) | function tE(e,t,n){var r=0===t.indexOf("--");null==n||"boolean"==typeof ...
function tx (line 1) | function tx(e,t,n){if(null!=t&&"object"!=typeof t)throw Error(u(62));if(...
function t_ (line 1) | function t_(e){if(-1===e.indexOf("-"))return!1;switch(e){case"annotation...
function tC (line 1) | function tC(e){return tP.test(""+e)?"javascript:throw new Error('React h...
function tT (line 1) | function tT(){}
function tz (line 1) | function tz(e){return(e=e.target||e.srcElement||window).correspondingUse...
function tM (line 1) | function tM(e){var t=e2(e);if(t&&(e=t.stateNode)){var n=e[eq]||null;swit...
function tD (line 1) | function tD(e,t,n){if(tI)return e(t,n);tI=!0;try{return e(t)}finally{if(...
function tF (line 1) | function tF(e,t){var n=e.stateNode;if(null===n)return null;var r=n[eq]||...
function t$ (line 1) | function t$(){if(tH)return tH;var e,t,n=tV,r=n.length,l="value"in tB?tB....
function tQ (line 1) | function tQ(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&...
function tW (line 1) | function tW(){return!0}
function tq (line 1) | function tq(){return!1}
function tK (line 1) | function tK(e){function t(t,n,r,l,a){for(var o in this._reactName=t,this...
function nl (line 1) | function nl(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
function na (line 1) | function na(){return nl}
function ny (line 1) | function ny(e,t){switch(e){case"keyup":return -1!==nd.indexOf(t.keyCode)...
function nb (line 1) | function nb(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}
function nS (line 1) | function nS(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"inpu...
function nE (line 1) | function nE(e,t,n,r){tL?tR?tR.push(r):tR=[r]:tL=r,0<(t=s5(t,"onChange"))...
function nN (line 1) | function nN(e){sY(e,0)}
function nP (line 1) | function nP(e){if(tf(e3(e)))return e}
function nC (line 1) | function nC(e,t){if("change"===e)return t}
function nL (line 1) | function nL(){nx&&(nx.detachEvent("onpropertychange",nR),n_=nx=null)}
function nR (line 1) | function nR(e){if("value"===e.propertyName&&nP(n_)){var t=[];nE(t,n_,e,t...
function nM (line 1) | function nM(e,t,n){"focusin"===e?(nL(),nx=t,n_=n,nx.attachEvent("onprope...
function nI (line 1) | function nI(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)retu...
function nD (line 1) | function nD(e,t){if("click"===e)return nP(t)}
function nF (line 1) | function nF(e,t){if("input"===e||"change"===e)return nP(t)}
function nj (line 1) | function nj(e,t){if(nA(e,t))return!0;if("object"!=typeof e||null===e||"o...
function nU (line 1) | function nU(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
function nB (line 1) | function nB(e,t){var n,r=nU(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.t...
function nV (line 1) | function nV(e){e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.d...
function nH (line 1) | function nH(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
function nX (line 1) | function nX(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.owne...
function nG (line 1) | function nG(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["W...
function n0 (line 1) | function n0(e){if(nJ[e])return nJ[e];if(!nY[e])return e;var t,n=nY[e];fo...
function re (line 1) | function re(e,t){n9.set(e,t),e9(t,[e])}
function rn (line 1) | function rn(e,t){return null!=e.name&&"auto"!==e.name?e.name:null!==t.au...
function rr (line 1) | function rr(e){if(null==e||"string"==typeof e)return e;var t=null,n=u1;i...
function rl (line 1) | function rl(e,t){return e=rr(e),null==(t=rr(t))?"auto"===e?null:e:"auto"...
function rs (line 1) | function rs(){for(var e=ri,t=ru=ri=0;t<e;){var n=ro[t];ro[t++]=null;var ...
function rc (line 1) | function rc(e,t,n,r){ro[ri++]=e,ro[ri++]=t,ro[ri++]=n,ro[ri++]=r,ru|=r,e...
function rf (line 1) | function rf(e,t,n,r){return rc(e,t,n,r),rm(e)}
function rd (line 1) | function rd(e,t){return rc(e,null,null,t),rm(e)}
function rp (line 1) | function rp(e,t,n){e.lanes|=n;var r=e.alternate;null!==r&&(r.lanes|=n);f...
function rm (line 1) | function rm(e){if(50<u2)throw u2=0,u3=null,Error(u(185));for(var t=e.ret...
function rg (line 1) | function rg(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this....
function rv (line 1) | function rv(e,t,n,r){return new rg(e,t,n,r)}
function ry (line 1) | function ry(e){return!(!(e=e.prototype)||!e.isReactComponent)}
function rb (line 1) | function rb(e,t){var n=e.alternate;return null===n?((n=rv(e.tag,t,e.key,...
function rw (line 1) | function rw(e,t){e.flags&=0x7e00002;var n=e.alternate;return null===n?(e...
function rk (line 1) | function rk(e,t,n,r,l,a){var o=0;if(r=e,"function"==typeof e)ry(e)&&(o=1...
function rS (line 1) | function rS(e,t,n,r){return(e=rv(7,e,r,t)).lanes=n,e}
function rE (line 1) | function rE(e,t,n){return(e=rv(6,e,null,t)).lanes=n,e}
function rx (line 1) | function rx(e){var t=rv(18,null,null,0);return t.stateNode=e,t}
function r_ (line 1) | function r_(e,t,n){return(t=rv(4,null!==e.children?e.children:[],e.key,t...
function rP (line 1) | function rP(e,t){if("object"==typeof e&&null!==e){var n=rN.get(e);return...
function rF (line 1) | function rF(e,t){rC[rT++]=rz,rC[rT++]=rO,rO=e,rz=t}
function rA (line 1) | function rA(e,t,n){rL[rR++]=rI,rL[rR++]=rD,rL[rR++]=rM,rM=e;var r=rI;e=r...
function rj (line 1) | function rj(e){null!==e.return&&(rF(e,1),rA(e,1,0))}
function rU (line 1) | function rU(e){for(;e===rO;)rO=rC[--rT],rC[rT]=null,rz=rC[--rT],rC[rT]=n...
function rB (line 1) | function rB(e,t){rL[rR++]=rI,rL[rR++]=rD,rL[rR++]=rM,rI=t.id,rD=t.overfl...
function rK (line 1) | function rK(e){var t=Error(u(418,1<arguments.length&&void 0!==arguments[...
function rX (line 1) | function rX(e){var t=e.stateNode,n=e.type,r=e.memoizedProps;switch(t[eW]...
function rG (line 1) | function rG(e){for(rV=e.return;rV;)switch(rV.tag){case 5:case 31:case 13...
function rY (line 1) | function rY(e){if(e!==rV)return!1;if(!r$)return rG(e),r$=!0,!1;var t,n=e...
function rJ (line 1) | function rJ(){rH=rV=null,r$=!1}
function rZ (line 1) | function rZ(){var e=rQ;return null!==e&&(null===uj?uj=e:uj.push.apply(uj...
function r0 (line 1) | function r0(e){null===rQ?rQ=[e]:rQ.push(e)}
function r4 (line 1) | function r4(e,t,n){Z(r1,t._currentValue),t._currentValue=n}
function r5 (line 1) | function r5(e){e._currentValue=r1.current,J(r1)}
function r8 (line 1) | function r8(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)...
function r6 (line 1) | function r6(e,t,n,r){var l=e.child;for(null!==l&&(l.return=e);null!==l;)...
function r9 (line 1) | function r9(e,t,n,r){e=null;for(var l=t,a=!1;null!==l;){if(!a){if(0!=(52...
function r7 (line 1) | function r7(e){for(e=e.firstContext;null!==e;){if(!nA(e.context._current...
function le (line 1) | function le(e){r2=e,r3=null,null!==(e=e.dependencies)&&(e.firstContext=n...
function lt (line 1) | function lt(e){return lr(r2,e)}
function ln (line 1) | function ln(e,t){return null===r2&&le(e),lr(e,t)}
function lr (line 1) | function lr(e,t){var n=t._currentValue;if(t={context:t,memoizedValue:n,n...
function lu (line 1) | function lu(){return{controller:new ll,data:new Map,refCount:0}}
function ls (line 1) | function ls(e){e.refCount--,0===e.refCount&&la(lo,function(){e.controlle...
function lc (line 1) | function lc(e,t){if(0!=(4194048&e.pendingLanes)){var n=e.transitionTypes...
function lg (line 1) | function lg(){if(0==--lp&&(lf=null,null!==ld)){null!==lh&&(lh.status="fu...
function lb (line 1) | function lb(){var e=ly.current;return null!==e?e:uE.pooledCache}
function lw (line 1) | function lw(e,t){null===t?Z(ly,ly.current):Z(ly,t.pool)}
function lk (line 1) | function lk(){var e=lb();return null===e?null:{parent:li._currentValue,p...
function lN (line 1) | function lN(e){return"fulfilled"===(e=e.status)||"rejected"===e}
function lP (line 1) | function lP(e,t,n){switch(void 0===(n=e[n])?e.push(t):n!==t&&(t.then(tT,...
function lC (line 1) | function lC(e){try{return(0,e._init)(e._payload)}catch(e){if(null!==e&&"...
function lO (line 1) | function lO(){if(null===lT)throw Error(u(459));var e=lT;return lT=null,e}
function lz (line 1) | function lz(e){if(e===lS||e===lx)throw Error(u(483))}
function lM (line 1) | function lM(e){var t=lR;return lR+=1,null===lL&&(lL=[]),lP(lL,e,t)}
function lI (line 1) | function lI(e,t){e.ref=void 0!==(t=t.props.ref)?t:null}
function lD (line 1) | function lD(e,t){if(t.$$typeof===_)throw Error(u(525));throw Error(u(31,...
function lF (line 1) | function lF(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.delet...
function lB (line 1) | function lB(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:...
function lV (line 1) | function lV(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={base...
function lH (line 1) | function lH(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}
function l$ (line 1) | function l$(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.sh...
function lQ (line 1) | function lQ(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,0!=(4194048&...
function lW (line 1) | function lW(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r...
function lK (line 1) | function lK(){if(lq){var e=lh;if(null!==e)throw e}}
function lX (line 1) | function lX(e,t,n,r){lq=!1;var l=e.updateQueue;lU=!1;var a=l.firstBaseUp...
function lG (line 1) | function lG(e,t){if("function"!=typeof e)throw Error(u(191,e));e.call(t)}
function lY (line 1) | function lY(e,t){var n=e.callbacks;if(null!==n)for(e.callbacks=null,e=0;...
function l0 (line 1) | function l0(e,t){Z(lZ,e=uz),Z(lJ,t),uz=e|t.baseLanes}
function l1 (line 1) | function l1(){Z(lZ,uz),Z(lJ,lJ.current)}
function l2 (line 1) | function l2(){uz=lZ.current,J(lJ),J(lZ)}
function l5 (line 1) | function l5(e){var t=e.alternate;Z(ae,1&ae.current),Z(l3,e),null===l4&&(...
function l8 (line 1) | function l8(e){Z(ae,ae.current),Z(l3,e),null===l4&&(l4=e)}
function l6 (line 1) | function l6(e){22===e.tag?(Z(ae,ae.current),Z(l3,e),null===l4&&(l4=e)):l...
function l9 (line 1) | function l9(){Z(ae,ae.current),Z(l3,l3.current)}
function l7 (line 1) | function l7(e){J(l3),l4===e&&(l4=null),J(ae)}
function at (line 1) | function at(e,t){Z(l3,l3.current),Z(ae,t)}
function an (line 1) | function an(e){J(ae),J(l3),l4===e&&(l4=null)}
function ar (line 1) | function ar(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedSta...
function ah (line 1) | function ah(){throw Error(u(321))}
function ag (line 1) | function ag(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length...
function av (line 1) | function av(e,t,n,r,l,a){return al=a,aa=t,t.memoizedState=null,t.updateQ...
function ay (line 1) | function ay(e){W.H=oS;var t=null!==ao&&null!==ao.next;if(al=0,ai=ao=aa=n...
function ab (line 1) | function ab(e,t,n,r){aa=e;var l=0;do{if(as&&(ap=null),ad=0,as=!1,25<=l)t...
function aw (line 1) | function aw(){var e=W.H,t=e.useState()[0];return t="function"==typeof t....
function ak (line 1) | function ak(){var e=0!==af;return af=0,e}
function aS (line 1) | function aS(e,t,n){t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n}
function aE (line 1) | function aE(e){if(au){for(e=e.memoizedState;null!==e;){var t=e.queue;nul...
function ax (line 1) | function ax(){var e={memoizedState:null,baseState:null,baseQueue:null,qu...
function a_ (line 1) | function a_(){if(null===ao){var e=aa.alternate;e=null!==e?e.memoizedStat...
function aN (line 1) | function aN(){return{lastEffect:null,events:null,stores:null,memoCache:n...
function aP (line 1) | function aP(e){var t=ad;return ad+=1,null===ap&&(ap=[]),e=lP(ap,e,t),t=a...
function aC (line 1) | function aC(e){if(null!==e&&"object"==typeof e){if("function"==typeof e....
function aT (line 1) | function aT(e){var t=null,n=aa.updateQueue;if(null!==n&&(t=n.memoCache),...
function aO (line 1) | function aO(e,t){return"function"==typeof t?t(e):t}
function az (line 1) | function az(e){return aL(a_(),ao,e)}
function aL (line 1) | function aL(e,t,n){var r=e.queue;if(null===r)throw Error(u(311));r.lastR...
function aR (line 1) | function aR(e){var t=a_(),n=t.queue;if(null===n)throw Error(u(311));n.la...
function aM (line 1) | function aM(e,t,n){var r=aa,l=a_(),a=r$;if(a){if(void 0===n)throw Error(...
function aI (line 1) | function aI(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=aa...
function aD (line 1) | function aD(e,t,n,r){t.value=n,t.getSnapshot=r,aA(t)&&aj(e)}
function aF (line 1) | function aF(e,t,n){return n(function(){aA(t)&&aj(e)})}
function aA (line 1) | function aA(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!nA(e,n...
function aj (line 1) | function aj(e){var t=rd(e,2);null!==t&&u6(t,e,2)}
function aU (line 1) | function aU(e){var t=ax();return"function"==typeof e&&(e=e()),t.memoized...
function aB (line 1) | function aB(e,t,n,r){return e.baseState=n,aL(e,ao,"function"==typeof r?r...
function aV (line 1) | function aV(e,t,n,r,l){if(ob(e))throw Error(u(485));if(null!==(e=t.actio...
function aH (line 1) | function aH(e,t){var n=t.action,r=t.payload,l=e.state;if(t.isTransition)...
function a$ (line 1) | function a$(e,t,n){null!==n&&"object"==typeof n&&"function"==typeof n.th...
function aQ (line 1) | function aQ(e,t,n){t.status="fulfilled",t.value=n,aq(t),e.state=n,null!=...
function aW (line 1) | function aW(e,t,n){var r=e.pending;if(e.pending=null,null!==r){r=r.next;...
function aq (line 1) | function aq(e){e=e.listeners;for(var t=0;t<e.length;t++)(0,e[t])()}
function aK (line 1) | function aK(e,t){return t}
function aX (line 1) | function aX(e,t){if(r$){var n=uE.formState;if(null!==n){e:{var r=aa;if(r...
function aG (line 1) | function aG(e){return aY(a_(),ao,e)}
function aY (line 1) | function aY(e,t,n){if(t=aL(e,t,aK)[0],e=az(aO)[0],"object"==typeof t&&nu...
function aJ (line 1) | function aJ(e,t){e.action=t}
function aZ (line 1) | function aZ(e){var t=a_(),n=ao;if(null!==n)return aY(t,n,e);a_(),t=t.mem...
function a0 (line 1) | function a0(e,t,n,r){return e={tag:e,create:n,deps:r,inst:t,next:null},n...
function a1 (line 1) | function a1(){return a_().memoizedState}
function a2 (line 1) | function a2(e,t,n,r){var l=ax();aa.flags|=e,l.memoizedState=a0(1|t,{dest...
function a3 (line 1) | function a3(e,t,n,r){var l=a_();r=void 0===r?null:r;var a=l.memoizedStat...
function a4 (line 1) | function a4(e,t){a2(8390656,8,e,t)}
function a5 (line 1) | function a5(e,t){a3(2048,8,e,t)}
function a8 (line 1) | function a8(e){var t=a_().memoizedState,n={ref:t,nextImpl:e};aa.flags|=4...
function a6 (line 1) | function a6(e,t){return a3(4,2,e,t)}
function a9 (line 1) | function a9(e,t){return a3(4,4,e,t)}
function a7 (line 1) | function a7(e,t){if("function"==typeof t){var n=t(e=e());return function...
function oe (line 1) | function oe(e,t,n){n=null!=n?n.concat([e]):null,a3(4,4,a7.bind(null,t,e)...
function ot (line 1) | function ot(){}
function on (line 1) | function on(e,t){var n=a_();t=void 0===t?null:t;var r=n.memoizedState;re...
function or (line 1) | function or(e,t){var n=a_();t=void 0===t?null:t;var r=n.memoizedState;re...
function ol (line 1) | function ol(e,t,n){return void 0===n||0!=(0x40000000&al)&&0==(261930&u_)...
function oa (line 1) | function oa(e,t,n,r){return nA(n,t)?n:null!==lJ.current?(nA(e=ol(e,n,r),...
function oo (line 1) | function oo(e,t,n,r,l){var a=q.p;q.p=0!==a&&8>a?a:8;var o=W.T,i={};i.typ...
function oi (line 1) | function oi(){}
function ou (line 1) | function ou(e,t,n,r){if(5!==e.tag)throw Error(u(476));var l=os(e).queue;...
function os (line 1) | function os(e){var t=e.memoizedState;if(null!==t)return t;var n={};retur...
function oc (line 1) | function oc(e){var t=os(e);null===t.next&&(t=e.alternate.memoizedState),...
function of (line 1) | function of(){return lt(fv)}
function od (line 1) | function od(){return a_().memoizedState}
function op (line 1) | function op(){return a_().memoizedState}
function om (line 1) | function om(e){for(var t=e.return;null!==t;){switch(t.tag){case 24:case ...
function oh (line 1) | function oh(e,t,n){var r=u4();n={lane:r,revertLane:0,gesture:null,action...
function og (line 1) | function og(e,t,n){ov(e,t,n,u4())}
function ov (line 1) | function ov(e,t,n,r){var l={lane:r,revertLane:0,gesture:null,action:n,ha...
function oy (line 1) | function oy(e,t,n,r){if(r={lane:2,revertLane:s$(),gesture:null,action:r,...
function ob (line 1) | function ob(e){var t=e.alternate;return e===aa||null!==t&&t===aa}
function ow (line 1) | function ow(e,t){as=au=!0;var n=e.pending;null===n?t.next=t:(t.next=n.ne...
function ok (line 1) | function ok(e,t,n){if(0!=(4194048&n)){var r=t.lanes;r&=e.pendingLanes,t....
function oN (line 1) | function oN(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:x({},t,n),e.me...
function oC (line 1) | function oC(e,t,n,r,l,a,o){return"function"==typeof(e=e.stateNode).shoul...
function oT (line 1) | function oT(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceive...
function oO (line 1) | function oO(e,t){var n=t;if("ref"in t)for(var r in n={},t)"ref"!==r&&(n[...
function oz (line 1) | function oz(e){ra(e)}
function oL (line 1) | function oL(e){console.error(e)}
function oR (line 1) | function oR(e){ra(e)}
function oM (line 1) | function oM(e,t){try{(0,e.onUncaughtError)(t.value,{componentStack:t.sta...
function oI (line 1) | function oI(e,t,n){try{(0,e.onCaughtError)(n.value,{componentStack:n.sta...
function oD (line 1) | function oD(e,t,n){return(n=lH(n)).tag=3,n.payload={element:null},n.call...
function oF (line 1) | function oF(e){return(e=lH(e)).tag=3,e}
function oA (line 1) | function oA(e,t,n,r){var l=n.type.getDerivedStateFromError;if("function"...
function oB (line 1) | function oB(e,t,n,r){t.child=null===e?lj(t,null,n,r):lA(t,e.child,n,r)}
function oV (line 1) | function oV(e,t,n,r,l){n=n.render;var a=t.ref;if("ref"in r){var o={};for...
function oH (line 1) | function oH(e,t,n,r,l){if(null===e){var a=n.type;return"function"!=typeo...
function o$ (line 1) | function o$(e,t,n,r,l){if(null!==e){var a=e.memoizedProps;if(nj(a,r)&&e....
function oQ (line 1) | function oQ(e,t,n,r){var l=r.children,a=null!==e?e.memoizedState:null;if...
function oW (line 1) | function oW(e,t){return null!==e&&22===e.tag||null!==t.stateNode||(t.sta...
function oq (line 1) | function oq(e,t,n,r,l){var a=lb();return t.memoizedState={baseLanes:n,ca...
function oK (line 1) | function oK(e,t){return(t=o8({mode:t.mode,children:t.children},e.mode))....
function oX (line 1) | function oX(e,t,n){return lA(t,e.child,null,n),e=oK(t,t.pendingProps),e....
function oG (line 1) | function oG(e,t){var n=t.ref;if(null===n)null!==e&&null!==e.ref&&(t.flag...
function oY (line 1) | function oY(e,t,n,r,l){return(le(t),n=av(e,t,n,r,void 0,l),r=ak(),null==...
function oJ (line 1) | function oJ(e,t,n,r,l,a){return(le(t),t.updateQueue=null,n=ab(t,r,n,l),a...
function oZ (line 1) | function oZ(e,t,n,r,l){if(le(t),null===t.stateNode){var a=rh,o=n.context...
function o0 (line 1) | function o0(e,t,n,r){return rJ(),t.flags|=256,oB(e,t,n,r),t.child}
function o2 (line 1) | function o2(e){return{baseLanes:e,cachePool:lk()}}
function o3 (line 1) | function o3(e,t,n){return e=null!==e?e.childLanes&~n:0,t&&(e|=uD),e}
function o4 (line 1) | function o4(e,t,n){var r,l=t.pendingProps,a=!1,o=0!=(128&t.flags);if((r=...
function o5 (line 1) | function o5(e,t){return(t=o8({mode:"visible",children:t},e.mode)).return...
function o8 (line 1) | function o8(e,t){return(e=rv(22,e,null,t)).lanes=0,e}
function o6 (line 1) | function o6(e,t,n){return lA(t,e.child,null,n),e=o5(t,t.pendingProps.chi...
function o9 (line 1) | function o9(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),r...
function o7 (line 1) | function o7(e){for(var t=null;null!==e;){var n=e.alternate;null!==n&&nul...
function ie (line 1) | function ie(e,t,n,r,l,a){var o=e.memoizedState;null===o?e.memoizedState=...
function it (line 1) | function it(e){var t=e.child;for(e.child=null;null!==t;){var n=t.sibling...
function ir (line 1) | function ir(e,t,n){var r=t.pendingProps,l=r.revealOrder,a=r.tail;r=r.chi...
function il (line 1) | function il(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),uR|=t.la...
function ia (line 1) | function ia(e,t){return 0!=(e.lanes&t)||!!(null!==(e=e.dependencies)&&r7...
function io (line 1) | function io(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps)oU=!0...
function ii (line 1) | function ii(e){e.flags|=4}
function iu (line 1) | function iu(e,t,n,r,l){var a;if((a=0!=(32&e.mode))&&(a=null===n?fo(t,r):...
function is (line 1) | function is(e,t){if("stylesheet"!==t.type||0!=(4&t.state.loading))e.flag...
function ic (line 1) | function ic(e,t){null!==t&&(e.flags|=4),16384&e.flags&&(t=22!==e.tag?eI(...
function id (line 1) | function id(e,t){if(!r$)switch(e.tailMode){case"visible":break;case"coll...
function ip (line 1) | function ip(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0...
function im (line 1) | function im(e,t){switch(rU(t),t.tag){case 3:r5(li),ea();break;case 26:ca...
function ih (line 1) | function ih(e,t){try{var n=t.updateQueue,r=null!==n?n.lastEffect:null;if...
function ig (line 1) | function ig(e,t,n){try{var r=t.updateQueue,l=null!==r?r.lastEffect:null;...
function iv (line 1) | function iv(e){var t=e.updateQueue;if(null!==t){var n=e.stateNode;try{lY...
function iy (line 1) | function iy(e,t,n){n.props=oO(e.type,e.memoizedProps),n.state=e.memoized...
function ib (line 1) | function ib(e,t){try{var n=e.ref;if(null!==n){switch(e.tag){case 26:case...
function iw (line 1) | function iw(e,t){var n=e.ref,r=e.refCleanup;if(null!==n)if("function"==t...
function ik (line 1) | function ik(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{switch(t...
function iS (line 1) | function iS(e,t,n){try{var r=e.stateNode;(function(e,t,n,r){switch(t){ca...
function iE (line 1) | function iE(e,t){if(5===e.tag&&null===e.alternate&&null!==t)for(var n=0;...
function ix (line 1) | function ix(e){for(var t=e.return;null!==t;){if(iN(t)){var n=e.stateNode...
function i_ (line 1) | function i_(e){return 5===e.tag||3===e.tag||26===e.tag||27===e.tag&&cy(e...
function iN (line 1) | function iN(e){return e&&7===e.tag&&null!==e.stateNode}
function iP (line 1) | function iP(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||i_(...
function iC (line 1) | function iC(e,t,n,r){var l=e.tag;if(5===l||6===l)l=e.stateNode,t?n.inser...
function iT (line 1) | function iT(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,...
function iL (line 1) | function iL(e){(30===e.tag||0!=(0x2000000&e.subtreeFlags))&&(iO=!0)}
function iM (line 1) | function iM(){var e=iR;return iR=null,e}
function iD (line 1) | function iD(e,t,n,r,l){return iI=0,function e(t,n,r,l,a){for(var o=!1;nu...
function iF (line 1) | function iF(e,t){for(;null!==e;)5===e.tag?cS(e.stateNode,e.memoizedProps...
function iA (line 1) | function iA(e){if(0!=(0x1200000&e.subtreeFlags))for(e=e.child;null!==e;)...
function ij (line 1) | function ij(e,t){if(30===e.tag){var n=e.stateNode,r=e.memoizedProps,l=rn...
function iU (line 1) | function iU(e){if(null!==iz&&0!==iz.size){var t=iz;if(0!=(0x1200000&e.su...
function iB (line 1) | function iB(e){if(30===e.tag){var t=e.memoizedProps,n=rn(t,e.stateNode),...
function iV (line 1) | function iV(e){if(0!=(0x1200000&e.subtreeFlags))for(e=e.child;null!==e;)...
function iH (line 1) | function iH(e){if(30===e.tag)e.stateNode.paired=null,iF(e.child,!1),iV(e...
function i$ (line 1) | function i$(e,t,n,r,l,a,o){for(var i=!1;null!==t;){if(5===t.tag){var u=t...
function i1 (line 1) | function i1(e){for(;null!==iG;){var t=iG,n=e,r=t.alternate,l=t.flags;swi...
function i2 (line 1) | function i2(e,t,n){var r=n.flags;switch(n.tag){case 0:case 11:case 15:ui...
function i3 (line 1) | function i3(e,t){for(e=e.child;null!==e;)(function e(t,n){switch(t.tag){...
function i8 (line 1) | function i8(e,t,n){for(n=n.child;null!==n;)i6(e,t,n),n=n.sibling}
function i6 (line 1) | function i6(e,t,n){if(e_&&"function"==typeof e_.onCommitFiberUnmount)try...
function i9 (line 1) | function i9(e,t){if(null===t.memoizedState&&null!==(e=t.alternate)&&null...
function i7 (line 1) | function i7(e,t){if(null===t.memoizedState&&null!==(e=t.alternate)&&null...
function ue (line 1) | function ue(e,t){var n=function(e){switch(e.tag){case 31:case 13:case 19...
function ut (line 1) | function ut(e,t,n){var r=t.deletions;if(null!==r)for(var l=0;l<r.length;...
function ur (line 1) | function ur(e,t,n){var r=e.alternate,l=e.flags;switch(e.tag){case 0:case...
function ul (line 1) | function ul(e){var t=e.flags;if(2&t){try{for(var n,r=null,l=e.return;nul...
function ua (line 1) | function ua(e,t){if(9270&t.subtreeFlags)for(t=t.child;null!==t;)uo(t,e),...
function uo (line 1) | function uo(e,t){var n=e.alternate;if(null===n)ij(e,!1);else switch(e.ta...
function ui (line 1) | function ui(e,t){if(8772&t.subtreeFlags)for(t=t.child;null!==t;)i2(e,t.a...
function uu (line 1) | function uu(e,t){var n=null;null!==e&&null!==e.memoizedState&&null!==e.m...
function us (line 1) | function us(e,t){e=null,null!==t.alternate&&(e=t.alternate.memoizedState...
function uc (line 1) | function uc(e,t,n,r){var l=(0x13ffff00&n)===n;if(t.subtreeFlags&(l?10262...
function uf (line 1) | function uf(e,t,n,r){var l=(0x13ffff00&n)===n;l&&null===t.alternate&&nul...
function ud (line 1) | function ud(e,t){if(10256&t.subtreeFlags)for(t=t.child;null!==t;){var n=...
function um (line 1) | function um(e,t,n){if(e.subtreeFlags&up)for(e=e.child;null!==e;)uh(e,t,n...
function uh (line 1) | function uh(e,t,n){switch(e.tag){case 26:um(e,t,n),e.flags&up&&(null!==e...
function ug (line 1) | function ug(e){var t=e.alternate;if(null!==t&&null!==(e=t.child)){t.chil...
function uv (line 1) | function uv(e){var t=e.deletions;if(0!=(16&e.flags)){if(null!==t)for(var...
function uy (line 1) | function uy(e){switch(e.tag){case 0:case 11:case 15:uv(e),2048&e.flags&&...
function ub (line 1) | function ub(e,t){for(;null!==iG;){var n=iG;switch(n.tag){case 0:case 11:...
function u4 (line 1) | function u4(){return 0!=(2&uS)&&0!==u_?u_&-u_:null!==W.T?s$():eH()}
function u5 (line 1) | function u5(){if(0===uD)if(0==(0x20000000&u_)||r$){var e=eO;0==(3932160&...
function u8 (line 1) | function u8(e,t){if(null!=t){var n=e.stateNode,r=n.ref;null===r&&(r=n.re...
function u6 (line 1) | function u6(e,t,n){(e===uE&&(2===uN||9===uN)||null!==e.cancelPendingComm...
function u9 (line 1) | function u9(e,t,n){if(0!=(6&uS))throw Error(u(327));for(var r=!n&&0==(12...
function u7 (line 1) | function u7(e,t,n,r,l,a,o,i,u,s,c,f,d,p){e.timeoutHandle=-1;var m,h,g=t....
function se (line 1) | function se(e,t,n,r){t&=~uI,t&=~uM,e.suspendedLanes|=t,e.pingedLanes&=~t...
function st (line 1) | function st(){return 0!=(6&uS)||(sA(0,!1),!1)}
function sn (line 1) | function sn(){if(null!==ux){if(0===uN)var e=ux.return;else e=ux,r3=r2=nu...
function sr (line 1) | function sr(e,t){var n=e.timeoutHandle;-1!==n&&(e.timeoutHandle=-1,cm(n)...
function sl (line 1) | function sl(e,t){aa=null,W.H=oS,t===lS||t===lx?(t=lO(),uN=3):t===lE?(t=l...
function sa (line 1) | function sa(){var e=l3.current;return null===e||((4194048&u_)===u_?null=...
function so (line 1) | function so(){var e=W.H;return W.H=oS,null===e?oS:e}
function si (line 1) | function si(){var e=W.A;return W.A=uw,e}
function su (line 1) | function su(){uL=4,uC||(4194048&u_)!==u_&&null!==l3.current||(uT=!0),0==...
function ss (line 1) | function ss(e,t,n){var r=uS;uS|=2;var l=so(),a=si();(uE!==e||u_!==t)&&(u...
function sc (line 1) | function sc(e){var t=io(e.alternate,e,uz);e.memoizedProps=e.pendingProps...
function sf (line 1) | function sf(e){var t=e,n=t.alternate;switch(t.tag){case 15:case 0:t=oJ(n...
function sd (line 1) | function sd(e,t,n,r){r3=r2=null,aE(t),lL=null,lR=0;var l=t.return;try{if...
function sp (line 1) | function sp(e){var t=e;do{if(0!=(32768&t.flags))return void sm(t,uC);e=t...
function sm (line 1) | function sm(e,t){do{var n=function(e,t){switch(rU(t),t.tag){case 1:retur...
function sh (line 1) | function sh(e,t,n,r,l,a,o,i,s,c,f){e.cancelPendingCommit=null;do sS();wh...
function sg (line 1) | function sg(e){0!==uW&&(0,uq.onRecoverableError)(e,{componentStack:null})}
function sv (line 1) | function sv(){3===uW&&(uW=0,uo(uK,uq),uW=4)}
function sy (line 1) | function sy(){if(1===uW){uW=0;var e=uq,t=uK,n=uX,r=0!=(13878&t.flags);if...
function sb (line 1) | function sb(){if(2===uW){uW=0;var e=uq,t=uK,n=0!=(8772&t.flags);if(0!=(8...
function sw (line 1) | function sw(){if(4===uW||3===uW){uW=0,uZ=null,eg();var e=uq,t=uK,n=uX,r=...
function sk (line 1) | function sk(e,t){0==(e.pooledCacheLanes&=t)&&null!=(t=e.pooledCache)&&(e...
function sS (line 1) | function sS(){return null!==uZ&&(uZ.skipTransition(),uZ=null),sy(),sb(),...
function sE (line 1) | function sE(){if(5!==uW)return!1;var e=uq,t=uG;uG=0;var n=eV(uX),r=W.T,l...
function sx (line 1) | function sx(e,t,n){t=rP(n,t),t=oD(e.stateNode,t,2),null!==(e=l$(e,t,2))&...
function s_ (line 1) | function s_(e,t,n){if(3===e.tag)sx(e,e,n);else for(;null!==t;){if(3===t....
function sN (line 1) | function sN(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new uk;v...
function sP (line 1) | function sP(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),e.pingedLanes...
function sC (line 1) | function sC(e,t){0===t&&(t=eI()),null!==(e=rd(e,t))&&(eF(e,t),sF(e))}
function sT (line 1) | function sT(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),sC(e,n)}
function sO (line 1) | function sO(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode...
function sF (line 1) | function sF(e){e!==sL&&null===e.next&&(null===sL?sz=sL=e:sL=sL.next=e),s...
function sA (line 1) | function sA(e,t){if(!sI&&sM){sI=!0;do for(var n=!1,r=sz;null!==r;){if(!t...
function sj (line 1) | function sj(){sU()}
function sU (line 1) | function sU(){sM=sR=!1;var e,t=0;0===sD||((e=window.event)&&"popstate"==...
function sB (line 1) | function sB(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,l=e.expirati...
function sV (line 1) | function sV(e,t){if(0!==uW&&5!==uW)return e.callbackNode=null,e.callback...
function sH (line 1) | function sH(e,t){if(sS())return null;u9(e,t,!0)}
function s$ (line 1) | function s$(){if(0===sD){var e=lm;0===e&&(e=eT,0==(261888&(eT<<=1))&&(eT...
function sQ (line 1) | function sQ(e){return null==e||"symbol"==typeof e||"boolean"==typeof e?n...
function sW (line 1) | function sW(e,t){var n=t.ownerDocument.createElement("input");return n.n...
function sY (line 1) | function sY(e,t){t=0!=(4&t);for(var n=0;n<e.length;n++){var r=e[n],l=r.e...
function sJ (line 1) | function sJ(e,t){var n=t[eX];void 0===n&&(n=t[eX]=new Set);var r=e+"__bu...
function sZ (line 1) | function sZ(e,t,n){var r=0;t&&(r|=4),s2(n,e,r,t)}
function s1 (line 1) | function s1(e){if(!e[s0]){e[s0]=!0,e8.forEach(function(t){"selectionchan...
function s2 (line 1) | function s2(e,t,n,r){switch(fL(t)){case 2:var l=fN;break;case 8:l=fP;bre...
function s3 (line 1) | function s3(e,t,n,r,l){var a=r;if(0==(1&t)&&0==(2&t)&&null!==r)e:for(;;)...
function s4 (line 1) | function s4(e,t,n){return{instance:e,listener:t,currentTarget:n}}
function s5 (line 1) | function s5(e,t){for(var n=t+"Capture",r=[];null!==e;){var l=e,a=l.state...
function s8 (line 1) | function s8(e){if(null===e)return null;do e=e.return;while(e&&5!==e.tag&...
function s6 (line 1) | function s6(e,t,n,r,l){for(var a=t._reactName,o=[];null!==n&&n!==r;){var...
function ce (line 1) | function ce(e){return("string"==typeof e?e:""+e).replace(s9,"\n").replac...
function ct (line 1) | function ct(e,t){return t=ce(t),ce(e)===t}
function cn (line 1) | function cn(e,t,n,r,l,a){switch(n){case"children":if("string"==typeof r)...
function cr (line 1) | function cr(e,t,n,r,l,a){switch(n){case"style":tx(e,r,a);return;case"dan...
function cl (line 1) | function cl(e,t,n){switch(t){case"div":case"span":case"svg":case"path":c...
function ca (line 1) | function ca(e){switch(e){case"css":case"script":case"font":case"img":cas...
function cu (line 1) | function cu(e){return 9===e.nodeType?e:e.ownerDocument}
function cs (line 1) | function cs(e){switch(e){case"http://www.w3.org/2000/svg":return 1;case"...
function cc (line 1) | function cc(e,t){if(0===e)switch(t){case"svg":return 1;case"math":return...
function cf (line 1) | function cf(e,t){return"textarea"===e||"noscript"===e||"string"==typeof ...
function cv (line 1) | function cv(e){setTimeout(function(){throw e})}
function cy (line 1) | function cy(e){return"head"===e}
function cb (line 1) | function cb(e,t){var n=t,r=0;do{var l=n.nextSibling;if(e.removeChild(n),...
function cw (line 1) | function cw(e,t){var n=e;e=0;do{var r=n.nextSibling;if(1===n.nodeType?t?...
function ck (line 1) | function ck(e,t,n){if(t=CSS.escape(t)!==t?"r-"+btoa(t).replace(/=/g,""):...
function cS (line 1) | function cS(e,t){e=e.style;var n=null!=(t=t.style)?t.hasOwnProperty("vie...
function cE (line 1) | function cE(e,t,n){return n=n.ownerDocument.defaultView,{rect:e,abs:"abs...
function cx (line 1) | function cx(e){return cE(e.getBoundingClientRect(),getComputedStyle(e),e)}
function c_ (line 1) | function c_(e){var t=e.getBoundingClientRect();return cE(t=new DOMRect(t...
function cN (line 1) | function cN(e){this.addEventListener("load",e),this.addEventListener("er...
function cP (line 1) | function cP(e,t){this._scope=document.documentElement,this._selector="::...
function cC (line 1) | function cC(e){return{name:e,group:new cP("group",e),imagePair:new cP("i...
function cT (line 1) | function cT(e){this._fragmentFiber=e,this._observers=this._eventListener...
function cO (line 1) | function cO(e,t,n,r){return g(e).addEventListener(t,n,r),!1}
function cz (line 1) | function cz(e,t,n,r){return g(e).removeEventListener(t,n,r),!1}
function cL (line 1) | function cL(e){return null==e?"0":"boolean"==typeof e?"c="+(e?"1":"0"):"...
function cR (line 1) | function cR(e,t,n,r){for(var l=0;l<e.length;l++){var a=e[l];if(a.type===...
function cM (line 1) | function cM(e,t){var n=e=g(e),r=t;function l(){a=!0}var a=!1;try{n.addEv...
function cI (line 1) | function cI(e,t){return t.push(e),!1}
function cD (line 1) | function cD(e){return(e=g(e))===e.ownerDocument.activeElement&&(e.blur()...
function cF (line 1) | function cF(e,t){return e=g(e),t.observe(e),!1}
function cA (line 1) | function cA(e,t){return e=g(e),t.unobserve(e),!1}
function cj (line 1) | function cj(e,t){return e=g(e),t.push.apply(t,e.getClientRects()),!1}
function cU (line 1) | function cU(e,t){var n=t._eventListeners;if(null!==n)for(var r=0;r<n.len...
function cB (line 1) | function cB(e){var t=e.firstChild;for(t&&10===t.nodeType&&(t=t.nextSibli...
function cV (line 1) | function cV(e,t){for(;8!==e.nodeType;)if((1!==e.nodeType||"INPUT"!==e.no...
function cH (line 1) | function cH(e){return"$?"===e.data||"$~"===e.data}
function c$ (line 1) | function c$(e){return"$!"===e.data||"$?"===e.data&&"loading"!==e.ownerDo...
function cQ (line 1) | function cQ(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||...
function cq (line 1) | function cq(e){e=e.nextSibling;for(var t=0;e;){if(8===e.nodeType){var n=...
function cK (line 1) | function cK(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){va...
function cX (line 1) | function cX(e,t,n){switch(t=cu(n),e){case"html":if(!(e=t.documentElement...
function cG (line 1) | function cG(e){for(var t=e.attributes;t.length;)e.removeAttributeNode(t[...
function cZ (line 1) | function cZ(e){return"function"==typeof e.getRootNode?e.getRootNode():9=...
function c2 (line 1) | function c2(e,t,n){if(c1&&"string"==typeof t&&t){var r=tm(t);r='link[rel...
function c3 (line 1) | function c3(e,t,n,r){var l=(l=en.current)?cZ(l):null;if(!l)throw Error(u...
function c4 (line 1) | function c4(e){return'href="'+tm(e)+'"'}
function c5 (line 1) | function c5(e){return'link[rel="stylesheet"]['+e+"]"}
function c8 (line 1) | function c8(e){return x({},e,{"data-precedence":e.precedence,precedence:...
function c6 (line 1) | function c6(e){return'[src="'+tm(e)+'"]'}
function c9 (line 1) | function c9(e){return"script[async]"+e}
function c7 (line 1) | function c7(e,t,n){if(t.count++,null===t.instance)switch(t.type){case"st...
function fe (line 1) | function fe(e,t,n){for(var r=n.querySelectorAll('link[rel="stylesheet"][...
function ft (line 1) | function ft(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null...
function fn (line 1) | function fn(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null...
function fl (line 1) | function fl(e,t,n){if(null===fr){var r=new Map,l=fr=new Map;l.set(n,r)}e...
function fa (line 1) | function fa(e,t,n){(e=e.ownerDocument||e).head.insertBefore(n,"title"===...
function fo (line 1) | function fo(e,t){return"img"===e&&null!=t.src&&""!==t.src&&null==t.onLoa...
function fi (line 1) | function fi(e){return"stylesheet"!==e.type||0!=(3&e.state.loading)}
function fu (line 1) | function fu(e){return(e.width||100)*(e.height||100)*("number"==typeof de...
function fs (line 1) | function fs(e,t){"function"==typeof t.decode&&(e.imgCount++,t.complete||...
function ff (line 1) | function ff(e){if(0===e.count&&(0===e.imgCount||!e.waitingForImages)){if...
function fd (line 1) | function fd(){this.count--,ff(this)}
function fp (line 1) | function fp(){this.imgCount--,ff(this)}
function fh (line 1) | function fh(e,t){e.stylesheets=null,null!==e.unsuspend&&(e.count++,fm=ne...
function fg (line 1) | function fg(e,t){if(!(4&t.state.loading)){var n=fm.get(e);if(n)var r=n.g...
function fy (line 1) | function fy(e,t,n,r,l,a,o,i,u){this.tag=1,this.containerInfo=e,this.ping...
function fb (line 1) | function fb(e,t,n,r,l,a,o,i,u,s,c,f){return e=new fy(e,t,n,o,u,s,c,f,i),...
function fw (line 1) | function fw(e,t,n,r,l,a){l=l?rh:rh,null===r.context?r.context=l:r.pendin...
function fk (line 1) | function fk(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var...
function fS (line 1) | function fS(e,t){fk(e,t),(e=e.alternate)&&fk(e,t)}
function fE (line 1) | function fE(e){if(13===e.tag||31===e.tag){var t=rd(e,0x4000000);null!==t...
function fx (line 1) | function fx(e){if(13===e.tag||31===e.tag){var t=u4(),n=rd(e,t=eB(t));nul...
function fN (line 1) | function fN(e,t,n,r){var l=W.T;W.T=null;var a=q.p;try{q.p=2,fC(e,t,n,r)}...
function fP (line 1) | function fP(e,t,n,r){var l=W.T;W.T=null;var a=q.p;try{q.p=8,fC(e,t,n,r)}...
function fC (line 1) | function fC(e,t,n,r){if(f_){var l=fT(r);if(null===l)s3(e,t,r,fO,n),fB(e,...
function fT (line 1) | function fT(e){return fz(e=tz(e))}
function fz (line 1) | function fz(e){if(fO=null,null!==(e=e1(e))){var t=c(e);if(null===t)e=nul...
function fL (line 1) | function fL(e){switch(e){case"beforetoggle":case"cancel":case"click":cas...
function fB (line 1) | function fB(e,t){switch(e){case"focusin":case"focusout":fM=null;break;ca...
function fV (line 1) | function fV(e,t,n,r,l,a){return null===e||e.nativeEvent!==a?(e={blockedO...
function fH (line 1) | function fH(e){var t=e1(e.target);if(null!==t){var n=c(t);if(null!==n){i...
function f$ (line 1) | function f$(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContaine...
function fQ (line 1) | function fQ(e,t,n){f$(e)&&n.delete(t)}
function fW (line 1) | function fW(){fR=!1,null!==fM&&f$(fM)&&(fM=null),null!==fI&&f$(fI)&&(fI=...
function fq (line 1) | function fq(e,t){e.blockedOn===t&&(e.blockedOn=null,fR||(fR=!0,a.unstabl...
function fX (line 1) | function fX(e){fK!==e&&(fK=e,a.unstable_scheduleCallback(a.unstable_Norm...
function fG (line 1) | function fG(e){function t(t){return fq(t,e)}null!==fM&&fq(fM,e),null!==f...
function fY (line 1) | function fY(){function e(e){e.canIntercept&&"react-transition"===e.info&...
function fJ (line 1) | function fJ(e){this._internalRoot=e}
function fZ (line 1) | function fZ(e){this._internalRoot=e}
function d (line 1) | function d(e,t){let n,r=t.errorBoundary?.constructor;if(n=n||r===s.Error...
function p (line 1) | function p(e){(0,i.isBailoutToCSRError)(e)||(0,o.isNextRouterError)(e)||...
function o (line 1) | function o({tree:e}){let[t,n]=(0,r.useState)(null);(0,r.useEffect)(()=>(...
function a (line 1) | function a(e,t){return function e(t,n,a,o){if(0===Object.keys(n).length)...
class i (line 1) | class i extends o.Component{constructor(e){super(e),this.state={hasError...
method constructor (line 1) | constructor(e){super(e),this.state={hasError:!1},this.rootHtml="",this...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){return{hasError:!0}}
method componentDidMount (line 1) | componentDidMount(){let e=this.htmlRef.current;this.state.hasError&&e&...
method render (line 1) | render(){let{hasError:e}=this.state;return("u">typeof window&&!this.ro...
function s (line 1) | function s({children:e,errorComponent:t,errorStyles:n,errorScripts:r}){r...
function T (line 1) | function T({appRouterState:e}){return(0,o.useInsertionEffect)(()=>{let{t...
function O (line 1) | function O(e){null==e&&(e={});let t=window.history.state,n=t?.__NA;n&&(e...
function z (line 1) | function z({headCacheNode:e}){let t=null!==e?e.head:null,n=null!==e?e.pr...
function L (line 1) | function L({actionQueue:e,globalError:t,webSocket:n,staticIndicatorState...
function R (line 1) | function R({actionQueue:e,globalErrorState:t,webSocket:n,staticIndicator...
function D (line 1) | function D(){let[,e]=o.default.useState(0),t=M.size;(0,o.useEffect)(()=>...
function i (line 1) | function i({navigatedAt:e,initialFlightData:t,initialCanonicalUrlParts:n...
method constructor (line 1) | constructor(e){super(e),this.state={hasError:!1},this.rootHtml="",this...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){return{hasError:!0}}
method componentDidMount (line 1) | componentDidMount(){let e=this.htmlRef.current;this.state.hasError&&e&...
method render (line 1) | render(){let{hasError:e}=this.state;return("u">typeof window&&!this.ro...
function T (line 1) | function T(e){if(0===e[0])a=[];else if(1===e[0]){if(!a)throw Object.defi...
method start (line 1) | start(e){a&&(a.forEach(t=>{e.enqueue("string"==typeof t?_.encode(t):t)})...
function M (line 1) | function M({initialRSCPayload:e,actionQueue:t,webSocket:n,staticIndicato...
function D (line 1) | function D({children:e}){return e}
function A (line 1) | async function A(e,t){let n,r,a=await l;(0,w.setAppBuildId)(a.b);let o=D...
FILE: docs/_next/static/chunks/b492b32695e3b282.js
function r (line 1) | function r({widthInt:e,heightInt:t,blurWidth:i,blurHeight:r,blurDataURL:...
function a (line 1) | function a(e){return void 0!==e.default}
function l (line 1) | function l(e){return void 0===e?e:"number"==typeof e?Number.isFinite(e)?...
function u (line 1) | function u({src:e,sizes:t,unoptimized:i=!1,priority:u=!1,preload:h=!1,lo...
function a (line 2) | function a(e){let{headManager:t,reduceComponentsToState:i}=e;function a(...
function c (line 2) | function c(){return[(0,a.jsx)("meta",{charSet:"utf-8"},"charset"),(0,a.j...
function d (line 2) | function d(e,t){return"string"==typeof t||"number"==typeof t?e:t.type===...
function m (line 2) | function m(e){let t,i,r,n;return e.reduce(d,[]).reverse().concat(c().rev...
function r (line 2) | function r(e,t){let i=e||75;return t?.qualities?.length?t.qualities.redu...
function s (line 2) | function s({config:e,src:t,width:i,quality:s}){if(t.startsWith("/")&&t.i...
function n (line 3) | function n(e,t){let i=(0,r.useRef)(null),n=(0,r.useRef)(null);return(0,r...
function s (line 3) | function s(e,t){if("function"!=typeof e)return e.current=t,()=>{e.curren...
function g (line 3) | function g(e,t,i,r,n,s,o){let a=e?.src;e&&e["data-loaded-src"]!==a&&(e["...
function v (line 3) | function v(e){return o.use?{fetchPriority:e}:{fetchpriority:e}}
function y (line 3) | function y({isAppRouter:e,imgAttributes:t}){let i={as:"image",imageSrcSe...
function u (line 3) | function u(e){let{props:t}=(0,o.getImgProps)(e,{defaultLoader:l.default,...
function u (line 3) | function u(e){var t=e.getSnapshot;e=e.value;try{var i=t();return!n(e,i)}...
function c (line 3) | function c(e,t,i){return Math.min(i,Math.max(t,e))}
function d (line 3) | function d(e){let t=1e4*Math.sin(e);return t-Math.floor(t)}
function p (line 3) | function p({className:e=""}){let t=(0,u.useRef)(null),i=(0,u.useRef)(nul...
function f (line 3) | function f(e){return e?Array.from(e.querySelectorAll('a[href],button:not...
function g (line 3) | function g({isOpen:e,onClose:t,title:i,children:r,width:n="max-w-sm",clo...
function v (line 5) | function v({children:e,strength:t=16,className:i=""}){let r=(0,u.useRef)...
function b (line 5) | function b(){let{language:e,setLanguage:t,t:i}=(0,x.useI18n)(),{isOpen:r...
function w (line 6) | function w(e){return null!==e&&"object"==typeof e&&"function"==typeof e....
function P (line 6) | function P(e,t){if(!Array.isArray(t))return!1;let i=t.length;if(i!==e.le...
function T (line 6) | function T(e){return"string"==typeof e||Array.isArray(e)}
function S (line 6) | function S(e){let t=[{},{}];return null==e||e.values.forEach((e,i)=>{t[0...
function E (line 6) | function E(e,t,i,r){if("function"==typeof t){let[n,s]=S(r);t=t(void 0!==...
function A (line 6) | function A(e,t,i){let r=e.getProps();return E(r,t,void 0!==i?i:r.custom,e)}
function R (line 6) | function R(e){let t;return()=>(void 0===t&&(t=e()),t)}
class L (line 6) | class L{constructor(e){this.stop=()=>this.runAll("stop"),this.animations...
method constructor (line 6) | constructor(e){this.stop=()=>this.runAll("stop"),this.animations=e.fil...
method finished (line 6) | get finished(){return Promise.all(this.animations.map(e=>"finished"in ...
method getAll (line 6) | getAll(e){return this.animations[0][e]}
method setAll (line 6) | setAll(e,t){for(let i=0;i<this.animations.length;i++)this.animations[i...
method attachTimeline (line 6) | attachTimeline(e,t){let i=this.animations.map(i=>D()&&i.attachTimeline...
method time (line 6) | get time(){return this.getAll("time")}
method time (line 6) | set time(e){this.setAll("time",e)}
method speed (line 6) | get speed(){return this.getAll("speed")}
method speed (line 6) | set speed(e){this.setAll("speed",e)}
method startTime (line 6) | get startTime(){return this.getAll("startTime")}
method duration (line 6) | get duration(){let e=0;for(let t=0;t<this.animations.length;t++)e=Math...
method runAll (line 6) | runAll(e){this.animations.forEach(t=>t[e]())}
method flatten (line 6) | flatten(){this.runAll("flatten")}
method play (line 6) | play(){this.runAll("play")}
method pause (line 6) | pause(){this.runAll("pause")}
method cancel (line 6) | cancel(){this.runAll("cancel")}
method complete (line 6) | complete(){this.runAll("complete")}
class F (line 6) | class F extends L{then(e,t){return Promise.all(this.animations).then(e)....
method then (line 6) | then(e,t){return Promise.all(this.animations).then(e).catch(t)}
function O (line 6) | function O(e,t){return e?e[t]||e.default||e:void 0}
function _ (line 6) | function _(e){let t=0,i=e.next(t);for(;!i.done&&t<2e4;)t+=50,i=e.next(t)...
function I (line 6) | function I(e){return"function"==typeof e}
function B (line 6) | function B(e,t){e.timeline=t,e.onfinish=null}
function X (line 6) | function X(e,t,i){var r;if(e instanceof Element)return[e];if("string"==t...
function G (line 6) | function G(e,t){let i=X(e),r=new AbortController;return[i,{passive:!0,.....
function K (line 6) | function K(e){return t=>{"touch"===t.pointerType||Y.x||Y.y||e(t)}}
function et (line 6) | function et(e){return t=>{"Enter"===t.key&&e(t)}}
function ei (line 6) | function ei(e,t){e.dispatchEvent(new PointerEvent("pointer"+t,{isPrimary...
function er (line 6) | function er(e){return J(e)&&!(Y.x||Y.y)}
function eu (line 6) | function eu(e,t){let i=!1,r=!0,n={delta:0,timestamp:0,isProcessing:!1},s...
function em (line 6) | function em(){t=void 0}
function eg (line 6) | function eg(e,t){-1===e.indexOf(t)&&e.push(t)}
function ev (line 6) | function ev(e,t){let i=e.indexOf(t);i>-1&&e.splice(i,1)}
class ex (line 6) | class ex{constructor(){this.subscriptions=[]}add(e){return eg(this.subsc...
method constructor (line 6) | constructor(){this.subscriptions=[]}
method add (line 6) | add(e){return eg(this.subscriptions,e),()=>ev(this.subscriptions,e)}
method notify (line 6) | notify(e,t,i){let r=this.subscriptions.length;if(r)if(1===r)this.subsc...
method getSize (line 6) | getSize(){return this.subscriptions.length}
method clear (line 6) | clear(){this.subscriptions.length=0}
class eb (line 6) | class eb{constructor(e,t={}){this.version="11.18.2",this.canTrackVelocit...
method constructor (line 6) | constructor(e,t={}){this.version="11.18.2",this.canTrackVelocity=null,...
method setCurrent (line 6) | setCurrent(e){this.current=e,this.updatedAt=ef.now(),null===this.canTr...
method setPrevFrameValue (line 6) | setPrevFrameValue(e=this.current){this.prevFrameValue=e,this.prevUpdat...
method onChange (line 6) | onChange(e){return this.on("change",e)}
method on (line 6) | on(e,t){this.events[e]||(this.events[e]=new ex);let i=this.events[e].a...
method clearListeners (line 6) | clearListeners(){for(let e in this.events)this.events[e].clear()}
method attach (line 6) | attach(e,t){this.passiveEffect=e,this.stopPassiveEffect=t}
method set (line 6) | set(e,t=!0){t&&this.passiveEffect?this.passiveEffect(e,this.updateAndN...
method setWithVelocity (line 6) | setWithVelocity(e,t,i){this.set(t),this.prev=void 0,this.prevFrameValu...
method jump (line 6) | jump(e,t=!0){this.updateAndNotify(e),this.prev=e,this.prevUpdatedAt=th...
method get (line 6) | get(){return ey.current&&ey.current.push(this),this.current}
method getPrevious (line 6) | getPrevious(){return this.prev}
method getVelocity (line 6) | getVelocity(){var e;let t=ef.now();if(!this.canTrackVelocity||void 0==...
method start (line 6) | start(e){return this.stop(),new Promise(t=>{this.hasAnimated=!0,this.a...
method stop (line 6) | stop(){this.animation&&(this.animation.stop(),this.events.animationCan...
method isAnimating (line 6) | isAnimating(){return!!this.animation}
method clearAnimation (line 6) | clearAnimation(){delete this.animation}
method destroy (line 6) | destroy(){this.clearListeners(),this.stop(),this.stopPassiveEffect&&th...
function ew (line 6) | function ew(e,t){return new eb(e,t)}
function eP (line 6) | function eP(e,t){let i=e.getValue("willChange");if(ej(i)&&i.add)return i...
function eA (line 6) | function eA(e,t,i,r){return e===t&&i===r?C:n=>0===n||1===n?n:eE(function...
function e9 (line 6) | function e9(e){let t=e.toString(),i=[],r={color:[],number:[],var:[]},n=[...
function e7 (line 6) | function e7(e){return e9(e).values}
function te (line 6) | function te(e){let{split:t,types:i}=e9(e),r=t.length;return e=>{let n=""...
function tn (line 6) | function tn(e){let[t,i]=e.slice(0,-1).split("(");if("drop-shadow"===t)re...
function tc (line 6) | function tc(e,t){let i=th(e);return i!==to&&(i=ti),i.getAnimatableNone?i...
function tj (line 6) | function tj(){if(tw){let e=Array.from(ty).filter(e=>e.needsMeasurement),...
function tP (line 6) | function tP(){ty.forEach(e=>{e.readKeyframes(),e.needsMeasurement&&(tw=!...
class tT (line 6) | class tT{constructor(e,t,i,r,n,s=!1){this.isComplete=!1,this.isAsync=!1,...
method constructor (line 6) | constructor(e,t,i,r,n,s=!1){this.isComplete=!1,this.isAsync=!1,this.ne...
method scheduleResolve (line 6) | scheduleResolve(){this.isScheduled=!0,this.isAsync?(ty.add(this),tb||(...
method readKeyframes (line 6) | readKeyframes(){let{unresolvedKeyframes:e,name:t,element:i,motionValue...
method setFinalKeyframe (line 6) | setFinalKeyframe(){}
method measureInitialState (line 6) | measureInitialState(){}
method renderEndStyles (line 6) | renderEndStyles(){}
method measureEndState (line 6) | measureEndState(){}
method complete (line 6) | complete(){this.isComplete=!0,this.onComplete(this.unresolvedKeyframes...
method cancel (line 6) | cancel(){this.isComplete||(this.isScheduled=!1,ty.delete(this))}
method resume (line 6) | resume(){this.isComplete||this.scheduleResolve()}
class tD (line 6) | class tD extends tT{constructor(e,t,i,r,n){super(e,t,i,r,n,!0)}readKeyfr...
method constructor (line 6) | constructor(e,t,i,r,n){super(e,t,i,r,n,!0)}
method readKeyframes (line 6) | readKeyframes(){let{unresolvedKeyframes:e,element:t,name:i}=this;if(!t...
method resolveNoneKeyframes (line 6) | resolveNoneKeyframes(){let{unresolvedKeyframes:e,name:t}=this,i=[];for...
method measureInitialState (line 6) | measureInitialState(){let{element:e,unresolvedKeyframes:t,name:i}=this...
method measureEndState (line 6) | measureEndState(){var e;let{element:t,name:i,unresolvedKeyframes:r}=th...
function tO (line 6) | function tO(e,{repeat:t,repeatType:i="loop"},r){let n=e.filter(tF),s=t&&...
class t_ (line 6) | class t_{constructor({autoplay:e=!0,delay:t=0,type:i="keyframes",repeat:...
method constructor (line 6) | constructor({autoplay:e=!0,delay:t=0,type:i="keyframes",repeat:r=0,rep...
method calcStartTime (line 6) | calcStartTime(){return this.resolvedAt&&this.resolvedAt-this.createdAt...
method resolved (line 6) | get resolved(){return this._resolved||this.hasAttemptedResolve||(tP(),...
method onKeyframesResolved (line 6) | onKeyframesResolved(e,t){this.resolvedAt=ef.now(),this.hasAttemptedRes...
method onPostResolved (line 6) | onPostResolved(){}
method then (line 6) | then(e,t){return this.currentFinishedPromise.then(e,t)}
method flatten (line 6) | flatten(){this.options.type="keyframes",this.options.ease="linear"}
method updateFinishedPromise (line 6) | updateFinishedPromise(){this.currentFinishedPromise=new Promise(e=>{th...
function tB (line 6) | function tB(e,t,i){return(i<0&&(i+=1),i>1&&(i-=1),i<1/6)?e+(t-e)*6*i:i<....
function t$ (line 6) | function t$(e,t){return i=>i>0?t:e}
function tW (line 6) | function tW(e){let t=tz.find(t=>t.test(e));if(C(!!t,`'${e}' is not an an...
function tG (line 6) | function tG(e,t){return i=>tI(e,t,i)}
function tK (line 6) | function tK(e){return"number"==typeof e?tG:"string"==typeof e?tk(e)?t$:e...
function tZ (line 6) | function tZ(e,t){let i=[...e],r=i.length,n=e.map((e,i)=>tK(e)(e,t[i]));r...
function tJ (line 6) | function tJ(e,t){let i={...e,...t},r={};for(let n in i)void 0!==e[n]&&vo...
function t0 (line 6) | function t0(e,t,i){return"number"==typeof e&&"number"==typeof t&&"number...
function t1 (line 6) | function t1(e,t,i){var r,n;let s=Math.max(t-5,0);return r=i-e(s),(n=t-s)...
function t6 (line 6) | function t6(e,t){return e*Math.sqrt(1-t*t)}
function t7 (line 6) | function t7(e,t){return t.some(t=>void 0!==e[t])}
function ie (line 6) | function ie(e=.3,t=.3){let i,r="object"!=typeof e?{visualDuration:e,keyf...
function it (line 6) | function it({keyframes:e,velocity:t=0,power:i=.8,timeConstant:r=325,boun...
function il (line 6) | function il(e,t,{clamp:i=!0,ease:r,mixer:n}={}){let s=e.length;if(C(s===...
function iu (line 6) | function iu({duration:e=300,keyframes:t,times:i,ease:r="easeInOut"}){var...
class ip (line 6) | class ip extends t_{constructor(e){super(e),this.holdTime=null,this.canc...
method constructor (line 6) | constructor(e){super(e),this.holdTime=null,this.cancelTime=null,this.c...
method flatten (line 6) | flatten(){super.flatten(),this._resolved&&Object.assign(this._resolved...
method initPlayback (line 6) | initPlayback(e){let t,i,{type:r="keyframes",repeat:n=0,repeatDelay:s=0...
method onPostResolved (line 6) | onPostResolved(){let{autoplay:e=!0}=this.options;this.play(),"paused"!...
method tick (line 6) | tick(e,t=!1){let{resolved:i}=this;if(!i){let{keyframes:e}=this.options...
method duration (line 6) | get duration(){let{resolved:e}=this;return e?e.calculatedDuration/1e3:0}
method time (line 6) | get time(){return this.currentTime/1e3}
method time (line 6) | set time(e){e=V(e),this.currentTime=e,null!==this.holdTime||0===this.s...
method speed (line 6) | get speed(){return this.playbackSpeed}
method speed (line 6) | set speed(e){let t=this.playbackSpeed!==e;this.playbackSpeed=e,t&&(thi...
method play (line 6) | play(){if(this.resolver.isScheduled||this.resolver.resume(),!this._res...
method pause (line 6) | pause(){var e;if(!this._resolved){this.pendingPlayState="paused";retur...
method complete (line 6) | complete(){"running"!==this.state&&this.play(),this.pendingPlayState=t...
method finish (line 6) | finish(){this.teardown(),this.state="finished";let{onComplete:e}=this....
method cancel (line 6) | cancel(){null!==this.cancelTime&&this.tick(this.cancelTime),this.teard...
method teardown (line 6) | teardown(){this.state="idle",this.stopDriver(),this.resolveFinishedPro...
method stopDriver (line 6) | stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}
method sample (line 6) | sample(e){return this.startTime=0,this.tick(e,!0)}
class ix (line 6) | class ix extends t_{constructor(e){super(e);const{name:t,motionValue:i,e...
method constructor (line 6) | constructor(e){super(e);const{name:t,motionValue:i,element:r,keyframes...
method initPlayback (line 6) | initPlayback(e,t){var i;let{duration:r=300,times:n,ease:s,type:o,motio...
method duration (line 6) | get duration(){let{resolved:e}=this;if(!e)return 0;let{duration:t}=e;r...
method time (line 6) | get time(){let{resolved:e}=this;if(!e)return 0;let{animation:t}=e;retu...
method time (line 6) | set time(e){let{resolved:t}=this;if(!t)return;let{animation:i}=t;i.cur...
method speed (line 6) | get speed(){let{resolved:e}=this;if(!e)return 1;let{animation:t}=e;ret...
method speed (line 6) | set speed(e){let{resolved:t}=this;if(!t)return;let{animation:i}=t;i.pl...
method state (line 6) | get state(){let{resolved:e}=this;if(!e)return"idle";let{animation:t}=e...
method startTime (line 6) | get startTime(){let{resolved:e}=this;if(!e)return null;let{animation:t...
method attachTimeline (line 6) | attachTimeline(e){if(this._resolved){let{resolved:t}=this;if(!t)return...
method play (line 6) | play(){if(this.isStopped)return;let{resolved:e}=this;if(!e)return;let{...
method pause (line 6) | pause(){let{resolved:e}=this;if(!e)return;let{animation:t}=e;t.pause()}
method stop (line 6) | stop(){if(this.resolver.cancel(),this.isStopped=!0,"idle"===this.state...
method complete (line 6) | complete(){let{resolved:e}=this;e&&e.animation.finish()}
method cancel (line 6) | cancel(){let{resolved:e}=this;e&&e.animation.cancel()}
method supports (line 6) | static supports(e){let{motionValue:t,name:i,repeatDelay:r,repeatType:n...
function iP (line 6) | function iP(e,t,{delay:i=0,transitionOverride:r,type:n}={}){var s;let{tr...
function iT (line 6) | function iT(e,t,i={}){var r;let n=A(e,t,"exit"===i.type?null==(r=e.prese...
function iS (line 6) | function iS(e,t){return e.sortNodePosition(t)}
function iM (line 6) | function iM(e=!1){return{isActive:e,protectedKeys:{},needsAnimating:{},p...
function iC (line 6) | function iC(){return{animate:iM(!0),whileInView:iM(),whileHover:iM(),whi...
class iR (line 6) | class iR{constructor(e){this.isMounted=!1,this.node=e}update(){}}
method constructor (line 6) | constructor(e){this.isMounted=!1,this.node=e}
method update (line 6) | update(){}
function iV (line 6) | function iV(e,t,i,r={passive:!0}){return e.addEventListener(t,i,r),()=>e...
function iD (line 6) | function iD(e){return{point:{x:e.pageX,y:e.pageY}}}
function iL (line 6) | function iL(e,t,i,r){return iV(e,t,e=>J(e)&&i(e,iD(e)),r)}
class iO (line 6) | class iO{constructor(e,t,{transformPagePoint:i,contextWindow:r,dragSnapT...
method constructor (line 6) | constructor(e,t,{transformPagePoint:i,contextWindow:r,dragSnapToOrigin...
method updateHandlers (line 6) | updateHandlers(e){this.handlers=e}
method end (line 6) | end(){this.removeListeners&&this.removeListeners(),ec(this.updatePoint)}
function i_ (line 6) | function i_(e,t){return t?{point:t(e.point)}:e}
function iI (line 6) | function iI(e,t){return{x:e.x-t.x,y:e.y-t.y}}
function iB (line 6) | function iB({point:e},t){return{point:e,delta:iI(e,i$(t)),offset:iI(e,t[...
function i$ (line 6) | function i$(e){return e[e.length-1]}
function iU (line 6) | function iU(e){return e&&"object"==typeof e&&Object.prototype.hasOwnProp...
function iz (line 6) | function iz(e){return e.max-e.min}
function iW (line 6) | function iW(e,t,i,r=.5){e.origin=r,e.originPoint=tI(t.min,t.max,e.origin...
function iH (line 6) | function iH(e,t,i,r){iW(e.x,t.x,i.x,r?r.originX:void 0),iW(e.y,t.y,i.y,r...
function iq (line 6) | function iq(e,t,i){e.min=i.min+t.min,e.max=e.min+iz(t)}
function iY (line 6) | function iY(e,t,i){e.min=t.min-i.min,e.max=e.min+iz(t)}
function iX (line 6) | function iX(e,t,i){iY(e.x,t.x,i.x),iY(e.y,t.y,i.y)}
function iG (line 6) | function iG(e,t,i){return{min:void 0!==t?e.min+t:void 0,max:void 0!==i?e...
function iK (line 6) | function iK(e,t){let i=t.min-e.min,r=t.max-e.max;return t.max-t.min<e.ma...
function iZ (line 6) | function iZ(e,t,i){return{min:iJ(e,t),max:iJ(e,i)}}
function iJ (line 6) | function iJ(e,t){return"number"==typeof e?e:e[t]||0}
function i5 (line 6) | function i5(e){return[e("x"),e("y")]}
function i3 (line 6) | function i3({top:e,left:t,right:i,bottom:r}){return{x:{min:t,max:i},y:{m...
function i4 (line 6) | function i4(e){return void 0===e||1===e}
function i6 (line 6) | function i6({scale:e,scaleX:t,scaleY:i}){return!i4(e)||!i4(t)||!i4(i)}
function i8 (line 6) | function i8(e){return i6(e)||i9(e)||e.z||e.rotate||e.rotateX||e.rotateY|...
function i9 (line 6) | function i9(e){var t,i;return(t=e.x)&&"0%"!==t||(i=e.y)&&"0%"!==i}
function i7 (line 6) | function i7(e,t,i,r,n){return void 0!==n&&(e=r+n*(e-r)),r+i*(e-r)+t}
function re (line 6) | function re(e,t=0,i=1,r,n){e.min=i7(e.min,t,i,r,n),e.max=i7(e.max,t,i,r,n)}
function rt (line 6) | function rt(e,{x:t,y:i}){re(e.x,t.translate,t.scale,t.originPoint),re(e....
function ri (line 6) | function ri(e,t){e.min=e.min+t,e.max=e.max+t}
function rr (line 6) | function rr(e,t,i,r,n=.5){let s=tI(e.min,e.max,n);re(e,t,i,s,r)}
function rn (line 6) | function rn(e,t){rr(e.x,t.x,t.scaleX,t.scale,t.originX),rr(e.y,t.y,t.sca...
function rs (line 6) | function rs(e,t){return i3(function(e,t){if(!t)return e;let i=t({x:e.lef...
class rl (line 6) | class rl{constructor(e){this.openDragLock=null,this.isDragging=!1,this.c...
method constructor (line 6) | constructor(e){this.openDragLock=null,this.isDragging=!1,this.currentD...
method start (line 6) | start(e,{snapToCursor:t=!1}={}){let{presenceContext:i}=this.visualElem...
method stop (line 6) | stop(e,t){let i=this.isDragging;if(this.cancel(),!i)return;let{velocit...
method cancel (line 6) | cancel(){this.isDragging=!1;let{projection:e,animationState:t}=this.vi...
method updateAxis (line 6) | updateAxis(e,t,i){let{drag:r}=this.getProps();if(!i||!ru(e,r,this.curr...
method resolveConstraints (line 6) | resolveConstraints(){var e;let{dragConstraints:t,dragElastic:i}=this.g...
method resolveRefConstraints (line 6) | resolveRefConstraints(){var e;let{dragConstraints:t,onMeasureDragConst...
method startAnimation (line 6) | startAnimation(e){let{drag:t,dragMomentum:i,dragElastic:r,dragTransiti...
method startAxisValueAnimation (line 6) | startAxisValueAnimation(e,t){let i=this.getAxisMotionValue(e);return e...
method stopAnimation (line 6) | stopAnimation(){i5(e=>this.getAxisMotionValue(e).stop())}
method pauseAnimation (line 6) | pauseAnimation(){i5(e=>{var t;return null==(t=this.getAxisMotionValue(...
method getAnimationState (line 6) | getAnimationState(e){var t;return null==(t=this.getAxisMotionValue(e)....
method getAxisMotionValue (line 6) | getAxisMotionValue(e){let t=`_drag${e.toUpperCase()}`,i=this.visualEle...
method snapToCursor (line 6) | snapToCursor(e){i5(t=>{let{drag:i}=this.getProps();if(!ru(t,i,this.cur...
method scalePositionWithinConstraints (line 6) | scalePositionWithinConstraints(){if(!this.visualElement.current)return...
method addListeners (line 6) | addListeners(){if(!this.visualElement.current)return;ra.set(this.visua...
method getProps (line 6) | getProps(){let e=this.visualElement.getProps(),{drag:t=!1,dragDirectio...
function ru (line 6) | function ru(e,t,i){return(!0===t||t===e)&&(null===i||i===e)}
function rg (line 6) | function rg(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}
class rw (line 6) | class rw extends rc.Component{componentDidMount(){let{visualElement:e,la...
method componentDidMount (line 6) | componentDidMount(){let{visualElement:e,layoutGroup:t,switchLayoutGrou...
method getSnapshotBeforeUpdate (line 6) | getSnapshotBeforeUpdate(e){let{layoutDependency:t,visualElement:i,drag...
method componentDidUpdate (line 6) | componentDidUpdate(){let{projection:e}=this.props.visualElement;e&&(e....
method componentWillUnmount (line 6) | componentWillUnmount(){let{visualElement:e,layoutGroup:t,switchLayoutG...
method safeToRemove (line 6) | safeToRemove(){let{safeToRemove:e}=this.props;e&&e()}
method render (line 6) | render(){return null}
function rj (line 6) | function rj(e){let[t,i]=function(e=!0){let t=(0,u.useContext)(rd);if(nul...
class rS (line 6) | class rS{constructor(){this.children=[],this.isDirty=!1}add(e){eg(this.c...
method constructor (line 6) | constructor(){this.children=[],this.isDirty=!1}
method add (line 6) | add(e){eg(this.children,e),this.isDirty=!0}
method remove (line 6) | remove(e){ev(this.children,e),this.isDirty=!0}
method forEach (line 6) | forEach(e){this.isDirty&&this.children.sort(rT),this.isDirty=!1,this.c...
function rE (line 6) | function rE(e){let t=ej(e)?e.get():e;return t&&"object"==typeof t&&t.mix...
function rR (line 6) | function rR(e,t){return void 0!==e[t]?e[t]:e.borderRadius}
function rD (line 6) | function rD(e,t,i){return r=>r<e?0:r>t?1:i(N(e,t,r))}
function rL (line 6) | function rL(e,t){e.min=t.min,e.max=t.max}
function rF (line 6) | function rF(e,t){rL(e.x,t.x),rL(e.y,t.y)}
function rO (line 6) | function rO(e,t){e.translate=t.translate,e.scale=t.scale,e.originPoint=t...
function r_ (line 6) | function r_(e,t,i,r,n){return e-=t,e=r+1/i*(e-r),void 0!==n&&(e=r+1/n*(e...
function rI (line 6) | function rI(e,t,[i,r,n],s,o){!function(e,t=0,i=1,r=.5,n,s=e,o=e){if(eZ.t...
function rU (line 6) | function rU(e,t,i,r){rI(e.x,t,rB,i?i.x:void 0,r?r.x:void 0),rI(e.y,t,r$,...
function rz (line 6) | function rz(e){return 0===e.translate&&1===e.scale}
function rW (line 6) | function rW(e){return rz(e.x)&&rz(e.y)}
function rH (line 6) | function rH(e,t){return e.min===t.min&&e.max===t.max}
function rq (line 6) | function rq(e,t){return Math.round(e.min)===Math.round(t.min)&&Math.roun...
function rY (line 6) | function rY(e,t){return rq(e.x,t.x)&&rq(e.y,t.y)}
function rX (line 6) | function rX(e){return iz(e.x)/iz(e.y)}
function rG (line 6) | function rG(e,t){return e.translate===t.translate&&e.scale===t.scale&&e....
class rK (line 6) | class rK{constructor(){this.members=[]}add(e){eg(this.members,e),e.sched...
method constructor (line 6) | constructor(){this.members=[]}
method add (line 6) | add(e){eg(this.members,e),e.scheduleRender()}
method remove (line 6) | remove(e){if(ev(this.members,e),e===this.prevLead&&(this.prevLead=void...
method relegate (line 6) | relegate(e){let t,i=this.members.findIndex(t=>e===t);if(0===i)return!1...
method promote (line 6) | promote(e,t){let i=this.lead;if(e!==i&&(this.prevLead=i,this.lead=e,e....
method exitAnimationComplete (line 6) | exitAnimationComplete(){this.members.forEach(e=>{let{options:t,resumin...
method scheduleRender (line 6) | scheduleRender(){this.members.forEach(e=>{e.instance&&e.scheduleRender...
method removeLeadSnapshot (line 6) | removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapsho...
function r2 (line 6) | function r2(e,t,i,r){let{latestValues:n}=t;n[e]&&(i[e]=n[e],t.setStaticV...
function r5 (line 6) | function r5({attachResizeListener:e,defaultParent:t,measureScroll:i,chec...
function r3 (line 6) | function r3(e){e.updateLayout()}
function r4 (line 6) | function r4(e){var t;let i=(null==(t=e.resumeFrom)?void 0:t.snapshot)||e...
function r6 (line 6) | function r6(e){rJ&&rZ.totalNodes++,e.parent&&(e.isProjecting()||(e.isPro...
function r8 (line 6) | function r8(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransfo...
function r9 (line 6) | function r9(e){e.clearSnapshot()}
function r7 (line 6) | function r7(e){e.clearMeasurements()}
function ne (line 6) | function ne(e){e.isLayoutDirty=!1}
function nt (line 6) | function nt(e){let{visualElement:t}=e.options;t&&t.getProps().onBeforeLa...
function ni (line 6) | function ni(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.targ...
function nr (line 6) | function nr(e){e.resolveTargetDelta()}
function nn (line 6) | function nn(e){e.calcProjection()}
function ns (line 6) | function ns(e){e.resetSkewAndRotation()}
function no (line 6) | function no(e){e.removeLeadSnapshot()}
function na (line 6) | function na(e,t,i){e.translate=tI(t.translate,0,i),e.scale=tI(t.scale,1,...
function nl (line 6) | function nl(e,t,i,r){e.min=tI(t.min,i.min,r),e.max=tI(t.max,i.max,r)}
function nu (line 6) | function nu(e){return e.animationValues&&void 0!==e.animationValues.opac...
function np (line 6) | function np(e){e.min=nd(e.min),e.max=nd(e.max)}
function nm (line 6) | function nm(e,t,i){return"position"===e||"preserve-aspect"===e&&!(.2>=Ma...
function nf (line 6) | function nf(e){var t;return e!==e.root&&(null==(t=e.scroll)?void 0:t.was...
function ny (line 6) | function ny(e,t,i){let{props:r}=e;e.animationState&&r.whileHover&&e.anim...
function nb (line 6) | function nb(e,t,i){let{props:r}=e;e.animationState&&r.whileTap&&e.animat...
function nM (line 6) | function nM(e){return w(e.animate)||M.some(t=>T(e[t]))}
function nC (line 6) | function nC(e){return!!(nM(e)||e.variants)}
function nR (line 6) | function nR(e){return Array.isArray(e)?e.join(" "):e}
function n_ (line 6) | function n_(e){if("string"!=typeof e||e.includes("-"));else if(nO.indexO...
function nI (line 6) | function nI(e){let t=(0,u.useRef)(null);return null===t.current&&(t.curr...
function nW (line 6) | function nW(e,t,i){let{style:r,vars:n,transformOrigin:s}=e,o=!1,a=!1;for...
function nY (line 6) | function nY(e,t,i){return"string"==typeof e?e:eJ.transform(t+i*e)}
function nX (line 6) | function nX(e,{attrX:t,attrY:i,attrScale:r,originX:n,originY:s,pathLengt...
function nJ (line 6) | function nJ(e,{style:t,vars:i},r,n){for(let s in Object.assign(e.style,t...
function n0 (line 6) | function n0(e,t,i,r){for(let i in nJ(e,t,void 0,r),t.attrs)e.setAttribut...
function n1 (line 6) | function n1(e,{layout:t,layoutId:i}){return es.has(e)||e.startsWith("ori...
function n2 (line 6) | function n2(e,t,i){var r;let{style:n}=e,s={};for(let o in n)(ej(n[o])||t...
function n5 (line 6) | function n5(e,t,i){let r=n2(e,t,i);for(let i in e)(ej(e[i])||ej(t[i]))&&...
function n8 (line 6) | function n8(e,t,i){for(let r in t)ej(t[r])||n1(r,i)||(e[r]=t[r])}
function n7 (line 6) | function n7(e){return e.startsWith("while")||e.startsWith("drag")&&"drag...
function sr (line 6) | function sr(){if(si.current=!0,nN)if(window.matchMedia){let e=window.mat...
class sa (line 6) | class sa{scrapeMotionValuesFromProps(e,t,i){return{}}constructor({parent...
method scrapeMotionValuesFromProps (line 6) | scrapeMotionValuesFromProps(e,t,i){return{}}
method constructor (line 6) | constructor({parent:e,props:t,presenceContext:i,reducedMotionConfig:r,...
method mount (line 6) | mount(e){this.current=e,ss.set(e,this),this.projection&&!this.projecti...
method unmount (line 6) | unmount(){for(let e in ss.delete(this.current),this.projection&&this.p...
method bindToMotionValue (line 6) | bindToMotionValue(e,t){let i;this.valueSubscriptions.has(e)&&this.valu...
method sortNodePosition (line 6) | sortNodePosition(e){return this.current&&this.sortInstanceNodePosition...
method updateFeatures (line 6) | updateFeatures(){let e="animation";for(e in nD){let t=nD[e];if(!t)cont...
method triggerBuild (line 6) | triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}
method measureViewportBox (line 6) | measureViewportBox(){return this.current?this.measureInstanceViewportB...
method getStaticValue (line 6) | getStaticValue(e){return this.latestValues[e]}
method setStaticValue (line 6) | setStaticValue(e,t){this.latestValues[e]=t}
method update (line 6) | update(e,t){(e.transformTemplate||this.props.transformTemplate)&&this....
method getProps (line 6) | getProps(){return this.props}
method getVariant (line 6) | getVariant(e){return this.props.variants?this.props.variants[e]:void 0}
method getDefaultTransition (line 6) | getDefaultTransition(){return this.props.transition}
method getTransformPagePoint (line 6) | getTransformPagePoint(){return this.props.transformPagePoint}
method getClosestVariantNode (line 6) | getClosestVariantNode(){return this.isVariantNode?this:this.parent?thi...
method addVariantChild (line 6) | addVariantChild(e){let t=this.getClosestVariantNode();if(t)return t.va...
method addValue (line 6) | addValue(e,t){let i=this.values.get(e);t!==i&&(i&&this.removeValue(e),...
method removeValue (line 6) | removeValue(e){this.values.delete(e);let t=this.valueSubscriptions.get...
method hasValue (line 6) | hasValue(e){return this.values.has(e)}
method getValue (line 6) | getValue(e,t){if(this.props.values&&this.props.values[e])return this.p...
method readValue (line 6) | readValue(e,t){var i;let r=void 0===this.latestValues[e]&&this.current...
method setBaseTarget (line 6) | setBaseTarget(e,t){this.baseTarget[e]=t}
method getBaseTarget (line 6) | getBaseTarget(e){var t;let i,{initial:r}=this.props;if("string"==typeo...
method on (line 6) | on(e,t){return this.events[e]||(this.events[e]=new ex),this.events[e]....
method notify (line 6) | notify(e,...t){this.events[e]&&this.events[e].notify(...t)}
class sl (line 6) | class sl extends sa{constructor(){super(...arguments),this.KeyframeResol...
method constructor (line 6) | constructor(){super(...arguments),this.KeyframeResolver=tD}
method sortInstanceNodePosition (line 6) | sortInstanceNodePosition(e,t){return 2&e.compareDocumentPosition(t)?1:-1}
method getBaseTargetFromProps (line 6) | getBaseTargetFromProps(e,t){return e.style?e.style[t]:void 0}
method removeValueFromRenderState (line 6) | removeValueFromRenderState(e,{vars:t,style:i}){delete t[e],delete i[e]}
method handleChildMotionValue (line 6) | handleChildMotionValue(){this.childSubscription&&(this.childSubscripti...
class su (line 6) | class su extends sl{constructor(){super(...arguments),this.type="html",t...
method constructor (line 6) | constructor(){super(...arguments),this.type="html",this.renderInstance...
method readValueFromInstance (line 6) | readValueFromInstance(e,t){if(es.has(t)){let e=th(t);return e&&e.defau...
method measureInstanceViewportBox (line 6) | measureInstanceViewportBox(e,{transformPagePoint:t}){return rs(e,t)}
method build (line 6) | build(e,t,i){nW(e,t,i.transformTemplate)}
method scrapeMotionValuesFromProps (line 6) | scrapeMotionValuesFromProps(e,t,i){return n2(e,t,i)}
class sh (line 6) | class sh extends sl{constructor(){super(...arguments),this.type="svg",th...
method constructor (line 6) | constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,thi...
method getBaseTargetFromProps (line 6) | getBaseTargetFromProps(e,t){return e[t]}
method readValueFromInstance (line 6) | readValueFromInstance(e,t){if(es.has(t)){let e=th(t);return e&&e.defau...
method scrapeMotionValuesFromProps (line 6) | scrapeMotionValuesFromProps(e,t,i){return n5(e,t,i)}
method build (line 6) | build(e,t,i){nX(e,t,this.isSVGTag,i.transformTemplate)}
method renderInstance (line 6) | renderInstance(e,t,i,r){n0(e,t,i,r)}
method mount (line 6) | mount(e){this.isSVGTag=nZ(e.tagName),super.mount(e)}
method constructor (line 6) | constructor(e){super(e),e.animationState||(e.animationState=function(e){...
method updateAnimationControlsSubscription (line 6) | updateAnimationControlsSubscription(){let{animate:e}=this.node.getProps(...
method mount (line 6) | mount(){this.updateAnimationControlsSubscription()}
method update (line 6) | update(){let{animate:e}=this.node.getProps(),{animate:t}=this.node.prevP...
method unmount (line 6) | unmount(){var e;this.node.animationState.reset(),null==(e=this.unmountCo...
method constructor (line 6) | constructor(){super(...arguments),this.id=iN++}
method update (line 6) | update(){if(!this.node.presenceContext)return;let{isPresent:e,onExitComp...
method mount (line 6) | mount(){let{register:e}=this.node.presenceContext||{};e&&(this.unmount=e...
method unmount (line 6) | unmount(){}
method constructor (line 6) | constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}
method startObserver (line 6) | startObserver(){var e;let t;this.unmount();let{viewport:i={}}=this.node....
method mount (line 6) | mount(){this.startObserver()}
method update (line 6) | update(){if("u"<typeof IntersectionObserver)return;let{props:e,prevProps...
method unmount (line 6) | unmount(){}
method mount (line 6) | mount(){let{current:e}=this.node;e&&(this.unmount=function(e,t,i={}){let...
method unmount (line 6) | unmount(){}
method constructor (line 6) | constructor(){super(...arguments),this.isActive=!1}
method onFocus (line 6) | onFocus(){let e=!1;try{e=this.node.current.matches(":focus-visible")}cat...
method onBlur (line 6) | onBlur(){this.isActive&&this.node.animationState&&(this.node.animationSt...
method mount (line 6) | mount(){this.unmount=tY(iV(this.node.current,"focus",()=>this.onFocus())...
method unmount (line 6) | unmount(){}
method mount (line 6) | mount(){let{current:e}=this.node;e&&(this.unmount=function(e,t,i={}){let...
method unmount (line 6) | unmount(){}
method constructor (line 6) | constructor(){super(...arguments),this.removePointerDownListener=C}
method onPointerDown (line 6) | onPointerDown(e){this.session=new iO(e,this.createPanHandlers(),{transfo...
method createPanHandlers (line 6) | createPanHandlers(){let{onPanSessionStart:e,onPanStart:t,onPan:i,onPanEn...
method mount (line 6) | mount(){this.removePointerDownListener=iL(this.node.current,"pointerdown...
method update (line 6) | update(){this.session&&this.session.updateHandlers(this.createPanHandler...
method unmount (line 6) | unmount(){this.removePointerDownListener(),this.session&&this.session.en...
method constructor (line 6) | constructor(e){super(e),this.removeGroupControls=C,this.removeListeners=...
method mount (line 6) | mount(){let{dragControls:e}=this.node.getProps();e&&(this.removeGroupCon...
method unmount (line 6) | unmount(){this.removeGroupControls(),this.removeListeners()}
function l (line 6) | function l(e,s){var o;let l,h={...(0,u.useContext)(nA),...e,layoutId:fun...
function sp (line 6) | function sp(){si.current||sr();let[e]=(0,u.useState)(st.current);return e}
function sg (line 6) | function sg({children:e,className:t="",delayMs:i=0}){let r=(0,u.useRef)(...
function sv (line 6) | function sv(e,t,i){return Math.min(i,Math.max(t,e))}
function sx (line 6) | function sx(e,t,i){var r;let n=(r=1-Math.sqrt(sv(i,0,5)/5.2),Math.round(...
function sy (line 6) | function sy(e,t,i){let r,n,s,{maxAbs:o}=sx(e,t,i);return Math.min(6e3,(n...
function sb (line 6) | function sb({className:e=""}){let{t}=(0,x.useI18n)(),[i,r]=(0,u.useState...
function sw (line 6) | async function sw(e){try{return await navigator.clipboard.writeText(e),!...
function sj (line 6) | function sj({value:e,children:t,className:i="",copiedLabel:r="Copied"}){...
function s0 (line 6) | async function s0(...e){let[t,i,r,n]=e,s=sC({populateCache:!0,throwOnErr...
function t (line 6) | function t(){let t="function"==typeof h?h(E().data):h;t&&-1!==e&&(e=setT...
function i (line 6) | function i(){!E().error&&(c||T.current.isVisible())&&(d||T.current.isOnl...
method data (line 6) | get data(){return C.data=!0,$}
method error (line 6) | get error(){return C.error=!0,I}
method isValidating (line 6) | get isValidating(){return C.isValidating=!0,W}
method isLoading (line 6) | get isLoading(){return C.isLoading=!0,H}
function oa (line 6) | async function oa(...e){let t=await fetch(...e);return await t.json()}
function oc (line 6) | function oc(){let e=sp();return(0,a.jsx)(sc.div,{className:"hidden md:bl...
function od (line 6) | function od(e){let t=nI(()=>ew(e)),{isStatic:i}=(0,u.useContext)(nA);if(...
function op (line 6) | function op(e,t){let i=od(t()),r=()=>i.set(t());return r(),nF(()=>{let t...
function om (line 6) | function om(e,...t){let i=e.length;return op(t.filter(ej),function(){let...
function of (line 6) | function of(e){return"number"==typeof e?e:parseFloat(e)}
function og (line 6) | function og(e,t={}){let{isStatic:i}=(0,u.useContext)(nA),r=(0,u.useRef)(...
function ov (line 6) | function ov(e,t,i,r){if("function"==typeof e){let t;return ey.current=[]...
function ox (line 6) | function ox(e,t){let i=nI(()=>[]);return op(e,()=>{i.length=0;let r=e.le...
function ob (line 6) | function ob({children:e,className:t=""}){let i=sp(),r=od(.5),n=od(.5),s=...
function oP (line 6) | function oP({checked:e,onToggle:t,ariaLabel:i,disabled:r=!1}){return(0,a...
function oS (line 6) | function oS(e,t){return{initial:!t&&{opacity:0,y:24},animate:{opacity:1,...
function oE (line 6) | function oE(){var e,t;let{t:i}=(0,x.useI18n)(),r=sp(),{data:n}=oo("https...
FILE: docs/_next/static/chunks/f1a98b44d1dc31f1.js
class n (line 1) | class n extends Error{constructor(e,t){super(`Invariant: ${e.endsWith("....
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
class o (line 1) | class o extends Error{constructor(e){super(`Bail out to client-side rend...
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function l (line 1) | function l(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest...
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function o (line 1) | function o(t){var r=e.r(t);return"function"!=typeof r.then||"fulfilled"=...
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function s (line 1) | function s(){}
function c (line 1) | function c(t){for(var r=t[1],n=[],a=0;a<r.length;a++){var u=e.L(r[a]);if...
function f (line 1) | function f(t){var r=e.r(t[0]);if(4===t.length&&"function"==typeof r.then...
function R (line 1) | function R(e,t,r){m.has(e)||m.set(e,{id:t,originalBind:e.bind,bound:r})}
function E (line 1) | function E(e,t,r){this.status=e,this.value=t,this.reason=r}
function P (line 1) | function P(e){switch(e.status){case"resolved_model":x(e);break;case"reso...
function S (line 1) | function S(e,t,r,n){for(var a=0;a<t.length;a++){var u=t[a];"function"==t...
function O (line 1) | function O(e,t,r){for(var n=0;n<t.length;n++){var a=t[n];"function"==typ...
function T (line 1) | function T(e,t){var r=t.handler.chunk;if(null===r)return null;if(r===e)r...
function j (line 1) | function j(e,t,r,n){switch(t.status){case"fulfilled":S(e,r,t.value,t);br...
function w (line 1) | function w(e,t,r){if("pending"!==t.status&&"blocked"!==t.status)t.reason...
function A (line 1) | function A(e,t,r){return new E("resolved_model",(r?'{"done":true,"value"...
function M (line 1) | function M(e,t,r,n){N(e,t,(n?'{"done":true,"value":':'{"done":false,"val...
function N (line 1) | function N(e,t,r){if("pending"!==t.status)t.reason.enqueueModel(r);else{...
function C (line 1) | function C(e,t,r){if("pending"===t.status||"blocked"===t.status){var n=t...
function x (line 1) | function x(e){var t=D;D=null;var r=e.value,n=e.reason;e.status="blocked"...
function U (line 1) | function U(e){try{var t=f(e.value);e.status="fulfilled",e.value=t}catch(...
function k (line 1) | function k(e,t){e._closed=!0,e._closedReason=t,e._chunks.forEach(functio...
function I (line 1) | function I(e){return{$$typeof:h,_payload:e,_init:P}}
function F (line 1) | function F(e,t){var r=e._chunks,n=r.get(t);return n||(n=e._closed?new E(...
function L (line 1) | function L(e,t,r){var n=t.handler,a=t.parentObject,o=t.key,l=t.map,i=t.p...
function H (line 1) | function H(e,t,r){t.errored||(t.errored=!0,t.value=null,t.reason=r,null!...
function $ (line 1) | function $(e,t,r,n,a,u){return D?(n=D,n.deps++):n=D={parent:null,chunk:n...
function B (line 1) | function B(e,t,r,n){if(!e._serverReferenceConfig)return function(e,t){fu...
function X (line 1) | function X(e,t,r,n,a){var u=parseInt((t=t.split(":"))[0],16);switch((u=F...
function q (line 1) | function q(e,t){return new Map(t)}
function W (line 1) | function W(e,t){return new Set(t)}
function K (line 1) | function K(e,t){return new Blob(t.slice(1),{type:t[0]})}
function V (line 1) | function V(e,t){e=new FormData;for(var r=0;r<t.length;r++)e.append(t[r][...
function G (line 1) | function G(e,t){return t[Symbol.iterator]()}
function Y (line 1) | function Y(e,t){return t}
function z (line 1) | function z(){throw Error('Trying to call a function from "use server" bu...
function Q (line 1) | function Q(e,t,r,n,a,u,o){var l,i=new Map;this._bundlerConfig=e,this._se...
function J (line 1) | function J(e,t,r){var n=(e=e._chunks).get(t);n&&"pending"!==n.status?n.r...
function Z (line 1) | function Z(e,t,r,n){var a=e._chunks,u=a.get(t);u?"pending"===u.status&&(...
function ee (line 1) | function ee(e,t,r){var n=null,a=!1;r=new ReadableStream({type:r,start:fu...
function et (line 1) | function et(){return this}
function er (line 1) | function er(e,t,r){var n=[],a=!1,u=0,o={};o[g]=function(){var e,t=0;retu...
function en (line 1) | function en(){var e=Error("An error occurred in the Server Components re...
function ea (line 1) | function ea(e,t){for(var r=e.length,n=t.length,a=0;a<r;a++)n+=e[a].byteL...
function eu (line 1) | function eu(e,t,r,n,a,u){J(e,t,a=new a((r=0===r.length&&0==n.byteOffset%...
function eo (line 1) | function eo(e){k(e,Error("Connection closed."))}
function el (line 1) | function el(e){return new Q(null,null,null,e&&e.callServer?e.callServer:...
function ei (line 1) | function ei(e,t,r){function n(t){k(e,t)}var u={_rowState:0,_rowID:0,_row...
function r (line 1) | function r(){var r=Array.prototype.slice.call(arguments);return t(e,r)}
function u (line 1) | function u(e,t){t=new Blob([new Uint8Array(t.buffer,t.byteOffset,t.byteL...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
function o (line 1) | function o(e,t){if(null===t)return null;if("object"==typeof t){switch(t....
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function l (line 1) | function l(e,t){return"object"==typeof e&&null!==e&&(t="$"+t.toString(16...
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function i (line 1) | function i(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"...
function s (line 1) | function s(e){return Number(e.digest.split(";")[1])}
function c (line 1) | function c(e){switch(e){case 401:return"unauthorized";case 403:return"fo...
function s (line 1) | function s(e){if("object"!=typeof e||null===e||!("digest"in e)||"string"...
function u (line 1) | function u(e){return(0,a.isRedirectError)(e)||(0,n.isHTTPAccessFallbackE...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
class n (line 1) | class n extends Error{constructor(){super("Method unavailable on `Readon...
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
class a (line 1) | class a extends URLSearchParams{append(){throw new n}delete(){throw new ...
method append (line 1) | append(){throw new n}
method delete (line 1) | delete(){throw new n}
method set (line 1) | set(){throw new n}
method sort (line 1) | sort(){throw new n}
function f (line 1) | function f(e,t){let r=Promise.resolve(t);return r.status="fulfilled",r.v...
function i (line 1) | function i(e){throw Object.defineProperty(Error(`\`${e}\` was called out...
function s (line 1) | function s(){throw Object.defineProperty(new l.InvariantError("Expected ...
function c (line 1) | function c(e){switch(e.type){case"prerender":case"prerender-runtime":cas...
function f (line 1) | function f(e){switch(e.type){case"request":case"prerender":case"prerende...
function d (line 1) | function d(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":...
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function p (line 1) | function p(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":...
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
function h (line 1) | function h(e,t){if(e.dev)switch(t.type){case"cache":case"private-cache":...
function y (line 1) | function y(e,t){if(e.isDraftMode)switch(t.type){case"cache":case"private...
function g (line 1) | function g(e){switch(e.type){case"prerender":case"prerender-client":case...
function _ (line 1) | function _(e){switch(e.type){case"prerender-runtime":case"private-cache"...
function u (line 1) | function u(){return!function(){if("u"<typeof window){let{workUnitAsyncSt...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
function n (line 1) | function n(e,t=!0){return e.pathname+e.search+(t?e.hash:"")}
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
function o (line 1) | function o(e){return!!(e&&"u">typeof window)&&!!window.next.__pendingUrl...
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function l (line 1) | function l(){}
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function i (line 1) | function i(e){return u.HTML_LIMITED_BOT_UA_RE.test(e)}
function s (line 1) | function s(e){return o.test(e)||i(e)}
function c (line 1) | function c(e){return o.test(e)?"dom":i(e)?"html":void 0}
class p (line 1) | class p extends l.default.Component{constructor(e){super(e),this.reset=(...
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
function h (line 1) | function h({errorComponent:e,errorStyles:t,errorScripts:r,children:n}){l...
function n (line 1) | function n(e){return null!==e&&"object"==typeof e&&"then"in e&&"function...
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
function i (line 1) | function i(e){if(null===l)throw Object.defineProperty(Error("Internal Ne...
function s (line 1) | function s(e){let[t,r]=u.default.useState(e.state);l=t=>e.dispatch(t,r);...
function o (line 1) | async function o(e,t){return new Promise((r,o)=>{(0,n.startTransition)((...
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function n (line 1) | function n(e){return e.startsWith("/")?e:`/${e}`}
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
function u (line 1) | function u(e){return Array.isArray(e)?e[1]:e}
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
function o (line 1) | function o(e){return"("===e[0]&&e.endsWith(")")}
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function l (line 1) | function l(e){return e.startsWith("@")&&"@children"!==e}
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function i (line 1) | function i(e,t){if(e.includes(c)){let e=JSON.stringify(t);return"{}"!==e...
function s (line 1) | function s(e,t){if(!e||0===e.length)return null;let r="children"===t?e[0...
function l (line 1) | function l(e){return(0,u.ensureLeadingSlash)(e.split("/").reduce((e,t,r,...
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function i (line 1) | function i(e){return e.replace(/\.rsc($|\?)/,"$1")}
function l (line 1) | function l(e){return void 0!==e.split("/").find(e=>o.find(t=>e.startsWit...
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function i (line 1) | function i(e){let t,r,n;for(let a of e.split("/"))if(r=o.find(e=>a.start...
function s (line 1) | function s(e){return e.reduce((e,t)=>{let r;return""===(t="/"===(r=t)[0]...
function c (line 1) | function c(e){let t=Array.isArray(e[0])?e[0][1]:e[0];if(t===o.DEFAULT_SE...
function f (line 1) | function f(e,t){let r=function e(t,r){let[n,a]=t,[o,s]=r,f=i(n),d=i(o);i...
function a (line 1) | function a(e){return void 0!==e}
method append (line 1) | append(){throw new n}
method delete (line 1) | delete(){throw new n}
method set (line 1) | set(){throw new n}
method sort (line 1) | sort(){throw new n}
function u (line 1) | function u(e,t){let r=t.shouldScroll??!0,u=e.previousNextUrl,o=e.nextUrl...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
function i (line 1) | function i(e){if("string"==typeof e)return e.startsWith(u.PAGE_SEGMENT_K...
function s (line 1) | function s(e,t,r){return e+"/"+("children"===t?r:`@${f(t)}/${r}`)}
function f (line 1) | function f(e){return c.test(e)?e:"!"+btoa(e).replace(/\+/g,"-").replace(...
function d (line 1) | function d(e){return`__next${e.replace(/\//g,".")}.txt`}
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function i (line 1) | function i(e){let t=e.headers.get(l.NEXT_REWRITTEN_QUERY_HEADER);return ...
function s (line 1) | function s(e){return e.headers.get(l.NEXT_REWRITTEN_PATH_HEADER)??p(new ...
function c (line 1) | function c(e,t,r){switch(e){case"c":return r<t.length?t.slice(r).map(e=>...
function f (line 1) | function f(e){return!(e===o.ROOT_SEGMENT_REQUEST_KEY||e.startsWith(u.PAG...
function d (line 1) | function d(e,t){return"string"==typeof e?(0,u.addSearchParamsIfPageSegme...
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function p (line 1) | function p(e){let t=new URL(e);if(t.searchParams.delete(l.NEXT_RSC_UNION...
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
function h (line 1) | function h(e,t){return"c"===t||"oc"===t?e.split("/"):e}
function y (line 1) | function y(e){let t={};for(let[r,n]of e.entries())void 0===t[r]?t[r]=n:A...
function i (line 1) | function i(e){let[t,r,n,a]=e.slice(-4),u=e.slice(0,-4);return{pathToSegm...
function s (line 1) | function s(e,t){let r=(0,o.getRenderedPathname)(e),n=(0,o.getRenderedSea...
function c (line 1) | function c(e){return e.slice(2)}
function f (line 1) | function f(e){return"string"==typeof e?e:e.map(e=>i(e))}
function d (line 1) | function d(e,t){return t?encodeURIComponent(JSON.stringify(e)):encodeURI...
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function o (line 1) | function o(e){u=e}
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function l (line 1) | function l(){return u}
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function u (line 1) | function u(e){let t=5381;for(let r=0;r<e.length;r++)t=(t<<5)+t+e.charCod...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
function o (line 1) | function o(e){return u(e).toString(36).slice(0,5)}
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function a (line 1) | function a(e,t,r,a){return(void 0===e||"0"===e)&&void 0===t&&void 0===r&...
method append (line 1) | append(){throw new n}
method delete (line 1) | delete(){throw new n}
method set (line 1) | set(){throw new n}
method sort (line 1) | sort(){throw new n}
function _ (line 1) | function _(e){return(0,p.urlToUrlWithoutFlightMarker)(new URL(e,location...
function b (line 1) | async function b(e,t){let{flightRouterState:r,nextUrl:n}=t,a={[l.RSC_HEA...
function m (line 1) | async function m(e,t,r,a,u){var o,c;let f=(0,h.getDeploymentId)();f&&(t[...
function R (line 1) | function R(e,t){return y(e,{callServer:i.callServer,findSourceMapURL:s.f...
function a (line 1) | function a(e,t=!1){return Array.isArray(e)?`${e[0]}|${e[1]}|${e[2]}`:t&&...
method append (line 1) | append(){throw new n}
method delete (line 1) | delete(){throw new n}
method set (line 1) | set(){throw new n}
method sort (line 1) | sort(){throw new n}
function v (line 1) | function v(e,t,r,n){return m(e,t,void 0,1,r,n,null,null,!1,null,null,!1,...
function b (line 1) | function b(e,t,r,n,a,u,c,f,d,h,y,g,_){return function e(t,r,n,a,u,c,f,d,...
function m (line 1) | function m(e,t,r,n,a,u,o,l,i,c,f,d,p){let y,g,_=t[0],v=null!==f&&null!==...
function R (line 1) | function R(e,t){let r=[e[0],t];return 2 in e&&(r[2]=e[2]),3 in e&&(r[3]=...
function E (line 1) | function E(e,t,r,n,a){let u=null;return r?(u=R(e,t),a||(u[3]="refetch"))...
function P (line 1) | function P(e,t,r){return{rsc:t.rsc,prefetchRsc:e?null:t.prefetchRsc,head...
function S (line 1) | function S(e,t,r,n,a,u,o,l){let i,s,c,f;return r?(s=e,i=D()):(s=null,i=e...
function O (line 1) | function O(e,t,r,n){let a=1===n;return{rsc:a?null:D(),prefetchRsc:null,h...
function j (line 1) | function j(e,t,r,n,a){let u=e.dynamicRequestTree;if(null===u){T=!1;retur...
function w (line 1) | async function w(e,t,r,n){var a,u;let o=await (a=r,u=n,new Promise(e=>{l...
function A (line 1) | function A(e,t,r,n,a){e=e||T,T=!0;let u={type:d.ACTION_SERVER_PATCH,prev...
function M (line 1) | async function M(e,t,r,n,a){try{let u=await (0,c.fetchServerResponse)(r,...
function C (line 1) | function C(e){return e&&"object"==typeof e&&e.tag===N}
function D (line 1) | function D(){let e,t,r=[],n=new Promise((r,n)=>{e=r,t=n});return n.statu...
function s (line 1) | function s(e){if(o===e)return;let t=e.prev,r=e.next;if(null===r||null===...
function c (line 1) | function c(e,t){let r=e.size;e.size=t,null!==e.next&&(i=i-r+t,d())}
function f (line 1) | function f(e){let t=e.next,r=e.prev;null!==t&&null!==r&&(i-=e.size,e.nex...
function d (line 1) | function d(){l||i<=0x3200000||(l=!0,h(p))}
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function p (line 1) | function p(){l=!1;for(;i>0x2d00000&&null!==o;){let e=o.prev;null!==e&&(0...
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
function i (line 1) | function i(){return{parent:null,key:null,value:null,map:null,prev:null,n...
function s (line 1) | function s(e,t,r,n,a){let i=function e(t,r,n,a,u,i){let s,f;if(null!==a)...
function c (line 1) | function c(e,t,r){return r.staleAt<=e||r.version<t}
function f (line 1) | function f(e,t,r,n){let a=function(e,t,r){let n=e,a=t,u=null;for(;;){let...
function d (line 1) | function d(e,t){null!==e.value&&(e.value.ref=null,e.value=null);let r=t....
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function p (line 1) | function p(e){let t=e.ref;null!==t&&(e.ref=null,h(t))}
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
function h (line 1) | function h(e){e.value=null,(0,u.deleteFromLru)(e);let t=e.map;if(null===...
function y (line 1) | function y(e,t){let r=e.ref;null!==r&&(e.size=t,(0,u.updateLruSize)(r,t))}
function i (line 1) | function i(e,t,r){return{value:e,parent:{value:t,parent:{value:r,parent:...
function s (line 1) | function s(e,t,r,n){return{value:e,parent:{value:t,parent:{value:n?r:o.F...
function c (line 1) | function c(e,t){return{value:t,parent:e}}
function f (line 1) | function f(e,t){return{value:e,parent:t}}
function d (line 1) | function d(e,t,r){return{value:e,parent:{value:t,parent:r}}}
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function p (line 1) | function p(e,t,r){return{value:e+l.HEAD_REQUEST_KEY,parent:{value:t,pare...
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
function h (line 1) | function h(e,t){let r=t.varyPath;if(t.isPage&&e!==u.FetchStrategy.Full&&...
function y (line 1) | function y(e,t){let r=e.parent;return{value:e.value,parent:{value:t,pare...
function n (line 1) | function n(e,t){let r=new URL(e);return{pathname:r.pathname,search:r.sea...
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
function b (line 1) | function b(){null!==v&&clearTimeout(v),v=setTimeout(()=>{v=null,O()},300)}
function m (line 1) | function m(e,t,r,n,a){let u={key:e,treeAtTimeOfPrefetch:t,cacheVersion:(...
function R (line 1) | function R(e){e.isCanceled=!0,function(e,t){let r=t._heapIndex;if(-1!==r...
function E (line 1) | function E(e,t,r,n){e.isCanceled=!1,e.phase=1,e.sortId=y++,e.priority=e=...
function P (line 1) | function P(e,t,r){let n=(0,l.getCurrentCacheVersion)();return e.cacheVer...
function S (line 1) | function S(e){e.priority===c.PrefetchPriority.Intent&&e!==_&&(null!==_&&...
function O (line 1) | function O(){g||(g=!0,d(M))}
function T (line 1) | function T(e){return null===v&&(e.priority===c.PrefetchPriority.Intent?h...
function j (line 1) | function j(e){return h++,e.then(e=>null===e?(w(),null):(e.closed.then(w)...
function w (line 1) | function w(){h--,O()}
function A (line 1) | function A(e){e.isCanceled||-1!==e._heapIndex||($(p,e),O())}
function M (line 1) | function M(){g=!1;let e=Date.now(),t=B(p);for(;null!==t&&T(t);){t.cacheV...
function N (line 1) | function N(e){return e.priority===c.PrefetchPriority.Background||(e.hasB...
function C (line 1) | function C(e,t,r,n,a){D(e,t,r,r.metadata,!1,n,a===c.FetchStrategy.Loadin...
function D (line 1) | function D(e,t,r,n,a,u,o){let i=(0,l.readOrCreateSegmentCacheEntry)(e,o,...
function x (line 1) | function x(e,t,r,n,a,u){switch(n.status){case l.EntryStatus.Empty:j((0,l...
function U (line 1) | function U(e,t,r,n){let a=(0,l.readOrCreateRevalidatingSegmentEntry)(e,c...
function k (line 1) | function k(e,t,r,n){let a=(0,l.readOrCreateRevalidatingSegmentEntry)(e,n...
function F (line 1) | function F(e,t){e.then(e=>{null!==e&&(0,l.upsertSegmentEntry)(Date.now()...
function L (line 1) | function L(e,t,r){return r===f.PAGE_SEGMENT_KEY?t===(0,f.addSearchParams...
function H (line 1) | function H(e,t){let r=t.priority-e.priority;if(0!==r)return r;let n=t.ph...
function $ (line 1) | function $(e,t){let r=e.length;e.push(t),t._heapIndex=r,W(e,t,r)}
function B (line 1) | function B(e){return 0===e.length?null:e[0]}
function X (line 1) | function X(e){if(0===e.length)return null;let t=e[0];t._heapIndex=-1;let...
function q (line 1) | function q(e,t){let r=t._heapIndex;-1!==r&&(0===r?K(e,t,0):H(e[r-1>>>1],...
function W (line 1) | function W(e,t,r){let n=r;for(;n>0;){let r=n-1>>>1,a=e[r];if(!(H(a,t)>0)...
function K (line 1) | function K(e,t,r){let n=r,a=e.length,u=a>>>1;for(;n<u;){let r=(n+1)*2-1,...
function n (line 1) | function n(e){let t=e.indexOf("#"),r=e.indexOf("?"),n=r>-1&&(t<0||r<t);r...
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
function a (line 1) | function a(e,t){if(!e.startsWith("/")||!t)return e;let{pathname:r,query:...
method append (line 1) | append(){throw new n}
method delete (line 1) | delete(){throw new n}
method set (line 1) | set(){throw new n}
method sort (line 1) | sort(){throw new n}
function n (line 1) | function n(e){return e.replace(/\/$/,"")||"/"}
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
function u (line 1) | function u(e,t){return(0,a.normalizePathTrailingSlash)((0,n.addPathPrefi...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
function l (line 1) | function l(e){return e.origin!==window.location.origin}
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function i (line 1) | function i(e){let t;if((0,u.isBot)(window.navigator.userAgent))return nu...
function d (line 1) | function d(e){(0,i.startTransition)(()=>{s?.setOptimisticLinkStatus(f),e...
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function p (line 1) | function p(e){s===e&&(s=null)}
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
function _ (line 1) | function _(e,t){void 0!==h.get(e)&&R(e),h.set(e,t),null!==g&&g.observe(e)}
function v (line 1) | function v(t){if(!("u">typeof window))return null;{let{createPrefetchURL...
function b (line 1) | function b(e,t,r,n,a,u){if(a){let a=v(t);if(null!==a){let t={router:r,fe...
function m (line 1) | function m(e,t,r,n){let a=v(t);null===a||_(e,{router:r,fetchStrategy:n,i...
function R (line 1) | function R(e){let t=h.get(e);if(void 0!==t){h.delete(e),y.delete(t);let ...
function E (line 1) | function E(e,t){let r=h.get(e);void 0!==r&&(r.isVisible=t,t?y.add(r):y.d...
function P (line 1) | function P(e,t){let r=h.get(e);void 0!==r&&void 0!==r&&S(r,u.PrefetchPri...
function S (line 1) | function S(t,r){if("u">typeof window){let n=t.prefetchTask;if(!t.isVisib...
function O (line 1) | function O(e,t){for(let r of y){let n=r.prefetchTask;if(null!==n&&!(0,l....
function n (line 1) | function n(){let e,t,r=new Promise((r,n)=>{e=r,t=n});return{resolve:e,re...
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
function P (line 1) | function P(e){return 1e3*Math.max(e,30)}
function M (line 1) | function M(){return A}
function N (line 1) | function N(e,t){A++,(0,s.startRevalidationCooldown)(),(0,b.pingVisibleLi...
function C (line 1) | function C(e,t){if(null!==w){let r=w;for(let n of(w=null,r))(0,s.isPrefe...
function D (line 1) | function D(e,t){let r=(0,c.getRouteVaryPath)(t.pathname,t.search,t.nextU...
function x (line 1) | function x(e,t){return(0,y.getFromCacheMap)(e,A,j,t,!1)}
function U (line 1) | function U(e){let t=e.promise;return null===t&&(t=e.promise=(0,E.createP...
function k (line 1) | function k(e,t,r){null!==t.onInvalidate&&(null===w?w=new Set([t]):w.add(...
function I (line 1) | function I(e,t,r){let n=t.search;if(""===n)return null;let a=new URL(t);...
function F (line 1) | function F(e,t){let r=null,n=e.slots;if(null!==n)for(let e in r={},n){le...
function L (line 1) | function L(e,t,r,n){let a=x(e,n.varyPath);if(null!==a)return a;let u=(0,...
function H (line 1) | function H(e,t,r,n){var a;let u=(a=n.varyPath,(0,y.getFromCacheMap)(e,A,...
function $ (line 1) | function $(e,t,r){let n=(0,c.getSegmentVaryPathForRequest)(e,r),a=X(t.st...
function B (line 1) | function B(e,t,r){if((0,y.isValueExpired)(e,A,r))return null;let n=x(e,t...
function X (line 1) | function X(e){return{status:0,fetchStrategy:R.FetchStrategy.PPR,rsc:null...
function q (line 1) | function q(e,t){return e.status=1,e.fetchStrategy=t,t===R.FetchStrategy....
function W (line 1) | function W(e){let t=e.blockedTasks;if(null!==t){for(let e of t)(0,s.ping...
function K (line 1) | function K(e,t,r,n,a){return e.status=2,e.rsc=t,e.loading=r,e.staleAt=n,...
function V (line 1) | function V(e,t){e.status=3,e.staleAt=t,W(e)}
function G (line 1) | function G(e,t){e.status=3,e.staleAt=t,null!==e.promise&&(e.promise.reso...
function Y (line 1) | async function Y(e,t,r){let n=r.pathname,a=r.search,u=r.nextUrl,s="/_tre...
function z (line 1) | async function z(e,t,r,n){let a=new URL(e.canonicalUrl,location.origin),...
function Q (line 1) | async function Q(e,t,r,n,a){let u=e.key,o=new URL(t.canonicalUrl,locatio...
function J (line 1) | function J(e,t){let r=[];for(let n of e.values())1===n.status?G(n,t):2==...
function Z (line 1) | function Z(e,t,r,n,a,u,o,l,i){let s=null!==i?i.get(l.requestKey):void 0;...
function ee (line 1) | async function ee(e,t){let r=await (0,i.createFetch)(e,t,"low",!1);retur...
function et (line 1) | function et(e,t,r){let n=0,a=e.getReader();return new ReadableStream({as...
function er (line 1) | function er(e,t){{let r=new URL(e),n=r.pathname.endsWith("/")?r.pathname...
function en (line 1) | function en(e,t){return e<t}
function d (line 1) | function d(e,t,r,n,a,u,o,l){let c=Date.now(),d=e.href,p=d===t.href,y=(0,...
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function p (line 1) | function p(e,t,r,n,a,u,l,i,s,c){let d={scrollableSegments:null,separateR...
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
function h (line 1) | function h(e,t,r,n,a,u,l,i,s,c,d,p,h,g,_){let v={scrollableSegments:null...
function y (line 1) | function y(e,t,r,n,a,u){return{tag:f.NavigationResultTag.Success,data:{f...
function g (line 1) | function g(e,t,r){let n={},a={},u=r.slots;if(null!==u)for(let r in u){le...
function _ (line 1) | function _(e,t){let r=null,n=!0,a=(0,i.readSegmentCacheEntry)(e,t.metada...
function b (line 1) | async function b(e,t,r,n,a,i,s,c,d){let h;switch(s){case o.FreshnessPoli...
function m (line 1) | function m(e,t,r){let n=e,a=null,u=null;for(let{segmentPath:e,tree:r,see...
function p (line 1) | function p(e,t,r,n){return t.mpaNavigation=!0,t.canonicalUrl=r,t.pending...
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
function h (line 1) | function h(e,t,r,n,a){switch(a.tag){case i.NavigationResultTag.MPA:retur...
function y (line 1) | function y(e,t){let{url:r,isExternalUrl:n,navigateType:a,shouldScroll:o}...
function c (line 1) | function c(e){let t=e.nextUrl,r=e.tree;return(0,l.revalidateEntireCache)...
function f (line 1) | function f(e,t){let r=e.nextUrl,n=(0,i.hasInterceptionRouteInCurrentTree...
function i (line 1) | function i(e,t){let r={};r.preserveCustomHistoryState=!1;let i=t.mpa,s=n...
function l (line 1) | function l(e,t){let r,l,i=t.historyState;i?(r=i.tree,l=i.renderedSearch)...
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function u (line 1) | function u(e){return(0,n.refreshDynamicData)(e,a.FreshnessPolicy.HMRRefr...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
class u (line 1) | class u extends Error{constructor(...e){super(...e),this.name="Unrecogni...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
function o (line 1) | function o(e){return!!(e&&"object"==typeof e&&e instanceof u)}
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function a (line 1) | function a(e,t){if(e.startsWith(".")){let r=t.origin+t.pathname;return n...
method append (line 1) | append(){throw new n}
method delete (line 1) | delete(){throw new n}
method set (line 1) | set(){throw new n}
method sort (line 1) | sort(){throw new n}
function i (line 1) | function i(e,t,r=u.RedirectStatusCode.TemporaryRedirect){let n=Object.de...
function s (line 1) | function s(e,t){throw i(e,t??=l?.getStore()?.isAction?o.RedirectType.pus...
function c (line 1) | function c(e,t=o.RedirectType.replace){throw i(e,t,u.RedirectStatusCode....
function f (line 1) | function f(e){return(0,o.isRedirectError)(e)?e.digest.split(";").slice(2...
function d (line 1) | function d(e){if(!(0,o.isRedirectError)(e))throw Object.defineProperty(E...
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function p (line 1) | function p(e){if(!(0,o.isRedirectError)(e))throw Object.defineProperty(E...
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
function a (line 1) | function a(e,t){if("string"!=typeof e)return!1;let{pathname:r}=(0,n.pars...
method append (line 1) | append(){throw new n}
method delete (line 1) | delete(){throw new n}
method set (line 1) | set(){throw new n}
method sort (line 1) | sort(){throw new n}
function a (line 1) | function a(e){return(0,n.pathHasPrefix)(e,"")}
method append (line 1) | append(){throw new n}
method delete (line 1) | delete(){throw new n}
method set (line 1) | set(){throw new n}
method sort (line 1) | sort(){throw new n}
function n (line 1) | function n(e){return e}
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
function u (line 1) | function u(e){let t=parseInt(e.slice(0,2),16),r=t>>1&63,n=Array(6);for(l...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
function o (line 1) | function o(e,t){let r=Array(e.length);for(let n=0;n<e.length;n++)(n<6&&t...
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function T (line 1) | async function T(e,t,{actionId:r,actionArgs:c}){let f,d,h,g,_,b=(0,i.cre...
function j (line 2) | function j(e,t){let{resolve:r,reject:n}=t,a={};a.preserveCustomHistorySt...
function w (line 2) | function w(e,t){let r=(0,h.getRedirectError)(e,t);return r.handled=!0,r}
function l (line 2) | function l(e,t,r,l,i){let s=(0,n.createPrefetchURL)(e);if(null===s)retur...
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function y (line 2) | function y(e,t){null!==e.pending?(e.pending=e.pending.next,null!==e.pend...
function g (line 2) | async function g({actionQueue:e,action:t,setState:r}){let n=e.state;e.pe...
function v (line 2) | function v(e,t){let r={state:e,dispatch:(e,t)=>(function(e,t,r){let n={r...
function b (line 2) | function b(){return null!==_?_.state:null}
function m (line 2) | function m(){return null!==_?_.onRouterTransitionStart:null}
function R (line 2) | function R(e,t,r,n){let a=new URL((0,d.addBasePath)(e),location.href);(0...
function E (line 2) | function E(e,t){let r=m();null!==r&&r(e,"traverse"),(0,f.dispatchAppRout...
function l (line 2) | function l(e){let t=(0,u.useContext)(o);t&&t(e)}
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function u (line 2) | function u(){let e=Object.defineProperty(Error(a),"__NEXT_ERROR_CODE",{v...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
function n (line 2) | function n(){throw Object.defineProperty(Error("`forbidden()` is experim...
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
function n (line 2) | function n(){throw Object.defineProperty(Error("`unauthorized()` is expe...
method constructor (line 1) | constructor(e,t){super(`Invariant: ${e.endsWith(".")?e:e+"."} This is ...
method constructor (line 1) | constructor(){super("Method unavailable on `ReadonlyURLSearchParams`. ...
function u (line 2) | function u(e){return"object"==typeof e&&null!==e&&"digest"in e&&e.digest...
method constructor (line 1) | constructor(...e){super(...e),this.name="UnrecognizedActionError"}
class l (line 2) | class l extends Error{constructor(e,t){super(`During prerendering, ${t} ...
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function s (line 2) | function s(e,t,r){if(e.aborted)return Promise.reject(new l(t,r));{let n=...
function c (line 2) | function c(){}
function f (line 2) | function f(e,t,r){return t.stagedRendering?t.stagedRendering.delayUntilS...
function a (line 2) | function a(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}
method append (line 1) | append(){throw new n}
method delete (line 1) | delete(){throw new n}
method set (line 1) | set(){throw new n}
method sort (line 1) | sort(){throw new n}
class o (line 2) | class o extends Error{constructor(e){super(`Dynamic server usage: ${e}`)...
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function l (line 2) | function l(e){return"object"==typeof e&&null!==e&&"digest"in e&&"string"...
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
class o (line 2) | class o extends Error{constructor(...e){super(...e),this.code=u}}
method constructor (line 1) | constructor(e){super(`Bail out to client-side rendering: ${e}`),this.r...
method constructor (line 2) | constructor(e){super(`Dynamic server usage: ${e}`),this.description=e,...
method constructor (line 2) | constructor(...e){super(...e),this.code=u}
function l (line 2) | function l(e){return"object"==typeof e&&null!==e&&"code"in e&&e.code===u}
method constructor (line 2) | constructor(e,t){super(`During prerendering, ${t} rejects when the pre...
function i (line 2) | function i(){return new Promise(e=>l(e))}
function s (line 2) | function s(){return new Promise(e=>setImmediate(e))}
function v (line 2) | function v(e){return{isDebugDynamicAccesses:e,dynamicAccesses:[],syncDyn...
function b (line 2) | function b(){return{hasSuspenseAboveBody:!1,hasDynamicMetadata:!1,dynami...
function m (line 2) | function m(e){var t;return null==(t=e.dynamicAccesses[0])?void 0:t.expre...
function R (line 2) | function R(e,t,r){if(t)switch(t.type){case"cache":case"unstable-cache":c...
function E (line 2) | function E(e,t,r){let n=Object.defineProperty(new i.DynamicServerError(`...
function P (line 2) | function P(e){switch(e.type){case"cache":case"unstable-cache":case"priva...
function S (line 2) | function S(e,t,r){let n=D(`Route ${e} needs to bail out of prerendering ...
function O (line 2) | function O(e,t,r,n){let a=n.dynamicTracking;S(e,t,n),a&&null===a.syncDyn...
function T (line 2) | function T(e,t,r,n){if(!1===n.controller.signal.aborted){S(e,t,n);let a=...
function j (line 2) | function j({reason:e,route:t}){let r=c.workUnitAsyncStorage.getStore();w...
function w (line 2) | function w(e,t,r){(function(){if(!_)throw Object.defineProperty(Error("I...
function A (line 2) | function A(e,t){return`Route ${e} needs to bail out of prerendering at t...
function M (line 2) | function M(e){return"object"==typeof e&&null!==e&&"string"==typeof e.mes...
function N (line 2) | function N(e){return e.includes("needs to bail out of prerendering at th...
function D (line 2) | function D(e){let t=Object.defineProperty(Error(e),"__NEXT_ERROR_CODE",{...
function x (line 2) | function x(e){return"object"==typeof e&&null!==e&&e.digest===C&&"name"in...
function U (line 2) | function U(e){return e.length>0}
function k (line 2) | function k(e,t){return e.dynamicAccesses.push(...t.dynamicAccesses),e.dy...
function I (line 2) | function I(e){return e.filter(e=>"string"==typeof e.stack&&e.stack.lengt...
function F (line 3) | function F(){let e=new AbortController;return e.abort(Object.definePrope...
function L (line 3) | function L(e){switch(e.type){case"prerender":case"prerender-runtime":let...
function H (line 3) | function H(e,t){let r=t.dynamicTracking;r&&r.dynamicAccesses.push({stack...
function $ (line 3) | function $(e){let t=f.workAsyncStorage.getStore(),r=c.workUnitAsyncStora...
function B (line 3) | function B(e){let t=f.workAsyncStorage.getStore(),r=c.workUnitAsyncStora...
function G (line 3) | function G(e,t,r,n){if(!V.test(t)){if(W.test(t)){r.hasDynamicMetadata=!0...
function Y (line 3) | function Y(e,t,r,n){if(!V.test(t)){if(W.test(t)){r.dynamicMetadata=Q(`Ro...
function z (line 3) | function z(e,t,r,n){if(!V.test(t)){if(W.test(t)){r.dynamicMetadata=Q(`Ro...
function Q (line 3) | function Q(e,t){let r=Object.defineProperty(Error(e),"__NEXT_ERROR_CODE"...
function Z (line 3) | function Z(e,t){console.error(t),e.dev||(e.hasReadableErrorStacks?consol...
function ee (line 5) | function ee(e,t,r,n){if(n.syncDynamicErrorWithStack)throw Z(e,n.syncDyna...
function et (line 5) | function et(e,t,r){if(r.hasSuspenseAboveBody)return[];if(0!==t){let n=r....
function er (line 5) | function er(e,t){return e.runtimeStagePromise?e.runtimeStagePromise.then...
function d (line 5) | function d(){throw Object.defineProperty(Error("`unstable_isUnrecognized...
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function h (line 5) | function h(){p?.("useSearchParams()");let e=(0,u.useContext)(l.SearchPar...
function y (line 5) | function y(){return d?.("usePathname()"),(0,u.useContext)(l.PathnameCont...
function g (line 5) | function g(){let e=(0,u.useContext)(o.AppRouterContext);if(null===e)thro...
function _ (line 5) | function _(){return d?.("useParams()"),(0,u.useContext)(l.PathParamsCont...
function v (line 5) | function v(e="children"){d?.("useSelectedLayoutSegments()");let t=(0,u.u...
function b (line 5) | function b(e="children"){d?.("useSelectedLayoutSegment()"),(0,u.useConte...
function f (line 5) | function f({redirect:e,reset:t,redirectType:r}){let n=(0,i.useRouter)();...
class d (line 5) | class d extends l.default.Component{constructor(e){super(e),this.state={...
method constructor (line 5) | constructor(e){super(e),this.state={redirect:null,redirectType:null}}
method getDerivedStateFromError (line 5) | static getDerivedStateFromError(e){if((0,c.isRedirectError)(e)){let t=...
method render (line 5) | render(){let{redirect:e,redirectType:t}=this.state;return null!==e&&nu...
function p (line 5) | function p({children:e}){let t=(0,i.useRouter)();return(0,o.jsx)(d,{rout...
method constructor (line 1) | constructor(e){super(e),this.reset=()=>{this.setState({error:null})},t...
method getDerivedStateFromError (line 1) | static getDerivedStateFromError(e){if((0,s.isNextRouterError)(e))throw...
method getDerivedStateFromProps (line 1) | static getDerivedStateFromProps(e,t){let{error:r}=t;return e.pathname!...
method render (line 1) | render(){return this.state.error&&!d?(0,o.jsxs)(o.Fragment,{children:[...
FILE: docs/_next/static/chunks/turbopack-98aeb181aa636c3c.js
function o (line 1) | function o(e,t){this.m=e,this.e=t}
function u (line 1) | function u(e,t,r){i.call(e,t)||Object.defineProperty(e,t,r)}
function c (line 1) | function c(e,t){let r=e[t];return r||(r=a(t),e[t]=r),r}
function a (line 1) | function a(e){return{exports:{},error:void 0,id:e,namespaceObject:void 0}}
function f (line 1) | function f(e,t){u(e,"__esModule",{value:!0}),s&&u(e,s,{value:"Module"});...
method get (line 1) | get(e,t){if(i.call(e,t)||"default"===t||"__esModule"===t)return Reflect....
method ownKeys (line 1) | ownKeys(e){let t=Reflect.ownKeys(e);for(let e of u)for(let r of Reflect....
function d (line 1) | function d(e,t,r){let n=[],o=-1;for(let t=e;("object"==typeof t||"functi...
function m (line 1) | function m(e){let t=B(e,this.m);if(t.namespaceObject)return t.namespaceO...
function b (line 1) | function b(e){let t=e.indexOf("#");-1!==t&&(e=e.substring(0,t));let r=e....
function y (line 1) | function y(){let e,t;return{promise:new Promise((r,n)=>{t=n,e=r}),resolv...
function t (line 1) | function t(t){if(t=b(t),i.call(e,t))return e[t].module();let r=Error(`Ca...
function C (line 1) | function C(e){e&&1!==e.status&&(e.status=1,e.forEach(e=>e.queueCount--),...
method set (line 1) | set(e){e!==u&&(u[g]=e)}
function u (line 1) | function u(e){e!==n&&!o.has(e)&&(o.add(e),e&&0===e.status&&(s.queueCount...
function R (line 1) | function R(e,t){throw Error(`Invariant: ${t(e)}`)}
function S (line 1) | async function S(e,t,r){let n;if("string"==typeof r)return E(e,t,K(r));l...
function E (line 1) | function E(t,r,n){let o=e.loadChunkCached(t,n),l=A.get(o);if(void 0===l)...
function K (line 1) | function K(e){return`${t}${e.split("/").map(e=>encodeURIComponent(e)).jo...
function M (line 4) | function M(e){return N.test(e)}
function q (line 4) | function q(e,t,r){let n=v.get(e);if("function"!=typeof n)throw Error(fun...
function I (line 4) | function I(r){let n,o=function(e){if("string"==typeof e)return e;let r=d...
function H (line 4) | function H(e){let t=W.get(e);if(!t){let r,n;t={resolved:!1,loadingStarte...
method registerChunk (line 4) | async registerChunk(e,t){if(H(K(e)).resolve(),null!=t){for(let e of t.ot...
method loadWebAssembly (line 4) | async loadWebAssembly(e,t,r,n,o){let l=fetch(K(r)),{instance:i}=await We...
method loadWebAssemblyModule (line 4) | async loadWebAssemblyModule(e,t,r,n){let o=fetch(K(r));return await WebA...
FILE: website/app/components/BentoCard/BentoCard.tsx
constant SPRING (line 13) | const SPRING = { stiffness: 150, damping: 30 };
function BentoCard (line 15) | function BentoCard({
FILE: website/app/components/CopyButton/CopyButton.tsx
function copyToClipboard (line 5) | async function copyToClipboard(value: string) {
function CopyButton (line 28) | function CopyButton({
FILE: website/app/components/EasingPlayground/EasingPlayground.tsx
function clamp (line 6) | function clamp(n: number, min: number, max: number) {
function roundTo (line 10) | function roundTo(n: number, decimals: number) {
function generateDurationTransition (line 17) | function generateDurationTransition(duration: number) {
function scrollFilterFill (line 27) | function scrollFilterFill(window: number[], nextValue: number) {
function niceCeil (line 39) | function niceCeil(n: number) {
function computeSim (line 51) | function computeSim(step: number, gain: number, duration: number) {
function computeTargetYMax (line 111) | function computeTargetYMax(step: number, gain: number, duration: number) {
function stepToDotQuant (line 116) | function stepToDotQuant(step: number) {
type EasingPlaygroundProps (line 132) | type EasingPlaygroundProps = {
function EasingPlayground (line 136) | function EasingPlayground({ className = "" }: EasingPlaygroundProps) {
FILE: website/app/components/FlowField/FlowField.tsx
type FlowFieldProps (line 5) | type FlowFieldProps = {
type Particle (line 9) | type Particle = {
function clamp (line 18) | function clamp(n: number, min: number, max: number) {
function rand (line 22) | function rand(seed: number) {
function FlowField (line 28) | function FlowField({ className = "" }: FlowFieldProps) {
FILE: website/app/components/HeroCurvePanel/HeroCurvePanel.tsx
constant SPRING (line 5) | const SPRING = { type: "spring" as const, stiffness: 80, damping: 18 };
constant CURVE_D (line 10) | const CURVE_D =
constant PARAMS (line 13) | const PARAMS = [
function HeroCurvePanel (line 19) | function HeroCurvePanel() {
FILE: website/app/components/LanguageSelector/LanguageSelector.tsx
constant LANGUAGES (line 9) | const LANGUAGES: { code: Language; name: string }[] = [
function LanguageSelector (line 24) | function LanguageSelector() {
FILE: website/app/components/Magnetic/Magnetic.tsx
function Magnetic (line 5) | function Magnetic({
FILE: website/app/components/Modal/Modal.tsx
function getFocusableElements (line 6) | function getFocusableElements(root: HTMLElement | null): HTMLElement[] {
type ModalProps (line 29) | interface ModalProps {
function Modal (line 38) | function Modal({
FILE: website/app/components/Modal/hooks.ts
function useModal (line 5) | function useModal(initialOpen = false) {
FILE: website/app/components/Reveal/Reveal.tsx
constant SPRING (line 6) | const SPRING = { type: "spring" as const, stiffness: 100, damping: 20 };
function Reveal (line 13) | function Reveal({
FILE: website/app/home-client.tsx
constant FALLBACK_RELEASE_LINK (line 19) | const FALLBACK_RELEASE_LINK = "https://github.com/Caldis/Mos/releases/la...
type Axis (line 21) | type Axis = "X" | "Y";
type AxisSetting (line 22) | type AxisSetting = "smooth" | "reverse";
type AppProfile (line 24) | type AppProfile = {
constant APP_PROFILES (line 32) | const APP_PROFILES: AppProfile[] = [
function MiniToggle (line 95) | function MiniToggle({
function pickDownloadUrl (line 136) | function pickDownloadUrl(release: unknown): string {
constant HERO_SPRING (line 161) | const HERO_SPRING = { type: "spring" as const, stiffness: 100, damping: ...
function heroMotion (line 163) | function heroMotion(delayS: number, shouldReduceMotion: boolean | null) {
function HomeClient (line 171) | function HomeClient() {
FILE: website/app/i18n/context.tsx
type Language (line 18) | type Language =
type Translations (line 32) | type Translations = typeof en;
constant SUPPORTED_LANGUAGES (line 34) | const SUPPORTED_LANGUAGES: readonly Language[] = [
function isLanguage (line 49) | function isLanguage(value: string): value is Language {
function uniqStrings (line 53) | function uniqStrings(items: string[]) {
function mapBrowserLanguageToSupported (line 57) | function mapBrowserLanguageToSupported(langRaw: string): Language | null {
function defaultLanguageFromBrowser (line 79) | function defaultLanguageFromBrowser(): Language {
constant TRANSLATIONS_BY_LANGUAGE (line 93) | const TRANSLATIONS_BY_LANGUAGE: Record<Language, Translations> = {
type I18nContextType (line 108) | interface I18nContextType {
function I18nProvider (line 116) | function I18nProvider({ children }: { children: React.ReactNode }) {
function useI18n (line 168) | function useI18n() {
FILE: website/app/i18n/format.ts
function format (line 1) | function format(
FILE: website/app/layout.tsx
constant GA_ID (line 25) | const GA_ID = "G-9M7WPLB8BR";
function RootLayout (line 27) | function RootLayout({
FILE: website/app/page.tsx
function Page (line 35) | function Page() {
FILE: website/app/providers.tsx
function Providers (line 5) | function Providers({ children }: { children: React.ReactNode }) {
FILE: website/app/robots.ts
function robots (line 6) | function robots(): MetadataRoute.Robots {
FILE: website/app/services/github.ts
function useGithubRelease (line 4) | function useGithubRelease() {
FILE: website/app/services/utils.ts
function fetcher (line 1) | async function fetcher (...args: [RequestInfo | URL, RequestInit?]) {
FILE: website/app/site.ts
constant SITE_URL (line 4) | const SITE_URL = new URL(rawSiteUrl.endsWith("/") ? rawSiteUrl : `${rawS...
constant SITE_NAME (line 6) | const SITE_NAME = "Mos";
constant SITE_TITLE (line 8) | const SITE_TITLE = "Mos | Turn the mouse into flow";
constant SITE_DESCRIPTION (line 10) | const SITE_DESCRIPTION =
constant OG_IMAGE_PATH (line 13) | const OG_IMAGE_PATH = "/og.svg";
FILE: website/app/sitemap.ts
function sitemap (line 6) | function sitemap(): MetadataRoute.Sitemap {
FILE: website/archive/v0/index.js
function translate (line 45) | function translate(language) {
FILE: website/archive/v1/src/i18n/image.js
function translate (line 28) | function translate(language) {
FILE: website/archive/v1/src/i18n/text.js
function translate (line 133) | function translate(language) {
Condensed preview — 259 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,878K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug-report-------.md",
"chars": 430,
"preview": "---\nname: Bug report | 故障报告\nabout: To help us improve | 帮助我们变得更好\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the"
},
{
"path": ".github/ISSUE_TEMPLATE/feature-request-------.md",
"chars": 356,
"preview": "---\nname: Feature request | 功能请求\nabout: Suggest an idea for this project | 提出你的新点子\ntitle: ''\nlabels: ''\nassignees: ''\n\n-"
},
{
"path": ".gitignore",
"chars": 233,
"preview": "# docs\nwebsite/.idea\nwebsite/.next\nwebsite/node_modules\nwebsite/out\n\n# macOS\n.DS_Store\n\n# XCode\nxcuserdata\n*.xcuserstate"
},
{
"path": ".last-release-commit",
"chars": 41,
"preview": "428607d00ab65498e548b2d942bf675069cf40a2\n"
},
{
"path": ".skills/release-preparation/SKILL.md",
"chars": 10640,
"preview": "---\nname: release-preparation\ndescription: Use when preparing a new Mos release (stable, beta, or alpha) - covers versio"
},
{
"path": ".skills/release-preparation/scripts/create_gh_draft.sh",
"chars": 1438,
"preview": "#!/usr/bin/env bash\n# create_gh_draft.sh - Create a GitHub release draft\n# Usage: create_gh_draft.sh <tag> <zip_path> <r"
},
{
"path": ".skills/release-preparation/scripts/prepare_zip.sh",
"chars": 2213,
"preview": "#!/usr/bin/env bash\n# prepare_zip.sh - Package Mos.app into a release zip\n# Usage: prepare_zip.sh <path-to-Mos.app> [--c"
},
{
"path": ".skills/release-preparation/scripts/update_appcast.sh",
"chars": 6129,
"preview": "#!/usr/bin/env bash\n# update_appcast.sh - Sign zip and update appcast.xml\n# Usage: update_appcast.sh <zip_path> <changel"
},
{
"path": "CHANGELOG.md",
"chars": 28109,
"preview": "# 4.0.0\n\n> \n\n## 新功能\n- 全新加入「按钮」模块:现在可以直接将鼠标按键绑定到你想要的快捷动作。🎉\n- 加入「模拟触控板」模式,我不知道有什么用, 但有点新鲜感总不是坏事 😜\n- 现在可以在「滚动」中基于垂直、水平方向独立调"
},
{
"path": "CLAUDE.md",
"chars": 8992,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3213,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "CONTRIBUTING.md",
"chars": 2842,
"preview": "# How to contribute\n\nBug-fixes and features often come from users of the Mos, and improving it greatly. We want to keep "
},
{
"path": "ISSUE_TEMPLATE.md",
"chars": 286,
"preview": "> 提供尽可能完整的内容可以让我们更快速地定位问题\n\n- 问题描述 | Issue description:\n\n\n- 如何重现 | How to reproduce it:\n\n\n- 期望结果 | What is expected:\n\n\n- "
},
{
"path": "LICENSE",
"chars": 1240,
"preview": "Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)\nThis is a human-readable summary of (and not a substitute for"
},
{
"path": "LOCALIZATION.md",
"chars": 7678,
"preview": "# Localization Guide for Mos\n\nThis guide describes how Mos 4.0 handles localisation, how to extend it, and how to keep e"
},
{
"path": "Mos/AppDelegate.swift",
"chars": 4381,
"preview": "//\n// AppDelegate.swift\n// Mos\n//\n// Created by Caldis on 2017/1/10.\n// Copyright © 2017年 Caldis. All rights reserve"
},
{
"path": "Mos/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1257,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"Base-16.png\",\n \"idiom\" : \"mac\",\n \"scale\" : \"1x\",\n \"size\" : \"16"
},
{
"path": "Mos/Assets.xcassets/AppStatusBarIcon.imageset/Contents.json",
"chars": 739,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\"\n },\n {\n \"filename\" : \"MenubarIcon-16 1.png\",\n \"idiom\""
},
{
"path": "Mos/Assets.xcassets/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Mos/Assets.xcassets/Donate/AlipayLogo.imageset/Contents.json",
"chars": 363,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"AliPayForLight.png\"\n },\n {\n \"idiom\" :"
},
{
"path": "Mos/Assets.xcassets/Donate/AlipayQR.imageset/Contents.json",
"chars": 367,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"AliPayQRForLight.png\"\n },\n {\n \"idiom\""
},
{
"path": "Mos/Assets.xcassets/Donate/BuyMeACoffee.imageset/Contents.json",
"chars": 164,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"bmc-brand-logo.svg\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n "
},
{
"path": "Mos/Assets.xcassets/Donate/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Mos/Assets.xcassets/Donate/MEOW.imageset/Contents.json",
"chars": 159,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"IMG_0412.jpeg\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"auth"
},
{
"path": "Mos/Assets.xcassets/Donate/PaypalLogo.imageset/Contents.json",
"chars": 363,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"PayPalForLight.png\"\n },\n {\n \"idiom\" :"
},
{
"path": "Mos/Assets.xcassets/Donate/WechatpayLogo.imageset/Contents.json",
"chars": 369,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"WeChatPayForLight.png\"\n },\n {\n \"idiom"
},
{
"path": "Mos/Assets.xcassets/Donate/WechatpayQR.imageset/Contents.json",
"chars": 373,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"WeChatPayQRForLight.png\"\n },\n {\n \"idi"
},
{
"path": "Mos/Assets.xcassets/Guidance/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Mos/Assets.xcassets/Guidance/drag-arrow.imageset/Contents.json",
"chars": 160,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"drag-arrow.png\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"aut"
},
{
"path": "Mos/Assets.xcassets/Guidance/manual-remove.imageset/Contents.json",
"chars": 163,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"manual-remove.png\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \""
},
{
"path": "Mos/Assets.xcassets/Guidance/sparkle.imageset/Contents.json",
"chars": 157,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"sparkle.png\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"author"
},
{
"path": "Mos/Assets.xcassets/Monitor/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Mos/Assets.xcassets/Monitor/SF.arrow.clockwise.imageset/Contents.json",
"chars": 237,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"SF.arrow.clockwise.svg\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n"
},
{
"path": "Mos/Assets.xcassets/Preferences/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.app.background.dotted.imageset/Contents.json",
"chars": 243,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"SF.app.background.dotted.svg\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info"
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.arrow.triangle.capsulepath.imageset/Contents.json",
"chars": 248,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"SF.arrow.triangle.capsulepath.svg\",\n \"idiom\" : \"universal\"\n }\n ],\n "
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.button.horizontal.top.press.imageset/Contents.json",
"chars": 249,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"SF.button.horizontal.top.press.svg\",\n \"idiom\" : \"universal\"\n }\n ],\n "
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.circle.dotted.circle.imageset/Contents.json",
"chars": 242,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"SF.circle.dotted.circle.svg\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\""
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.ellipsis.circle.imageset/Contents.json",
"chars": 237,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"SF.ellipsis.circle.svg\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n"
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.gearshape.imageset/Contents.json",
"chars": 231,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"SF.gearshape.svg\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"a"
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.lasso.badge.sparkles.imageset/Contents.json",
"chars": 242,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"SF.lasso.badge.sparkles.svg\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\""
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.minus.imageset/Contents.json",
"chars": 224,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"minus.pdf\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"author\" "
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.person.crop.circle.dashed.imageset/Contents.json",
"chars": 247,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"SF.person.crop.circle.dashed.svg\",\n \"idiom\" : \"universal\"\n }\n ],\n \""
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.plus.imageset/Contents.json",
"chars": 223,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"plus.pdf\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"author\" :"
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.scribble.imageset/Contents.json",
"chars": 227,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"scribble.pdf\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"autho"
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.tray.imageset/Contents.json",
"chars": 223,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"tray.pdf\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" : {\n \"author\" :"
},
{
"path": "Mos/Assets.xcassets/Preferences/SF.wand.and.rays.inverse.imageset/Contents.json",
"chars": 240,
"preview": "{\n \"images\" : [\n {\n \"filename\" : \"wand.and.rays.inverse.pdf\",\n \"idiom\" : \"universal\"\n }\n ],\n \"info\" :"
},
{
"path": "Mos/Assets.xcassets/StatusItem/Contents.json",
"chars": 63,
"preview": "{\n \"info\" : {\n \"author\" : \"xcode\",\n \"version\" : 1\n }\n}\n"
},
{
"path": "Mos/Assets.xcassets/StatusItem/SF.escape.imageset/Contents.json",
"chars": 224,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"escape.pdf\"\n }\n ],\n \"info\" : {\n \"version"
},
{
"path": "Mos/Assets.xcassets/StatusItem/SF.gauge.imageset/Contents.json",
"chars": 223,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"gauge.pdf\"\n }\n ],\n \"info\" : {\n \"version\""
},
{
"path": "Mos/Assets.xcassets/StatusItem/SF.hidpp.imageset/Contents.json",
"chars": 223,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"hidpp.pdf\"\n }\n ],\n \"info\" : {\n \"version\""
},
{
"path": "Mos/Assets.xcassets/StatusItem/SF.square.stack.3d.down.right.imageset/Contents.json",
"chars": 244,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"square.stack.3d.down.right.pdf\"\n }\n ],\n \"in"
},
{
"path": "Mos/Base.lproj/Main.storyboard",
"chars": 320326,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" t"
},
{
"path": "Mos/ButtonCore/ButtonCore.swift",
"chars": 2162,
"preview": "//\n// ButtonCore.swift\n// Mos\n// 鼠标按钮事件截取与处理核心类\n// Created by Claude on 2025/8/10.\n// Copyright © 2025年 Caldis. All"
},
{
"path": "Mos/ButtonCore/ButtonFilter.swift",
"chars": 1747,
"preview": "//\n// ButtonFilter.swift\n// Mos\n// 鼠标按钮事件过滤器\n// Created by Claude on 2025/8/10.\n// Copyright © 2025年 Caldis. All ri"
},
{
"path": "Mos/ButtonCore/ButtonUtils.swift",
"chars": 1035,
"preview": "//\n// ButtonUtils.swift\n// Mos\n// 按钮绑定工具类 - 获取配置和管理绑定\n// Created by Claude on 2025/8/10.\n// Copyright © 2025年 Caldi"
},
{
"path": "Mos/Components/AdaptivePopover.swift",
"chars": 1002,
"preview": "//\n// AdaptivePopover.swift\n// Mos\n// Popover tip view that auto-sizes based on content\n// Created by Caldis on 2025"
},
{
"path": "Mos/Components/BrandTag.swift",
"chars": 6134,
"preview": "//\n// BrandTag.swift\n// Mos\n// 统一的品牌标签渲染工具 - 支持多厂商品牌标识\n// Created by Mos on 2026/3/19.\n// Copyright © 2026 Caldis. "
},
{
"path": "Mos/Components/DraggingImageView.swift",
"chars": 1014,
"preview": "//\n// DraggingImageView.swift\n// Mos\n//\n// Copyright © 2025年 Caldis. All rights reserved.\n//\n\nimport Cocoa\n\nclass Dra"
},
{
"path": "Mos/Components/PrimaryButton.swift",
"chars": 2271,
"preview": "//\n// PrimaryButton.swift\n// Mos\n// 带样式的按钮\n// Created by 陈标 on 2025/9/10.\n// Copyright © 2025 Caldis. All rights re"
},
{
"path": "Mos/Extension/CGEvent+Extensions.swift",
"chars": 5243,
"preview": "//\n// CGEvent+Extensions.swift\n// Mos\n// CGEvent 相关的扩展方法\n// Created by Claude on 2025/9/13.\n// Copyright © 2025年 Ca"
},
{
"path": "Mos/Extension/NSColor+Extensions.swift",
"chars": 1812,
"preview": "//\n// NSColor+Extensions.swift\n// Mos\n// NSColor 相关的扩展方法\n// Created by Claude on 2025/10/05\n// Copyright © 2025年 Ca"
},
{
"path": "Mos/Info.plist",
"chars": 1708,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Mos/InputEvent/MosInputEvent.swift",
"chars": 6972,
"preview": "//\n// MosInputEvent.swift\n// Mos\n// 统一输入事件 - 抽象 CGEventTap 和 HID++ 两种事件源\n// Created by Mos on 2026/3/16.\n// Copyrig"
},
{
"path": "Mos/InputEvent/MosInputProcessor.swift",
"chars": 1194,
"preview": "//\n// MosInputProcessor.swift\n// Mos\n// 统一事件处理器 - 接收 MosInputEvent, 匹配 ButtonBinding, 执行动作\n// Created by Mos on 2026"
},
{
"path": "Mos/Keys/KeyCode.swift",
"chars": 6028,
"preview": "//\n// KeyCode.swift\n// Mos\n// 键盘和事件相关的常量定义\n// Created by Claude on 2025/9/13.\n// Copyright © 2025年 Caldis. All righ"
},
{
"path": "Mos/Keys/KeyPopover.swift",
"chars": 3738,
"preview": "//\n// KeyPopover.swift\n// Mos\n// 录制按键时显示的 Popover UI 组件\n// Created by Claude on 2025/9/13.\n// Copyright © 2025年 Cal"
},
{
"path": "Mos/Keys/KeyPreview.swift",
"chars": 9399,
"preview": "//\n// KeyPreview.swift\n// Mos\n// 可复用的按键显示组件\n// Created by Claude on 2025/9/13.\n// Copyright © 2025年 Caldis. All rig"
},
{
"path": "Mos/Keys/KeyRecorder.swift",
"chars": 11865,
"preview": "//\n// KeyRecorder.swift\n// Mos\n// 用于录制热键\n//\n// Created by Claude on 2025/8/31.\n// Copyright © 2025 Caldis. All righ"
},
{
"path": "Mos/Localizable.xcstrings",
"chars": 167591,
"preview": "{\n \"sourceLanguage\": \"en\",\n \"strings\": {\n \"appExpose\": {\n \"extractionState\": \"manual\",\n \"localizations\": "
},
{
"path": "Mos/LogitechHID/LogitechDeviceSession.swift",
"chars": 40584,
"preview": "//\n// LogitechDeviceSession.swift\n// Mos\n// 单个 Logitech 设备的 HID++ 2.0 通信会话\n// 实现 Feature Discovery, Button Divert, 事"
},
{
"path": "Mos/LogitechHID/LogitechHIDDebugPanel.swift",
"chars": 25233,
"preview": "//\n// LogitechHIDDebugPanel.swift\n// Mos\n// Logitech HID++ 综合调试面板\n// Created by Mos on 2026/3/16.\n// Copyright © 20"
},
{
"path": "Mos/LogitechHID/LogitechHIDManager.swift",
"chars": 6804,
"preview": "//\n// LogitechHIDManager.swift\n// Mos\n// Logitech HID 设备管理器 - 通过 IOKit 枚举和监控 Logitech 设备\n// Created by Mos on 2026/3"
},
{
"path": "Mos/Managers/StatusItemManager.swift",
"chars": 4502,
"preview": "//\n// StatusItemManager.swift\n// Mos\n// 管理状态栏图标以及初始化\n// Created by Caldis on 2018/3/7.\n// Copyright © 2018年 Caldis."
},
{
"path": "Mos/Managers/UpdateManager.swift",
"chars": 1138,
"preview": "//\n// UpdateManager.swift\n// Mos\n// Updates management via Sparkle\n//\n\nimport Cocoa\nimport Sparkle\n\nfinal class Updat"
},
{
"path": "Mos/Managers/WindowManager.swift",
"chars": 1757,
"preview": "//\n// WindowManager.swift\n// Mos\n// 管理窗口创建及初始化\n// Created by Caldis on 2018/2/24.\n// Copyright © 2018年 Caldis. All "
},
{
"path": "Mos/MosRelease.entitlements",
"chars": 181,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Mos/Options/Options.swift",
"chars": 11552,
"preview": "//\n// Options.swift\n// Mos\n// 配置参数\n// Created by Caldis on 2018/2/19.\n// Copyright © 2018年 Caldis. All rights reser"
},
{
"path": "Mos/ScrollCore/Interpolator.swift",
"chars": 775,
"preview": "//\n// Interpolator.swift\n// Mos\n// 插值函数集\n// Created by Caldis on 2018/2/19.\n// Copyright © 2018年 Caldis. All rights"
},
{
"path": "Mos/ScrollCore/ScrollCore.swift",
"chars": 12419,
"preview": "//\n// ScrollCore.swift\n// Mos\n// 滚动事件截取与插值计算核心类\n// Created by Caldis on 2017/1/14.\n// Copyright © 2017年 Caldis. All"
},
{
"path": "Mos/ScrollCore/ScrollDispatchContext.swift",
"chars": 4748,
"preview": "//\n// ScrollDispatchContext.swift\n// Mos\n//\n// Created by Codex on 2026/3/5.\n//\n\nimport Cocoa\nimport os\n\nfinal class "
},
{
"path": "Mos/ScrollCore/ScrollEvent.swift",
"chars": 7357,
"preview": "//\n// ScrollEvent.swift\n// Mos\n// 滚动事件基类\n// Created by Caldis on 2018/2/24.\n// Copyright © 2018年 Caldis. All rights"
},
{
"path": "Mos/ScrollCore/ScrollFilter.swift",
"chars": 1157,
"preview": "//\n// Filter.swift\n// Mos\n// 曲线峰值滤波, 用于去除滚动的起始抖动\n// Created by Caldis on 2018/3/21.\n// Copyright © 2018年 Caldis. Al"
},
{
"path": "Mos/ScrollCore/ScrollPhase.swift",
"chars": 5652,
"preview": "//\n// ScrollPhase.swift\n// Mos\n//\n// Created by Caldis on 2020/12/19.\n// Copyright © 2020 Caldis. All rights reserve"
},
{
"path": "Mos/ScrollCore/ScrollPoster.swift",
"chars": 14892,
"preview": "//\n// ScrollPoster.swift\n// Mos\n//\n// Created by Caldis on 2020/12/3.\n// Copyright © 2020 Caldis. All rights reserve"
},
{
"path": "Mos/ScrollCore/ScrollUtils.swift",
"chars": 7362,
"preview": "//\n// ScrollUtils.swift\n// Mos\n// 滚动事件截取与判断核心工具方法\n// Created by Caldis on 2018/2/19.\n// Copyright © 2018年 Caldis. A"
},
{
"path": "Mos/Shortcut/ShortcutExecutor.swift",
"chars": 5397,
"preview": "//\n// ShortcutExecutor.swift\n// Mos\n// 系统快捷键执行器 - 发送快捷键事件\n// Created by Claude on 2025/8/10.\n// Copyright © 2025年 C"
},
{
"path": "Mos/Shortcut/ShortcutManager.swift",
"chars": 6612,
"preview": "//\n// ShortcutManager.swift\n// Mos\n// 快捷键管理器 - 菜单构建和快捷键触发\n// Created by Claude on 2025/9/27.\n// Copyright © 2025年 C"
},
{
"path": "Mos/Shortcut/SystemShortcut.swift",
"chars": 23510,
"preview": "//\n// SystemShortcut.swift\n// Mos\n// 系统快捷键组合常量定义\n// Created by 陈标 on 2025/8/28.\n// Copyright © 2025 Caldis. All rig"
},
{
"path": "Mos/Utils/Archieve.swift",
"chars": 4735,
"preview": "//\n// Archieve.swift\n// Mos\n//\n// Created by Caldis on 2020/11/21.\n// Copyright © 2020 Caldis. All rights reserved.\n"
},
{
"path": "Mos/Utils/Constants.swift",
"chars": 6439,
"preview": "//\n// Constants.swift\n// Mos\n// 常量\n// Created by Caldis on 2019/3/4.\n// Copyright © 2019 Caldis. All rights reserve"
},
{
"path": "Mos/Utils/EnhanceArray.swift",
"chars": 3413,
"preview": "//\n// EnhanceArray.swift\n// Mos\n// 增强数组, 使用内置字典便于快速查找\n// Created by Caldis on 2019/3/27.\n// Copyright © 2019 Caldis"
},
{
"path": "Mos/Utils/Interceptor.swift",
"chars": 3572,
"preview": "//\n// Interceptor.swift\n// Mos\n// 事件截取工具函数\n// Created by Caldis on 2018/3/18.\n// Copyright © 2018年 Caldis. All righ"
},
{
"path": "Mos/Utils/Utils.swift",
"chars": 11184,
"preview": "//\n// Utils.swift\n// Mos\n// 实用方法\n// Created by Caldis on 2017/3/24.\n// Copyright © 2017年 Caldis. All rights reserve"
},
{
"path": "Mos/Windows/IntroductionWindow/IntroductionViewController.swift",
"chars": 3494,
"preview": "//\n// IntroductionViewController.swift\n// Mos\n//\n// Created by Caldis on 15/11/2019.\n// Copyright © 2019 Caldis. All"
},
{
"path": "Mos/Windows/IntroductionWindow/IntroductionWindowController.swift",
"chars": 491,
"preview": "//\n// IntroductionWindowController.swift\n// Mos\n// 简介界面\n// Created by Caldis on 15/11/2019.\n// Copyright © 2019 Cal"
},
{
"path": "Mos/Windows/MonitorWindow/Logger.swift",
"chars": 7731,
"preview": "//\n// Logger.swift\n// Mos\n// 日志工具\n// Created by Caldis on 2018/2/20.\n// Copyright © 2018年 Caldis. All rights reserv"
},
{
"path": "Mos/Windows/MonitorWindow/MonitorViewController.swift",
"chars": 12058,
"preview": "//\n// MonitorViewController.swift\n// Mos\n// 滚动监控界面\n// Created by Caldis on 2017/1/10.\n// Copyright © 2017年 Caldis. "
},
{
"path": "Mos/Windows/MonitorWindow/MonitorWindowController.swift",
"chars": 483,
"preview": "//\n// MonitorWindowController.swift\n// Mos\n// 滚动监控界面的容器 Window\n// Created by Caldis on 2017/1/15.\n// Copyright © 20"
},
{
"path": "Mos/Windows/PreferencesWindow/AboutView/PreferencesAboutViewController.swift",
"chars": 1950,
"preview": "//\n// PreferencesAboutViewController.swift\n// Mos\n// 关于界面\n// Created by Caldis on 2017/1/21.\n// Copyright © 2017年 C"
},
{
"path": "Mos/Windows/PreferencesWindow/AboutView/PreferencesContributorsViewController.swift",
"chars": 482,
"preview": "//\n// PreferencesContributorsViewController.swift\n// Mos\n// 贡献者名单\n// Created by Caldis on 2018/7/9.\n// Copyright © "
},
{
"path": "Mos/Windows/PreferencesWindow/AboutView/PreferencesDonateViewController.swift",
"chars": 993,
"preview": "//\n// PreferencesDonateViewCOntroller.swift\n// Mos\n// 捐赠界面\n// Created by Caldis on 2017/1/27.\n// Copyright © 2017年 "
},
{
"path": "Mos/Windows/PreferencesWindow/ApplicationView/Application.swift",
"chars": 4076,
"preview": "//\n// Application.swift\n// Mos\n// 应用程序对象\n// Created by Caldis on 2018/2/20.\n// Copyright © 2018年 Caldis. All rights"
},
{
"path": "Mos/Windows/PreferencesWindow/ApplicationView/PreferencesApplicationViewController.swift",
"chars": 9590,
"preview": "//\n// PreferencesApplicationViewController.swift\n// Mos\n// 分应用设置界面\n// Created by Caldis on 2017/1/29.\n// Copyright "
},
{
"path": "Mos/Windows/PreferencesWindow/ButtonsView/ButtonTableCellView.swift",
"chars": 11746,
"preview": "//\n// ButtonTableCellView 2.swift\n// Mos\n//\n// Created by 陈标 on 2025/9/27.\n// Copyright © 2025 Caldis. All rights re"
},
{
"path": "Mos/Windows/PreferencesWindow/ButtonsView/PreferencesButtonsViewController.swift",
"chars": 7533,
"preview": "//\n// PreferencesButtonsViewController.swift\n// Mos\n// 按钮绑定配置界面\n// Created by Claude on 2025/8/10.\n// Copyright © 2"
},
{
"path": "Mos/Windows/PreferencesWindow/ButtonsView/RecordedEvent.swift",
"chars": 6509,
"preview": "//\n// RecordedEvent.swift\n// Mos\n// 按钮绑定数据结构, 包含三部分\n// - EventType: 事件类型枚举 (键盘/鼠标), 供 RecordedEvent 和 ScrollHotkey 共"
},
{
"path": "Mos/Windows/PreferencesWindow/GeneralView/PreferencesGeneralViewController.swift",
"chars": 1232,
"preview": "//\n// PreferencesViewController.swift\n// Mos\n// 基础选项界面\n// Created by Caldis on 2017/1/15.\n// Copyright © 2017年 Cald"
},
{
"path": "Mos/Windows/PreferencesWindow/PreferencesTabViewController.swift",
"chars": 3538,
"preview": "//\n// PreferencesTabViewController.swift\n// Mos\n// 偏好设置的 TabViewController 容器\n// Created by Caldis on 2017/1/20.\n// "
},
{
"path": "Mos/Windows/PreferencesWindow/PreferencesWindowController.swift",
"chars": 1186,
"preview": "//\n// PreferencesWindowController.swift\n// Mos\n// 偏好设置面板容器 Window\n// Created by Caldis on 2017/1/15.\n// Copyright ©"
},
{
"path": "Mos/Windows/PreferencesWindow/ScrollingView/PreferencesScrollingViewController.swift",
"chars": 14225,
"preview": "//\n// PreferencesScrollingViewController.swift\n// Mos\n// 滚动选项界面\n// Created by Caldis on 2017/1/26.\n// Copyright © 2"
},
{
"path": "Mos/Windows/PreferencesWindow/ScrollingView/PreferencesScrollingWithApplicationViewController.swift",
"chars": 3140,
"preview": "//\n// PreferencesScrollingWithApplicationViewController.swift\n// Mos\n// 滚动窗口容器\n// Created by Caldis on 31/10/2019.\n/"
},
{
"path": "Mos/Windows/PreferencesWindow/ScrollingView/ScrollOptionsContextProviding.swift",
"chars": 1912,
"preview": "//\n// ScrollOptionsContextProviding.swift\n// Mos\n// Shared helpers for view controllers that operate on scroll option"
},
{
"path": "Mos/Windows/PreferencesWindow/ScrollingView/ScrollReverseDetailSettingsPopoverViewController.swift",
"chars": 1361,
"preview": "import Cocoa\n\nclass ScrollReverseDetailSettingsPopoverViewController: AdaptivePopover, ScrollOptionsContextProviding {\n\n"
},
{
"path": "Mos/Windows/PreferencesWindow/ScrollingView/ScrollSmoothDetailSettingsPopoverViewController.swift",
"chars": 2302,
"preview": "import Cocoa\n\nclass ScrollSmoothDetailSettingsPopoverViewController: AdaptivePopover, ScrollOptionsContextProviding {\n\n "
},
{
"path": "Mos/Windows/PreferencesWindow/UpdateView/PreferencesUpdatesViewController.swift",
"chars": 1417,
"preview": "//\n// PreferencesUpdatesViewController.swift\n// Mos\n// 更新界面\n// Created by Caldis on 2017/1/21.\n// Copyright © 2017年"
},
{
"path": "Mos/Windows/WelcomeWindow/WelcomeViewController.swift",
"chars": 1946,
"preview": "//\n// WelcomeViewController.swift\n// Mos\n// 欢迎界面的 View\n// Created by Caldis on 2018/7/9.\n// Copyright © 2018年 Caldi"
},
{
"path": "Mos/Windows/WelcomeWindow/WelcomeWindowController.swift",
"chars": 478,
"preview": "//\n// WelcomeWindowController.swift\n// Mos\n// 欢迎界面的 Window\n// Created by Caldis on 2018/7/9.\n// Copyright © 2018年 C"
},
{
"path": "Mos/mul.lproj/Main.xcstrings",
"chars": 283816,
"preview": "{\n \"sourceLanguage\" : \"en\",\n \"strings\" : {\n \"1LK-nr-g7N.title\" : {\n \"comment\" : \"Class = \\\"NSMenuItem\\\"; title"
},
{
"path": "Mos.xcodeproj/project.pbxproj",
"chars": 16247,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 70;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Mos.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "Mos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Mos.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 181,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Mos.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
"chars": 1459,
"preview": "{\n \"originHash\" : \"cbdd3e98dceb33f1d8c60bd4f8b77a6dce7375a680fa9378f22fc5212378a305\",\n \"pins\" : [\n {\n \"identit"
},
{
"path": "Mos.xcodeproj/xcshareddata/xcschemes/Debug.xcscheme",
"chars": 2845,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"2630\"\n version = \"1.7\">\n <BuildAction\n "
},
{
"path": "Mos.xcodeproj/xcshareddata/xcschemes/Profile.xcscheme",
"chars": 2804,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"2630\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "README.enUS.md",
"chars": 2999,
"preview": "<p align=\"center\">\n <a href=\"http://mos.caldis.me/\">\n <img width=\"320\" src=\"https://github.com/Caldis/Mos/blob/maste"
},
{
"path": "README.id.md",
"chars": 2461,
"preview": "<p align=\"center\">\n <a href=\"http://mos.caldis.me/\">\n <img width=\"320\" src=\"https://github.com/Caldis/Mos/blob/maste"
},
{
"path": "README.md",
"chars": 1710,
"preview": "<p align=\"center\">\n <a href=\"http://mos.caldis.me/\">\n <img width=\"320\" src=\"https://github.com/Caldis/Mos/blob/maste"
},
{
"path": "README.ru.md",
"chars": 3142,
"preview": "<p align=\"center\">\n <a href=\"http://mos.caldis.me/\">\n <img width=\"320\" src=\"https://github.com/Caldis/Mos/blob/maste"
},
{
"path": "dmg/README.md",
"chars": 229,
"preview": "# DMG 构建说明\n\n创建 mos 安装用的 dmg, 使用 create-dmg 脚本实现\n\n先安装 https://github.com/create-dmg/create-dmg\n\n如果 command 报错记得 chmod +x "
},
{
"path": "dmg/create-dmg.command",
"chars": 915,
"preview": "#!/bin/bash\n\n# 创建 mos 安装用的 dmg, 使用 create-dmg 脚本实现\n# 先安装 https://github.com/create-dmg/create-dmg\n# 然后东西都丢到 Mos 的 dmg 目录"
},
{
"path": "docs/.nojekyll",
"chars": 0,
"preview": ""
},
{
"path": "docs/404/index.html",
"chars": 11907,
"preview": "<!DOCTYPE html><!--4xlWUdmYkOQZmVpTO2yEI--><html lang=\"en\" class=\"js\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\""
},
{
"path": "docs/404.html",
"chars": 11907,
"preview": "<!DOCTYPE html><!--4xlWUdmYkOQZmVpTO2yEI--><html lang=\"en\" class=\"js\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\""
},
{
"path": "docs/CNAME",
"chars": 13,
"preview": "mos.caldis.me"
},
{
"path": "docs/__next.__PAGE__.txt",
"chars": 720,
"preview": "1:\"$Sreact.fragment\"\n2:I[61096,[\"/_next/static/chunks/19717b1d18b1c046.js\",\"/_next/static/chunks/d95bda38d1a9ce53.js\",\"/"
},
{
"path": "docs/__next._full.txt",
"chars": 8018,
"preview": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunk"
},
{
"path": "docs/__next._head.txt",
"chars": 2546,
"preview": "1:\"$Sreact.fragment\"\n2:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\""
},
{
"path": "docs/__next._index.txt",
"chars": 3915,
"preview": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunk"
},
{
"path": "docs/__next._tree.txt",
"chars": 894,
"preview": ":HL[\"/_next/static/chunks/543732a8392562b4.css\",\"style\"]\n:HL[\"/_next/static/media/0c795a286deabae8-s.p.b6c48e4e.woff2\",\""
},
{
"path": "docs/_next/static/4xlWUdmYkOQZmVpTO2yEI/_buildManifest.js",
"chars": 219,
"preview": "self.__BUILD_MANIFEST = {\n \"__rewrites\": {\n \"afterFiles\": [],\n \"beforeFiles\": [],\n \"fallback\": []\n },\n \"sort"
},
{
"path": "docs/_next/static/4xlWUdmYkOQZmVpTO2yEI/_clientMiddlewareManifest.json",
"chars": 2,
"preview": "[]"
},
{
"path": "docs/_next/static/4xlWUdmYkOQZmVpTO2yEI/_ssgManifest.js",
"chars": 80,
"preview": "self.__SSG_MANIFEST=new Set([]);self.__SSG_MANIFEST_CB&&self.__SSG_MANIFEST_CB()"
},
{
"path": "docs/_next/static/chunks/12c422bc11762090.js",
"chars": 19135,
"preview": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,70566,(e"
},
{
"path": "docs/_next/static/chunks/19717b1d18b1c046.js",
"chars": 38790,
"preview": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,22576,e="
},
{
"path": "docs/_next/static/chunks/2f0565a65fa02d97.js",
"chars": 30662,
"preview": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,64942,(e"
},
{
"path": "docs/_next/static/chunks/543732a8392562b4.css",
"chars": 35390,
"preview": "@font-face{font-family:Syne;font-style:normal;font-weight:400;font-display:swap;src:url(../media/ab624315db63c58d-s.028b"
},
{
"path": "docs/_next/static/chunks/a6dad97d9634a72d.js",
"chars": 112541,
"preview": "!function(){var t=\"undefined\"!=typeof globalThis?globalThis:\"undefined\"!=typeof window?window:\"undefined\"!=typeof global"
},
{
"path": "docs/_next/static/chunks/b4611851359555bd.js",
"chars": 223440,
"preview": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,11725,(e"
},
{
"path": "docs/_next/static/chunks/b492b32695e3b282.js",
"chars": 178022,
"preview": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,40574,(e"
},
{
"path": "docs/_next/static/chunks/c62ecb7f1a587007.js",
"chars": 282,
"preview": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,46424,(e"
},
{
"path": "docs/_next/static/chunks/d95bda38d1a9ce53.js",
"chars": 341,
"preview": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,46424,(e"
},
{
"path": "docs/_next/static/chunks/f1a98b44d1dc31f1.js",
"chars": 156188,
"preview": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,17421,(e"
},
{
"path": "docs/_next/static/chunks/turbopack-98aeb181aa636c3c.js",
"chars": 10196,
"preview": "(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push([\"object\"==typeof document?document.currentScript:void 0,{otherCh"
},
{
"path": "docs/_not-found/__next._full.txt",
"chars": 7249,
"preview": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunk"
},
{
"path": "docs/_not-found/__next._head.txt",
"chars": 1026,
"preview": "1:\"$Sreact.fragment\"\n2:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\""
},
{
"path": "docs/_not-found/__next._index.txt",
"chars": 3915,
"preview": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunk"
},
{
"path": "docs/_not-found/__next._not-found.__PAGE__.txt",
"chars": 1449,
"preview": "1:\"$Sreact.fragment\"\n2:I[45924,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\""
},
{
"path": "docs/_not-found/__next._not-found.txt",
"chars": 432,
"preview": "1:\"$Sreact.fragment\"\n2:I[33720,[\"/_next/static/chunks/c62ecb7f1a587007.js\",\"/_next/static/chunks/2f0565a65fa02d97.js\"],\""
},
{
"path": "docs/_not-found/__next._tree.txt",
"chars": 483,
"preview": ":HL[\"/_next/static/chunks/543732a8392562b4.css\",\"style\"]\n0:{\"buildId\":\"4xlWUdmYkOQZmVpTO2yEI\",\"tree\":{\"name\":\"\",\"paramTy"
},
{
"path": "docs/_not-found/index.html",
"chars": 11907,
"preview": "<!DOCTYPE html><!--4xlWUdmYkOQZmVpTO2yEI--><html lang=\"en\" class=\"js\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\""
},
{
"path": "docs/_not-found/index.txt",
"chars": 7249,
"preview": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunk"
},
{
"path": "docs/appcast.xml",
"chars": 5388,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<rss version=\"2.0\"\n xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces"
},
{
"path": "docs/index.html",
"chars": 45927,
"preview": "<!DOCTYPE html><!--4xlWUdmYkOQZmVpTO2yEI--><html lang=\"en\" class=\"js\"><head><meta charSet=\"utf-8\"/><meta name=\"viewport\""
},
{
"path": "docs/index.txt",
"chars": 8018,
"preview": "1:\"$Sreact.fragment\"\n3:I[96923,[\"/_next/static/chunks/19717b1d18b1c046.js\"],\"Providers\"]\n4:I[33720,[\"/_next/static/chunk"
},
{
"path": "docs/llms.txt",
"chars": 667,
"preview": "# Mos (macOS)\n\nMos is a free macOS utility that makes mouse wheel scrolling smooth, with per-app settings, independent a"
},
{
"path": "docs/release-notes/4.0.0-beta-20260108.1.en.html",
"chars": 933,
"preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, "
},
{
"path": "docs/release-notes/4.0.0-beta-20260108.1.zh.html",
"chars": 772,
"preview": "<!doctype html>\n<html lang=\"zh\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, "
},
{
"path": "docs/release-notes/4.0.0-beta-20260201.1.en.html",
"chars": 1013,
"preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, "
},
{
"path": "docs/release-notes/4.0.0-beta-20260201.1.md",
"chars": 987,
"preview": "> 这是测试版本, 一些功能或内容可能会在正式版本中变更\n>\n> 如果应用无法启动或遇到权限问题, 请参考 [Wiki: 如果应用无法正常运行](https://github.com/Caldis/Mos/wiki/%E5%A6%82%E6"
},
{
"path": "docs/release-notes/4.0.0-beta-20260201.1.zh.html",
"chars": 811,
"preview": "<!doctype html>\n<html lang=\"zh\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, "
},
{
"path": "docs/release-notes/4.0.0-beta-20260203.1.en.html",
"chars": 646,
"preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, "
},
{
"path": "docs/release-notes/4.0.0-beta-20260203.1.zh.html",
"chars": 623,
"preview": "<!doctype html>\n<html lang=\"zh\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, "
},
{
"path": "docs/release-notes/beta.en.html",
"chars": 1993,
"preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, "
},
{
"path": "docs/release-notes/beta.zh.html",
"chars": 1607,
"preview": "<!doctype html>\n<html lang=\"zh\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, "
},
{
"path": "docs/robots.txt",
"chars": 67,
"preview": "User-Agent: *\nAllow: /\n\nSitemap: https://mos.caldis.me/sitemap.xml\n"
},
{
"path": "docs/sitemap.xml",
"chars": 213,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n<url>\n<loc>https://m"
},
{
"path": "docs/superpowers/plans/2026-03-16-logitech-hid-integration.md",
"chars": 42468,
"preview": "# Logitech HID++ 2.0 Hardware Button Integration Plan\n\n> **For agentic workers:** REQUIRED: Use superpowers:subagent-dri"
},
{
"path": "docs/superpowers/specs/2026-03-16-logitech-hid-integration-design.md",
"chars": 32479,
"preview": "# Logitech HID++ 2.0 硬件按键集成设计\n\n## 概述\n\n为 Mos 新增 Logitech 鼠标硬件层面的按键识别能力。通过 IOKit HIDManager 实现 HID++ 2.0 协议通信,捕获 CGEventTa"
},
{
"path": "tools/hidpp-divert-debug.swift",
"chars": 5667,
"preview": "#!/usr/bin/env swift\n// 对比测试: 批量 divert vs 顺序 divert, 并验证 divert 状态\nimport Foundation\nimport IOKit\nimport IOKit.hid\n\nlet"
},
{
"path": "tools/hidpp-divert-fix.swift",
"chars": 6284,
"preview": "#!/usr/bin/env swift\n// 对比: CID+flags+0000 vs CID+flags+CID (self-mapping)\nimport Foundation\nimport IOKit\nimport IOKit.h"
},
{
"path": "tools/hidpp-full-test.swift",
"chars": 11833,
"preview": "#!/usr/bin/env swift\n// HID++ 2.0 全量测试 - 一次运行覆盖: 发现 → 枚举 → Divert → 捕获按键\n// swift tools/hidpp-full-test.swift\n\nimport Fo"
},
{
"path": "tools/hidpp-probe.swift",
"chars": 5920,
"preview": "#!/usr/bin/env swift\n// HID++ 2.0 BLE 探测工具 v3 - 精确复现 hidapi 行为\n// swift tools/hidpp-probe.swift\n\nimport Foundation\nimpor"
},
{
"path": "tools/hidpp-undivert-test.swift",
"chars": 4460,
"preview": "#!/usr/bin/env swift\n// 测试如何正确清除 persistDivert\nimport Foundation\nimport IOKit\nimport IOKit.hid\n\nlet VID = 0x046D\nclass C"
},
{
"path": "tools/hidpp-verify-final.swift",
"chars": 4165,
"preview": "#!/usr/bin/env swift\n// 最终验证: flags=0x03 + targetCID=self + button capture\nimport Foundation\nimport IOKit\nimport IOKit.h"
},
{
"path": "website/.nvmrc",
"chars": 3,
"preview": "22\n"
},
{
"path": "website/CNAME",
"chars": 13,
"preview": "mos.caldis.me"
},
{
"path": "website/README.md",
"chars": 578,
"preview": "## Mos Home Page\n\nThis is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.o"
},
{
"path": "website/app/components/BentoCard/BentoCard.tsx",
"chars": 1955,
"preview": "\"use client\";\n\nimport {\n motion,\n useMotionTemplate,\n useMotionValue,\n useReducedMotion,\n useSpring,\n useTransform"
},
{
"path": "website/app/components/CopyButton/CopyButton.tsx",
"chars": 1230,
"preview": "\"use client\";\n\nimport { ReactNode, useCallback, useState } from \"react\";\n\nasync function copyToClipboard(value: string) "
},
{
"path": "website/app/components/EasingPlayground/EasingPlayground.tsx",
"chars": 13113,
"preview": "\"use client\";\n\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useI18n } from \"@/app/i18n/context"
},
{
"path": "website/app/components/FlowField/FlowField.tsx",
"chars": 6424,
"preview": "\"use client\";\n\nimport { useEffect, useRef } from \"react\";\n\ntype FlowFieldProps = {\n className?: string;\n};\n\ntype Partic"
},
{
"path": "website/app/components/HeroCurvePanel/HeroCurvePanel.tsx",
"chars": 3963,
"preview": "\"use client\";\n\nimport { motion, useReducedMotion } from \"framer-motion\";\n\nconst SPRING = { type: \"spring\" as const, stif"
},
{
"path": "website/app/components/LanguageSelector/LanguageSelector.tsx",
"chars": 2861,
"preview": "\"use client\";\n\nimport { Modal } from \"@/app/components/Modal/Modal\";\nimport { useModal } from \"@/app/components/Modal/ho"
},
{
"path": "website/app/components/Magnetic/Magnetic.tsx",
"chars": 2226,
"preview": "\"use client\";\n\nimport { ReactNode, useEffect, useRef } from \"react\";\n\nexport function Magnetic({\n children,\n strength "
},
{
"path": "website/app/components/Modal/Modal.tsx",
"chars": 5138,
"preview": "\"use client\";\n\nimport { ReactNode, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { createPortal } f"
},
{
"path": "website/app/components/Modal/hooks.ts",
"chars": 348,
"preview": "\"use client\";\n\nimport { useCallback, useState } from \"react\";\n\nexport function useModal(initialOpen = false) {\n const ["
},
{
"path": "website/app/components/Reveal/Reveal.tsx",
"chars": 931,
"preview": "\"use client\";\n\nimport { motion, useInView, useReducedMotion } from \"framer-motion\";\nimport { ReactNode, useRef } from \"r"
},
{
"path": "website/app/globals.css",
"chars": 7649,
"preview": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n:root {\n --bg0: #000000;\n --bg1: #090909;\n --fg0: rgba(25"
}
]
// ... and 59 more files (download for full content)
About this extraction
This page contains the full source code of the Caldis/Mos GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 259 files (2.6 MB), approximately 690.6k tokens, and a symbol index with 1540 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.