Files
moreminimore-vibe/e2e-tests/snapshots/capacitor.spec.ts_upgraded-capacitor.txt

7834 lines
308 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

=== .gitignore ===
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
=== AI_RULES.md ===
# Tech Stack
- You are building a React application.
- Use TypeScript.
- Use React Router. KEEP the routes in src/App.tsx
- Always put source code in the src folder.
- Put pages into src/pages/
- Put components into src/components/
- The main page (default page) is src/pages/Index.tsx
- UPDATE the main page to include the new components. OTHERWISE, the user can NOT see any components!
- ALWAYS try to use the shadcn/ui library.
- Tailwind CSS: always use Tailwind CSS for styling components. Utilize Tailwind classes extensively for layout, spacing, colors, and other design aspects.
Available packages and libraries:
- The lucide-react package is installed for icons.
- You ALREADY have ALL the shadcn/ui components and their dependencies installed. So you don't need to install them again.
- You have ALL the necessary Radix UI components installed.
- Use prebuilt components from the shadcn/ui library after importing them. Note that these files shouldn't be edited, so make new components if you need to change them.
=== android/.gitignore ===
# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore
# Built application files
*.apk
*.aar
*.ap_
*.aab
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Uncomment the following line in case you need and you don't have the release build type files in your app
# release/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# IntelliJ
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
.idea/navEditor.xml
# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
#*.jks
#*.keystore
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx/
# Google Services (e.g. APIs or Firebase)
# google-services.json
# Freeline
freeline.py
freeline/
freeline_project_description.json
# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
# Version control
vcs.xml
# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
# Android Profiling
*.hprof
# Cordova plugins for Capacitor
capacitor-cordova-android-plugins
# Copied web assets
app/src/main/assets/public
# Generated Config files
app/src/main/assets/capacitor.config.json
app/src/main/assets/capacitor.plugins.json
app/src/main/res/xml/config.xml
=== android/app/.gitignore ===
/build/*
!/build/.npmkeep
=== android/app/build.gradle ===
apply plugin: 'com.android.application'
android {
namespace "com.example.[[normalizedAppName]]"
compileSdk rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "com.example.[[normalizedAppName]]"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
flatDir{
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
implementation project(':capacitor-android')
testImplementation "junit:junit:$junitVersion"
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
implementation project(':capacitor-cordova-android-plugins')
}
apply from: 'capacitor.build.gradle'
try {
def servicesJSON = file('google-services.json')
if (servicesJSON.text) {
apply plugin: 'com.google.gms.google-services'
}
} catch(Exception e) {
logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
}
=== android/app/build/.npmkeep ===
=== android/app/proguard-rules.pro ===
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
=== android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java ===
package com.getcapacitor.myapp;
import static org.junit.Assert.*;
import android.content.Context;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.getcapacitor.app", appContext.getPackageName());
}
}
=== android/app/src/main/AndroidManifest.xml ===
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBarLaunch"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
</application>
<!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
=== android/app/src/main/java/com/example/[[normalizedAppName]]/MainActivity.java ===
package com.example.[[normalizedAppName]];
import com.getcapacitor.BridgeActivity;
public class MainActivity extends BridgeActivity {}
=== android/app/src/main/res/drawable-land-hdpi/splash.png ===
[binary hash="08cc34ad7713fe7ed58bceaa37b2387b670c53cd60264b4bd6442db3098e75dc"]
=== android/app/src/main/res/drawable-land-mdpi/splash.png ===
[binary hash="5cf98b4451bd99b20df26f9e608a46946118be6b0ae90762f9ca1786a30c76ff"]
=== android/app/src/main/res/drawable-land-xhdpi/splash.png ===
[binary hash="22f87e1e3bc89aa01a7dbc39c9a4db058cd0bf4ad3fe9f55712bf69eb997f4bf"]
=== android/app/src/main/res/drawable-land-xxhdpi/splash.png ===
[binary hash="42aa26392546fcdee1b8d3ac6d4b41bfcceb41dc6a4f3a3c30c24a8a8f4db862"]
=== android/app/src/main/res/drawable-land-xxxhdpi/splash.png ===
[binary hash="60393ce8636fd263e4e1fea3fd4ab2de948c6295e898fda9b50ac4e5283be809"]
=== android/app/src/main/res/drawable-port-hdpi/splash.png ===
[binary hash="c5015f4ba3628392b538386c5e210f0b94f352a3160adab934fd0311972137ca"]
=== android/app/src/main/res/drawable-port-mdpi/splash.png ===
[binary hash="07fa579e1c83e04ba7f9cbcbfcf41b68e15fe3638f2c44a04e58b809103e6b69"]
=== android/app/src/main/res/drawable-port-xhdpi/splash.png ===
[binary hash="b73049cb37fe76d6c11b87a796766bf6af0c85483b31eb6a921657b0d764a4b9"]
=== android/app/src/main/res/drawable-port-xxhdpi/splash.png ===
[binary hash="0c7f1212f25b7b90e9a6e1d320013e4ff3d3e03e634cbb07b7b7981cac51627f"]
=== android/app/src/main/res/drawable-port-xxxhdpi/splash.png ===
[binary hash="3db071a03b2f8ffe0dfd4170fc59842d53cd15bba5e88af59401d58efabf7827"]
=== android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml ===
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1" />
</vector>
=== android/app/src/main/res/drawable/ic_launcher_background.xml ===
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillColor="#26A69A"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
</vector>
=== android/app/src/main/res/drawable/splash.png ===
[binary hash="5cf98b4451bd99b20df26f9e608a46946118be6b0ae90762f9ca1786a30c76ff"]
=== android/app/src/main/res/layout/activity_main.xml ===
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
=== android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml ===
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
=== android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml ===
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>
=== android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png ===
[binary hash="32baa10d2632a4417454a579f992bd640e0a3cec79321423559b2c9940de58a9"]
=== android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png ===
[binary hash="bfcc1b0fa931b14bb241372c76ab4f04374b67d02363c98d9cb12edfdacdf5f3"]
=== android/app/src/main/res/mipmap-hdpi/ic_launcher.png ===
[binary hash="72b71c3581ca3b5a23b1c168d69b9d855b3f184fa079902a01f088eb4f0607d5"]
=== android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png ===
[binary hash="58e78a618778926b1f6d9472a6468de878de8530970934e94aab5ba4ba08cc00"]
=== android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png ===
[binary hash="0166fc333074c373fbd0ce6b5defd71552166165ac778121ca9c9dff6b83f0fc"]
=== android/app/src/main/res/mipmap-mdpi/ic_launcher.png ===
[binary hash="27ed3603010ebc278f64f8645741ab132ff517abb5308eb9df6c8e42a48956b2"]
=== android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png ===
[binary hash="6f88083b8166cc559102f7044688de7525287632ebe09ac45d001ac8bf4b3eae"]
=== android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png ===
[binary hash="40911a00922868686854a4804b93fd6e56b503664696de03f450bff690affb6d"]
=== android/app/src/main/res/mipmap-xhdpi/ic_launcher.png ===
[binary hash="d35dbfff175b83c13ef59cf924abfc810f7b6a158595d7417c5498ea8c7c7ed1"]
=== android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png ===
[binary hash="4a82bc1e9923576275869998925ce0ae021a79aa18b24a0dd87ad6b61ca85053"]
=== android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png ===
[binary hash="1ee4cd9ff371dcb2e3938097e434f6fb8731688ed7165e61fc63693ad5b2f455"]
=== android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png ===
[binary hash="ed346eb1e3f0280f15709393705899b3ff55c20b88f4e0308006b3c33cf5fe14"]
=== android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png ===
[binary hash="bd24fd383253bf8d43f0a81f11c071d76d1d555114376dd647cd9fb38fa0a9da"]
=== android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png ===
[binary hash="ab93096331e7cd8ec379f73f1e9adcaaa9ee1115c9f4ff10411a811fb9700174"]
=== android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png ===
[binary hash="87cb2f2ffe992652bb4fa768c73719a37b5852ab17fbf8e170e888f7a42b0761"]
=== android/app/src/main/res/values/ic_launcher_background.xml ===
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>
=== android/app/src/main/res/values/strings.xml ===
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">[[appName]]</string>
<string name="title_activity_main">[[appName]]</string>
<string name="package_name">com.example.[[normalizedAppName]]</string>
<string name="custom_url_scheme">com.example.[[normalizedAppName]]</string>
</resources>
=== android/app/src/main/res/values/styles.xml ===
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:background">@null</item>
</style>
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
<item name="android:background">@drawable/splash</item>
</style>
</resources>
=== android/app/src/main/res/xml/file_paths.xml ===
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="." />
<cache-path name="my_cache_images" path="." />
</paths>
=== android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java ===
package com.getcapacitor.myapp;
import static org.junit.Assert.*;
import org.junit.Test;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
=== android/build.gradle ===
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.7.2'
classpath 'com.google.gms:google-services:4.4.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
apply from: "variables.gradle"
allprojects {
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
=== android/gradle.properties ===
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
=== android/gradle/wrapper/gradle-wrapper.jar ===
PK! META-INF/LICENSEUT<00>Z[s<>6<>hfg<66>FI<46><49><EFBFBD>}Rc<52>U7<55>3<EFBFBD><33><EFBFBD>>B$(aC,@Z<><5A><EFBFBD>=<17>(<28>N<EFBFBD>u=<3D>֢<EFBFBD><D6A2><EFBFBD>s<EFBFBD><73>w<0E>J|<7C>g<EFBFBD><67>r<EFBFBD><72>]<5D>ΩW/<2F><>/e<>6<EFBFBD><36>v<EFBFBD><76><10><>n<EFBFBD><6E>(<28>}<7D><><EFBFBD>g<><ED87A1>͛<EFBFBD><CD9B>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>ݛ<EFBFBD><DD9B>ro^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><1B>X݈ww<77><77><EFBFBD><EFBFBD><EFBFBD>n<EFBFBD><11><><EFBFBD><EFBFBD>as[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;|\<5C>[7<><37><EFBFBD>z<EFBFBD><7A>>!<01><>ō<EFBFBD>u<EFBFBD>P<><50>_ymf<6D>D3<44><33><EFBFBD>iD<69>d'8<>l<EFBFBD><6C>*Q<><51><EFBFBD>U<EFBFBD>6V<36>Nªޚj,<2C>q<EFBFBD>Eổv<E1BB95><76><EFBFBD><11> <0B>D<EFBFBD>[<5B>Jl<4A>b<EFBFBD>J<16>
ȷf<EFBFBD><EFBFBD><EFBFBD><0F><><EFBFBD>A<EFBFBD>{<7B>[<5B>
<EFBFBD>z{<7B>Xi<58><69>ջ<EFBFBD> ̡SV<53>J<EFBFBD>PG!<21>ao<61><6F><0F><><EFBFBD>\Z1<5A><31><><D39D><EFBFBD><EFBFBD><EFBFBD>K<EFBFBD><0E>j'qK<71>ϔ;< i<><69>,IJ<49><02><00>z1^<5E>
j<EFBFBD>xk0<EFBFBD>`MSiU<69>А<EFBFBD><05><06><>]<05><4A><D3B6><EFBFBD><EFBFBD>⠇=<3D><>
<EFBFBD><EFBFBD>G?<3F><>@<40>$<24>F<EFBFBD>ͼ<>ʼn+}<7D>K<EFBFBD>A<EFBFBD><02>g<EFBFBD>K<EFBFBD><4B><EFBFBD><EFBFBD><EFBFBD>B F<><12><><EFBFBD>y)<29>'<27><><15><><EFBFBD>N<EFBFBD><4E>p_7<5F>{<7B>X!{E<><07>Ӿ<EFBFBD>d<EFBFBD>9h<39>&<26>r<EFBFBD>Ar<><72><EFBFBD>k<>ʖ(<28><><EFBFBD><EFBFBD><EFBFBD><7F><EFBFBD> <0C><>
<04><><1B><><EFBFBD>p<>U.H<04>J
<EFBFBD><EFBFBD>H<EFBFBD><EFBFBD>L.<2E>Ì3qk<>7;<3B>ν<0E><>&<26><>Q<>y|x<01> <09><><01>[<5B><<3C>'<01><>,<2C>6<EFBFBD>[ )<08>՞FZoU<6F><55><EFBFBD><EFBFBD><EFBFBD>ך,<2C><19>hM<68><4D>h<EFBFBD><68>*8Xwe3<65>) Eg<06><>V<EFBFBD><56><EFBFBD>Gg<47><67><EFBFBD><EFBFBD>hCpJ<05><0F>G<EFBFBD><47>~<7E><08>_<EFBFBD><5F>h<EFBFBD><68><EFBFBD><EFBFBD>Fe<46>q<EFBFBD><71>7<EFBFBD>¹<EFBFBD>;<3B>3p<33><70>P~<7E>ִ<EFBFBD><D6B4>r/;<3B>:$DE<44><45>M<02><>4<EFBFBD>c-<2D>`<60>bz@/<2F>䘐6<E49890>Ƅ2<C684><32>?<3F>"<01><00>'<07><> N<><4E><EFBFBD><EFBFBD>P<0E>n<EFBFBD>*-<2D>p<EFBFBD><70>c2<7F><32>(<1C>!iL8<4C><38><EFBFBD>R@w<>1<01>t<EFBFBD>X<EFBFBD><58>H<1E>n<EFBFBD> <09><><EFBFBD>R<EFBFBD>h<EFBFBD>XJJ2<4A>B@70<03><1C>-/k2<6B><06>-d<><64><EFBFBD>qPO<50><4F>agX<08>a<> <0B><>E<EFBFBD>+<2B><> <09><>1<EFBFBD><31>d<EFBFBD>e<>#X<>Q 4<><34><EFBFBD>F<00>q<EFBFBD><06><>^<12> (<28><><0E><>Q*V<>F?DcnE<6E><45>\8<>u<EFBFBD><75><EFBFBD><00>5@
<EFBFBD>̴<EFBFBD>Q<EFBFBD>+1<><31>4>O<> ><3E><08><><<3C><>0<EFBFBD>r<EFBFBD>A<EFBFBD><41><EFBFBD>%lfJ
X<EFBFBD>w<EFBFBD><EFBFBD>]<5D>}~<7E><><01><>I<EFBFBD><17><>|<7C>z<18><>w$<24>W
<EFBFBD>Z<EFBFBD>c~<7E>^Z<><14> <1D>UV5Gȃ<47>3n тq<D182><71>V]<07>k"[˒<>D<EFBFBD><44><EFBFBD>h<EFBFBD>3<EFBFBD><33>:<3A><><EFBFBD><EFBFBD><EFBFBD><10>}<7D><><EFBFBD><EFBFBD><EFBFBD><1C>)<29><>
<EFBFBD>.<2E>Ҩ
<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD><EFBFBD>L$H2lZN<7F>"K<>Q<><51><EFBFBD>M<EFBFBD>m7n;<x<04>A<EFBFBD>E<EFBFBD><45>z>h#<23><>3Z<11>L<EFBFBD><4C><EFBFBD>j<EFBFBD>De<44><1E>}<7D><><EFBFBD>5<EFBFBD><35>y<EFBFBD><79>u<EFBFBD>^<5E><>f^<16><>˰H5<48><35><EFBFBD>腭l(<28><16>uD><3E><>[_`<16>FW<46>Ph<50><68><EFBFBD>d!<21><><EFBFBD><EFBFBD>R<14>+<2B><03>%<25>u<><75><1B><> -+Y<>
<EFBFBD><EFBFBD>T<>r<08><>;*,!%<25>H<EFBFBD><06>+<1F><>ȵr<C8B5><19>L<EFBFBD> <20>6<EFBFBD>
8n9:<3A><>cKx<4B>i<EFBFBD>'B<>T<EFBFBD><54>S0<53><30><EFBFBD>!<1E>(<28><><EFBFBD>hF<07><>J<EFBFBD><19><>&v(<28>rz<72><11>C(<28><>Ȱ#<11>j<EFBFBD>{K<><4B><EFBFBD>|v<><76>'<27>:;d<>)On@<40><><EFBFBD>dS<64>e<>
<EFBFBD> (<28>"$<07><>}R:<3A><><08><>{s<>F›<46>ѷs<D1B7> <0B>*<2A><>]<~`Vb3rq<72><71>z<EFBFBD><7A><EFBFBD><EFBFBD>,GeURd!<21>3<EFBFBD>8<EFBFBD>@<0E><><EFBFBD>z5<7A>eB<65><01>5<EFBFBD>A#<23><>L<EFBFBD><4C><<3C><><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD><1E><><EFBFBD><EFBFBD>e3_<>V<EFBFBD>'
<EFBFBD><EFBFBD>є<08>g<EFBFBD><67><EFBFBD><EFBFBD>a<EFBFBD>`<05>X<EFBFBD>q|<7C>t <09><>q k<><6B><10>}#!<21><>ЙK<D099><4B>'<27>X<EFBFBD>}[N<>#Y><3E><>B9'la<07>5s<35>G<EFBFBD><47><EFBFBD><EFBFBD><7F>+X<><58> Z<>!P$P<>qCt-z>k<>=<3D><> l/<15><><EFBFBD><10>Ѧ<EFBFBD><D1A6><EFBFBD>AP
<EFBFBD>/<2F><10>؁q<>e<>
f<><66><EFBFBD><><ECA3B0><EFBFBD><06><4D><D381>ʈ]^<5E><><EFBFBD><1A><><EFBFBD>f<EFBFBD>+<2B><>ܺ7;<3B>^<5E>Ք<EFBFBD><D594><05> <1D>ҡ<EFBFBD><D2A1>
6<EFBFBD><EFBFBD><11>Id<49><64><EFBFBD>tA8w<><77>ڂ<EFBFBD>L<EFBFBD><4C><EFBFBD>-<0E>P<EFBFBD><50>bY<62><59>c/<2F><00>0<EFBFBD><30>S<06>c<15>N<EFBFBD> <09>|<7C>~<7E>
V<EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><EFBFBD> <0C><><><CD88>?<3F><>h<EFBFBD><68><EFBFBD>z<EFBFBD><7A>6j<36>E,<16>O<EFBFBD><4F>_8<> <09><><EFBFBD>v<EFBFBD>S&<26>ñ<>?Zb<5A> <20><><EFBFBD>4e
ͨϔ<EFBFBD>h<EFBFBD><1C>%/<2F>*<2A><0E><><EFBFBD>+<2B><05>V<EFBFBD><56>
<EFBFBD>Ċ<EFBFBD>໹X<EFBFBD>|24<32><34>[yL<79>v<EFBFBD>B<EFBFBD><42>:p<> <1E><><EFBFBD><EFBFBD>%Ha<>@<40><>
<EFBFBD><EFBFBD>Ċ<m<><6D><EFBFBD>?<3F>dEj<45><6A> )<29>Z<EFBFBD><5A>˵i<CBB5>'<27><><1E><><EFBFBD>Pg<50><67>5<EFBFBD>t<EFBFBD><48><DBA1><1E><1B>V
GD<EFBFBD>ʩo<EFBFBD><0E><><EFBFBD><ECA092>i'<27><13>Ѱ<EFBFBD>7<>Jc<1F><>;u,<2C><10><0F><>8<EFBFBD><38><EFBFBD>e<EFBFBD>#<23>ŐF<C590>غ<EFBFBD><D8BA><18><>Lw.<2E><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><16><><03><><EFBFBD>p<EFBFBD><70>q<EFBFBD>fX<66><58><EFBFBD><EFBFBD><EFBFBD>a<><52><C89B>LP<4C>)<29><><EFBFBD>xqA<71>SHş<48><C59F>=<3D> R<>2Dh<44><68><EFBFBD><31>qvH<76><48>Or^<5E><>F<EFBFBD><46><11><><EFBFBD>}㇮<><E387AE><EFBFBD><EFBFBD><EFBFBD>ng<6E>|O<03><1B><>;<3B> .dʙe<CA99>_<EFBFBD><5F><EFBFBD>zJ𡬨<4A>LA<4C>.<2E>AI<41>7<13>A<EFBFBD><41><EFBFBD>BG(<28>Ʈ<EFBFBD><C6AE><EFBFBD><16>hW
6<EFBFBD><EFBFBD>(鰝ʧ<E9B09D>~I<>V F<><46>AMtL<74>N<16>D<EFBFBD>{Q<><51>r0<72>Y<><59><EFBFBD><01><>u<EFBFBD>,<2C><>T<01><>[<5B>[Y<06><>M<EFBFBD>|op<6F>J<EFBFBD>I<EFBFBD><10><><0E><>m<>y<><79><EFBFBD>p>
3 %<25> <09><>s<17><>un<75><6E><EFBFBD>D<1E><><EFBFBD>C><3E>!R<> e<><65><EFBFBD>-B<><42>d6ˆ<>*<2A><>b<EFBFBD><62>Gd&%<25><>-<2D>5<EFBFBD>P<EFBFBD><50>8"?<13>S8ި*<2A>Uch<>$b<02>p<EFBFBD><17>y<EFBFBD>id<69>0<EFBFBD>3\L&<26>VA<56><41><<3C><><EFBFBD><EFBFBD>džy<C786><79>⢉RWA<57><41><EFBFBD><EFBFBD>LN_<>+P<>?G<>2<EFBFBD><32>4<EFBFBD><34> ˽<><CBBD><EFBFBD>h<EFBFBD>•<11><><EFBFBD>L}A<>"<22>MM<4D><4D><EFBFBD>V$<24><><EFBFBD>T"y<>u6<75>K
<EFBFBD><EFBFBD>VM<EFBFBD>pd<EFBFBD>8K&*<2A>q4<19><>N<EFBFBD><13>8<EFBFBD>{jv<6A>M<00><><EFBFBD><05><>x蠊:r<>z<EFBFBD><7A>J<EFBFBD><4A>/I<>.H<>|<7C>x<EFBFBD>"<22>aV6<56>zvt<76><74>><3E>x:<3A>a<EFBFBD><61>ͧ<EFBFBD><CDA7>Kk<4B>i<16><> <0C>`<60>Z<EFBFBD><5A>G^<5E>2.<2E><>7T_<54><5F><EFBFBD>2L<32><1D>wXFH57B9p<39>R|<11>i<EFBFBD><69><EFBFBD>o<EFBFBD><6F><07>`<60><><12><><EFBFBD><EFBFBD><EFBFBD>?<3F> <0C><>L=<3D>2<EFBFBD>x<02>h<10>v<EFBFBD><76><EFBFBD>i<EFBFBD><69><EFBFBD><02>P<08>CX<43>xte9<07><>ٍ<1A>_<EFBFBD>1} <09><18>ŹYd48<34>R<EFBFBD>g<><67>#<23><>c<EFBFBD>_A4<0E><><EFBFBD>T<EFBFBD><54><1C><>=‚<><C282>'X<>ɥP<C9A5>M<EFBFBD><4D>Ө
XxG <07><><EFBFBD>MNj<4E><6A>!<21><><EFBFBD>|5<>P<02>R<52><7F><1B><>u<EFBFBD>K<EFBFBD>Z|<02> v9<76>$<24><>n<EFBFBD><6E><EFBFBD>R<EFBFBD>-V<><01>"5/i
V$<24><><EFBFBD>wI<77>+<2B><15><06>-j<>6<EFBFBD>/'νƹ@<40>l<EFBFBD><11><>L<EFBFBD><4C><EFBFBD>,7<><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=܋O<DC8B><4F>z<EFBFBD><7A>_<EFBFBD>n<EFBFBD><6E>:<3A><><EFBFBD>{/<16>?<3F>?<3F><><1B>;<3B>o<EFBFBD><6F>p:<3A><>I4<49>J<EFBFBD><4A>ISќT<06>:B<>K<EFBFBD><4B><EFBFBD>ȞC,<18>~y<><79><00><>^/W<><57><EFBFBD><EFBFBD>/<2F><>߮<EFBFBD> <0B><><EFBFBD><EFBFBD>ݯ<EFBFBD><DDAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<><42><EFBFBD><EFBFBD>
}`<60>e|\<5C><>ak<><6B>a<EFBFBD><61>ns<6E>Ֆo <1B>Y<00>{<7B><03><>pW8
<17>5<EFBFBD><35>H<EFBFBD><48><EFBFBD>5D<17>B<EFBFBD>7<><37><EFBFBD><EFBFBD>9<EFBFBD>Dx<44><00><><11>;S<><53>&3<><33>{V<><56><EFBFBD><17><><EFBFBD>,<2C><>?<3F><>9<EFBFBD>}<7D>r<EFBFBD><1B><_b<5F>@<><7F><EFBFBD>`<19>a'<27><08>v6j 7Y@C>2<>Ԯ<EFBFBD><D4AE><EFBFBD>Ju]<5D><><EFBFBD>b2ʍ<32><CA8D>/<2F><><05><>7zK<7A><4B><EFBFBD><EFBFBD><EFBFBD><"<22>[<5B>-<07><06><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>9)8<> .k4m<34>'<02>Z<EFBFBD><5A><EFBFBD>t<EFBFBD><74><EFBFBD><EFBFBD>Wҗ\<5C><>n=<3D>}<7D><>b<>W H`x<><78>r^h@h<><68><EFBFBD><EFBFBD>8<EFBFBD><38>|g<>U<<3C>j<EFBFBD>5>mtɚcĘ<63><C498><EFBFBD><EFBFBD>;3<><33>|bp<62><70>x<EFBFBD>
<EFBFBD><EFBFBD>؝1<D89D>A7<41><37><EFBFBD>3e<><65><12><><EFBFBD> FT<46><54><EFBFBD>-W#<23><>c<EFBFBD><63>
<15> <0B><04>[ <0C><><1E><>r8<18>H<EFBFBD>Oq^F<1C><><EFBFBD>Q<EFBFBD>%i<><69><EFBFBD><19><><10><><EFBFBD><EFBFBD>s<06>0<17>kZ! /<2F>H<EFBFBD>:K<>O{<7B><><EFBFBD>t=<3D>,|<7C>-<2D><>ro OAi<41>9<EFBFBD>l<EFBFBD><6C>+<2B>Z<11>ԑ<><D491>+<1F><>1<EFBFBD>G<EFBFBD>#ŝj;<3B>jI<1A><>Y<EFBFBD><59><EFBFBD>0<EFBFBD><30>O<EFBFBD><4F><EFBFBD><EFBFBD>A<EFBFBD>A<EFBFBD><41>W-p<1E><17>_造<5F><E980A0><EFBFBD><EFBFBD><1C><13>V2<1A><> N<>o<EFBFBD>tMv9<><39><16>!<21><EFBFBD>@<40>`<60><>%<25><>nQ<12><>IQ~&<26>=<3D><><19>1<EFBFBD>9<EFBFBD><39>6u<36>M<EFBFBD>jhWx0<><30><EFBFBD><EFBFBD><>(<28><>hŔΣ<C594><CEA3><EFBFBD>O<EFBFBD><01><>+<2B>f<EFBFBD><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x{<7B>d#<1D>H6<48>d<EFBFBD><64>EcF<1B>.<1C><><EFBFBD><1B><><EFBFBD><EFBFBD><06><>PK<08><><EFBFBD><1E>
<00>'PK! META-INF/MANIFEST.MFUT<00>M<EFBFBD><4D>LK-.<2E>
K-*<2A><>ϳR0<52>3<EFBFBD><33><EFBFBD><EFBFBD>-<2D>I<EFBFBD>M<EFBFBD>+I,
<EFBFBD>d<EFBFBD><EFBFBD>Z)<29>%<25><>*<2A>%<14><16>r<EFBFBD>rPKm<>>=@?PK!1 org/gradle/cli/CommandLineArgumentException.classUTMO<4D>J1<10><><EFBFBD><EFBFBD><EFBFBD>^/sR<73><52>R<EFBFBD>a<EFBFBD>"H<>SO-xO<78><4F>46<34>.<2E>n<11>><3E>o<EFBFBD>I<EFBFBD><49><03>P<EFBFBD>,(:<03><><EFBFBD>}~<7E><00><19>3x<33>ng<6E>_<08>F<EFBFBD><46>1<EFBFBD>K<EFBFBD><4B>2<EFBFBD><32>6<EFBFBD>Й<EFBFBD>l<EFBFBD>"<22>
<EFBFBD><EFBFBD>$<24>D<EFBFBD><44>
<EFBFBD>:<3A>6<EFBFBD><36>R<EFBFBD><52>}<7D><>Ȋ<<3C><> \\<5C><><EFBFBD>y}<7D>ۿ,<2C>!"<22>D4<44>,Ni<4E><69>S<EFBFBD>n<EFBFBD><07>E|2
<EFBFBD>(<28>
ncЙg<D099><67>x<EFBFBD>
2<EFBFBD>e^<5E>ʋ<EFBFBD>`,<2C><>'<27><>¥S<C2A5>t<EFBFBD>Ui<55><15><><12><><EFBFBD>4=<3D><><EFBFBD><EFBFBD>p*<2A><><EFBFBD><EFBFBD><16><>M<06>+<2B>tq<74><71><EFBFBD>x<EFBFBD>g<EFBFBD><17>Y<EFBFBD>'<27>]h<>nZ<><61>0<><1D>U0JR<4A>v @<40><12>y<EFBFBD>{<7B><><EFBFBD>G<>j
<EFBFBD><EFBFBD>PK<08>`zX!pPK!& org/gradle/cli/CommandLineOption.classUTeR]OA=<03><><EFBFBD>
(<28><><EFBFBD>~<7E><><EFBFBD>ʇZ<CA87><5A>B<EFBFBD> <20><>X<02><>2<EFBFBD><1D><03><>fwK4F<34><46><EFBFBD>M<><4D><EFBFBD><>zw<7A><77><EFBFBD><EFBFBD><EFBFBD>3w<33>=<3D>Ι<EFBFBD><CE99>Ϸ<00><><EFBFBD>~o<>y<EFBFBD>V<EFBFBD><56>p-mI3<49><33><EFBFBD>fz<66><7A>tx(=Wox<6F><78><EFBFBD>/<1C>A<>u<1E>f]<5D>;A<>hK[<5B> DQk<51>z<EFBFBD>7uq<><71><EFBFBD>U<EFBFBD>'<27>_j<5F>o<EFBFBD><1C>A<><41>ĵ<>+<2B>/]<5D><><EFBFBD><EFBFBD>H<><48><EFBFBD><EFBFBD><EFBFBD>n<EFBFBD>]<5D><>C<><43>|S<<3C><>`<60><>|۰}n9<6E>0i<>x<EFBFBD>w<>21U<31>Q<EFBFBD>
 <0C><>|<7C>wm<77>R<EFBFBD>f<><66><EFBFBD>A<EFBFBD>bD<62>0Z<30><01>P:<3A>cԫ"$#T<>ۭ<EFBFBD><70>M<EFBFBD>ʔ;,+<02><>-<11><><EFBFBD>yF<><10>0zA<><41>2<>3<EFBFBD>ߓ<EFBFBD> <0C>`<60>K<EFBFBD>,<2C>p9<70><39>Л˯<D09B>B&#<23>x<EFBFBD>+c)d1<64>b<00>$<24>p<EFBFBD>a<EFBFBD>#<23><>IK<49>$Cbm<62><6D><15>N<EFBFBD>.<2E>HE<48>>\R1xT8E<38>v
WC<EFBFBD><EFBFBD>#h 2:<3A><><EFBFBD>0<EFBFBD><30>w5<77>z<EFBFBD>_Vq
<EFBFBD>Ӹ<EFBFBD>m<><13>
r<EFBFBD>.
<EFBFBD>S<EFBFBD>*<2A><><EFBFBD>BE<01>i<EFBFBD>Q<EFBFBD><51><EFBFBD>8=<3D><><EFBFBD><EFBFBD>b<><62><11>n<EFBFBD><6E><EFBFBD>#7<15><1B>,<2C>l<EFBFBD>tm<74><6D><EFBFBD>ۑAwhLlV<><1F>=<3D><>'Vh1K~(4<> d"_i<5F>"<22><><EFBFBD> <0C>Ld<1B><1E> a<><61>%:Uя^<5E><><EFBFBD> <0B>/0<><1D><><03><>c<EFBFBD>3.<2E><><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD>d(OBgx<67><78><02>f~b<><62>L<14><><EFBFBD>Ƈ<EFBFBD><C687>?<01>T <09><><19><>b_<62>`<1F>k+<2B><><EFBFBD>PK×<12>n<00>PK!3 org/gradle/cli/CommandLineParser$AfterOptions.classUT<00>SmO<6D>P~.ʺ1@|+<2B>6( <0B><01>ILL0<><30><EFBFBD><EFBFBD>ܶw]<5D><>]n;<3B><18>!<21>?h<><68>h<EFBFBD><0F>GO<><10>,<2C><>=<3D><><<3C>9O<39>=<3D><><EFBFBD><1F><D<><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><07><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>5c<35><63>à<EFBFBD><C3A0><<3C>Bi<06><>/x$(X<><69>5<><35>X<EFBFBD>q? F<>5<03>0<EFBFBD>$<24><>V9<>2aU<61><55>_k<5F>>9<>:7<><12>t=)<29><>K<EFBFBD><03>"<22>E<EFBFBD><45><EFBFBD><EFBFBD>b<EFBFBD><74>q<08>A<EFBFBD><0E><><16><_0<5F><30>rK<72><4B>/J<><4A>6<EFBFBD> <20>ҩP<D2A9>\EBͬ<42>b<EFBFBD><62><1A><>HC?<3F>BOJ<4F>l<EFBFBD><2<><19><><EFBFBD>\HЂ;<3B>Ҭ1 ><3E><>?a<><61><EFBFBD><EFBFBD>v<18><><EFBFBD> ;Y<><59><EFBFBD><EFBFBD>0<EFBFBD><30><10>i `<60>a4<61><34><EFBFBD> 9*n<><07>D<EFBFBD><44><EFBFBD>x<><78><EFBFBD>-m<>I<EFBFBD><49>
<EFBFBD> á<><07><>ׅyQ<79><13>k <0C><>JO<4A>k<EFBFBD>/<2F>w<EFBFBD>Y<><04>覭g<E8A6AD>zK=/<2F><><EFBFBD>)<1D><>F<EFBFBD><18><>P<EFBFBD><50><EFBFBD>i<EFBFBD><1E>_z<5F><7A>^<5E>5<EFBFBD><62><C889><EFBFBD><EFBFBD><EFBFBD>mB<><11>_<EFBFBD>t3<74><33>ҺR<D2BA><52><EFBFBD>E<EFBFBD>Zwp7<70>ۘf<18><02>`0<><30><EFBFBD>\<18>-kO<6B>1
@3<><33>qh<>6<EFBFBD>1<EFBFBD>$"6<><36>%<25>+n<>K4T<1A>u<EFBFBD><75>d<EFBFBD>h<EFBFBD>O{Z<><5A>5<EFBFBD><14><>f<EFBFBD><66><EFBFBD> r<><72>0<EFBFBD><15>3F<33>(G6<01><>>wb<77>ډ<EFBFBD>Q<EFBFBD>ّ<><D991><EFBFBD><16>1:<3A><>x<EFBFBD><78>_Z5 <0B><0E>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><0E>ة<EFBFBD>+V<>q<EFBFBD>{<7B><>1<EFBFBD>挣St<53><74>i<EFBFBD><69><EFBFBD><EFBFBD><0F><>PKd<><64> Z<00>PK!< org/gradle/cli/CommandLineParser$BeforeFirstSubCommand.classUT<00>UkO<6B>P~ <20>Z<EFBFBD><5A>x<EFBFBD><78><EFBFBD> <0C><> S<1C><1B>-<11>8%&<26><><EFBFBD>UzY<7A>4F<46><7F>~<7E>h<>b$^<5E><><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>A<><41><EFBFBD>-k<><6B><<3C>{<7B><>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD> <0B>Q<EFBFBD>`x<><78><EFBFBD><EFBFBD><EFBFBD>S<EFBFBD><53><EFBFBD>%a<><61> U_TS<54><53>XU<58><55><EFBFBD>ؚ<EFBFBD><04>0<05>-V<><56><EFBFBD><15>/y5<79>S'<16>鉔Z-k<16>jF<6A>C<14>ϔ<EFBFBD><19><><EFBFBD><EFBFBD><EFBFBD>5<EFBFBD>$<24><>pm$<24><>e<EFBFBD><16>5<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>h/³Ù<C2B3>V<12><>609<><39>\]\3L<33>0<EFBFBD><30>t<EFBFBD><74>%S<>u<EFBFBD>HO;<3B><><EFBFBD><EFBFBD> y<><79>]O<><4F>Sb<53>q<EFBFBD><71>z~<7E>Vl<56>Kha8i{<7B><1A>;<3B><><EFBFBD><06><><EFBFBD>/$<24>2<EFBFBD><32><15><><>D<EFBFBD><44><11><>a<1B>E<EFBFBD><45><EFBFBD><EFBFBD><EFBFBD>u<><75><EFBFBD><EFBFBD><1B>WІ<57>v삢@<40>n<12>0t86)t<>P7<50><37><EFBFBD><EFBFBD>#<23><><EFBFBD>&<26><><EFBFBD><1F>6<EFBFBD><19><><EFBFBD>PL<50><0E><>]$t3<74>w<EFBFBD>g><3E>i<EFBFBD><69><1E><32><C4A2>p<EFBFBD>a<EFBFBD>S<EFBFBD>˛z:a<> <1D>|<7C>L<EFBFBD><4C>^e<>Ws
<0E>p;<0E>Cצe <09><18><><EFBFBD>gX/<2F>V<EFBFBD><56>}J<>&H<> <09>dG߶:<3A><H8I<38><49>i:+<2B><>%<25>Y<EFBFBD>C<EFBFBD>c`
Na Pg<18>L<EFBFBD><06>
<EFBFBD>9İ[<5B><>ߢ=7w<37><77>$R<><52>A<1A>تB<D8AA><1E>h}<7D><>M<EFBFBD>H<EFBFBD><48>O<EFBFBD>߶<EFBFBD>n<EFBFBD>f ۿ<>X<17><14>2t<32>] g<18>9<>5<EFBFBD><35>Lr <0B>"?<3F>Ň<EFBFBD>0<EFBFBD><30><EFBFBD>w_f<5F><78>8<EFBFBD>}|<7C><><EFBFBD>o<EFBFBD>
<EFBFBD><EFBFBD> <09>d<EFBFBD><64><C<>^ /<2F><><EFBFBD><EFBFBD>NF<4E><46>x<><78>u<EFBFBD> <0C>p<EFBFBD><70>+O<><4F>O%<25><>1<EFBFBD>+ -<2D>4<EFBFBD><34>乚U<14>]^4Fh~I<><49>a<EFBFBD>]<5D>8<EFBFBD>M`<60>8<EFBFBD><38>5z:<3A>f<EFBFBD>J<><4A>|<7C><>dj{<7B>"<22>t<EFBFBD><74>~!<21>Z<>B<EFBFBD><07>5<EFBFBD><14><02><>w<EFBFBD>x<EFBFBD><78><EFBFBD>P<><50><EFBFBD>0<EFBFBD><1D>D|<7C><>5$
<EFBFBD>4<EFBFBD>|<7C>X<EFBFBD>ț5d
-<2D>q<EFBFBD>p<EFBFBD>Y<EFBFBD>w<EFBFBD>K|ąU\<5C><><EFBFBD><EFBFBD>:kFK%<25>w<EFBFBD>M<EFBFBD><13><>:@J<>ED*<2A><><EFBFBD><EFBFBD>u<EFBFBD><75>}I<>t<EFBFBD>R<c<><63>@V<>ބ<EFBFBD>_PK<08><>1,]PK!= org/gradle/cli/CommandLineParser$KnownOptionParserState.classUT<00>Viwe~^ҡ<>N<EFBFBD>$<24>a<EFBFBD><61>H:<3A>iYԐ <20>DD<44>;A:<3A>؀K<D880><4B>M<EFBFBD><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD>
.<2E>θ勉(<28>3<EFBFBD>L<EFBFBD>q8<71>~<7E>_=<3D><07><><0F>s<<3C>O<EFBFBD>}<7D><><EFBFBD><EFBFBD>n <0C>KW<4B>}<7D><>s<EFBFBD><73><EFBFBD>7<EFBFBD><37><EFBFBD> <00><>/<2F>w<EFBFBD><1D><><EFBFBD>phPM<1F>j<0F><>B<EFBFBD>P<EFBFBD><50><EFBFBD>tCuuˌf-<2D><><EFBFBD><EFBFBD>WN<>êM<0F><>a'<27>uB<75>C<EFBFBD><43><EFBFBD>H(<28><>f<EFBFBD>\T><3E><EFBFBD><E0B6AD>ҵۊ<D2B5>Cy<43> <20>3<EFBFBD>F7 3<><33><EFBFBD>ۺ<EFBFBD>!<21><08><1D><><EFBFBD>m<EFBFBD>[Zۢ <1D>c&<26><><EFBFBD><EFBFBD>w<EFBFBD>g<>ٲ3<D9B2><33><EFBFBD>j<06><>
=<3D>me<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>v<EFBFBD>}<7D><1E>5{s<02>/I<><49><EFBFBD>%6<>j\<5C>n><3E>ly<6C>+<2B>2<EFBFBD><32>W<EFBFBD><57>7<EFBFBD>`<60><>;`<08><><EFBFBD>oC<6F>u<EFBFBD>a<13>
<EFBFBD>ĐL<EFBFBD><01><>uvh%<25> d#<23><><EFBFBD>Ò<>!uD<75><44>]݈uڶ:<16>W(l<>M<EFBFBD><4D><EFBFBD>p<EFBFBD>i<EFBFBD>a<EFBFBD><1E><><EFBFBD>-<2D><>~<7E>@<40><><EFBFBD>~
X<1C><>% <0C>*<2A>%aCU<43><55><EFBFBD><18>r<EFBFBD><72><EFBFBD><10><><EFBFBD><EFBFBD>*5<>o<><6F><08>N<EFBFBD>)2d\#<23>B2<16>Z<EFBFBD>v=U<>evڙ|<7C><>.CW<43>Ϡ<EFBFBD><CFA0><EFBFBD>X<EFBFBD><58>湦C<E6B9A6><43>3 MT<4D>j<EFBFBD>־<EFBFBD>%<25><><EFBFBD><EFBFBD>nCu<43>a<>Ԣ<11>3<><33><EFBFBD><EFBFBD>Ih%<25><>R{wʸA(Ű<>a<EFBFBD><61><EFBFBD>%l<><6C>ԣ<>G<EFBFBD>n7<> <20><>f<EFBFBD><66>j<1A>LiĽ<69><C4BD>x<EFBFBD><78>h<EFBFBD>/c<1B><05>AA<><41>6oh<6F>#2n<32><6E> Q}+C˕-<2D>)<29>y$<24> u^<12>MB7<42><37>NS<4E>ٜ;<3B>)TFUG<55><47>ֈ<EFBFBD>qM<19>l<EFBFBD><6C>}Q<>|+~<7E>*<1B>;<><6B>8!<21><>J<EFBFBD><4A>V!<21>*R<>%c<17>L<4C>b<EFBFBD>xe<78>'<27>.<2E><19>t_<01><>Y<EFBFBD>QL<51>U\<5C>0WTs:&B<>C<EFBFBD><17><><EFBFBD>n?<3F>G <0C><><EFBFBD><14>{<7B><><ݍ}"OI<4F><49>f<EFBFBD>KBw<1C><>!y+ <0C>?<3F>D<EFBFBD><44>pi<70><69><07><><EFBFBD>=5<><35>;Ug<55><67><EFBFBD>=<3D><>Ȑ2<C890><32>ÊƝ<C38A><C69D>{<7B>vO\<5C> <0C>.<2E><>+<2B><1A>%<25><1B>}XAc<41>Đ<EFBFBD><C490>R<EFBFBD><1E>*<2A>j<EFBFBD><6A>@<40><>h[2D+<2B><>.#<1A><>o<EFBFBD><6F>Ƶ<EFBFBD>eqS<71>2<19>.t<0F>-s<1A> 1<>kf<>P)<1B>r <0C><>D:]cET<45>JVeg8<67><38><08>
<EFBFBD><0F><>T_v,a<><61><EFBFBD><EFBFBD>ɰ<EFBFBD><C9B0>p(<17>8<EFBFBD><38> F<><10>̆<EFBFBD>8<1F><><EFBFBD><EFBFBD>ܡ<EFBFBD><DCA1>EN9<4E>$Ώ<>Q<01>1*<2A>Bx2<78><10>fg<>fƄ<66>%<%<25>i<EFBFBD><69><EFBFBD><EFBFBD><EFBFBD>T<EFBFBD><54>2 B+v<>h<EFBFBD>g<EFBFBD>l<1D><>s4H<1D>!.<2E>Ob2.<2E><>8<EFBFBD><55>Y<EFBFBD><59><EFBFBD>%<25><1D><><EFBFBD><EFBFBD>4
<EFBFBD><EFBFBD><EFBFBD>QF<EFBFBD>ͯz<EFBFBD><EFBFBD>B<15><><EFBFBD>V]<5D>fXZ<58><18><>9E<39>^
.?<3F><>1A_ob&<26>8<EFBFBD>}ux<1B>P& .<2E><><EFBFBD><14><>? <0B><>0<EFBFBD>fl+<2B><1B>6<EFBFBD><36>7<EFBFBD><37><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>d<10><04><1A>o)Q<>.<2E>^<5E>Tgp6<70><36><EFBFBD>!qo<71>5Bt<42>C,<2C>S<EFBFBD>'1鋴<31>b<EFBFBD>><3E><13><>8<EFBFBD><13>OK<4F>]Q=<3D><> <20><><EFBFBD>A<EFBFBD>cm
<EFBFBD>>p<>Q/<2F>9<EFBFBD>Ջ]<5D>=i<>{O<><4F>ޓ<EFBFBD><DE93><EFBFBD>I<EFBFBD>a<11>~<7E>}K$6<>SVMa<4D>,O<><4F><EFBFBD><EFBFBD>V<>L`Mdk<>X<><18><>za!<m<>Ƃ<EFBFBD>1<EFBFBD><31>G<EFBFBD><47><EFBFBD>q<EFBFBD>G<><6<><36>֖I<D696><49>@}85NN&<26>}`<12><><EFBFBD><EFBFBD><EFBFBD>i<><69><13>/nOū<4F>Ɇ;Z<><5A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Yo<59>3<EFBFBD><33><EFBFBD><>%TQ\²;
X$c<>\_<>e)<29>Y=<3D><><13>/<2F>?<15>B<EFBFBD>\X<><58>v<EFBFBD><76>B<10>%r<><72>\<5C><>k=B<>c_<63>u<EFBFBD>΄<EFBFBD>E<EFBFBD><45><EFBFBD><EFBFBD>Y<04>><3E>v$<24><><EFBFBD>z<EFBFBD><7A>}c<>-I<><49>3Yj<59>7<EFBFBD><37>0Eo8<6F><38><16><><1A><>O:H<><02>K<EFBFBD><07>p<EFBFBD><38><D2A9>Q<EFBFBD>h<><68>Df<44>%<15><>V4&q8Y<38>)<29>"<22><><EFBFBD><EFBFBD>|V<><56>{ZƑ<5A>L<EFBFBD><4C>p4<70>ӿǣ<D3BF>x<EFBFBD>s<EFBFBD>q<06><>_<EFBFBD>><3E><17><><EFBFBD>)<29><16>5<EFBFBD>|<06><>bM<62><4D><EFBFBD><0F><>x<EFBFBD><78>x<EFBFBD>Q{5F<35><46><EFBFBD> _ak<0F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD><49>֌<EFBFBD><D68C><EFBFBD>̈́q]O<>t<EFBFBD>Nh<4E>$<24>D<EFBFBD>W<EFBFBD><57>]4Rt<52> <20>"ΏN\<5C><><EFBFBD>*<2A>ϑ<EFBFBD><CF91><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>XYV<1C><39>]$<24><><18>1(MR<><52>=<3D>S<EFBFBD><M<><4D>S<EFBFBD><53>F<EFBFBD><46>&<26><>$<24><>j<>O<EFBFBD><18><><12><><EFBFBD><EFBFBD>',<2C><>X<EFBFBD>V<EFBFBD><56><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>UE<EFBFBD><EFBFBD>CկPK<08><><0F><>bPK!< org/gradle/cli/CommandLineParser$MissingOptionArgState.classUT<00><>mO<6D>P<14><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"c<><63>Oh<05><1E><>!:<3A>h<EFBFBD>hb2<62>8<EFBFBD><38>ww<77>]<5D><><EFBFBD>#<1F><><EFBFBD> Mt&<26><><03><><EFBFBD><EFBFBD><EFBFBD>3hHڤ<><DAA4><EFBFBD>~<7E><><EFBFBD>s<73><7F><EFBFBD><03>" <0C><0F><>/<1A>67w<37><77><EFBFBD><15><>h5<68><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>  \<5C>CAwxh<78>;<3B><>
{^<5E><>t<EFBFBD><1B><>ֵ
<EFBFBD>w
'f<><66><EFBFBD>e<EFBFBD><65>Dڠ1<DAA0><31><EFBFBD>\<5C><1C>7b<><62>)D<>H<EFBFBD><48>{")<17><1B>K<EFBFBD>
<EFBFBD>{<7B><>C<><43><EFBFBD>S<q\<5C>p<EFBFBD><0F>p<>u<>u<EFBFBD><75><EFBFBD>qi5<69><35><EFBFBD><07>f<>9aH<61><48>n\<5C><><EFBFBD>nE<
<EFBFBD>j<><6A><1E>4"ː<>
<EFBFBD>r<EFBFBD><EFBFBD>؃<EFBFBD><EFBFBD><08>ߑN<DF91><4E>~@y<>aXZ<7F>RQ<52>Z<EFBFBD><5A>19<><39><18>8C<38><43><6F>A<EFBFBD><41><EFBFBD>9<EFBFBD>7<EFBFBD><37>=^w<><77><EFBFBD>(<28><>jy<6A>A<EFBFBD><1F>ec<65><63><EFBFBD>Y<EFBFBD><59>W<EFBFBD>`<60>$<1E>hOCS(p<18>|<7C>~<7E><08> O׬œG)<29>L<EFBFBD><4C>K<EFBFBD>v]<11>|<7C><><EFBFBD>#<23><>*<2A>b<EFBFBD><62>+<2B><><EFBFBD>".<2E>M<EFBFBD>F}<7D><><EFBFBD><EFBFBD>o<EFBFBD><1D>Փ<EFBFBD>Iʤi<CAA4>yBF*nb.<2E>y<EFBFBD>6#<23>~<10>XZ =<3D><>u:5 <0C>{<7B><>E<EFBFBD>]<5D><05>|<7C><>.<2E>D< <0B><1A>u<01><><EFBFBD><EFBFBD><EFBFBD>2";Zy<5A><79><EFBFBD>3կ(~F|M<>]JE3$<24>EJ<45>t<EFBFBD><74><EFBFBD> <09>F<EFBFBD>,Y<><59><EFBFBD><19>x<EFBFBD><78><19>c<EFBFBD>/(<28>q<EFBFBD>Z<EFBFBD><5A>Ƨ<EFBFBD>9<EFBFBD><39>T6<54>2<EFBFBD>ڇ><3E><>Q<EFBFBD>#<23>٩<EFBFBD>H<EFBFBD>*c ~<08><>PKC'|<7C>L<00>PK!= org/gradle/cli/CommandLineParser$OptionAwareParserState.classUT<00>TkO<6B>P~<1B><>!<21><><EFBFBD><EFBFBD>PA7<41>2nʸ<08>
D<>_<EFBFBD>Y{(<28><>#<23>B<><42><><1F>pI4<49><07><><EFBFBD>o(<28>%k<><6B><EFBFBD><EFBFBD>}<7D><EFBFBD><E7BD9C><EFBFBD><EFBFBD><EFBFBD>/<00><>c<EFBFBD>||<7C><><EFBFBD><EFBFBD><16><>'\C<>R<EFBFBD>m5<6D><35>Eg߲<67>o]<5D>)<1A>p)l<>=A<><1D>i<EFBFBD><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>S<EFBFBD><53><EFBFBD>DZ<44>75<37><35>kV<6B>!
<EFBFBD><EFBFBD>Fa<EFBFBD><EFBFBD>2{<7B>]<5D>m<02><1D><>״\!<21><08>Q,³CcCY<43><07>z0<7A><30>Z<EFBFBD>$u<>ڲ<05>DQ<44>Sr<53>ݶ2<DDB6>E<EFBFBD>᮱DJ+\zB<7A>/<2F>9<>>py<70><79><EFBFBD><EFBFBD>
<EFBFBD> <0C><>7<<3C><1A><>u<><75>ݸ&3<>P<EFBFBD><50>X^<5E>p<05><>p{<7B>r-<><7F>M<EFBFBD>:<3A>z<EFBFBD><7A><18>h<EFBFBD><68><16>‰<><00><>9
<05><18> L<> <0C>?**T<><54>1<EFBFBD>'<27>v<EFBFBD><01><><EFBFBD>53k~p.<2E><><EFBFBD> Jb<4A>KjC<6A>z<EFBFBD>'<27><>]Dq<44>O<EFBFBD><4F><EFBFBD><EFBFBD>Qt<51><74>ZWt<57>E<EFBFBD>J<EFBFBD>U%<25>_?jVo<56><6F><15>2<EFBFBD><13><><EFBFBD>9i<39><1C><>V]<5D>-;<3B><><EFBFBD>-Y<>?<1D><>'<11><><EFBFBD><EFBFBD><EFBFBD>A<>S<EFBFBD>7<>[<5B>Y.<2E>
ݧ<EFBFBD>Đ@2<>g<18><>ٝJ<14>)<29><><EFBFBD><EFBFBD><EFBFBD>r~+<2B>{<7B><><EFBFBD><EFBFBD>[__X<5F>3t]KO
SR]<5D>/<2F>K)!<13><><EFBFBD><1B>/g<>`<60><><EFBFBD><14><><EFBFBD>=<3D><>5<EFBFBD><35><EFBFBD><EFBFBD>H<02>x<1E>^0hU<68><55>ۦ<EFBFBD><DBA6><03>d<06><>d剋a*<2A>I<EFBFBD> <09><><EFBFBD>Sgh
L<EFBFBD><EFBFBD>Sr<>lS<EEA3A9>S<EFBFBD>x0<78>@s<<3C>SBB`<60><><48>փ0!d<1E><>L<EFBFBD><4C>)t<><74><EFBFBD>)ھ!<21><>hG<68>%<25>1i<31>Ъ<EFBFBD>Z:<3A><><EFBFBD> mf<>YGkp<6B><70>He<48>
<EFBFBD><06><><EFBFBD><EFBFBD><13><>` u<><75><EFBFBD> <09><>cd<63> ?1<>9H<39>s<EFBFBD>|<7C><><EFBFBD>MZ<4D><5A><EFBFBD><EFBFBD>o#)<29>Qr<51><72><EFBFBD>^<5E>]<5D><13> PK<08><>[<5B><>JPK!8 org/gradle/cli/CommandLineParser$OptionParserState.classUT<00>PMO1<>PJ9q誇<71>bY =<3D><><EFBFBD>Z$D<>(<28><>ʡ7<CAA1><37>d<EFBFBD><64><EFBFBD><EFBFBD>lo<6C><6F><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>T<EFBFBD><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>qDo><3E><>ߛy<DF9B><79><EFBFBD>~<7E><02><03>b<EFBFBD><62><EFBFBD><EFBFBD>s<EFBFBD><73> yt<79>*<2A><0E>h<EFBFBD><68>xQ<78><51>Br+2<>Y<EFBFBD><59>k<EFBFBD><6B>
<EFBFBD>8<EFBFBD>Ə<EFBFBD>]<5D>"5<><35>K<EFBFBD>;^<5E><>)<29>}<7D><0|<7C>.{<7B><><EFBFBD><0F><>BJ"̔<><CC94>.E%B!j<>b<>
<EFBFBD>E|<><7F><EFBFBD><EFBFBD>c<EFBFBD>{<7B>
` <0C><><EFBFBD><EFBFBD><11> <09> 2<><04><><EFBFBD> <20>"8<>Ҕ<EFBFBD>x@N<>\<1B>o.r<><72><EFBFBD><EFBFBD><EFBFBD>r<EFBFBD>u<EFBFBD>0h<30><68><EFBFBD><07><>$<24>g<18>:<3A>Ԏ<><12><>A<EFBFBD><41><1D>B<03>5<EFBFBD>M<06>Χ<EFBFBD> U<17>2E><3E><0E><>~<7E> <09><>Nw<4E><77>6<EFBFBD>i<EFBFBD><69>f<EFBFBD><14>)*<2A><>cg<63><67><EFBFBD>Ⱥ<><D9B1>=<3D><>ѕF<D195><46><EFBFBD><EFBFBD>*s<><73><EFBFBD>U9<55><39>3Xs&<26>"
Q<EFBFBD><EFBFBD><EFBFBD>k<1A><0E>Ԁ<EFBFBD><D480><EFBFBD>ޤ<EFBFBD>:!#<23><><EFBFBD><>v<EFBFBD><76>R<EFBFBD>&,-<2D><>Nf<4E>j<EFBFBD>A1-<2D>k<>X699| |<7C>x<EFBFBD>*<2A>]<5D><>=PKu[z?<3F>}PK!3 org/gradle/cli/CommandLineParser$OptionString.classUTuR]OA=Ck[<5B>ji<01><><EFBFBD>+J[<5B>4<EFBFBD><15><0F><>D<EFBFBD><44><EFBFBD><EFBFBD>3<>;<3B><0E>Wf<57>}1<>?<3F><0F><> <09>D<>?<3F>x<EFBFBD>-<2D>5<EFBFBD><35><EFBFBD>9sϙ{<7B><>?<3F>~<07><06><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>w<EFBFBD>ɭ<13><><EFBFBD><EFBFBD>n<EFBFBD><6E><EFBFBD>n^(]<1E><>7<EFBFBD><37><16>+<2B>
 <09><><EFBFBD>Ȱ:<3A>:<3A><>^<5E>o<EFBFBD><6F><1B><>:<3A><>CC&<1A>|<7C><>67(W5/<2F><><EFBFBD><EFBFBD>u<><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>w<08> <15>[<5B>7<EFBFBD><36>-z<><7A>C~?<3F>*K<><4B><EFBFBD>`0<02>4<1C>mW4,W6<57><03>㾽CJ{\EB-<2D>I<EFBFBD><49>q<EFBFBD><71>E<EFBFBD>a<EFBFBD><61>x<EFBFBD><78><EFBFBD><EFBFBD>5<EFBFBD><35>g<>aHq<48>0<EFBFBD>v~_)[ <0C>` A<>3<EFBFBD><33><EFBFBD>9<EFBFBD>Je<o<1C><1E>l<EFBFBD>z<EFBFBD><7A>*<2A><><EFBFBD>u
9LO<EFBFBD>
f4<EFBFBD>Q<EFBFBD>!C<06>\<5C>:<3A><>)<29><><EFBFBD><EFBFBD>_<EFBFBD>_6t<36> <0C>b<EFBFBD><62><EFBFBD>P<EFBFBD><1D><> <09>U<EFBFBD>4,`1<>[<5B><>P<EFBFBD><50><EFBFBD>EW<45><57>PY<50><59>}<7D><><EFBFBD><<3C>p<EFBFBD>L<EFBFBD>aHsA<73>OJ<1D>F<EFBFBD>[`9<>x<EFBFBD>a<0E>I<EFBFBD><49><EFBFBD><EFBFBD><EFBFBD>*Cz<43>&<26><><EFBFBD><EFBFBD><EFBFBD>W]<5D><14>
7]<5D>u2(Ks9<73>b<EFBFBD>E<>ķ¨&<26><>U:-"E (<28>Z<EFBFBD> V<>Q<EFBFBD><51>c<EFBFBD> 0<><30>{<7B><>=<3D>)<02><>3K<>><3E>|<7C><>7,<2C>joK<6F> <0B>g<EFBFBD><67><EFBFBD>Q<1F>O(<28><>ڟ<EFBFBD>g<EFBFBD>2<EFBFBD>i<EFBFBD><69>w<EFBFBD>R<EFBFBD>rR<72>PK<16><>
CPK!2 org/gradle/cli/CommandLineParser$ParserState.classUT<00>Q<EFBFBD>J1<14><><EFBFBD><EFBFBD>j<EFBFBD><6A>W.\<5C><>q<EFBFBD>\(
BQ<EFBFBD><EFBFBD><EFBFBD>]f<>v<1A>$%3-<2D><><EFBFBD><17>~<7E>%<25><><EFBFBD><EFBFBD><EFBFBD><03>ss<73>ɹɽo<C9BD>/<2F><00> <1E>kw<6B>σT<><54><EFBFBD>M<><4D>:n <0B>S<EFBFBD><53><1B>)oP"O<><4F><4F><DCA0>g<><67>e<EFBFBD>U<EFBFBD><1D>1o<31><6F>z<EFBFBD><7A><EFBFBD><19><1B>5<EFBFBD><35><EFBFBD>͎<EFBFBD><CD8E>HZ<48>]<5D> <09>h<EFBFBD><68>(<28>E<EFBFBD>P-<2D><>V7Vkn<6B>]<5D>~<18>BCwL<77>GB"<22><>6<EFBFBD>J<>)<29><1D>\<5C>ur:<3A>&A<><41> <09><><EFBFBD><EFBFBD><EFBFBD>,<2C><>5<EFBFBD>rOry<><79>5ir r<>B<EFBFBD>t<EFBFBD>A<EFBFBD>\<5C><1C>-@
<0C><><EFBFBD><EFBFBD>e<01>m\<5C><><EFBFBD><EFBFBD>de<64>Ӷ<EFBFBD><04><>r<EFBFBD>ǯ<EFBFBD><C7AF><EFBFBD><EFBFBD>T<EFBFBD><14><><EFBFBD><EFBFBD><1A>p<><70><EFBFBD>s>
=j<><6A><EFBFBD>V'Z}<7D><>t<><74><EFBFBD><EFBFBD>Z<EFBFBD><5A><EFBFBD>%9T!u<><75><EFBFBD>`<60>&N:<3A><><EFBFBD><EFBFBD><12>KԜ<<3C>/<07>v<EFBFBD><76>9<EFBFBD>M2<><32>g{<7B>|<7C><><EFBFBD>}z<>p<EFBFBD>O-<2D>`<60><>A1
j&<26>70r<30>8
3=<3D><>w<EFBFBD>boOϝ<7F> <0C>C<EFBFBD><43>PK<08><>ɉ<EFBFBD><00>PK!? org/gradle/cli/CommandLineParser$UnknownOptionParserState.classUT<00>S<EFBFBD>NQ=<3D><><16>
<EFBFBD>oWԶt<D4B6>|<7C>X<EFBFBD><58> <20><>؀<11>@L<><4C><EFBFBD>eY؏<59><D88F>5F<1E>g<EFBFBD><67>&<>><3E>qn)<29><49>{g<>93<39><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><00>a<EFBFBD><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'<27>ʭ=<11><><EFBFBD>nm<6E>E<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<03>mA~)<<3C>#A<>֎<><D68E><EFBFBD><EFBFBD><1F><>܋DQ<44>9<EFBFBD><39>k<EFBFBD><6B>8Du<44>]<5D><>\Y><3E>o<EFBFBD>=<3D><1C>7fUJก<10>
<1C><> Q-<2D>K<EFBFBD>a<EFBFBD>}<7D>s7Cf=<3D>KK<q=<3D><>J<>t$<24>=aZ<61>k<EFBFBD><6B><EFBFBD><EFBFBD><03>BL/<2F><><EFBFBD><EFBFBD>z<1D><05><>`<60><><EFBFBD><1F><>c<1E>4<EFBFBD> s<1D><><EFBFBD>.1<EFBFBD>"ud(U:<12>A<EFBFBD>\: <03>]<5D><>M<EFBFBD><07><><1E><>)<29>k<EFBFBD>b<19><><EFBFBD>M<1E><><EFBFBD> <20><1E><>?b<10><>;\L|~<7E>!<21>{<7B><><EFBFBD>Ї+<19><>ՐAoRԠ<>:
k<EFBFBD>F<EFBFBD>:<3A>2<EFBFBD>9"~ʣe<CAA3><65>}<11><>~.<2E>E<EFBFBD>0 J<19><><0F><>L.<>Af€Rj<52><6A><EFBFBD><EFBFBD> <09>g<EFBFBD><EFBFBD><E28DA6><EFBFBD><EFBFBD>s<EFBFBD>r<EFBFBD>B<EFBFBD><42>Ƙ<EFBFBD>N-Q+<2B><><EFBFBD><EFBFBD><18><>K<EFBFBD>c<EFBFBD>3<EFBFBD><33><EFBFBD>+n/i<><1E><>]<5D><>s<12>ȩĶ<7F><C4B6>]<5D>ZuWX<57>R~KC<01><19>Q<EFBFBD>e<EFBFBD><65>;b<>W"V<>~U<>W<EFBFBD><57> <09><>(<28><><EFBFBD>Ȫ]<5D>)<29><>Դ<EFBFBD>%<25>)<29>b<EFBFBD>ӷD<D3B7>I<EFBFBD>'<27>6<>&~``<60>C<>C<EFBFBD><18><18>4qWq<57><71><EFBFBD>G<EFBFBD><47><EFBFBD>J~mŮc<C5AE>˶b<CBB6><62>n~k<>'q<>-<2D>u6<<3C><0F><>+<2B>has<61><73><EFBFBD><EFBFBD>
R<EFBFBD><EFBFBD><EFBFBD>wG0<EFBFBD>40<EFBFBD> fSB<53>ڡΉm<CE89> J(AH<41>PK<4B>s<00>PK!& org/gradle/cli/CommandLineParser.classUT<00>U[wU<14> L<1A><>p3X<33><18><>i<EFBFBD>E酋!<14>m<EFBFBD><6D>jh<6A><68>̜&C'3afҋ,<2C>]<5D>G<EFBFBD><47> <0B>*آ,<2C>g_|<7C>'<27>?<3F>}&<26><> <0B><d<><64><EFBFBD>}<7D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><00>E<EFBFBD>a<EFBFBD><61>ñ<EFBFBD><C3B1><EFBFBD><12>f<EFBFBD><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>3<EFBFBD><33>՚arϰ<72>T<EFBFBD><54><05>a
<EFBFBD>
ڬp7<EFBFBD>U<EFBFBD>6<EFBFBD>֫n<EFBFBD>o<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʩ*<2A><> <0C>C<EFBFBD>z<EFBFBD><7A>n<EFBFBD>:=k<>g<EFBFBD>I<06><>Sg$<24>*<1B><10>a<EFBFBD><61>:'<1C><>"{OWwWOJs<>!0<>p<EFBFBD><70>;<3B><>f<EFBFBD><66>A<EFBFBD><41>r<EFBFBD><72>p<EFBFBD>i<>4<EFBFBD>Y<EFBFBD>Z<EFBFBD>>L<>F<EFBFBD><46>
GA<EFBFBD><EFBFBD><EFBFBD>]><3E><>&<26><><EFBFBD>|<7C><><<05><0E>G<EFBFBD><07><>\fd`z43>>0<>c<EFBFBD>
<EFBFBD><EFBFBD>g<EFBFBD>iG<EFBFBD><EFBFBD>Bz<EFBFBD>{<7B>p<EFBFBD>~:q<><71><EFBFBD>S<EFBFBD><53>^5\^2<><32><EFBFBD>n3<1C>k<EFBFBD><6B><EFBFBD>b<EFBFBD><62>v<><76><EFBFBD>ܭ<EFBFBD><DCAD><EFBFBD><EFBFBD><4D>i<EFBFBD>Z<EFBFBD><5A><EFBFBD>o<EFBFBD>a<EFBFBD>w<EFBFBD><77> <0C>C <20>~+<2B>8<18><>f<EFBFBD><66>m>
<EFBFBD>0<EFBFBD>#<23><>&<26><>Q<EFBFBD><51>J<><4A><EFBFBD><EFBFBD>F<EFBFBD>Y<EFBFBD><59>Uc8<63> <0B>p<EFBFBD><70>Y <0B><>q<EFBFBD><71><EFBFBD><EFBFBD>ݎ<EFBFBD>]<5D><>q'"c<>t<EFBFBD><74>В<EFBFBD><D092><EFBFBD><EFBFBD>T<EFBFBD><><C6B4><07><><EFBFBD><EFBFBD><EFBFBD>d{<08>1ۅ&<05>3(<28>v<EFBFBD><02><12>!5<><35><6F>N<>0N<30>-<2D><10>d0<64>DO<44>\<5C><>ɝ<EFBFBD><C99D><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>myܰ<EFBFBD>!<21><>pdsP<73><50><EFBFBD>L<EFBFBD><4C>%<25>MSMS!<21><>O<EFBFBD>4nS<6E>M<1D>z<EFBFBD><7A><EFBFBD> ël<C3AB><12><><1F>q牌*<2A>h:<1C><><EFBFBD><EFBFBD>l<EFBFBD>;q<>.,M<>@<40>H<EFBFBD>Qҋ>II<49><0E><><EFBFBD>\\<5C>ƍ<EFBFBD>,<2C>%|<7C>߸n<DFB8>4E<34><45><19>\<5C>
<EFBFBD>XЄO<D084><4F>+ <0C>YnY<6E><59>r]Wd<>m<EFBFBD><6D>6<EFBFBD><36>*<2A><>,<2C>\Z梺ʥ<E6A2BA><CAA5>Z<EFBFBD>SW<53><57>j<EFBFBD>F<EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD>L<EFBFBD>m<EFBFBD>6<EFBFBD>1<EFBFBD><31><15>U*<2A><>P| <0C>;<3B>5<EFBFBD>C5<43><35>"<22><>O%<25><>w!ݟ<><DD9F><EFBFBD><EFBFBD>b<EFBFBD><62><EFBFBD>f$1~9<>y*<2A><><EFBFBD>ah<61>o:d<>!<21>\_Tu1C}<7D>(<28>F<EFBFBD>ɯ<EFBFBD>{c<><63><EFBFBD><EFBFBD>e<1C>/<2F>P<16><11>.1r:<3A>{<7B><>! <09><>o<EFBFBD>V<18> Il<49>m<EFBFBD>^ c $F<><46>&,[E<> <20><>)<29>i"<22><17><>|I<>bP<1D>gS<67>Mlep<65>NNJ<4E><4A><EFBFBD> <20><>n<EFBFBD>W0Ca<43>g!'<16>*hُ2 <0C><>E<06>É<EFBFBD><C389>9G0 S⪤L<E2AAA4>:<3A>zv<7A><76>7<EFBFBD>ʺ+59<35><39><EFBFBD><EFBFBD>,}nHeUr<55>jI8<49>R<EFBFBD>q<EFBFBD><71>E<EFBFBD><45>^1<>5<EFBFBD><35><EFBFBD>@<40>4Km<4B>'<27><><EFBFBD>{<7B>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I<EFBFBD><1D>&<26>+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>$± !<21><><EFBFBD>m<EFBFBD>{(<28>w'<27><><EFBFBD>A<EFBFBD><41>_ <20> <0C><06>1:й
<EFBFBD><EFBFBD><02><4B>W<03>N<EFBFBD>|<7C><><EFBFBD>'<27><><05><>X,<2C><><0F>p#<16><>]F<><12>?")<29><17><>y<EFBFBD><79>o<02><><EFBFBD>?_"[ <0C>
<EFBFBD>8<14> с<> <0C>`<60><>-<2D><>.<2E><>
<EFBFBD>X<EFBFBD>8<EFBFBD><EFBFBD><02><>`<60>9<EFBFBD><39>!<21>;~<7E>]<5D>'8<><38>i<><69>8<EFBFBD><38><EFBFBD>R<EFBFBD><52>p&<26><><EFBFBD><EFBFBD><EFBFBD>{<7B>1<EFBFBD><31>Ô<EFBFBD><C394><EFBFBD>~<7E>g <20><04>PK<1D><><EFBFBD>cPK!& org/gradle/cli/ParsedCommandLine.classUT<00>U<EFBFBD>vU<18>v<EFBFBD>v<EFBFBD><76>Xh<58>P@$DJ<44>{<00><13><>"ФE<D0A4><45>@=Lfv<66>i'3qf<71><05>%<25><07><05><05>ŵjf<>\y<><79><05><>E<EFBFBD><45><EFBFBD><12><><EFBFBD>"<22><>?<3F><EFBFBD>߷w~<7E><>ǟL<>dx<64><78><EFBFBD><EFBFBD><EFBFBD>Wᜪ<57>qKχ<>|8<16><>b<EFBFBD>0Uϰ<55>x<EFBFBD><78>9<EFBFBD>nr<6E><72><EFBFBD><EFBFBD><EFBFBD>Ƶ<1D><><EFBFBD><EFBFBD><1B>ϫ<EFBFBD><CFAB>c<EFBFBD>R!^TKqC<71>๹Y=7CX'<27><>ϗM<CF97><02><1A><10>`X<>;<3B>U<EFBFBD><55>>w\<5C>E<EFBFBD><45><EFBFBD><EFBFBD>d2<64><32><EFBFBD><EFBFBD><EFBFBD>09c<39><1D><>0L<30><10><>B<EFBFBD><EFBFBD><13>i$<><EEA88E>U<EFBFBD>XT-=E<>$<24><19><><EFBFBD>j<EFBFBD>T<EFBFBD>Bb3<62><33>5OB<1F>1<EFBFBD>$<24>qWe<ѕ<>D<EFBFBD>,{<7B><><EFBFBD><EFBFBD><EFBFBD>;i<><69><EFBFBD>0Xr<58><72>-o<><0E>e<EFBFBD>'`/<2F><>\<1B>=G]v
<EFBFBD>"eS`<60>%o<>q<EFBFBD>G)<29><15>}<7D><>ex<65>N<>w<EFBFBD><q<><71>7>qO<71>1 ɐd<18>S<EFBFBD>I<19>*<08><><1F><38>b<12><>8+P2<04>MJ<>{<7B><><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD>"<22>
<EFBFBD><EFBFBD> <01><><EFBFBD>َ<EFBFBD>x<EFBFBD>e<EFBFBD>[<5B><><EFBFBD><EFBFBD>Q\<16><><18><><EFBFBD>K<EFBFBD>`<60>H5tD<74><44><EFBFBD>+<2B>"6<><08> ~<7E><>BUN<55><1D><><EFBFBD>$<24><><EFBFBD>: f.<2E><>D<EFBFBD><44>+2<><32>Õ <0B>5<EFBFBD><35>m 69Q<39>Ĝ<EFBFBD><59><CCB7><EFBFBD># <09><>S<EFBFBD>L+$<24>;7<>t]<5D><1A> B<>cP<63>,<2C>_<><5F>۶a1L<31><4C>d9<64><39>4o<34>6Mʣ<4D>۪<EFBFBD>"<22><><EFBFBD>gl<67>l<EFBFBD>:'&ޗ<>&<26><0E>F<EFBFBD>hʙtw><18>M<EFBFBD>aO,<14>mR<6D>Z*ѣ<><1F><><EFBFBD>ٸф<D9B8>I!-<2D>l0<6C><30><<3C>y<EFBFBD><79>ynSp<19><><15>ʤ<<3C>3<>+;uc<75><63><EFBFBD>U<EFBFBD><55>_B <0B><o;E<><18><>2<EFBFBD><32><EFBFBD><7F><EFBFBD>D<EFBFBD><44>@<40><12><>\}<0E>Ů<EFBFBD><C5AE><EFBFBD>G<><47>Hj<48><6A>.*骉/<2F>
M<EFBFBD><18>-l<11><05>l<EFBFBD><6C><EFBFBD>C<EFBFBD>7M<<3C><>[<5B><><46>e{!<21><>i}2<><32>w<><77>k͎ <0E><><EFBFBD>*<2A>՘<EFBFBD>ӗ<EFBFBD><D397><EFBFBD><EFBFBD>!<21>7$<1E><>U<1A><><EFBFBD><1A><>U<1C><>=<3D><>[<5B><>%<25>M4<4D><34>nWp<57><70><EFBFBD>l<EFBFBD><6C>S<EFBFBD>0R<30>Y<EFBFBD>#<23>|<7C><EFBFBD><7F><EFBFBD><EFBFBD><0F><EFBFBD><10><> L2|<7C>%r<>^b<><62><EFBFBD><EFBFBD>t<05>b<><1B>:<3A><>H<EFBFBD><48>X<EFBFBD><58>`<60>?v<>孧G~<0F><>/<2F>Ԙ,K<><4B>Ȧ#U<>e<EFBFBD>+<2B><>_|<7C>[ <0C>X<EFBFBD><58>ԹX<D4B9>Z<EFBFBD> <09>Hp<48><10>[<5B>G<EFBFBD>C<EFBFBD>D<EFBFBD>G<EFBFBD><47>->=<3D>=r<><72><EFBFBD><EFBFBD><EFBFBD> <09>6<EFBFBD>,<2C><>~<7E> <09>;<3B><><EFBFBD><EFBFBD>Z?<3F>%2<>\ <20><><EFBFBD> Rv{<7B><17><><EFBFBD><EFBFBD><EFBFBD>X&<26><><>B<EFBFBD><42><EFBFBD>F<EFBFBD>+T<><54><EFBFBD>D<EFBFBD><16><><EFBFBD>K:<3A><>_<EFBFBD>yV<05><>E<EFBFBD>u_4,D(<28><><EFBFBD>_j%Xm<58><1E><>PK<08>2w<32>:<00>PK!, org/gradle/cli/ParsedCommandLineOption.classUTm<><6D>J<EFBFBD>@<14><>m<>mmu<6D>" Q1<51><31><EFBFBD><EFBFBD><EFBFBD> 7<05><>4<EFBFBD>M<EFBFBD>N<EFBFBD>2<EFBFBD>D<>A| "(<28>><3E>8)<29>ss<73><73><EFBFBD>oΝ<6F>/{Xexy~<7E><1F><01>Ɣ<EFBFBD>ޑ
<EFBFBD>/<2F>Ӊ<EFBFBD><D389>y<>yLFW$<24>k2<6B>k?Q4<51>e<EFBFBD><65><EFBFBD>!<21><>v<EFBFBD>I<EFBFBD>|<7C>*<2A><06><07>`߰*<2A>;?,<2C>4<EFBFBD>q<>[!Y"2"%<25>ĨSR<53><52>2z<32><7A><EFBFBD><1B>1M<31><4D>:<18>s<EFBFBD><73>*<2A>s!<21>a#WI<57>(K
")<29>+<2B>4Ž<My<16>M<EFBFBD><EFBFBD><E5A4BA>y<EFBFBD><79>=<3D><>@<40>, .<07>6j <0C>)<29>%i<><69><EFBFBD><EFBFBD>/ !<21>3<EFBFBD><33>C_<43><5F><EFBFBD>'"<13>)<29><><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD>.C<><1F>Ʋ<EFBFBD>&\u4X<>
<EFBFBD>]3<><33>V*oֱ*<2A>Ԏ<EFBFBD><D48E>a<EFBFBD>ho߽c<DFBD>ͻ<>w<EFBFBD><77><EFBFBD><EFBFBD>~f<>e<EFBFBD><1C>_PKZ<>vmT<00>PK!3 org/gradle/internal/file/PathTraversalChecker.classUTuSks<6B>F=<1B>H1n<01>-<2D>(<28>D<EFBFBD>h<>G<EFBFBD>`<60><><EFBFBD><EFBFBD><<3C>Ǘ<EFBFBD><C797><EFBFBD>z<><7A>u<EFBFBD>L<EFBFBD><4C><1F>h<>v<EFBFBD><76>e<EFBFBD><00><>Q Wb<57>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B>=w<><EFBFBD><EC9BB7>pM<><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>oN<6F>OE<4F>q<16><><EFBFBD><EFBFBD>9A<39><41><EFBFBD><EFBFBD><EFBFBD>(KkI<6B><11>K <0B>{\Ղ<><08><>A<EFBFBD><41><EFBFBD>.<2E><><EFBFBD>s<EFBFBD>a-<2D><>Z<EFBFBD>s<EFBFBD><73>©N{<7B>re<72>C}w<10><04><1E><><EFBFBD>S<EFBFBD>0J<30><4A>Q<12>*<2A><>^<5E>׽y<D7BD>^<5E>U<EFBFBD>w<13><><EFBFBD><EFBFBD>2<17>X0<58>2<19><><EFBFBD>X<EFBFBD>Q<EFBFBD><51>Ly<4C>w)<29><><EFBFBD>wG<77>Ǎ\<5C><><06> ;<3B><>U<EFBFBD><55><
<EFBFBD><1B>'"<22><06><19><>wE^s<>'<27>{t<><74><EFBFBD><EFBFBD>ҹ<EFBFBD><D2B9><EFBFBD><EFBFBD>C<EFBFBD><43><EFBFBD><EFBFBD> T<18>H<EFBFBD>$}<7D><>P<EFBFBD><50>}XE_U<5F>_30<33><30>NBi.<2E><><1F><1E>ޭ<EFBFBD>Q<EFBFBD><51><EFBFBD>y<EFBFBD><1E>zlb<6C>a<EFBFBD><61>L|<7C>`Y<>y<EFBFBD>*<2A><><1F>6z\<5C>ij<EFBFBD>HQ0|<7C><>9<EFBFBD><39><EFBFBD><EFBFBD>q^<5E><03>Ҧ}<7D><><EFBFBD><EFBFBD>OQ<4F><51><EFBFBD>!<21><><EFBFBD>#BJ<42><4A><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD>(S^JKc<4B>اC<D8A7>+-5<><35><EFBFBD><EFBFBD>7e<37>R<>W<EFBFBD>c<EFBFBD><0F>?dt<14><>,<2C>0p<30>f<EFBFBD><66>b<EFBFBD><62><EFBFBD>ǖ<EFBFBD>8<EFBFBD><38><13>ǏĨ<C78F>f<EFBFBD>&d<>l<EFBFBD><6C>'go<67>'UԱ<55>ϵH<CFB5>ע<EFBFBD><D7A2><EFBFBD>)<13> <0C>f<EFBFBD>8!<21><><EFBFBD>p<EFBFBD><70>T<EFBFBD><54><1A>~nmg<18><>#jڎ<6A><DA8E>f<EFBFBD><66>vn <0C>ˠ<17>
<EFBFBD><EFBFBD>庝I<EFBFBD>OV<EFBFBD><EFBFBD><05><><EFBFBD><EFBFBD>a<EFBFBD><61>Ʉk<C984><6B>-<2D><>Q<EFBFBD>s<EFBFBD>m<EFBFBD><6D><<1A><> D<><1C><>><3E><6B>".Up<16><19>
:M ;<3B>tx<74><0F><><EFBFBD>wx;<16>)l<><6C><EFBFBD>b<EFBFBD><62>I7<49>U<EFBFBD><55><EFBFBD><EFBFBD>1zo<7A>#<23>"p<>]#<23><1D>k<EFBFBD>+>n<>ַ#b<>/L<><4C><EFBFBD><11>!<21>]<5D>pλ<><CEBB>q]k<>@<40>\<5C><><0E><>Ik<49>9N<39><4E><EFBFBD>FX<46>~.b<>ܿ_<DCBF><5F><EFBFBD>K<0F>%<25>e<EFBFBD>;<3B>+<2B><><EFBFBD><EFBFBD>B<EFBFBD>5zN<7A>rYu<59><75><EFBFBD>pe<>V<><56>J<>PK<08>$O<14><00>PK!A org/gradle/internal/file/locking/ExclusiveFileAccessManager.classUTePMO<4D>@}[LBRHi<48><01>"<22><><EFBFBD>!T<>B<EFBFBD>DU<44>H<EFBFBD><48>^O<>%<25>u<EFBFBD>kG<6B><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>9<EFBFBD>r<EFBFBD>ȁUul<75>z<EFBFBD>f4<66>y3;<3B><EFBFBD><7F><01>b]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>jJ6
B5<0E>BU<42>3md<6D> <1B>EJ<45>;2$=19<31>>RRS_<53>><K<>i+<2B>eQ.g<><67>=(y<><79>&{<7B>u<EFBFBD><75><EFBFBD>qe ~"<22><>Zb3m<33><6D><EFBFBD><19>sr<73>g1><3E><><EFBFBD>E)<29><>Kݳ<>r<EFBFBD>N<EFBFBD>!<21><><EFBFBD>eq<65>dj(ֶ$g<><67><EFBFBD>LŦPS<50><53>?^*Sy=o>(E<><EFBFBD>Vf<56><02>V/<2F>\<5C>F<EFBFBD><46>srA<72> <0C>(<28>x<EFBFBD><78>.<2E> ,ll<6C><6C><EFBFBD><EFBFBD>N<01><02>\^%tl
O_*M<><4D>X<>8mLt7<>L n<><6E><EFBFBD>?8<>K<EFBFBD><4B><EFBFBD><EFBFBD>V<>Y<EFBFBD>
k<><6B><EFBFBD>uiV_9<5F><39>@<40>O<EFBFBD><1D>yz<79>^@<40><>p|<7C>Հ<EFBFBD><D580><EFBFBD><1E>b<EFBFBD><62>t<>C<EFBFBD><43>~<7E>D<EFBFBD> <1F><1F><>+<2B>_h}<7D>a<EFBFBD>Ţ>^3<>_l|<17>PKy<>PK!> org/gradle/util/internal/WrapperDistributionUrlConverter.classUT<00>Q]o<>0=f<>2<EFBFBD><00><><EFBFBD><EFBFBD>c᥃<63><01>CX/CHHC<48>U<03><>InSo<53>9N_<10>!<21><>=u<12>xE<78>G!<21>u4<><34>dY<64><59><EFBFBD>{<><EEB1BF><EFBFBD><15><13>2|<7C><><EFBFBD>?z<11><>H%ކ<0F><><17>Y!$7"W~<7E>'dqM<71>xI<78>r<EFBFBD>K?Q<>WVY<56>m <0C>,<2C><><15><><EFBFBD><EFBFBD>u<0F><>=M<>u<EFBFBD><75><EFBFBD>~XIi<49>r<EFBFBD><72><EFBFBD>5E<35>Bi<>R<EFBFBD><52>I<EFBFBD><49><EFBFBD><EFBFBD>aw<61><1B> <09><>O<EFBFBD>` <0C>~^<5E>^ I a<><61> <20><<3C>TF<54>@(CZq|м(H<><14><>"<22><><EFBFBD>w<EFBFBD><77>̕<EFBFBD>l) <0C><>|<7C><03>U<1A><>v)6<0E>V<>)錔<>Q{<7B>X <20>v<EFBFBD>m<EFBFBD><6D><EFBFBD>M=wom
)2<><32><EFBFBD><EFBFBD><1E><>g<EFBFBD><67><EFBFBD>0<EFBFBD>\(a^0<><30><EFBFBD>пw<D0BF><77>B <0B><>p>%ӷ<>٠<EFBFBD><D9A0><EFBFBD><EFBFBD><EFBFBD>.q<>&_9u:<19><><EFBFBD>5<EFBFBD>%<25><14><><EFBFBD><EFBFBD>qm\<5C>L5W<19><>?<3F><>@כh<D79B>ì<>m <0C>n<EFBFBD>3A]<5D><><EFBFBD>t<EFBFBD><74><EFBFBD>i<EFBFBD><69><EFBFBD><EFBFBD>Y8<59><38>́y<CD81><19>٪<EFBFBD>f<><66>aa0x<30><78><10>&X<><58><EFBFBD>#<23>:\;<3B><> <09>tN<>5<EFBFBD>f~PKb<><06><><00>PK!/ org/gradle/wrapper/BootstrapMainStarter$1.classUTmQ<6D>nA<10>!<21>5<EFBFBD>@$<24><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>p0 <09>!H<><48><EFBFBD><EFBFBD><EFBFBD>qi<71><69><EFBFBD><EFBFBD>ήf<CEAE><66>ȇ<EFBFBD>
\<5C><>ā<0F><10><08><>Li<4C><69><EFBFBD>{z<><7A><EFBFBD><EFBFBD>
<EFBFBD>C<EFBFBD>S<EFBFBD>py<EFBFBD>r<EFBFBD>.<2E>Pv<50>6<EFBFBD><36><EFBFBD>l<1A><>*km(<28><>&e<><65><EFBFBD><EFBFBD>
<EFBFBD>g)<29><><> <0B>(}|<%<25><1F>ERR<52><52>&<26>'<27><1F><>o<EFBFBD>ta<74>~Fɰ<46><C9B0>B[f<>m!쒝<>^G<>Q<EFBFBD><51>2~߂Rh<52><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>6<EFBFBD>Ы\<5C><16>r<EFBFBD><72>[Gu<47>.=<3D><><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD>@.<2E>{0<><30><EFBFBD><EFBFBD>5<EFBFBD>%<25><>l<EFBFBD><6C><EFBFBD><EFBFBD>9 6<15>W<EFBFBD><57><EFBFBD>&<26>R<EFBFBD>d<EFBFBD>'BKa<4B>:<3A>*<2A>u{<7B>:h<>F:R<>,<2C>:(<28><><EFBFBD><EFBFBD>?9<><39>c<1C>ל<EFBFBD>^+\
<EFBFBD>ZXY<58>K<06>osr-l<>3֕%ŽBTR<10>W<EFBFBD><57><EFBFBD>/<2F><>;<3B>kc<17>
<EFBFBD>Oe<EFBFBD>bC<62>S<EFBFBD>.yMP<4D><50><EFBFBD>ܶ<05><><EFBFBD><EFBFBD><17><><04><>[<5B><><EFBFBD><EFBFBD>+<2B>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD>W<02><><EFBFBD><EFBFBD>PK<08><45>PK!A org/gradle/wrapper/Download$DefaultDownloadProgressListener.classUT<00>SQo<51>V<14>.i<><69>sKJ(T<>գ, MC)+<2B><>+CJ <09>Ԡ<EFBFBD>H<EFBFBD>؍}<7D>u<EFBFBD><75><EFBFBD>N<EFBFBD><10>썇=<3D><0F><>3<EFBFBD>Z*&<26><>6i<36>O<EFBFBD><4F>50:<3A><>l<EFBFBD><6C><EFBFBD>s<EFBFBD>{<7B>s<EFBFBD><73><EFBFBD><EFBFBD>_/^8<><38>ݻ<>V<EFBFBD>c<EFBFBD><63><EFBFBD>)|<7C>\2<><32>9kZA<5A><41>z<r<03><>
lAq)<<3C>CA<43><1E><><EFBFBD><EFBFBD><1B>Km<4B>b<EFBFBD><62>9<EFBFBD>.<2E>\<5C>C<EFBFBD>Ν<EFBFBD>[ <0B><><EFBFBD><EFBFBD><EFBFBD>۱<EFBFBD>Q <20><>Ҽ<EFBFBD><D2BC><EFBFBD><EFBFBD> !]ߡh_Ȑ<5F>(^<5E>[<5B><><EFBFBD>l<EFBFBD>7<EFBFBD><0E>1<EFBFBD> <20><><EFBFBD><EFBFBD>z<EFBFBD><7A>H<><48>Hn{<7B><>%y<>'d<>J<EFBFBD><4A>{<01><>_m{<7B><><EFBFBD><EFBFBD>2p<32>úF<>R<>Cf<43><66>y<EFBFBD><79>S^mm+<2B>0<EFBFBD>0<EFBFBD><05>#$<24>T<EFBFBD><04>d<EFBFBD><64>0d<30>Q!><04><><EFBFBD>P<EFBFBD>C=)<29>n<10><>`5<>G <0C>F<EFBFBD><46>w}7<><37><EFBFBD>X<EFBFBD>#<15>R<>º<EFBFBD>Qdth30<33><30>a<EFBFBD>1n@<40>'<27><>00<30><30>C Y<>
[#<23>Q.wh<0E>fH<66>WV
<EFBFBD>H<1E><>wc<77>Σ<EFBFBD><CEA3><EFBFBD>D<EFBFBD><44><15>V+<2B> <0C><>c<EFBFBD>Vq<56>7<EFBFBD><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><7F>)y5<79>`<60><>܋<EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>1Uyt|<7C>"<22><><EFBFBD><EFBFBD>Y<EFBFBD>,MGE|*<2A>T~OjF6<46><0F><>-Q<>Kp9A<39>'<27>de%<25>"<22><><EFBFBD>GP<47>j<><6A><EFBFBD>;<3B>Z<EFBFBD>GnW|}<7D>=u/4|<7C>0<EFBFBD><30><EFBFBD>l%)^<5E>rV<72>"*$<24><><10> <1C><11>t8<74>0<EFBFBD><30>q<EFBFBD>rmuO:<3A>{`<60><>
<EFBFBD><EFBFBD>:]<5D>o<EFBFBD>nK<6E>*<1F><>Fʤ0<CAA4>$&oL <09>hE<68>ݧT<DDA7>~<7E>^<5E>UƋ<><C68B><EFBFBD><EFBFBD><EFBFBD>mL<6D>mLmc<6D>Y"<22><>
<EFBFBD>O <0C> <0B><>~<7E><18><><7F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B>~<7E>~0<><30>͟R<CD9F>va<76>b&<26>{<7B>:<3A><><EFBFBD>CT7<>M?A<><41>M<EFBFBD>?<3F>M<EFBFBD><4D><EFBFBD><0E>33<33><33>_Qʦwp<77>&><3E>ȵ_<C8B5><5F>,>ǹW<C7B9><57>1<><31><07><><EFBFBD><EFBFBD>Ț<EFBFBD>~<7E>p17<31><37> Ϩ<>)<29>@<17><08>=<3D><><EFBFBD>]<5D>Zb<1B>U<EFBFBD><55>2=J39J<39> <0C><>A><3E><><EFBFBD>4RPK<08><>%)<00>PK!4 org/gradle/wrapper/Download$ProxyAuthenticator.classUT<00>T<EFBFBD>R<EFBFBD>P]<07><><10> <20><>P<>ҋ\<5C>R<EFBFBD>A/<2F><>Te<54><65><EFBFBD><EFBFBD>&<26>m4M<34>I
2<EFBFBD>|<7C><1F>:ZF<5A>q|<7C>?<3F>q<EFBFBD><71><EFBFBD>Vf$'<27><>k<EFBFBD><6B>>+<2B><><EFBFBD><EFBFBD>7<00>X`x<><78><EFBFBD>K<EFBFBD><4B>
<EFBFBD>x!S<>hFQ<46>k<EFBFBD>[<5B>Z6<5A>-<2D>IT\SP\
[pOP<4F>̽<EFBFBD>Q<16> <0B>V<EFBFBD>L<EFBFBD>۞<EFBFBD>k<EFBFBD>R<EFBFBD>« +<2B>!
S<EFBFBD>fa<EFBFBD><EFBFBD>2<EFBFBD>[_<><5F>6<05>2O<32><10>d9BH<42>)QtEH<45><48>(<28>NN$<24> S<>ho<68>` <0C>C<EFBFBD>&
1oق!<21><>R<EFBFBD>$<24>i<EFBFBD>Ԫ<EFBFBD>ժ<EFBFBD><D5AA>9wձ]n<>,I<><49><EFBFBD>L<EFBFBD>/ Ƿ <0C>2<EFBFBD><0E><><EFBFBD>|<7C><><1C>Zr<5A> o<><6F>E<EFBFBD>*<2A><>o <09><>oq _<>-;u<>W<EFBFBD>:<3A>Z<EFBFBD><5A>_g<18>[r<>e<EFBFBD>v=<3D><>B<EFBFBD><42> <20>atu<74><00><18><><EFBFBD><EFBFBD><EFBFBD>=oՕf5m<35>aX<61>.<2E>յ7<D5B5><37>#<23>!'^քG<D684><1F>UizcaӆF<D386><46><EFBFBD>*b0<62>t<EFBFBD>ad?!f8<66><38>{<7B>$<24>p~<7E>$Gq<47> Gp<47>I,<2C><><EFBFBD><EFBFBD>"<22><1A>R<EFBFBD><52>'q*u<>Am̄p<CC84><70>;<18>t}<7D>pm<70><6D><EFBFBD>b<EFBFBD>;<3B><>C?p
5ƈ
<EFBFBD><0E>fgk<67>m
:<3A>
t<EFBFBD><EFBFBD><EFBFBD>qL<71><4C><EFBFBD>o<EFBFBD><EFBFBD><7F><EFBFBD>I <0C>A<EFBFBD>8<EFBFBD>/Y
l<EFBFBD><EFBFBD>2<>$C<>w<EFBFBD><77>*.Jt<4A>1<EFBFBD>4<EFBFBD>"<22> <09><05><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\~<13>NH<4E>%\<5C><>$<24><><EFBFBD>ZU<5A>0<EFBFBD>л-c<>)a<>;<3B>j<EFBFBD>N<><4E>F!ܠ<><DCA0>n<EFBFBD><6E>匔|<7C><>C<EFBFBD><><CDAA><EFBFBD><EFBFBD> <0C>4<EFBFBD>=<3D><>4<EFBFBD><34><EFBFBD>[
nb^E?<06><><EFBFBD>C<EFBFBD>Y<EFBFBD><59>1F&<0F>O<EFBFBD>Q<EFBFBD><OOm<4F><6D><EFBFBD><EFBFBD><EFBFBD>{<7B>6D<36>mtWb<57>
<EFBFBD>~F<><03><>?贃YG<07><>.cu }ĉw(<28><>u<EFBFBD><75><EFBFBD><EFBFBD>>!<21> =?<3F>l<03>:)Z<><18><>t<1B>#<23><><EFBFBD>S<>V<EFBFBD><56><16><>Ot\_<><5F><EFBFBD><Q<><51> w<>}lw<>oia[<5B>mh<6D>PKw<><77>&<26>PK!! org/gradle/wrapper/Download.classUT<00>W |U<19><>d7<64><37>nK<6E>mKiCBs<42><73>5M<35>ФW<D0A4>A<EFBFBD>&<26>K<EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD>fwf<77><66><EFBFBD>A<EFBFBD><1E><17><>QKU<14><><EFBFBD>6B7
<11>ZZ<5A>Q<QQ<51>T<><54>ߛ<EFBFBD>M7<4D><1A><><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD><6F><EFBFBD>x<EFBFBD><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>> `=<3D>29x<39><78><EFBFBD><1D>Z<EFBFBD><5A><EFBFBD>":XQ_Փ)5<>X<EFBFBD><58><05>z<EFBFBD><13><> <09><><EFBFBD><16>3<1D><>a3<61>4+<2B><06><><EFBFBD><EFBFBD>+R<>`RIU!<21>l<><1B>@{<7B><><1C>`:<3A> <20>9<EFBFBD>׉-Z\<5C>87T-N<>n<><6E><EFBFBD>
<EFBFBD><EFBFBD>`<60><>T<EFBFBD><54>c<><63><EFBFBD><EFBFBD><11>;<3B>gX<67>񆸡<><12>a<EFBFBD>PR)n4l<34>G<EFBFBD><47><EFBFBD><EFBFBD>$<24>J<>+#JCB<43><42>
<EFBFBD><0E><>QKB CIB<49>ǹA<C7B9><74>Ĝ2<C49C><32><EFBFBD>M<EFBFBD>C5-<2D> <09>+ 1<>4Vn<56>J:a<><61><EFBFBD>9<EFBFBD>B<EFBFBD>9N<39>IZ!FK<46>&<26><1D><>iKM4t*)ڴT<DAB4>֨n <0C><>I<EFBFBD><49>-<06><>paT<61><54>+Vx<56><78><EFBFBD><EFBFBD>< <09><16>k<EFBFBD>Ȼs<>^6<>(<28>O.<2E>B<EFBFBD>Tk CquM<75>˱‹e(gX^H<><48><EFBFBD><\<5C><><EFBFBD>0'˪<><11>ه<EFBFBD><D987>ҋ.aX2kI<6B>j<EFBFBD>U-n(<28>N.-<2D><>ۖ<EFBFBD><DB96>/\<5C><17><><EFBFBD>?]B%<25>D<EFBFBD><44><EFBFBD><EFBFBD>,<2C><><EFBFBD>}<7D> k<16>
<EFBFBD> .<2E>&/<2F><><EFBFBD><EFBFBD><00>\<5C>:<3A><><EFBFBD>a<EFBFBD>,<2C>Wn'<27>"Ĺ<7F><C4B9><EFBFBD>}X+<2B>6`<1D>l<EFBFBD>aK<61><4B>\<5C><0E><>n<EFBFBD>F/$\N{<7B><>_I<5F><49>/r4<><34>)<11><><EFBFBD><EFBFBD><14><> <09>"*W0<57><30>^ s Ľ<><C4BD>_XV<58><07><16><><EFBFBD>}<7D>a<EFBFBD><61>jah<61>?<3F>Z<EFBFBD>6<EFBFBD><36> <0B><><EFBFBD><EFBFBD>/<2F>c<EFBFBD>^,Z<>|X<> <0B>W;<3B>%<25>ۃj<mp<6D>>6<>5m
Qn<EFBFBD>Q<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>э.
<EFBFBD><EFBFBD> <0C>>C<><35>Ri<52><69>i<EFBFBD><69>+<2B>2<EFBFBD><32>q = <0C>(&a<>SI
J<EFBFBD><EFBFBD>T}$<24><><EFBFBD>t<EFBFBD><74>a<EFBFBD>C{<7B>C<EFBFBD><43>
'<27><><EFBFBD><EFBFBD>G<EFBFBD><47>ͮ(֐/qv<71>sb}]<5D><1B>,<2C>C`XL<58><1D>O<>A|<7C>9t<39>X<EFBFBD><58><EFBFBD><EFBFBD>s><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>}\(b<><62><EFBFBD>zO<7A><1C><><EFBFBD>Ǣ<%<25>,a?U<><0E><>jL<6A>t9<74>&<26><>u$j<17><>w<EFBFBD><77>G<EFBFBD><47><04><>Ӽ<18>N<EFBFBD>5?<06>q<EFBFBD>R<EFBFBD><52><14>H<EFBFBD>nȲR<C8B2><52>z<><7A>
<0F>Y<EFBFBD><59>nNi<4E>B\4<><34>
N<>2<19><>b<EFBFBD>`<60>z<EFBFBD><7A>o<EFBFBD>+8<>Z(<28><>&<26><>47S<07><>ӥ<EFBFBD><D3A5><EFBFBD>܋<EFBFBD>x<05><><EFBFBD><EFBFBD><EFBFBD>a}]X&<26><>5D<1E>K<EFBFBD>Y[m<><6D>ƭ^܂א@%kQL5:<3A>j<><6A>}><3E>Ѫk<1A><>6<EFBFBD>82<38>9d({H<>o<>u):<3A><>p;<3B><><EFBFBD><EFBFBD>[1M<31><4D>b<1E><>.<2E><>-i5<13><>f/<2F><14>D<EFBFBD>`<60>b <0C><02>2<EFBFBD>Yf<59>)Xo<58>ۄ<EFBFBD><DB84>S<17>n]x<>;<3B><><EFBFBD><EFBFBD><EFBFBD>r<EFBFBD><72>ĉڴA݇w:<05>.<06>r<0F>&<26><><EFBFBD>i<EFBFBD>EV<14><1C>/ދ{<7B><><03>c<EFBFBD>u<EFBFBD>֞<EFBFBD><D69E><EFBFBD><EFBFBD>r<EFBFBD>IJ<49>]<5D><>ݲ<EFBFBD>yvd<><64>`Y<>dU3y<33><1A><1C><>(<28>X6<58>db<64>w<EFBFBD><0E>c<EFBFBD>)
u -<2D><><EFBFBD>n{jl<>J<07><>3
<EFBFBD>!><3E><10><><EFBFBD>T‡<54>hv<68>s<EFBFBD><73>Z<EFBFBD>0<EFBFBD><30><EFBFBD>(>Be$ <0C>
<EFBFBD>&<26>n<0F>#8'<27><><EFBFBD>"w<><15><F5rNPk<50><6B>.<2E>T<EFBFBD><54>]<1B>È<EFBFBD>'0<><30><EFBFBD>[<5B><><<3C><>^܏L6<4C>B<EFBFBD>HB<48><42>o<EFBFBD><6F><EFBFBD> 2<> <20><><07>' g<>D<EFBFBD><44><EFBFBD><EFBFBD>9<EFBFBD>6R<36>)<<3C><>4<1E><>"+<2B>kQ<6B>')<29>O:<1D><>ӱ)<0F>. m<><i<><69>
><3E><>H68H<>g<EFBFBD>Yq<59>S <17>=W<><57><EFBFBD><EFBFBD>,n#<23><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<14>i<EFBFBD><69>X<EFBFBD><58><EFBFBD>| _<><5F><EFBFBD>ڈ>L<><4C><EFBFBD><19><><<3C>ݗ<EFBFBD>_<>W(<28><>zw=<3D><>s)<29><>[b>,/<2F><>=-><<3C><><EFBFBD><EFBFBD><EFBFBD><06>,6<><36>ƒ<EFBFBD>Ѐ<EFBFBD><D080>B<EFBFBD>K<><4B>S<EFBFBD>ՙ9<D599>9<EFBFBD>ES^<5E>x-<2D>-<2D><><18>|'<27><><EFBFBD>jA<12>K-<2D><>_<0F>!7<><37><EFBFBD>H]y<>y݁"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~<7E>pC<70>C<EFBFBD>j)PX<50><<3C>ZC <14>jʚn<CA9A>f:<3A><><EFBFBD><EFBFBD>.9<EFBFBD><EFBFBD><EFBFBD>SB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>G<EFBFBD>Y<EFBFBD>6!<21><>1"<22>$<24>iz<69>p<EFBFBD>p<EFBFBD><70>I*<2A>;%F<><46><EFBFBD>䝟e<07>P<EFBFBD><50><EFBFBD><EFBFBD>/<2F><>I<>#<23><>&<08> iJ<69>{<7B>J`Bf<>,*Ftȃ?<3F>Y<EFBFBD>><3E><>'<27>Z<0F>L<EFBFBD>G<EFBFBD><47>Pe<50><65>Uf<55><66>_<EFBFBD><5F><EFBFBD><EFBFBD>_)<29>u#<23>Xs2<73>@<40>Ȩ<>9<EFBFBD>o<EFBFBD><6F>H<EFBFBD><EFBFBD><1C>J<EFBFBD>-<2D>(<28>6<EFBFBD>J'<07><>+<2B>y<EFBFBD><79>yL<79>'<27> eb<65><62><EFBFBD>21<32>ِ<EFBFBD>J<1B>|G<><47>VK c<>a<>PL<@<40>v<1A>"퓸0<ED93B8>US<55><53><EFBFBD><EFBFBD>n
5 wa3}N<>!<12><>z<EFBFBD> 6uMa3<61>xX<78>Q,<2C><>1"w<><06>3<EFBFBD>r<EFBFBD>ѳ<EFBFBD>j<EFBFBD>A<EFBFBD><41>l<EFBFBD>-YekI<6B>PVYٻwW<><1D><><EFBFBD><EFBFBD>h<EFBFBD><68><EFBFBD>H{<7B>$v<><1E>5<EFBFBD><35><EFBFBD>#<23>k'l<>E<EFBFBD><45>uY<75>[G<>j<>A;<3B><><EFBFBD><EFBFBD> <6E>K<EFBFBD>\D<><44> 6<><36><EFBFBD>կ
<EFBFBD><02>@<40>$<24>c<EFBFBD><63><18><><EFBFBD><EFBFBD><EFBFBD>H=b YLo<03><RfC?Vذ<56><D8B0>G<02><>jʸԆU<D486>Px<50><78>߬A;<3B>w<EFBFBD>`]<5D>h<>[S<><53><EFBFBD><Rfc/<2F><><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>'<27><> <09>#<23>ӯE<><45><EFBFBD>5<04><>:<3A><><11><0E><>J.<2E><><EFBFBD>f<EFBFBD>9<EFBFBD>;"]6<><36><1C><>:<3A><><00><>Ӹ3<12>7<EFBFBD><37>dp<64><70>)<29><><02>C<1C>:
O]<06><>
<EFBFBD><EFBFBD>k<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٗ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>G<EFBFBD><EFBFBD><EFBFBD>?<3F><>G<EFBFBD>k<17><1D>OLb<4C>O<EFBFBD><4F><EFBFBD>D<EFBFBD>\<5C><> <1E><EFBFBD><7F><><DC9F>Mn<4D><19><EFBFBD>Ex<45><78><EFBFBD><EFBFBD>0nF<6E>ROU<><04>7<EFBFBD><37>_<EFBFBD><5F><EFBFBD>+<2B><>h<EFBFBD> <09><><EFBFBD>o<EFBFBD>p<><70>-x<><78><EFBFBD>eY<65>-6Ǫ<1C>ѳ<EFBFBD><D1B3><EFBFBD><EFBFBD><1D>3<EFBFBD><33><13>g<EFBFBD><67>-<2D><01><>)<29><04><>
<0F>nރ<>l8A~<11>Qj<51>E<04><>^(<28>Sxچ<78><DA86>Y:<3A>/<2F><><EFBFBD>*<2A><>*<2A><><16>9<EFBFBD>X1<58><31><EFBFBD>Sl<53><06>0<EFBFBD>v<EFBFBD><76>.<2E>M<EFBFBD><4D><EFBFBD>9<EFBFBD><39> <0B>9<EFBFBD>C`<60><>a<EFBFBD><02>m<0E><12><>υM<CF85><EFBFBD><1E> <12><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><6C><EFBFBD>K<EFBFBD> <0C>\a)<29>{jå%u<>R<EFBFBD>><3E>.Pr<02><>UU1<55><16><><EFBFBD>PK<04> e *PK!- org/gradle/wrapper/GradleUserHomeLookup.classUT<00>R]OA=C+<2B>~<7E>XQPTdU( ۍ<>CEb<45>R<EFBFBD><06>Z<13><><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD>~ev<65><76><18>!<21> c<>F<>?<3F>x<EFBFBD>h<EFBFBD><68>/3sϜs<CF9C>w<EFBFBD><77><EFBFBD><EFBFBD>_<01>NJ<EFBFBD><C78A><EFBFBD><EFBFBD>v<EFBFBD>ޗֈ[<5B>ԭ<EFBFBD><D4AD><EFBFBD>[<5B><1F><>L<EFBFBD>00<30><30>&<26>y$c<>ˡ<EFBFBD>
kH<EFBFBD>(N<>X<EFBFBD>H/<2F>u=r _F<5F><46><EFBFBD><EFBFBD><EFBFBD>v<76><7F><EFBFBD><EFBFBD>K?H=<3D><>x(<28>{%p܀H<DC80><48><EFBFBD><EFBFBD>o<>7<EFBFBD>
æ<EFBFBD><EFBFBD>V<EFBFBD>(u<>TY<54><59>z$<24>*<2A>t<EFBFBD><74>=2_+E<>̽I؍I<D88D>><3E><>p<EFBFBD>F<05>f<0F>X<EFBFBD><58> <1C>HVR<56><52><EFBFBD><EFBFBD>Nsw<73><77>z<EFBFBD><7A>koﴚ<6F>n<EFBFBD><6E><EFBFBD><EFBFBD><k
T[<5B><15>$s<>H@۲<7p<37><70><02><><EFBFBD>K<EFBFBD><4B><EFBFBD>IOR׳IP<11>ޚp+8<>r 3<> PL<50>Z}<7D><>4\<5C><>U<EFBFBD>(N<>/<2F><>@١<>
<EFBFBD><EFBFBD><EFBFBD>H`<60>v<EFBFBD><76><EFBFBD>Y<EFBFBD><59>˸R<CBB8><1C>p6<70><36>0<>K<EFBFBD><4B>3<EFBFBD><33><EFBFBD>k<EFBFBD><6B>E<EFBFBD>Ԭ<EFBFBD><D4AC>V<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>*0W<30>g<EFBFBD>%<25>ʔ<EFBFBD>h(q<0E><05>O<EFBFBD><4F><EFBFBD><EFBFBD><14><> <09><>w<EFBFBD><77><EFBFBD>ʼ<><CABC>hS|<16>`<60><>G<EFBFBD>V<EFBFBD><56><EFBFBD>p<EFBFBD><70>՛<EFBFBD><D59B>@<40><>;,<2C><>r?PKAs <09><00>PK!* org/gradle/wrapper/GradleWrapperMain.classUT<00>Y |<1B>ot<6F>h<EFBFBD>\<5C>"B<>p<EFBFBD>F<EFBFBD>-<2D>ȡ<>_I<5F><49>N<EFBFBD>c<EFBFBD>r<10><><EFBFBD><16>4FG<03><>6<05>e<EFBFBD><65>҆<EFBFBD>ݖ<1E><><EFBFBD>+<2B>
.<2E>R<1A><>B)<29><02>7<EFBFBD>Rz--<2D>-<2D>d<EFBFBD>ߌd[<5B><1C><><EFBFBD>dF<64><46><EFBFBD><EFBFBD><EFBFBD>}|<7C><><EFBFBD>?JDˤ^<5E>ۯ<EFBFBD>r<EFBFBD><72>˫<EFBFBD><CBAB><EFBFBD>^=<19>
VEz<EFBFBD>j<EFBFBD>"F<>?<16>21#HQ<1D>)=<3D>ki<1D>}Z:<10><>#{<7B><>D<EFBFBD><><D8A3>zmUo <20><>b<><62>޽<EFBFBD><DEBD>h<EFBFBD>Y<EFBFBD>M<EFBFBD>,<2C><>d<EFBFBD>q,<2C><><EFBFBD><EFBFBD>R<01><>%u=K<>bu<62><75>J<EFBFBD>,<2C><><EFBFBD>;<3B>ne <20><><EFBFBD><EFBFBD>B̤v<1A>TD_<17><>L <0B>To}oJ<6F><4A><EFBFBD><EFBFBD><EFBFBD>)<29><>_Oկ7n<7F>~<7E>k<EFBFBD><6B>Lv<4C><76><EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>}<7D><1E><><EFBFBD>d<EFBFBD>'<27><>4ۿ34<33>ߙL<><4C><EFBFBD><EFBFBD>i<EFBFBD><69>js\K<>eR<65><<3C>zfK<66>ȀXl1,U<>j<EFBFBD>FZ<46>dS<64><53>@<40>D<EFBFBD><44>nr<6E>4<EFBFBD><34>h:<3A><><13><>4<EFBFBD>ij<><6A>,<2C><>N<EFBFBD>t<EFBFBD><74>.<2E><><EFBFBD>G<EFBFBD>YT<59>4g*(<28>f3<66><33><6C>Ƅb
D<EFBFBD>z<EFBFBD><EFBFBD>kk<08><>W<EFBFBD>S<EFBFBD>T&<26><><1D>Ncrd<72><64><EFBFBD>m<EFBFBD><6D>ڀ6<DA80>NWi<1E><><EFBFBD><EFBFBD>d<EFBFBD>br<62><72>N<EFBFBD>HbTP<>k<EFBFBD>M i<>J <0B>C<EFBFBD>J<0F><><EFBFBD><EFBFBD><EFBFBD>j<16>LK<4C><4B><EFBFBD><EFBFBD>Y<EFBFBD>S<>?4Ѭ<34><D1AC>w<EFBFBD><77><EFBFBD>*<2A>Pleq3<><05><>-Z<>F<<3C><><06><>?<3F>b!
2<EFBFBD><EFBFBD>k<><6B>,<2C><><EFBFBD><EFBFBD>L<EFBFBD><4C>eZ<0E>2<EFBFBD>呣z<01>X<01>JZUF+(X<>K~G<>s<EFBFBD>d<EFBFBD>K <20>5<EFBFBD><35><EFBFBD>ֹ<EFBFBD>d,<2C>f<EFBFBD>x<EFBFBD>^<5E>FjR<6A><52><EFBFBD>-<2D>n<EFBFBD>Rz2<7A>VA<56><41><EFBFBD>YD;<3B><><EFBFBD>
<EFBFBD><1A><><EFBFBD>Uw<55><77>Z<EFBFBD><5A>&8@]<>@pdbzZ<7A>v<EFBFBD><76><EFBFBD><EFBFBD><08>TZYY<59><59><12><>2<EFBFBD>f<EFBFBD>"4><3E><>#b<><62>)<29><>f9<66>%<25>P<EFBFBD><50>.<2E>Ubg;<3B>o\<5C>G<EFBFBD>1<EFBFBD>t"<22>%<25>!<21> <20><><EFBFBD>La<18>o<EFBFBD>۩<EFBFBD><0E><05>k񸱿+<2B>7i<37>On<4F><0F>ax<61>E<EFBFBD><45><05><><EFBFBD>W<EFBFBD>n<EFBFBD><6E>"ȂV<C882><56>H<EFBFBD><48><EFBFBD>К<EFBFBD>oEɊ<45>"45W<35>i<EFBFBD>H<0F>
n<EFBFBD>N(<28>-<2D>%<25><><EFBFBD><EFBFBD><EFBFBD>&<26><>m<03><>Y<EFBFBD> )$<24>p<EFBFBD>^[|<7C>B<EFBFBD><08>K<EFBFBD>1=<3D>P
+-
<EFBFBD><EFBFBD>e<EFBFBD>tFO<04><><15><>4<EFBFBD>$<24><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<1A><><00><><EFBFBD>3> З<><D097><01><><EFBFBD><EFBFBD><EFBFBD><17><><EFBFBD>z]o<>/В<10>
<EFBFBD><EFBFBD>}Z<<3C>W<EFBFBD>)tN<><4E><EFBFBD>H*<2A><>Oy)g<><67>>,<2C><><EFBFBD><10><><EFBFBD>6<EFBFBD><18>hWK ^<5E>i<>ȡb<C8A1>A<EFBFBD><1A><>JW<4A>G'<27><>t<EFBFBD><74>8<EFBFBD><38><EFBFBD>1(o<><6F>-<2D>qe<71>Yݲj<DDB2>i<EFBFBD>b<15>*<2A>l<EFBFBD><6C>q<EFBFBD><71><EFBFBD><13>I<EFBFBD>u!l<><6C>o<10>T\j<><<3C><>F<n%s<10><>nV<6E>F<EFBFBD>w&<26><>4<EFBFBD><EFBFBD>t=}RԢ<52>$<24><> <20>R<EFBFBD>Z<EFBFBD>4<EFBFBD><34>
<EFBFBD><EFBFBD>Mz<EFBFBD><EFBFBD><EFBFBD>¹3۝ߗ<EFBFBD>v<EFBFBD><EFBFBD><EFBFBD>8<><38><EFBFBD>z"<22>$<24><><EFBFBD><EFBFBD>C<EFBFBD><43><EFBFBD><14><>i<EFBFBD><69><EFBFBD><EFBFBD>ҺEr<45>O&%&~e<><65><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD><EFBFBD>P<EFBFBD><50><EFBFBD><EFBFBD>2<EFBFBD>}<7D>@<40>h_<68>/!<21><><EFBFBD><EFBFBD><EFBFBD>d<><64>F<EFBFBD><0E>]e<>e<EFBFBD>
<EFBFBD>D<EFBFBD>\.<2E>'y<>q<EFBFBD>W<EFBFBD><01>5<EFBFBD><35>ԗ<><D497><EFBFBD>hp~/<2F>5<EFBFBD>
t<EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>{x<>d v<>T<><54>d<><01><>0><3E><><08><>G2
<EFBFBD>8Y<38>?<3F><>0= <0C>;/j<>]<5D><>7<EFBFBD>#<23>eP\<5C>nzTpSCGQ<1A><><EFBFBD>t޽+<2B>m%<25><>7<EFBFBD>q<01>-d^#Y$펓,(<28>Ep<45>~q<><71>PٓL<D993><4C>y|<7C><>F6˳+<2B><>1 <09><><EFBFBD>/<2F>\|<7C><>U<EFBFBD><19>.<2E><><EFBFBD>KW<4B><57><EFBFBD>P<EFBFBD>D<EFBFBD><44><EFBFBD>X2<58><1F><>/<2F><><EFBFBD><EFBFBD><EFBFBD>}zA<7A><41>—ۦR<DBA6><05><EFBFBD>I5<49><35><EFBFBD>4<EFBFBD><34>T<EFBFBD>s<EFBFBD>Yn_<6E><5F><05><><EFBFBD>@<40><>
fM^_E<5F>Z<EFBFBD><5A> <20>9ܩ%<25><16>u<>O<EFBFBD><12>3<EFBFBD><33><F`<60>@<40>E<EFBFBD>?4<>i,`<60><>R"<22>~<7E><>k<EFBFBD>t<EFBFBD>E<EFBFBD>d<06>hz<68>><3E><>ECu#<23><0F>)Ei<45><69><EFBFBD>QQ<7F><7F><00><>Jo<4A><6F><EFBFBD>)<29><>$jh<6A><68><EFBFBD>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD>?<12><><EFBFBD><EFBFBD>1<EFBFBD>M7<4D>Q42oҟ`,<2C>H<><05><><EFBFBD><EFBFBD>t<EFBFBD><74><EFBFBD>;<3B>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>A<EFBFBD><41>'q<><16>>3<33><7F><EFBFBD><EFBFBD>߅<EFBFBD><DF85><19>d<EFBFBD><64><EFBFBD> <0B>t\h<>>A3M:s<>&<26>n<EFBFBD>DOqۊ[R<>t<EFBFBD><74><EFBFBD>w.<2E>M<EFBFBD>Ă0<C482><30><EFBFBD><EFBFBD>2+*;<3B>%
E<EFBFBD>{2<>1)<1B><><17>FU<46>iL:9<1C>g !<21>&<14>|<7C><><EFBFBD>g<EFBFBD>x&<26><1A>b<00>+T<><14><>>e<><65>(b<>1@<40>0RC<><43>?;<3B><>̧<EFBFBD>)<29>~Q.<2E><><EFBFBD><EFBFBD><EFBFBD>F<EFBFBD>hQQJ<51>2c<32>p<EFBFBD><70>x<1C>d|<15><1C><><17>"<22>0<><30><EFBFBD><EFBFBD>)=
<EFBFBD><19>'Qp<51><70><EFBFBD>j<14>qC)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>z<0E><><EFBFBD>nM<6E>g<06>\<0F><>J<EFBFBD>LaO<61>.<2E>ݼ <0E><><EFBFBD>&<26><><EFBFBD>Ҵ<EFBFBD><D2B4><10>NW:<3A><10>jq3<71>[D<><44><EFBFBD>V2͵X<CDB5><58><10><12>x&<17>Y<EFBFBD>G<EFBFBD><47>A<EFBFBD>W<EFBFBD><57>;=5<><35>/id<00>O<EFBFBD>i<EFBFBD> <14>
<EFBFBD>ʧ<1C><><EFBFBD>6<><36>
<19><>l<EFBFBD><6C>D洴<44>k<EFBFBD>
m۳~kcK<63>uOWg<57><67>=6<><36><EFBFBD><EFBFBD><11><1D><><EFBFBD>ƹN4<4E>uf<75><66><><D68C><EFBFBD>\<5C>R<00><><EFBFBD>׋<EFBFBD><D78B><00><13>Tx#l <0C>zr<7A><72>C f<>Y<EFBFBD><59>Ǎ4<C78D><34>i<EFBFBD><69>x <0C>b<EFBFBD><62><EFBFBD>1`<60>V<EFBFBD>%%c<><63><EFBFBD><EFBFBD>m@ ő<>x<EFBFBD>u 0q<71>ե<EFBFBD>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><17>%,qj<71><6A><EFBFBD><15><><10>g<EFBFBD><67><EFBFBD>.<2E>w<EFBFBD>n1<6E>@<1C><11><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_<EFBFBD>J<EFBFBD><4A>_~<7E><1E>#Y<>Fq7|_$<24><>%<25>21GYg<59>*G<18><> <09><EFBFBD>e<> G5<47>0ٔf<D994>%<25><> <0B>g<EFBFBD>@j<>87<><37><EFBFBD><EFBFBD><EFBFBD>.Y<><59><EFBFBD><EFBFBD>K<EFBFBD>cR<63>o<EFBFBD><6F>n<EFBFBD>%tC$nss?_<>b<EFBFBD><62>f<EFBFBD>^<5E>A<EFBFBD>ɖ<EFBFBD><C996>O!kI e8<65>r<EFBFBD>17-<2D>ڲ<EFBFBD><DAB2><12>m<EFBFBD><6D>tx<74><78>%<25>ے<EFBFBD> S<>//<2F>c
<EFBFBD><EFBFBD>>@<40><>D<EFBFBD><44>lFh<46><34><DBA8>'^<5E>򕌡j<F2958CA1> ><3E>1Jn<16>?<3F><1A><><EFBFBD><EFBFBD><EFBFBD><11><>D<EFBFBD>ٝ<EFBFBD>Z<EFBFBD><5A><13><> L<7F><4C>Z<18>^<5E><>0<><66><DAAC>͟<EFBFBD><CD9F><04>+Fn<46>4%<25><><1E>+c<><>(<28><>f<EFBFBD>` U<>2Fcgs[[<5B>Q<EFBFBD>[<5B>k<14> eko9G<39>O<EFBFBD><03>o<EFBFBD><6F><EFBFBD>tZ<74><5A>[b<><62>(i<><69>de%)nٖN<D996><4E>J<EFBFBD>?<3F><>;T<><54>1 9<><39><EFBFBD> <0B>TX<54>? <20>4<EFBFBD><11>7<EFBFBD>͝Mn<4D><<3C>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>G<EFBFBD><47>A<EFBFBD><41><EFBFBD>IT<49>/<2F><05><>B<EFBFBD>C<EFBFBD><43>W<EFBFBD><14>mKft3A`rFMD<>0<EFBFBD>}<7D><>8<>y<EFBFBD><79>6<EFBFBD> <0C>u<EFBFBD><75>w<EFBFBD>}<7D><>z\<5C>= )䂙<><E48299>פ<EFBFBD>Q<EFBFBD><51><EFBFBD><EFBFBD>np<0E>زu<D8B2><75><EFBFBD><EFBFBD>m
O<>4o<34><6F>a r<04><><EFBFBD><EFBFBD>-<2D>G<EFBFBD><47>G<EFBFBD>5 <0B>1k훈<04>@$<24>M<EFBFBD><4D><EFBFBD>W<EFBFBD><57><EFBFBD>Tخ%<25>E<EFBFBD>m<EFBFBD>xߋA<DF8B>TR<54>[Wlq#<23><17>o<EFBFBD><1D><>?<3F>S~<7E>n<>R<EFBFBD>1s<31>NLŞV*$<24><>J<EFBFBD>̆<EFBFBD><15>V<EFBFBD>)~<7E><>
<EFBFBD>"5<>hp<68><70><EFBFBD><EFBFBD><EFBFBD>]<5D>d<EFBFBD><1E>Z<17><>U<EFBFBD>yX3<58>7<EFBFBD>a<EFBFBD><61>/XySHY <0C>~
<EFBFBD><EFBFBD><EFBFBD>B<13>Ck<1D>ǩc<14>f<EFBFBD><19><>q<EFBFBD><71>K<EFBFBD><4B><EFBFBD><EFBFBD>l<j6<08><><0E><><EFBFBD><EFBFBD>7n<37>h<EFBFBD><68><EFBFBD><EFBFBD>H<EFBFBD><48><EFBFBD>}<7D>><3E>1t<31>׍<>i#<23><><EFBFBD>e_5<5F><16>'*<2A>,<2C>%<25>%
<EFBFBD><EFBFBD><EFBFBD>6{<7B><>ο<15><>f4<66><34><11><>Xa<58><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ˒<>}(c<><63>R<EFBFBD><15><><EFBFBD>o<EFBFBD><6F><EFBFBD>
U<EFBFBD><EFBFBD>2q<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>ZM<EFBFBD>6˃@u<><75><EFBFBD> <09><>3<EFBFBD>;!<21>̘.<2E>Lj )E<><45><EFBFBD><EFBFBD><EFBFBD><07>?<3F>T~<7E><>fZ<66><5A><EFBFBD>S<EFBFBD>1<EFBFBD><31>2o<16><>FZ?_\<5C><>ƲN77<37>g6<67><7F>~<7E>h<EFBFBD><68><EFBFBD><07><>t<EFBFBD><1D>"<1D><>~<11><05><>|\<5C>H<7F>`<60>x<>[<5B><08><>)<29>V<EFBFBD><56><EFBFBD><EFBFBD><EFBFBD><12>9<>5<EFBFBD>-ɘt$<24><><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>"<22>(<28>%<<3C><>02H
Z<EFBFBD><EFBFBD><EFBFBD>b<EFBFBD><EFBFBD>Y<>ʒ[<5B><><EFBFBD><EFBFBD><EFBFBD>#g<>#<23><><EFBFBD><EFBFBD><11><>B9QPvN<76>,<2C>fH3<48>VҬ¤<D2AC><C2A4><EFBFBD>`GU
j<EFBFBD><<3C><52>rK<72><4B><EFBFBD><EFBFBD><05>H&<26>SË$:ڰ<><DAB0><11>r<EFBFBD>b<EFBFBD><62>/s<><73>T<EFBFBD>Ti<54><69>Z<EFBFBD><5A>Ӆ,;<3B>?<3F>L<EFBFBD>m<06>t<EFBFBD>*UH<55>M<EFBFBD><4D>n<EFBFBD> <20>l7<6C><37><EFBFBD> <0B>E€R*<2A><><EFBFBD><1C>@<40><><EFBFBD>S<EFBFBD>S<EFBFBD>'<27><>j<EFBFBD><6A><EFBFBD>e>,V<>o<EFBFBD><6F>Z6<19>Csn<73><6E><EFBFBD>^<5E>T+,<04>|&Z<>
z>7IuR<75><52>fO<><4F>pYZ<59>`<60>3<EFBFBD>J<EFBFBD><4A>><03><>-Ay<41>$<24><><EFBFBD>J<EFBFBD>=<3D>f<EFBFBD>ޢ<EFBFBD><43><CF91>T&<26>(<28><>(<28><><EFBFBD>UH<55><48><EFBFBD>>c/Ъ<12><><EFBFBD><17>E<EFBFBD><45><EFBFBD>Z:W<><57>F%GDĢ[:OD<><44><EFBFBD><EFBFBD>u,u<><75><EFBFBD>3ݼ)<29><><EFBFBD>+<2B>ٷ<EFBFBD>q<EFBFBD>/<2F>,,<2C>/<2F><>ŋҋ<C58B> S<>9}<02>%<25>S<EFBFBD><53>´$<24>H<EFBFBD>h<1E>u(<06>~X<><58>+<2B><06><>ո;i#<23>iS<><0F><07><><EFBFBD><EFBFBD>Z, 3<><33><EFBFBD>j<EFBFBD>ff0_<30>0<EFBFBD>A<10>1s9E<39><17><18><>|<7C><>/k}bQ<62><51>q<EFBFBD><71><EFBFBD>0<EFBFBD><30>A<18>}<7D>U$<24><>Ĭu<C4AC><75>E<EFBFBD><45><EFBFBD><EFBFBD><EFBFBD>D](1<>L<><4C><EFBFBD><EFBFBD><1B><>
%<25>:6<><36>#<0E>x<EFBFBD><78><19>KQL<51><4C>D,<2C><>"<22><><EFBFBD>Q<EFBFBD>L1<4C><31>̷QK<51>zRF<52>1<>z7d+Xj<58><6A><EFBFBD>9k<>k<> -f<>k<EFBFBD>Hf<48>cUW<55>S<EFBFBD><53>k<EFBFBD><6B>0L<30>o<EFBFBD>{<7B><19>dԺw<D4BA><77>•<EFBFBD> 39<>l.><3E><06>K<EFBFBD><4B>l<EFBFBD>[Om<<3C><19> <20>,<2C><>9R<39><52>%<25><><EFBFBD><0E>ʈ<EFBFBD><CA88><EFBFBD><1C><>Qe<51><65><EFBFBD><EFBFBD>p(G<>˫sTH~<7E>f<EFBFBD><66>y<EFBFBD>V3<56><06>|<7C>5<><35>kr<6B>v<EFBFBD>ZjCKj
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PyG<EFBFBD><EFBFBD>QW<51>.<2E><><EFBFBD>FhGx׮<78>!<21>m?B<><42><11> <09>m<EFBFBD>N{<7B>ޙ<EFBFBD>Xy<58>2
<EFBFBD><EFBFBD>b5-V<>V<>X<EFBFBD>/V<><56>,<2C><>]5LG<><47>p<EFBFBD>>Bׇ<03><><1C>2D<32>
ѡ<11>L8<4C>x<>C<EFBFBD>ه<EFBFBD>LA<4C><41><EFBFBD><10><>t<EFBFBD><74>y<1D><><EFBFBD>L<EFBFBD><4C>tP<74><50><EFBFBD>C<EFBFBD>%<25>\<5C><06>@<<3C>,<2C><1F><>c<EFBFBD><63> 4<19>y<EFBFBD>+<2B><><EFBFBD>S9<53>^<5E>1x<31><1E>?o<>׉<EFBFBD><D789>
9zq<EFBFBD><00><04>,<2C>J<EFBFBD><4A>b<EFBFBD><62><1C>X <20><07>OL$<24>@<40><><EFBFBD>ze<7A>ؖ<07><><EFBFBD><00><>vR<><08><1E><>> <20>
<EFBFBD><EFBFBD>*9z<39>UZ<><5A><EFBFBD><EFBFBD>@<40>v<EFBFBD>%<25>\&<26>G<EFBFBD><47>z3<7A>u<EFBFBD>)<29><><10>.Go<47><6F>m<EFBFBD><6D><14><><EFBFBD>_<0E><> <20><><EFBFBD><EFBFBD>O{<7B><>ݠñ\<5C>T<EFBFBD>P<EFBFBD><50>w<EFBFBD><EFBFBD><7F>T<EFBFBD> I+SԠb<D4A0>U<EFBFBD><55><04>W <09><><EFBFBD>񣰓V<F1A3B093><56><EFBFBD>Ȕ|<7C><01>F<>Y<EFBFBD>/<2F><><EFBFBD>ۇY<DB87><18><1B><><10><>gs<<3C>0{r<{<7B><><EFBFBD>Vdk<0F><><EFBFBD><EFBFBD><EFBFBD>r<EFBFBD><0E>%<25>yx^<5E><><EFBFBD>>x<><05>)<29>W<EFBFBD>U*B<1A>~q<><71><EFBFBD><EFBFBD><EFBFBD>^{8 <20>\\z<><7A><EFBFBD>s<>X<EFBFBD>;D<>^8`C<>Q<1E>z8<7A>4yXj<58>F<EFBFBD><46><EFBFBD><EFBFBD>l<EFBFBD><17><14>v<EFBFBD>e<EFBFBD><65>
0<EFBFBD><EFBFBD>$}<7D>W<EFBFBD>=<3D>z<EFBFBD><7A>=j<><6A><11>p<>v<0F>s<1B>:F<>"<22> <20>8^'䧀<>7
s<EFBFBD><14>3<EFBFBD><07><><EFBFBD> <0C><><EFBFBD>o<19><>aC<06><>u<14><><EFBFBD>pd,<2C><14>T<EFBFBD>/uC|Q<><51>C<EFBFBD>'G8׎<><D78E><EFBFBD>G<><47><EFBFBD>0<EFBFBD>m<1F><04><03><>9
K <0C><>=C|<7C>_nG<6E><47> <20><19>C<>Q<EFBFBD><51>;<0E>u<EFBFBD>><3E><05><1E>x<EFBFBD>o/<2F><><10>=<3D>무t.l<><6C> {*d<>i<><69>i<EFBFBD><69>M<EFBFBD><04><33><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<0F>g<EFBFBD>A<EFBFBD><17><><EFBFBD><EFBFBD>s|<7C><08>
?<3F>/Wr<57><72>J<<3C>?sa<73>4<>K<EFBFBD><4B><EFBFBD>p.q:<3A><><EFBFBD>r<EFBFBD><72>,<2C><1C>!<10>j<EFBFBD><<3C>zA<> <20>+<0F><15>5AW<41><57>x]<5D>R@:<3A><><18>%"C<10>N5<>a><0E>j.<2E>#$<24>T <0B><16>z]5<>=^L(<28><><1C>y<EFBFBD><79><EFBFBD><EFBFBD>S<EFBFBD><17>z<EFBFBD><7A>P<EFBFBD>wr<77><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"N.̇<>)<29>F<EFBFBD><46><EFBFBD>G<EFBFBD><47><1D><><EFBFBD><EFBFBD>Ҁ<EFBFBD>'M<><4D>GfJ<66><4A><EFBFBD>a<EFBFBD>[<5B><><EFBFBD>?<16><>?-<2D><><EFBFBD>(wpa<><61>
~-<2D><><EFBFBD>j+<1C><><EFBFBD>ԕ_<D495><5F><EFBFBD><EFBFBD><0E>0<EFBFBD>o<EFBFBD><6F><EFBFBD>z<EFBFBD><1C>&<26>0<1D><><EFBFBD>'i>"4<><34><EFBFBD>Y<EFBFBD><59><EFBFBD>a<EFBFBD>I<><49>;y6RT<07>{<7B><>M<EFBFBD><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>d<EFBFBD><64>@ <0B> <18><><EFBFBD>=<3D>q<EFBFBD><12><>#<23> <09><>յ<>U<>#Ҵp<D2B4><70>4<EFBFBD>6'<27><>ۏ<EFBFBD><DB8F><EFBFBD>G<EFBFBD>#<23>ֶ<EFBFBD>}<7D><1C>^{<7B><><EFBFBD>H<15>]!@T<>9<EFBFBD><39>Gh^<5E>V<EFBFBD>9,<2C><>I<EFBFBD>!i<><69><EFBFBD>'<27>z '-<2D>nY8d<38>Hguz<75><7A><EFBFBD><EFBFBD>+2V<32>t2~<7E>ٞ<EFBFBD><1A>z3<7A>7<EFBFBD>jּdXZ/T6<54>y<EFBFBD>8Z<38>1<EFBFBD><31><EFBFBD>L㼞<4C>B<1E>CX<43>U<EFBFBD><55>%<25><><EFBFBD><46><1E><><EFBFBD>J<EFBFBD>i<><18>(<28>k
<EFBFBD>M<02>#m[2$m?:<3A><>Zp.p<A<><41><EFBFBD>u<19><1D>
t <0C><15>t1ͥ<31><EFBFBD><E497BA>ڏ<EFBFBD><DA8F>IQ<49><51><EFBFBD><EFBFBD><EFBFBD>|<7C><><EFBFBD>x:+<2B>s<EFBFBD><07><>K<EFBFBD>K<EFBFBD><4B>
g<EFBFBD>|<7C>q<EFBFBD>3<EFBFBD><33>m<EFBFBD>><C<><43><EFBFBD>s<EFBFBD><73>"<22><><EFBFBD><EFBFBD>3<EFBFBD>W;<0F>Mxt<>d<EFBFBD><64><EFBFBD>M<<3C>&<26><>|n<>;<3B>g<EFBFBD><67>k>/<2F><>O<>1=<3D><><EFBFBD>6<EFBFBD><36><EFBFBD>*<2A>h <0B>h<07>IG<49>#'
<EFBFBD><EFBFBD>
=<3D><><EFBFBD>u<EFBFBD>$<24>PN<50>+<2B>{h<1A>K<EFBFBD><4B>9<EFBFBD>A/<2F>LVi<16>S<EFBFBD><53>5<EFBFBD>HS<>t<EFBFBD>*<2A><>i<EFBFBD>m<1E>b<EFBFBD><62><1C>"<22>ڪ<EFBFBD>T<EFBFBD>r<EFBFBD>kk<6B><6B>l[h<><68><EFBFBD><EFBFBD>ےt<DB92><74><EFBFBD><EFBFBD>]Gg<47>~@U<>wh<77><68>F <0B>2-<2D>Ϡ<0F><>i<EFBFBD><69>O~{-U<>Ϧ%<25>Tco<63>Z<EFBFBD><5A><14><>:{<7B><><EFBFBD><07>L<EFBFBD>i<>}<7D><><EFBFBD><EFBFBD><EFA5B3><EFBFBD><EFBFBD>w<EFBFBD><1C>{<7B>#<23>
<EFBFBD>BZ<EFBFBD><08>t<><74>j<EFBFBD>f:ב<><06>>Z<><18><><1C><><EFBFBD><EFBFBD>{<7B><>YAM<41><15>켍Z<ECBC8D><5A>S<EFBFBD><53>eZ'<27><><EFBFBD><EFBFBD>
<EFBFBD>A~<7E><><EFBFBD>Wi<57><69>6t<36><74><1D><><EFBFBD><EFBFBD>PK5<><35><EFBFBD><00>)PK!" org/gradle/wrapper/Install$1.classUT<00>W |[e<15>I<7F>{{<7B><>ҽ<EFBFBD>n<EFBFBD><6E>m<EFBFBD>=X<><58><18><>I<EFBFBD><49><EFBFBD>n<EFBFBD><6E>a<EFBFBD>Mnӻ%<25>%<25>f<EFBFBD>@<11>m<EFBFBD>K<EFBFBD><4B><EFBFBD><EFBFBD>]Z(c<d<>Pp
(<28><0E>!
<EFBFBD><EFBFBD><EFBFBD>"2<><32><EFBFBD><EFBFBD>i<EFBFBD><69><EFBFBD><EFBFBD>K<EFBFBD>=<3D><EFBFBD><E3BCBE><EFBFBD><EFBFBD><EFBFBD>~<7E><><EFBFBD><16>U<02>/<2F>l͒K<CD92><4B><EFBFBD><EFBFBD>&#<1E>T<><54><EFBFBD><EFBFBD>CV<43>׌<EFBFBD>i<EFBFBD><69>1+l<>xˆ<1A>m<EFBFBD>d<EFBFBD>n<EFBFBD>C=Fh<46><68><EFBFBD><EFBFBD>Ձn=j<1B>սL<7F><4C><EFBFBD>,<2C><>ZzB<7A>k<11>M,<2C><><EFBFBD>NF<4E>4`<60><><EFBFBD><05>$1㆑0<E38691><1A>l$l<>E<EFBFBD>K5,<2C><>՗<EFBFBD>Z<><5A>L<EFBFBD><4C>Uf<55><10>f%"<22><><EFBFBD><1E><1A>} <09><><EFBFBD>H4<48><34>mG<6D>F<EFBFBD>,PP 0q<30><71>Yo<59><6F><EFBFBD>H<EFBFBD><48>]<1B><><EFBFBD><EFBFBD>#0]<5D>&3<><18><>d"aĝ<61>fڦwE
*mܬG<DCAC>D<EFBFBD><44>=<3D><>Mk<1B>*<2A><>V#<23>' <14>i;+̈́@Y<>K<EFBFBD>]I<>ԺD<D4BA>Ц<EFBFBD><D0A6>4<EFBFBD>[<5B>B<EFBFBD>Jxi<>6#Ʉ<><C984><EFBFBD><EFBFBD><EFBFBD><<3C>t<EFBFBD>is<69>R<EFBFBD><52>qzL{<7B>|r>ߦ<><DFA6><EFBFBD>n<EFBFBD>7<><37><02><><EFBFBD>v<EFBFBD><76><EFBFBD>M<>1<EFBFBD>8<EFBFBD>\/JPZ<50>B<EFBFBD>{<7B><><EFBFBD><EFBFBD>&{<7B>M<4D><7F><18><><EFBFBD><09><>_<EFBFBD><05>5<EFBFBD><35> 35(<28>(<28><>S<EFBFBD>&<26><>k{<7B><>7<EFBFBD> s<04>E g<><67><07>><3E><>ٍYO<59>8<0E>k<EFBFBD><6B><1A><>#"<22>ιӒf4l$<14>j<EFBFBD>c<EFBFBD>
<EFBFBD>k<EFBFBD>c<EFBFBD>X <0B><>I<EFBFBD>
,<2C><>"<22>1<EFBFBD><31><05>5<EFBFBD>/<|oF<15>X<EFBFBD><58><EFBFBD>m9<>`mR<6D>X@u<><75>*/NduX"0;<3B> <09><>"C`<60>8/M<>2<EFBFBD>e%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Xγ<58><CEB3><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>X<EFBFBD>:M`9<><39>˶<EFBFBD>I<EFBFBD>X<EFBFBD>;=^<5E>L{w<>@<40>SB<53>'<27>BꡐaSFΧ<46><CEA7><EFBFBD>5<><35><EFBFBD>G<><'C<>h(v-<2D><><EFBFBD>3p<33><70><EFBFBD>ǸI<C7B8>Ydmz<6D>V<>p6'dV<><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD>c<EFBFBD><14><><EFBFBD> <09><><EFBFBD><EFBFBD>^MV:d<><64><EFBFBD>Ȃ<EFBFBD>XW<58>v<EFBFBD>Kw<4B>[7<>Ʉq<16>A<EFBFBD>Pʔ<50>K<EFBFBD><4B>dm<64>R<><11>`%]/D <11><><1D>Щ<EFBFBD>\H<>&<76><C88B>1<EFBFBD>(y<><18><><EFBFBD>m<EFBFBD><6D>QI+<07><03>|<7C>"<22><><EFBFBD><EFBFBD>2+0ɘ\Tk<54><6B>.njOƼ<4F><C6BC>m<04>R<EFBFBD><52>bP6<50>P<EFBFBD><50>̼隅<18>"<0E><0F><><EFBFBD>0<EFBFBD><30>lۋD<DB8B> 2<>|<04><><EFBFBD>h<EFBFBD>Ҙ<EFBFBD><D298>
<EFBFBD>EF<45><46><EFBFBD><EFBFBD>J;(<28>Y<0F>J#<07><>E<EFBFBD>fP<66>Ei<45>ՓĒ<D593>y<EFBFBD><79>b<EFBFBD>%<25>4<EFBFBD>4{RʊDB<44><42>|F<><46>n=s<10>[<5B>9|<7C><>]A90<39>W<>y<EFBFBD><79>Aa<41>(<28>*FYے';<3B>—<EFBFBD><C297>E\M><3E><>J
<EFBFBD><EFBFBD>m<EFBFBD>Nj<>`y1<79><31>u<04>q9<71>U<EFBFBD><55>(<28>Q+1H<31><48>|w<>UN<55><4E>qS<05><><EFBFBD><EFBFBD>JNJ<><4A>p*<2A>T|<7C>a<EFBFBD><61>ag<61><67><14>L<EFBFBD>!<21>^<5E><>˿<EFBFBD>[)<29><EFBFBD><E98494>dL
p<EFBFBD>n<EFBFBD>|<7C><>&<26><><EFBFBD>'/<2F><><EFBFBD>`#<23>ʢz&S|<7C>PݱV<DDB1>7<EFBFBD><37>dA<64>{<7B>Kw<4B><77>Q<><11><>+<2B><>x<EFBFBD><78><EFBFBD>͙D`q<><71>s,<2C><><03><><EFBFBD><EFBFBD>es2~<7E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>H<EFBFBD>|<7C>1<EFBFBD>x<1F><>?N<17>4~<7E><4C><DB99>[<5B>C<>$ B<><42><11>G<EFBFBD>ٛ<>Ńf)<0F><>Y<EFBFBD><59>%<25><><EFBFBD><EFBFBD>^c<>^=L甝k<E7949D><6B>&3p<33><70>~$[<5B>2<06>,Q<>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>'<1E><02><>֮<EFBFBD>/Q<>@<40><><EFBFBD>G,EOkx{<19>mK<6D><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>]<11>n<><6E>ϋ<EFBFBD>8d<38><64>sR<1B>Z6<5A><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%<25><>l%<25><EFBFBD>Tu3<75><54>"С<>}<7D><>>O<>fC<><43>(<28><>m<EFBFBD>K<10>ͨGcc<63>^<5E><>k<EFBFBD>fL9<4C>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>hP<68>*9G.<2E>V<@F<><46><EFBFBD><19>smO<6D><4F>K<EFBFBD><4B><EFBFBD><7F>d8<64><38><EFBFBD><EFBFBD><1C><03>#<23>l<EFBFBD>
q<EFBFBD>@T<><54>J:gV<67>"<22><02><EFBFBD> <20><><EFBFBD><EFBFBD>ըw<D5A8>.<2E>O<EFBFBD>ؤ<EFBFBD><D8A4><02>u퇪U<ED87AA><1C>|/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28>*<2A>'<19>X<EFBFBD>VU z<03><18>+#<23>A<1F>_<1A>ǿɽ>3<1E><>l<15><>HQC<51><43>f<EFBFBD><66>zj<7A>o<EFBFBD>=z<>ݸ(i<>Ci<10>/><3E><>)j]f<s檠<73><E6AAA0><EFBFBD><EFBFBD>](nI<6E>=<3D>psJ<73>лC<15><>['.^<5E>
<EFBFBD><1C>r<EFBFBD>ǭ<EFBFBD>I<EFBFBD><49>k+<2B>d<EFBFBD>#4<06><>G<EFBFBD>m<EFBFBD><6D>D<EFBFBD>G2<47><32>H8\r]<5D>(?<3F>+&<26><><EFBFBD><EFBFBD><EFBFBD>n<EFBFBD>aӊ(<28><><E8A6B3><03>h-^Q.*41IL<49>jB<6A><42>\3<><33>9<EFBFBD>l<EFBFBD><6C><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>MSG2<1A><1D><><EFBFBD><EFBFBD><EFBFBD><19><><EFBFBD><6B><CF8D><EFBFBD><<3C>rV`Y<>4ZĜ-<2D>4W<34><57>$[<5B>aKF<4B> <09>7]kEO<00>y]<5D><><EFBFBD>v<EFBFBD><76>Q<EFBFBD>5O<35>j<EFBFBD>F<EFBFBD>Q<19><0E><><EFBFBD>d<EFBFBD><64>~m <20><00>p<EFBFBD><70>-F(<28><>
<EFBFBD><EFBFBD>+3m~-<2D> t<><74>|VK<56><1D><><EFBFBD>X(<28> A<>v<EFBFBD><76>5ɸcƌӷ<C68C><D3B7>^<5E><>Śh<C59A><68>7=<3D>F<>*<2A>XUu<55>4<EFBFBD>@<40>VT<56>6<EFBFBD>SE<53>93\E<>B<EFBFBD>5<EFBFBD>"<22><>!F<13><><EFBFBD>ѱl<14>L,<2C><> [<5B>Ι8<CE99>`kdGK6>F8g
u<EFBFBD><05><><EFBFBD><EFBFBD>f<EFBFBD><66>-<19>2k9B<39>K<EFBFBD><4B><EFBFBD>QdQ8<51><38><EFBFBD>cQo<51><6F>[LRz<52>IJ/7.Z_<5A>I<EFBFBD><49>^I\-<2D><><10>Qܰ<>W<EFBFBD>u;1<>~'*<2A>;1<>W<EFBFBD>31<>><3E>_ <09>1;<3B><>p<07>$<24><><EFBFBD>j<EFBFBD>17<31>Z;<3B>))<29>F]<5D><>s<10><><EFBFBD><EFBFBD><EFBFBD> <09>M<EFBFBD>/<2F><><EFBFBD>X6<58><36><4E>u)4oC<03><><EFBFBD>_e0<65>UCh
<EFBFBD>5<EFBFBD>s<EFBFBD>m{<7B><>w<EFBFBD><77><EFBFBD>$d}
z
<EFBFBD><EFBFBD>`p<03><>S<>0-P@<40><02><03> x<>S<EFBFBD><53>@,<2C><><EFBFBD>TOS<4F>_JW<4A><57>m<EFBFBD><6D><EFBFBD><EFBFBD><EFBFBD>.<2E><15><>lG<6C>.<0E><>ha<68><61>`@}<7D>t<0E><>`@<1B>gn*v7y˽<79><CBBD>w`<60>O-<2D>. <06>I<EFBFBD><49>}<7D><><EFBFBD><EFBFBD><EFBFBD>q<EFBFBD>W<EFBFBD>T<><54><00>,<2C><><EFBFBD>^`<16><><EFBFBD><1E><>4<><34><10><>Y<EFBFBD>m;<3B><>t,R<>mwv<77>|<7C><><EFBFBD> <0C>?<3F>{<7B>>e<08><>a<03>F?^<5E>(/<2F>܎<EFBFBD><>[/W<03><14>p<EFBFBD>S<18><>><3E><><EFBFBD>+<2B>K<><>3G<33>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>΁2<><32><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>0' <07><><EFBFBD><EFBFBD>A<3<>gS<67>PSxާ<06>~<7E>q<EFBFBD><71>|<<3C><>><3E><>H<EFBFBD>,}<7D><<1A>+)<29>/<2F><>!<21><><EFBFBD>jg<6A><67><EFBFBD><EFBFBD>7M<><4D><52><17>. 6<15>"<02><><EFBFBD><EFBFBD>;<3B>)@<40>iR<69>=9<> 4<>
<EFBFBD><EFBFBD>K<EFBFBD><<3C><>܏<DC8F><7F>a<EFBFBD>G)<0E><>/H<> <0B>e<EFBFBD>E~<7E><>aQ<10><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD>.<13><><EFBFBD>2<EFBFBD><32>6yR<79><52><EFBFBD><EFBFBD><EFBFBD>>(ƧD)eMJL<4A><06><><EFBFBD><EFBFBD>Q(><1A>V<EFBFBD>T'<27><><19>Bq<16>]<5D>b&Es<1A><>L<EFBFBD>
<EFBFBD><05><>En<45><6E>N<EFBFBD>.J<><4A>t<EFBFBD><74><EFBFBD><EFBFBD>c"<22>*Y<>q<EFBFBD>Q<EFBFBD><12>)<29>HA N<>3<EFBFBD><33><EFBFBD>,_A6J<36><4A>eb<65><62>Ĩ<EFBFBD><C4A8>K<EFBFBD>:<3A><> 9<><39><EFBFBD>h
<EFBFBD>e'<27><><EFBFBD><EFBFBD>і<EFBFBD><D196>r<EFBFBD><72>2qR<71>li <0B><>p<EFBFBD>8O<38>L<EFBFBD><4C>ݒ<EFBFBD>C<EFBFBD>/<2F>< <20>c<EFBFBD><63>1݋g%}<19>%}
$}<7D><><07>R<>%J5V<35>t<1C>/<2F><>b<EFBFBD><62><EFBFBD>b<EFBFBD><62>'<27>5<EFBFBD><35>D<EFBFBD>xU<78>".WIz<49><7A>V<EFBFBD><56><EFBFBD>IoC<>>$<24>I<EFBFBD>O</<00>E<EFBFBD><45><0F><><EFBFBD><EFBFBD><EFBFBD>q<EFBFBD><71>'VHZ$<24>];\<5C>J<EFBFBD>)<29><><S<><53>]<03>g<EFBFBD><67><EFBFBD><EFBFBD>A<EFBFBD>3e~<7E><><11>3e<33>1<EFBFBD><13>g<EFBFBD><67>S<EFBFBD>W$ϔ<><CF94><EFBFBD>7$ϔ<><CF94>]<5D>J<EFBFBD>)<29><>><3E><S<>?tJ<>)<29><>w<05>O<>y:<3A><>FT<12>
<EFBFBD>I<00><37><D6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<02><1B><>.Տ<><D58F>(&<26><><EFBFBD>Ɖƻ<>c<EFBFBD>k-&<26>.@<40>+<2B>RWe<>K1ɽ<06><> P<>a<><61><53>s[R<>[<02><>PK7<>
<EFBFBD> <00>PK!- org/gradle/wrapper/Install$InstallCheck.classUTe<><65>J1<14><>X<EFBFBD>Z<EFBFBD>j<EFBFBD><6D>V;^<16><>AAAp<41>ΜN<CE9C><4E> ɴ.Dķp!<21> <1F><><12>TED<0E><><EFBFBD>;B<7F><42><EFBFBD><EFBFBD>`s<02><0F><>;<3B>%<25>JBw<42>
<EFBFBD>n<EFBFBD>
<EFBFBD>8SZ<EFBFBD>*M<>8
<EFBFBD>uC<EFBFBD><EFBFBD>%<25><>H<EFBFBD>
nl7<EFBFBD><EFBFBD>N[jK
7<EFBFBD><EFBFBD>Xf<EFBFBD>*<<3C><><EFBFBD><15>6<EFBFBD><35>vWklGz<47><05>D*!2*<2A>X푱|<16>͵͵<CDB5><1F><10>\<5C>]С<>$<24><><EFBFBD>ȏ<EFBFBD> 5<><35>Ff<19>8<EFBFBD><38><EFBFBD>z<EFBFBD>;+cP`<60>Z<EFBFBD><5A><EFBFBD>e<12>g<EFBFBD>k
<EFBFBD>2<EFBFBD><EFBFBD><EFBFBD>k<EFBFBD>(<28>ٯz<D9AF>gT<67><17><>,<2C><><EFBFBD>]C<>d<EFBFBD><64><EFBFBD><EFBFBD>:<3A>u<EFBFBD>ȋ<EFBFBD>25<32><35><12><> ,,<2C>5<EFBFBD><0F>/J<><4A>K<0E><15>1<EFBFBD>`<04><>B<>AcE5-0x<30><78><EFBFBD>un<75><6E>3<03>W<><57><EFBFBD>,8<1C><>:<3A><><J<1C><><EFBFBD><EFBFBD><EFBFBD> &W<>1<EFBFBD>x<EFBFBD><78><13>GK}<7D><>'PK<08><04>Jj<00>PK! org/gradle/wrapper/Install.classUT<00>X x<1B>u~C<04><><0E><>d<EFBFBD>הh<D794>8H)A<>^<5E>)BGD<1D>%[^ r%`<60><>]H<>]+i+<2B>J<EFBFBD>4<EFBFBD><34>DJc<4A>nk<6E><6B><EFBFBD>F<EFBFBD><04>Q"<22><>ݺiҴi<D2B4>3mc7m<37>+M<><4D>Q<EFBFBD>7H<><04>է<0F>3<EFBFBD>f<EFBFBD><66>{<7B><><EFBFBD><1B><><EFBFBD>O<EFBFBD>$<24><>"'<27><> <0B>w=<3D>:<3A><><EFBFBD><EFBFBD>f<EFBFBD>5њζ<D19A>Z<EFBFBD>V~<7E><>i<EFBFBD>a<EFBFBD><61><EFBFBD>1n<31>9]stL<74>iN<=<3D><><EFBFBD>8<EFBFBD><38>Ӛ<EFBFBD>j9G<39><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x<EFBFBD><78>=<3D><><EFBFBD><EFBFBD>fFv@<40><>UY<55>-<2D>r<70>61G
S<EFBFBD>m<EFBFBD><1C><>Y<EFBFBD>vp<16>wu<77><75><EFBFBD><15><>g[<5B>
<EFBFBD><10> [;<3B>?h<>tA<74>,{<7B>s<EFBFBD><73>29<32>󜭍<EFBFBD><F39CAD8D>v<EFBFBD><76>Z.<2E>'<27><>U<EFBFBD><55><EFBFBD>ZgN3G;<0F><><EFBFBD>Ӯ<EFBFBD><D3AE><05><><EFBFBD>Q<EFBFBD><16>>Yc}RN<52><14>X<EFBFBD>̜<EFBFBD>em<>%<25>_<EFBFBD><5F><EFBFBD>:<3A>|:Wp<57><70>R<EFBFBD><52>tZw<5A><77><EFBFBD><EFBFBD><EFBFBD>S<EFBFBD>^l<><6C>n<EFBFBD>Z<EFBFBD>3 <0B>Μ<EFBFBD>><3E> w,<2C><1C><><EFBFBD>g<EFBFBD><67><EFBFBD>WУ<57><D0A3><EFBFBD>{[
kM<1E>ܱ<1E><><EFBFBD>#9,o?&<26>n?<16><15>J!?5
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD> iy<03>hM<68><02><>_wI<>e<EFBFBD><65><0E><><EFBFBD><EFBFBD>[<5B>n4Z<34>e<EFBFBD><65>IJgV'V<>I<EFBFBD><0E><><EFBFBD>=<3D><>Y<EFBFBD><59><EFBFBD><EFBFBD>1Lٷ<4C><D9B7>ۗ<EFBFBD>GPs<50><73>j/9<>'Hw<48>]lUP<55><50>X?<3F><>!<21>y<EFBFBD>qi<>G<EFBFBD><47><EFBFBD><EFBFBD><14>D<EFBFBD>j<><6A><05><>u<EFBFBD>Y<EFBFBD><1C> ;~
j<><6A><EFBFBD><EFBFBD>D<12>5UN<55><4E><<3C>#U<><55>b<10>a<EFBFBD><0F> <09><><EFBFBD><13><><1D><0E><><EFBFBD>`<60><>]zl[<5B><><EFBFBD>i<EFBFBD>B;<3B>}<7D> <0C>߰<EFBFBD><DFB0>eOigI<67>.h<>e<00>prap<61><70><EFBFBD><EFBFBD>ݼ>!h<>|<1D>t<EFBFBD> <20><> <0C>E<EFBFBD><45><EFBFBD>ږ<EFBFBD><DA96><EFBFBD><EFBFBD><1F>&W3<10><><EFBFBD>_Z<5F><5A><EFBFBD>lQ3<51><EFBFBD>i<EFBFBD>t5<74>T5sb%<25> <0C><>PΏ<><CE8F>gT<67>R<EFBFBD><52><EFBFBD>Q<EFBFBD><51>Z<EFBFBD><5A>M<EFBFBD><4D>f<EFBFBD>&:<02>3/<2F>K<EFBFBD><4B>S\<5C><><EFBFBD><06><>/ĉ7\,<15>zP<7A>~zHЖ<48>A~<14>)<29><><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><34>>J
<EFBFBD>:<3A><13><04>`<60><0E>A6<41>!D<><44><EFBFBD>+[́q,5<><EFBFBD><7F>a <09><><EFBFBD><07>[$HG<48>(<28><><04>3F<02><0E> <09>m<EFBFBD>a<EFBFBD>^<5E>r<EFBFBD><72>6<EFBFBD><1F>
<EFBFBD><EFBFBD>
<EFBFBD>O':ɘk<C998>oS<>35<33>L05p<35><18>tJо<4A>F<1F><>|<7C>Y,<2C>5Vᾚ<56>5HFv<46>B}<7D><>$hg
<EFBFBD><EFBFBD><EFBFBD><01><>{<7B><>wv\/E=]<5D>
w<EFBFBD>s?<3F> <0B><>o<EFBFBD><6F>$<24><<3C>[<5B><>LC|[<5B>3<EFBFBD>~<7E><>Lc<4C>i<EFBFBD><69><EFBFBD><E88CA0><EFBFBD>
<EFBFBD><EFBFBD>[<5B>Z<EFBFBD>Oyf<79><66>ʗ<EFBFBD>f)d<>x<EFBFBD>07o<12>_`_<>D/Cѥ<43>B<0E>E4<15>3<EFBFBD> <0B><><EFBFBD><1C><><EFBFBD><EFBFBD>k<><04><>9<EFBFBD>у<EFBFBD>]<5D>z
<EFBFBD><19>/6K<><06>]<5D>n<EFBFBD><6E><EFBFBD><EFBFBD>U7<55>-<18> g<><67>U<EFBFBD>"<03>qNb<10>Ef<45><66><EFBFBD>\<5C>a<EFBFBD>|i<>"<22><><06><0F>*<2A><><EFBFBD>C<EFBFBD><43>Q7<51>cA<63>a:<3A>1<EFBFBD>#b<><62><EFBFBD>߆p<DF86><70><EFBFBD>eE<65><45>{<7B><>X<EFBFBD><58> <09>/<2F><>%V~<7E>W><3E>4<EFBFBD>Z]W<>k<EFBFBD><6B><EFBFBD><EFBFBD>!<21><>0g<30>wP<05>23l?}<7D>
<EFBFBD>ʅM?Z"<22>g<05>vzF+Wpu<70><75>Az<41>w<EFBFBD>D?)<29><>1<EFBFBD><31><EFBFBD>,<2C>T+[+Ԭ$d<>n3<6E><33>*<2A><>2ymB<1D><><EFBFBD><EFBFBD><EA88AE><EFBFBD><EFBFBD><11><><EFBFBD>s<EFBFBD>;<3B><>f<EFBFBD>Yfְ<66>;<3B><><EFBFBD><EFBFBD><EFBFBD><><D58B>4<04>p!<21>E<1D>-,t'TD<54><04>U"<22>x<EFBFBD>,:<3A><> +<2B><><06>p<10>63A<><41><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>a
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>լm<EFBFBD><11>]p<><70>Y<>u<EFBFBD><75><EFBFBD><EFBFBD>/s<><73>%<25>6<07><>}ԤU2Qix<69>&+%jBRK<52>ٓvᐪa<E190AA><q<>p Ws<>q'<27>Yf<59>&<26>r<EFBFBD>;W<>v2!<21><>F<EFBFBD>>;<3B>ޱ<EFBFBD><DEB1><13><><07>̖<>5€R ̣<>i\׭<16><><EFBFBD><EFBFBD>K<EFBFBD><4B><EFBFBD><EFBFBD> (<28>Pq<50>a<EFBFBD>p<EFBFBD>t<EFBFBD><74><EFBFBD>ZL<1F>u~<7E><><05>}^:<3A>T<EFBFBD>zeF |(j<10>#<08>,VZf+<2B><><EFBFBD>~<7E><>x<EFBFBD>~<7E>~^A1<41> PD<50>|<7C><00><>U33αԼJ +:1<>K<EFBFBD><4B>5<EFBFBD><35>3w<33>u<EFBFBD><75>,'(4<>X0 yݖޅS4<53><34>/<2F>ۯJ<DBAF>O7Qx<51><78>l} <20><>+<02><>\<5C>|<7C>n<EFBFBD>nL<6E><4C>[<5B>X³<><C2B3><EFBFBD>WX<57>W<EFBFBD>Wi=5'<27><><EFBFBD><EFBFBD><18>{<00>.H<>p<EFBFBD>~<7E>^<05>,Y@sh<1F>5~<7E>h<EFBFBD><68><EFBFBD> <09>7Qm:ZV><3E>%<25><EFBFBD><EF889A>o<EFBFBD>gz<>~<7E>OF<4F>W<EFBFBD>?<3F>w<><77><12>|tXqBo!<21><>x?Xp<58><70><EFBFBD><EFBFBD> <09><><EFBFBD>M<EFBFBD>g_<7F>/<2F>_Bs<42><73>(C<><14>"<22>!*G<>ggu<><75><EFBFBD>MW<4D><57><EFBFBD>,<2C><><EFBFBD>1<EFBFBD> <09><>O<EFBFBD>Z<07><><EFBFBD><00>sH<73>0<EFBFBD>_p<5F><70>s<EFBFBD>*<2A><><C5AB> Ef<45>\<5C>~<7E>~<7E><11>W<EFBFBD>"<22><><02><>+
)<29><06>o<EFBFBD><6F>^<5E><><00><> <20><10><07>u<EFBFBD>ǖ<EFBFBD><C796><EFBFBD>Œ5<1A>or<<3C><13>3r<33>ap<03>N<EFBFBD><4E><EFBFBD><EFBFBD>|<7C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>9m<39><6D><EFBFBD><EFBFBD>P <0C>)<29><> <20>'C<>?迪<><E8BFAA><EFBFBD><EFBFBD>@<40>ȣ<><C8A3>sWw<57>cK<05><><EFBFBD><EFBFBD>G<0F><>Z<EFBFBD><5A><0F>UM<55><4D>B^n_Pw<50>~<02>u<> <0B><><EFBFBD>1<EFBFBD>2. |_<07><1F><>m^<5E>~<7E><00>3^<5E>چ<EFBFBD>;<3B> <0B><><EFBFBD>
<EFBFBD>e"<22>E,_<>p<EFBFBD><70>̫<12>X '<27>U<EFBFBD><55>XyO<79>h<EFBFBD><68><EFBFBD>u<EFBFBD>p<EFBFBD><EFBFBD>$\-Z<14>,<2C><>_<EFBFBD><5F>;Q<>&<26>tf<74>B]<5D>~n;<3B><13>@x<<3C>j<EFBFBD><6A><EFBFBD>)<29><>A<EFBFBD><41>T3W<33>V<EFBFBD><56>f<EFBFBD>q<><71><EFBFBD>-<2D><>e<13>.<2E>Ptut<75>g;E+P<><50>Mp><3E><><EFBFBD>p@<40>UhѦ~<7E>[9<>{5*<2A>C<EFBFBD>Č͒<05><> <20>EDa<11>i<EFBFBD><69>9<EFBFBD>>sI<>*<2A><17>`P<>EGt<>D<EFBFBD><44>9<EFBFBD>g%<25>a.<16>6<EFBFBD><36><EFBFBD>؁=<3D>2Z<32>,;KS<4B><53><EFBFBD><EFBFBD>%c^<5E>b<EFBFBD><62>p<EFBFBD><<3C>Ž<EFBFBD><C5BD>O<>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>Z:q/<2F><>R<EFBFBD>a_ZH<5A>Qx<51>m<EFBFBD>G<0F>^,0<1C><m<>0<EFBFBD><30> (<28><><EFBFBD><EFBFBD><19><11>[E<><45><EFBFBD>sGm+<2B>us<75>sF<><46>~=<3D>rn<72>h<7F>r<EFBFBD>?(<28><><1D><><EFBFBD>u<EFBFBD><EFBFBD><7F>_<EFBFBD>Nx<4E><78><05>o <17>e]<5D>o{<7B>8<EFBFBD><38><03><>`<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܭ;bX<62>7<EFBFBD>E<EFBFBD>D<EFBFBD>
<EFBFBD><EFBFBD>`2[>܎XA<58><41>ܾI<DCBE>h<><68>Y<><05>I<EFBFBD><49>\p&T<><54>j5<10>q<EFBFBD>]<5D>t<EFBFBD><74><EFBFBD><EFBFBD>9<EFBFBD><39>V<EFBFBD><56><EFBFBD><EFBFBD>H <0B><><1E><>,Z<>5B<35><42>" J<>
<EFBFBD>a Y<><59><EFBFBD>9<15>Mo<4D><6F><19>L<1A>~<7E><><1F><>#<23>mCV<43><56><EFBFBD>j<>N᫑<4E>6%<25> -G<> V<>Jp<4A>i<EFBFBD><69>@ދv}$ur<75><72>n<EFBFBD><6E><EFBFBD><EFBFBD><14>D<EFBFBD><44><EFBFBD><EFBFBD>u
Ů<EFBFBD><EFBFBD><EFBFBD>>
<EFBFBD><EFBFBD>6<EFBFBD><16><><EFBFBD><EFBFBD><1E><>h<EFBFBD>Hw/ҖˤLS|h<><1E>i[j<>U<EFBFBD><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ڑJNѽ7<EFBFBD>z<EFBFBD><EFBFBD><><DE8D><EFBFBD>H<EFBFBD>w{*<2A>+R<>%R<>!|<7C>9~<7E>+&o<><1D><>Lot<>T<EFBFBD>ɟ<1A>Ć<EFBFBD>z#<23><><EFBFBD><EFBFBD>
ڗJ<EFBFBD><EFBFBD>A
<08>^<5E>^$6<1E>L<EFBFBD><4C>P<EFBFBD>l<EFBFBD><6C><EFBFBD>T*iJM<4A>#P<><12><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>7<EFBFBD>$+<2B>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>M<EFBFBD>s<EFBFBD><10>l<EFBFBD>$<24>x<EFBFBD><78><EFBFBD><EFBFBD>EG,<2C><><EFBFBD>@'<27> <09>H<EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!<21><><EFBFBD><EFBFBD>Cga<67><61><EFBFBD><EFBFBD><EFBFBD>bt<12>~<7E>&<26>y r
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>}.<2E>*y<>6e<36>)w<><06><><EFBFBD>7:E<>l\E<>
$|!/[<5B>\<5C><><EFBFBD>Yj<59><6A>|<7C><><EFBFBD>"=9 k<>Z<>뮰ٿy<>t<EFBFBD><48><17>~<7E><><EFBFBD>t<EFBFBD>Z|<7C><>SG<53>ŷ<EFBFBD><C5B7>n]<5D><><EFBFBD><EFBFBD>X<><58><EFBFBD>ﲐw<EFB290><77>"<22><>8<EFBFBD><38><EFBFBD><07>_<EFBFBD><5F>!_<><5F>><3E>R<07><><13><>R4U<34>+p<><70>I?%u2<75><32>D<EFBFBD><44><EFBFBD>a_l<5F>>><3E><><EFBFBD>!o<>B/<2F>`<60><><EFBFBD><EFBFBD>Z<EFBFBD><5A>-<2D><>v<EFBFBD>f<1B><><EFBFBD>m<EFBFBD><6D><EFBFBD>Y{<7B><><EFBFBD><0F>z<1F><><1A><1B><>.<2E><>3<1E>]<11>8<EFBFBD>_`7m<37>ܿ!<21><>l`<60>F<EFBFBD><1B>ñ<EFBFBD>t<EFBFBD>2<EFBFBD></]<5D><><EFBFBD>o@<40><>Ke<4B>X*۸<><1D>ߠ<EFBFBD><DFA0>~<7E>Y,<2C>'w3<77><33><EFBFBD><EFBFBD><EFBFBD>5<01>|&u<>w<EFBFBD><77><EFBFBD>E<EFBFBD><45>i<EFBFBD><69><04><>/<2F>J<EFBFBD><4A><EFBFBD><1E><><EFBFBD><EFBFBD>I:<11>ߠ/<2F><>R<EFBFBD>)<29>r<EFBFBD>7ET<7F><54>$<24><><EFBFBD><05><><08><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[_<><5F><EFBFBD>Nz<03>'o<>{(<28><>ޘ<EFBFBD><15>/<2F><><EFBFBD> "TA<54><41>J <0B><><EFBFBD>ZRe<52>Jm<4A>
S<EFBFBD>lw<EFBFBD>^<5E><0E>><3E>&<26>l<0F><49>S<EFBFBD>.<2E>FYَ<59>%<25><02>G<EFBFBD><47><EFBFBD>r<EFBFBD>˶<><05>61[<07><><18>K<EFBFBD>8<14>M<EFBFBD>__M<1D><><EFBFBD>Q<EFBFBD><51>=<3D><><EFBFBD>)<29>[ j<>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40>H<EFBFBD>R<16><>j<EFBFBD>7)<29>߳338<33><38><EFBFBD>z<EFBFBD>7<EFBFBD>շ!<21><>:<00><>K\<5C>ER2<52><32><EFBFBD>E<EFBFBD>)<29>l,<2C><>fQ_<51>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>S<EFBFBD>"<22><><EFBFBD>Ŋ<EFBFBD>h<EFBFBD><68><EFBFBD><00><1B>%<<3C>N<EFBFBD><4E><EFBFBD><EFBFBD>O<EFBFBD><4F>EP<45>W~v+<00>e<EFBFBD><65><EFBFBD><EFBFBD>hG\<5C><>Dž<><C785>(67<36>{NE<><45>Z<14><><EFBFBD><EFBFBD>H$|<7C>a8Q<7F><51><EFBFBD>m<EFBFBD>4t+!_L<5F> <20>u<>E_Q<x<>_<><5F> <09><04>><3E>к<><D0BA>c<EFBFBD>x(<28><><EFBFBD>G)<29>Fi<46>><3E><>eZ_Ãzw<7A><77>Hbh<62>R<14>C<EFBFBD><43><EFBFBD>% <20><0E>Jw`<60><>sC!<>;IN<49>Mܠ7S<37><53>Ȕ8:
<EFBFBD>C<EFBFBD><EFBFBD>5q<EFBFBD>Y<EFBFBD>ׯ<><<18><><EFBFBD>"0<><30>W<EFBFBD><57>;<3B>x<19>
vm<16>¢ <04><>,N<>3.<2E>8<EFBFBD>,2%KG<4B><47><EFBFBD>L<EFBFBD>ίP<CEAF><50>~!<21><>/x<><78> <0C>h<EFBFBD>N<EFBFBD>a<><61>1<EFBFBD>6O<36>e<EFBFBD>['<27>f<EFBFBD><66>݀<EFBFBD><DD80><EFBFBD><05><><EFBFBD>/<2F><>d<EFBFBD>[<5B><EFBFBD><7F><EFBFBD>><3E><><EFBFBD><EFBFBD><EFBFBD>><3E><><EFBFBD>>+<2B><>r<EFBFBD><72><EFBFBD>5<EFBFBD><35><EFBFBD>o<EFBFBD><00>><3E><> <0B>h<EFBFBD>l<EFBFBD>ݲ<>-<2D><><EFBFBD><19>g).<2E><><EFBFBD><EFBFBD><03><>Q<EFBFBD>H<EFBFBD>G<EFBFBD><47><17><><EFBFBD><EFBFBD><EFBFBD>mPK<19>u<EFBFBD><75>xPK! org/gradle/wrapper/Logger.classUT<00><>kOA<14><><11>B)B<> <14>[[XV<58><0F><13>Ą<EFBFBD>Qc
F<EFBFBD>M<EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>^0<><30><0F>W<EFBFBD>њ<EFBFBD><D19A><1F><>2<EFBFBD><32>EHچ<48><DA86><EFBFBD><EFBFBD><EFBFBD>9<39>?<7F><06> S<><53><EFBFBD><EFBFBD>M<EFBFBD>^<5E><>!<21>
}[<5B><><EFBFBD>5<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> |<7C> <1A><>\<5C><11>dSF<53><46>$<24>0J<30>H<EFBFBD>ޗnDkz<6B>6<<3C>2<1C><><EFBFBD>O7<>[<5B>
K<EFBFBD><EFBFBD>~<7E><1C><><EFBFBD><EFBFBD>P<12>v|<7C><><EFBFBD>m<EFBFBD>S<18><17>K<EFBFBD>[<5B>%<25>A<EFBFBD><41><EFBFBD>Q<08>t-HB<48>^8. ,<06>mڡl<DAA1>d~e<>E<EFBFBD>Y
l<EFBFBD>B
<EFBFBD>S<07>X<EFBFBD><58><EFBFBD>m<EFBFBD>U<EFBFBD><55><EFBFBD>XCJ`<60>"<22><> <09>!<21>.i9J<1C>Ğ@<40><>;<3B>3<EFBFBD><33><EFBFBD>^aW`(_<><5F> <20><>ih<69><68> <20><>1<EFBFBD> <20>3n` <0B><>yk<79>ZGYq<59>j<EFBFBD>}<7D>b<EFBFBD>4<EFBFBD>1$<24>3<EFBFBD>A<EFBFBD><41>|<7C><><EFBFBD>)<29>^9<>X<18><f<>4<><04><>
<EFBFBD>~˘Mc <09><>dy<64><1C>G<EFBFBD>k<EFBFBD>4eX<65><58><EFBFBD>|<7C>ʅj<CA85>ŗ̫<><CCAB>"W<><02>ٝ<><D99D><EFBFBD>WC},<><CB87>|e`<60><>s}U<>U<EFBFBD>j<EFBFBD>w<EFBFBD><77>d<EFBFBD>7<EFBFBD><37>īS<C4AB>V<EFBFBD><56><EFBFBD><EFBFBD>j<18>'<27><><EFBFBD><EFBFBD>b<EFBFBD><62>3<EFBFBD><33><EFBFBD><EFBFBD>y\<5C>H<17><><EFBFBD>T<EFBFBD><07><>B]Y<>`<60><><EFBFBD>u5<75><35><EFBFBD>>E<>n<><6E>q<EFBFBD>\<5C><>;]a<>+<2B>v<EFBFBD><76><1D>w<EFBFBD>/X<>1<EFBFBD>o<EFBFBD>Ha<48><61><EFBFBD>*<2A><>f:؄–<D884><C296><EFBFBD><EFBFBD><EFBFBD>Cg`a<>_<EFBFBD><5F><EFBFBD>^<5E><01><>w<EFBFBD>PK]<5D><>o;PK!& org/gradle/wrapper/PathAssembler.classUTU<><55>J<EFBFBD>@<10>gM<67><4D>ZE<5A>@<40>S+MC<4D><43><EFBFBD><EFBFBD> <20>'AQ<41>}<7D><>&<26>n6a7<61><07><0F>[x<<3C>><3E>8=8 <0B><><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><59><EFBFBD><EFBFBD>N`<60><><EFBFBD>fs=<3D>X<EFBFBD>%<25><>O<EFBFBD><4F><EFBFBD><01>E^*-*U<> /$nQ<6E>pH<70><48>p<EFBFBD><70>P.<2E>*w|:<17>ဗi<E18097><69>2P<32><0E>'<27>I<<3C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B> <09>L<04>:bRe<10>2)<29>5ZGo<11><><EFBFBD>a$<24><><EFBFBD>>0<06><>be%^+<2B> <0C>
<EFBFBD><EFBFBD><EFBFBD><15><><EFBFBD>ъ<EFBFBD>Dމ*<2A>t<0E>X<EFBFBD>mC<6D><43><EFBFBD>B<EFBFBD>E<EFBFBD><45>I<EFBFBD><49>x<EFBFBD><78>jC<6A>A<EFBFBD>\U]08<30><38><EFBFBD>T<11>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD>C<EFBFBD>m<><61>/<2F><08>d<EFBFBD>bt|ئ<>K<EFBFBD><4B>#m<1E>A<EFBFBD><41>7P<37>-<2D>PK<08>)<29>>$jPK!0 org/gradle/wrapper/SystemPropertiesHandler.classUT<00>T[wU<14><>M;q<12><><EFBFBD>B kn<6B>E
-x<01><><EFBFBD>
P/x29I<39>Nf<4E><66>LZX]<5D><><1B><>W^y<>,<2C>Z<EFBFBD><5A><EFBFBD><0F><><1B><17>}Rڦ<17>f<EFBFBD><66><EFBFBD><EFBFBD><EFBFBD>}<7D>o<EFBFBD><6F><EFBFBD><EFBFBD><EFBFBD>W<00><>`<60>|<7C>d<EFBFBD><64><EFBFBD><EFBFBD>pkU<6B><55><EFBFBD><74><CAAA>)<29>k<EFBFBD>l<EFBFBD><07><>M<>*<08><><11>$lp߰<1A>Z<EFBFBD><5A>M?5]<5D>/<2F>V<EFBFBD>h<EFBFBD>a+<1F>r<EFBFBD>r<EFBFBD>2E<32><45><EFBFBD>c_k;~<7E><17><>[<5B>]!<21><><EFBFBD> ]ҧX<D2A7>'<27>&<26>FU<46><55>~<7E><>1<EFBFBD>e<EFBFBD>--q<>v<43>B]<5D>#
뒷ZBʏ<>@4oK<6F><0E>-<2D>9<EFBFBD>Xj<58>0 ?<3F>k<EFBFBD><6B>p<EFBFBD>^X<><V<>a<EFBFBD>a<EFBFBD>.<2E><>V <0C><><EFBFBD>=m<>+<2B>`3<><33>c;<3B><><EFBFBD><1C> <0B>5<EFBFBD>p<EFBFBD><10>Ag<18>j<EFBFBD>v<EFBFBD>1<EFBFBD>@:s/<2F>8<EFBFBD><38><EFBFBD>
<EFBFBD>x<EFBFBD>O
äj<EFBFBD><EFBFBD>Ő<EFBFBD><EFBFBD>8F0<EFBFBD><EFBFBD>8N0<EFBFBD><EFBFBD>s<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><C695>~O%<25><>ʁ<14><><EFBFBD>4<EFBFBD>u0<75>^o<>H<EFBFBD>m<EFBFBD><6D><EFBFBD><EFBFBD>*é=<3D>><3E><><EFBFBD>;8<><38>$-<2D><>E)UB<02>)<29>U<EFBFBD>,<15><>'<04><><EFBFBD>.&<26><>{ <0C><><EFBFBD>4d<18>v $<<3C>pr<70>m<EFBFBD>Nr<>ǐ<EFBFBD><C790>0rX<72><58><EFBFBD><EFBFBD><11>ţ <20><><18><>}\<5C><>\<02>e;^<5E>FL>/<2F><03><>!exT%q<><71>6J<36>E\ѡa<D1A1>!<21><>rb2<62><32><EFBFBD>س<EFBFBD><D8B3><EFBFBD>&<26><><01><><EFBFBD>b<07>=c<><63>><3E>T?<3F>g:><3E>u<EFBFBD><75><EFBFBD>v<EFBFBD><EFBFBD><7F>X<EFBFBD>td<0E>cViߤ^;<3B><17>1<EFBFBD><31><14>JJ<4A>%<25><>j<13><><EFBFBD>فy,<2C><>,<2C>!
<EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD>tu_)./3$<24><><EFBFBD>m7<6D><37>b<EFBFBD><62>%Z<><5A>pg<70><67>}<7D>]o<>NU<4E><55>=Z<>Y)=<3D>\o7<><37>H<EFBFBD>dk<64><6B><EFBFBD><1A><>Z_<>KK{t<><74>c<05>P<EFBFBD><50><EFBFBD>Dh<44>?ڱ/ *<2A>;|<7C>\<Px<><78>H}ȝ<><C89D><EFBFBD>yew<65>*:<3A>¢<EFBFBD>cw<63><77><EFBFBD><EFBFBD>ܠ<EFBFBD>.r<0E><>'<27><><EFBFBD>#J<4A>:<3A><><EFBFBD>I<><49>l1s<31><73>7C<37>mb0<62><30><EFBFBD>q<EFBFBD>\<5C><>T s1o<31><6F>΄8<17>B<EFBFBD><42> L2<4C>ʾ<EFBFBD><14>SL<53><4C>G <0C>b<EFBFBD><62><EFBFBD>k!n<<3C><>ˠ<EFBFBD><CBA0>X<EFBFBD>/<2F><>H<EFBFBD>[?o<><6F>;<1D><13>D<EFBFBD><10>g[<5B><><EFBFBD>?C<><43> /<2F><>kv<6B>bf<1F><>|<1B><<3C>A<EFBFBD>%<25><><19><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'<27><>e<>A<EFBFBD>w<EFBFBD><77>O<EFBFBD><4F><EFBFBD>n<EFBFBD><6E><EFBFBD>a<EFBFBD>PK<08><>%<25><>NPK!- org/gradle/wrapper/WrapperConfiguration.classUT}<7D>mOA<10>g<EFBFBD><67>R<EFBFBD><52><10>*r<>}<7D>R<EFBFBD><52><EFBFBD>A<EFBFBD>'<27>Ŵ<><C5B4><EFBFBD><EFBFBD>m<EFBFBD><6D>\kI4<49>A<EFBFBD> <0C><><EFBFBD><EFBFBD><EFBFBD>~?<3F>q<EFBFBD>w<EFBFBD><77>=l<><6C>ٝ<EFBFBD>ovwf<77><66><EFBFBD>?`<1E> |<7C><><EFBFBD>f><3E>yZ<79>`jQ\ %qF,h<><68><EFBFBD>PS<50><53>dE+2<>י¨<D799>0X<30>F<EFBFBD>Pf<50> <0B>V1ĕU 6#V<>d<EFBFBD>V<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD> <0B>|<1A>z<EFBFBD><7A>K5E<35> <09>L<EFBFBD>s\<5C>J<EFBFBD>ʘ.<2E><12>֙n<D699>Z8<5A><38>M<EFBFBD>f<EFBFBD>EV?<3F><><10>級^`<60>e<EFBFBD><11>j<EFBFBD><6A><EFBFBD>tZTX<54>R<EFBFBD><52>*<2A>S<EFBFBD>,<2C><><EFBFBD>%Y<><59><EFBFBD>={<7B>C xN<78>4<EFBFBD>PUJ<1D><>Y<EFBFBD><59>B/<01>(<1B>.<2E>k\G <20><>T<EFBFBD><54>Lf<>V<EFBFBD>j<EFBFBD>o<EFBFBD> <09><><EFBFBD>eʙ|<7C><><EFBFBD>7<EFBFBD>,n<>ʕ<EFBFBD><CA95><EFBFBD>R<EFBFBD>V!<21>}/W<><4C>\<5C>R<EFBFBD>/<2F><><15><>Ld<><64>H<EFBFBD>*r<><72>l<EFBFBD>%ѡ<>`<60>@<><EF9AAC>:<3A><>X<EFBFBD>H<EFBFBD>!<18><>n<>V^d7w<37>w<EFBFBD>s<>ٳ<EFBFBD><07>v}0*<2A>n<>A<0F><11>wJ<77><4A>g<EFBFBD><67><00><15>/@<40><>0`y<>Aq<>a<18><>#3w<33><77>.<14>^;<3B>)<1F>q}<7D><><EFBFBD>t]o`(w+<2B><>&<1E>uj<75>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD>fG۴<DBB4>"@<40>u<EFBFBD>4<EFBFBD><34>Dx<44><78>?q<><71>7ZV<>ZƎX<C68E>F^<5E><>{<7B>
<19>Ol<4F>j <0C><><EFBFBD>ڏ4^<5E>1<EFBFBD>?O섧<4F>l<EFBFBD>k<EFBFBD>9<<3C>_8<5F> <20><12><08>M+ض߶<01><0E><16>ߴ<EFBFBD>z<EFBFBD>A<EFBFBD><41><EFBFBD>w Gi<47>J<EFBFBD>F<13>ǧ<EFBFBD><C7A7>a$|<7C><01><><06>so<73>{<7B><>h<EFBFBD>S<>D<><02><> q;A<18><>Л<>n<EFBFBD><6E><13><><EFBFBD><0F><> <0B>$<24>A<EFBFBD><1D><><EFBFBD>q<>Ǯ<EFBFBD><C7AE><EFBFBD>Ϲ<EFBFBD><CFB9>><3E>/8<><38>;<3B><><EFBFBD>K<EFBFBD><4B><EFBFBD><EFBFBD>?q<>'<<3C>O:<3A><>;><3E><>+<2B><>O}<7D><>k<EFBFBD><03>`w|6\<5C>?<3F>M7<4D>n,<2C>K<EFBFBD>vA<76>PK<08><04><>PPK!( org/gradle/wrapper/WrapperExecutor.classUT<00>V<EFBFBD>wU<14><>]BX<1A><1A><>6Mv <14><16>J7S<>:M^ҡ<><D2A1>83i <08>
<EFBFBD><EFBFBD>J<EFBFBD>QTP<54>V*<2A><><EFBFBD><EFBFBD><EFBFBD><7F><EFBFBD>f<EFBFBD>&iS<0F><><EFBFBD><EFBFBD>{<7B>~w<><77>{<7B><><EFBFBD><7F><EFBFBD><17>
<EFBFBD><EFBFBD>0v<EFBFBD>to<EFBFBD><EFBFBD><EFBFBD><EFBFBD><1F>j"<22>-OB<><42><EFBFBD><EFBFBD>ȊdʚNk N<>:W<>dpZ<1C><>p|<7C>LJ<EFBFBD>l<EFBFBD>lKJ<4B><4A>C<EFBFBD>L*<2A><>2aY<61><59>[7%6<><36>ޜ<EFBFBD>'<27><>BƠ^/TԔ<54>r<EFBFBD><72>j<EFBFBD>f<EFBFBD><66>n<EFBFBD>/<2F>on<6F><6E><EFBFBD>N<><4E><EFBFBD>)7<18>'<27>e<EFBFBD>8<EFBFBD>#+<2B>!<21><>HJ<48>
<EFBFBD><EFBFBD><EFBFBD>R&<26><><EFBFBD>!G<><1E><><EFBFBD>.T2,<&
KERS<52><53>c<n<>PM<50>2<EFBFBD>F<EFBFBD><46><EFBFBD>
<EFBFBD>%<1D><4E>H<EFBFBD><48><EFBFBD>v<EFBFBD><76>-<2D><>|GS<47>"bL<1A>qMM<4D>)<29><><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD>u<EFBFBD><75>͡<00>Ȫl><3E>PW_j<5F>|
*<2A>z1 =p<><70><EFBFBD><EFBFBD><EFBFBD>ͅEԢ<> /<2F><>A<15>x<EFBFBD><78><1C><>  <0C><>8\XEA<45>Q<EFBFBD>0
<EFBFBD>u<EFBFBD><17><>V<>O(<28><>(<28><>E <d<>!<21>y:<3A><12><08>kt<><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<><15><><EFBFBD><1A><15>:<02><><EFBFBD>#<23>\5~<17>yF<79>h@P8ndh.<2E><><EFBFBD>HVM<56><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,dE<64><EFBFBD><E49F88>D*.<2E><><EFBFBD>qg8M<38>a]<5D>"G<><47>I<EFBFBD>f<EFBFBD>@o;<3B><14>:<0F><><EFBFBD>a<EFBFBD><61>K,2<>ԗj<D497><6A>m<EFBFBD>&Q<>͔`<60>H<EFBFBD><48>ΐ<1B>0,J<>Z ^l4<>b<1B>\A<><41><EFBFBD>q<EFBFBD>~f<><66>]<5D>| v<08>i<EFBFBD>-2f<32>dX\ƴH<C6B4>q<EFBFBD><14><>NK<4E>G2<07><>53<01><><EFBFBD>'<27>'fzs<7A><73><1D>O<EFBFBD><4F>b<EFBFBD><62>Ai<41><69>-<2D><0E>e<EFBFBD>LO<4C>z<EFBFBD><7A><EFBFBD><EFBFBD>f<EFBFBD>zO<7A><4F><EFBFBD><EFBFBD><EFBFBD>><3E>I/<2F>2fu<66><75> <09><00><>r&Jͅ;<3B>;D<><44>"<22>3N<33>bNL}4mM?<3F><><EFBFBD><14><1D><><EFBFBD><EFBFBD>'<27><><1F><>;<3B> O%<25>!<21>.n<>h<EFBFBD><68>~9͵<39>i<1F>v/R:2Ce}<7D><>h<EFBFBD><68>Ȍ<EFBFBD>x<EFBFBD>1$<24><><EFBFBD>*4<><34>0<EFBFBD> <20>%ENH&<26>vJ<76><4A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!p}<7D>!<21> +<2B>Θ<15>h<EFBFBD><68>Q<17><13>](AoV5)<29>ݣq<DDA3>q<EFBFBD><71><EFBFBD> <0C>6-<2D>$<24><>f<EFBFBD>E<EFBFBD><45><EFBFBD>Њ<EFBFBD>I]K<><4B><EFBFBD>uMn<4D>.<2E><>NQ]x<><78>WR<57>ӒY~o<1C>~+<2B>?//<2F> <0C><><EFBFBD>a<EFBFBD>umD<1A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>=8<>7h<37>T<><54><><CBB0><EFBFBD><E7B4AB>IF<49><46>v<EFBFBD>Bɷ$<24><><EFBFBD><1E><>;<3B>U<EFBFBD><55>.<2E>Gd <0B>h<17>E<EFBFBD>m+<1F>C<0F><>G<EFBFBD><47>JU\<5C><><EFBFBD>*<2A>hb<68>~&.<2E>Oq<4F><71>\<5C><><EFBFBD>n|ΰ<>\<5C>(<><7F>.<2E>d<EFBFBD>٥<EFBFBD><D9A5>%%<25><>#<23>9<EFBFBD><1F><><EFBFBD>*<2A><> <0C><>I<EFBFBD>'<27><>Z<EFBFBD><5A><EFBFBD>A<EFBFBD><41>_ &v
v<EFBFBD><EFBFBD><EFBFBD>H-<2D><>n|<7C><>=t'E3k/<1B>%\E<><45>x.<2E><><EFBFBD>]<5D> Ts<><73>HG<48>*~<7E><>'<27>B<EFBFBD>.<2E><>ݸ&<26><>{<7B>%<25>&B<><42>$<24>VM<56>gm<><6D><EFBFBD>%<25>r3<72><33>A<EFBFBD>pX<><58>J<EFBFBD>FO+*U<07><><EFBFBD><EFBFBD><EFBFBD><01><><17><11><EFBFBD>W<EFBFBD>q<><71>W<EFBFBD><57><EFBFBD>mIO<02>.<10>X@<40><>sa*i<><69><EFBFBD>`c0<14><><EFBFBD>7<EFBFBD><37>X<EFBFBD>k<1C>ob<6F>M,<2C><><EFBFBD><<3C><><EFBFBD>`86<38>G<EFBFBD><47><1E>P<EFBFBD>i!D<>,l<>5<EFBFBD>`{<7B><><EFBFBD>c<16>|<7C>i<EFBFBD>dn<64><6E><EFBFBD>I<EFBFBD><49>P<50><7F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ix8<78>x<EFBFBD><78>,<2C><>Q<EFBFBD><51>1 i <0B>Y0-<2D>X8y<19>:'q*Vy<1B>XWEc<45><63>Bx<02><><EFBFBD>q<EFBFBD><71>uJ-<2D>V\<5C><>hC<68>-{pĖG1dK'lygly<6C><79><EFBFBD>Qȓ<>QRAr<41>$<24><>:C<>q<EFBFBD><1B>𱅱<EFBFBD>$<24><><EFBFBD>\<5C>^<04><><EFBFBD>'<27><>E5<45>#<23>%x<03>},|uޠ<><02><>l<EFBFBD><6C><EFBFBD>ia<69><61>*~<7E><><EFBFBD>w!Z<19><><EFBFBD>i<EFBFBD><1C>q<EFBFBD>!<19><>Y<><59><EFBFBD>Ŷ<EFBFBD>k<gߟ<67><DF9F>M<EFBFBD><4D>&<26><10>$<24><><EFBFBD>5<EFBFBD><35>n"m<11>/<2F><><EFBFBD><EFBFBD><EFBFBD> \ <09> <0B>~<7E>Z<EFBFBD>i<EFBFBD><69>%O<>2<EFBFBD><EFBFBD><EB84BD>ޚ<EFBFBD><DE9A>"l<><6C>ݗ<EFBFBD><1E>q<15><1D><>F"!<21><><EFBFBD>.<2E><>W^ <0B>EU<45><55><EFBFBD>1T<31><54>ltR5m2B<32><42><10><><EFBFBD>p<EFBFBD><70><EFBFBD>}<7D><>PKYa<59>S<00> PK!<00><><EFBFBD><1E>
<00>' META-INF/LICENSEUTPK!m<>>=@? 0META-INF/MANIFEST.MFUTPK!<00>`zX!p1 <00>org/gradle/cli/CommandLineArgumentException.classUTPK!×<12>n<00>& Dorg/gradle/cli/CommandLineOption.classUTPK!d<><64> Z<00>3 org/gradle/cli/CommandLineParser$AfterOptions.classUTPK!<00><>1,]< <00>org/gradle/cli/CommandLineParser$BeforeFirstSubCommand.classUTPK!<00><><0F><>b= rorg/gradle/cli/CommandLineParser$KnownOptionParserState.classUTPK!C'|<7C>L<00>< <00> org/gradle/cli/CommandLineParser$MissingOptionArgState.classUTPK!<00><>[<5B><>J= <00>#org/gradle/cli/CommandLineParser$OptionAwareParserState.classUTPK!u[z?<3F>}8 <00>&org/gradle/cli/CommandLineParser$OptionParserState.classUTPK!<16><>
C3 <00>(org/gradle/cli/CommandLineParser$OptionString.classUTPK!<00><>ɉ<EFBFBD><00>2 W+org/gradle/cli/CommandLineParser$ParserState.classUTPK!<4B>s<00>? g-org/gradle/cli/CommandLineParser$UnknownOptionParserState.classUTPK!<1D><><EFBFBD>c& P0org/gradle/cli/CommandLineParser.classUTPK!<00>2w<32>:<00>& \5org/gradle/cli/ParsedCommandLine.classUTPK!Z<>vmT<00>, <00>9org/gradle/cli/ParsedCommandLineOption.classUTPK!<00>$O<14><00>3 <00>;org/gradle/internal/file/PathTraversalChecker.classUTPK!y<>A ?org/gradle/internal/file/locking/ExclusiveFileAccessManager.classUTPK!b<><06><><00>> Aorg/gradle/util/internal/WrapperDistributionUrlConverter.classUTPK!<00><45>/ HCorg/gradle/wrapper/BootstrapMainStarter$1.classUTPK!<00><>%)<00>A <Eorg/gradle/wrapper/Download$DefaultDownloadProgressListener.classUTPK!w<><77>&<26>4 <00>Horg/gradle/wrapper/Download$ProxyAuthenticator.classUTPK!<04> e *! -Lorg/gradle/wrapper/Download.classUTPK!As <09><00>- <00>Uorg/gradle/wrapper/GradleUserHomeLookup.classUTPK!5<><35><EFBFBD><00>)* 'Xorg/gradle/wrapper/GradleWrapperMain.classUTPK!7<>
<EFBFBD> <00>" <00>morg/gradle/wrapper/Install$1.classUTPK!<00><04>Jj<00>- <00>yorg/gradle/wrapper/Install$InstallCheck.classUTPK!<19>u<EFBFBD><75>x <00>{org/gradle/wrapper/Install.classUTPK!]<5D><>o; <00>org/gradle/wrapper/Logger.classUTPK!<00>)<29>>$j& <00><>org/gradle/wrapper/PathAssembler.classUTPK!<00><>%<25><>N0 <12>org/gradle/wrapper/SystemPropertiesHandler.classUTPK!<00><04><>P- <13>org/gradle/wrapper/WrapperConfiguration.classUTPK!Ya<59>S<00> ( e<>org/gradle/wrapper/WrapperExecutor.classUTPK!!
<17>
=== android/gradle/wrapper/gradle-wrapper.properties ===
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
=== android/gradlew ===
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
=== android/gradlew.bat ===
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
=== android/settings.gradle ===
include ':app'
include ':capacitor-cordova-android-plugins'
project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/')
apply from: 'capacitor.settings.gradle'
=== android/variables.gradle ===
ext {
minSdkVersion = 23
compileSdkVersion = 35
targetSdkVersion = 35
androidxActivityVersion = '1.9.2'
androidxAppCompatVersion = '1.7.0'
androidxCoordinatorLayoutVersion = '1.2.0'
androidxCoreVersion = '1.15.0'
androidxFragmentVersion = '1.8.4'
coreSplashScreenVersion = '1.0.1'
androidxWebkitVersion = '1.12.1'
junitVersion = '4.13.2'
androidxJunitVersion = '1.2.1'
androidxEspressoCoreVersion = '3.6.1'
cordovaAndroidVersion = '10.1.1'
}
=== capacitor.config.ts ===
import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.example.[[normalizedAppName]]',
appName: '[[appName]]',
webDir: 'dist'
};
export default config;
=== components.json ===
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "default",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "tailwind.config.ts",
"css": "src/index.css",
"baseColor": "slate",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
}
}
=== eslint.config.js ===
import js from "@eslint/js";
import globals from "globals";
import reactHooks from "eslint-plugin-react-hooks";
import reactRefresh from "eslint-plugin-react-refresh";
import tseslint from "typescript-eslint";
export default tseslint.config(
{ ignores: ["dist"] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ["**/*.{ts,tsx}"],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
plugins: {
"react-hooks": reactHooks,
"react-refresh": reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
"@typescript-eslint/no-unused-vars": "off",
},
},
);
=== index.html ===
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>dyad-generated-app</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
=== ios/.gitignore ===
App/build
App/Pods
App/output
App/App/public
DerivedData
xcuserdata
# Cordova plugins for Capacitor
capacitor-cordova-ios-plugins
# Generated Config files
App/App/capacitor.config.json
App/App/config.xml
=== ios/App/App.xcodeproj/project.pbxproj ===
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 48;
objects = {
/* Begin PBXBuildFile section */
2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; };
50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; };
504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; };
504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; };
504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; };
504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; };
50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; };
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = "<group>"; };
50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = "<group>"; };
504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; };
504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = "<group>"; };
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; };
AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; };
FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
504EC3011FED79650016851F /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = {
isa = PBXGroup;
children = (
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
504EC2FB1FED79650016851F = {
isa = PBXGroup;
children = (
504EC3061FED79650016851F /* App */,
504EC3051FED79650016851F /* Products */,
7F8756D8B27F46E3366F6CEA /* Pods */,
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */,
);
sourceTree = "<group>";
};
504EC3051FED79650016851F /* Products */ = {
isa = PBXGroup;
children = (
504EC3041FED79650016851F /* App.app */,
);
name = Products;
sourceTree = "<group>";
};
504EC3061FED79650016851F /* App */ = {
isa = PBXGroup;
children = (
50379B222058CBB4000EE86E /* capacitor.config.json */,
504EC3071FED79650016851F /* AppDelegate.swift */,
504EC30B1FED79650016851F /* Main.storyboard */,
504EC30E1FED79650016851F /* Assets.xcassets */,
504EC3101FED79650016851F /* LaunchScreen.storyboard */,
504EC3131FED79650016851F /* Info.plist */,
2FAD9762203C412B000D30F8 /* config.xml */,
50B271D01FEDC1A000F3C39B /* public */,
);
path = App;
sourceTree = "<group>";
};
7F8756D8B27F46E3366F6CEA /* Pods */ = {
isa = PBXGroup;
children = (
FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */,
AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
504EC3031FED79650016851F /* App */ = {
isa = PBXNativeTarget;
buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */;
buildPhases = (
6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */,
504EC3001FED79650016851F /* Sources */,
504EC3011FED79650016851F /* Frameworks */,
504EC3021FED79650016851F /* Resources */,
9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = App;
productName = App;
productReference = 504EC3041FED79650016851F /* App.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
504EC2FC1FED79650016851F /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0920;
LastUpgradeCheck = 0920;
TargetAttributes = {
504EC3031FED79650016851F = {
CreatedOnToolsVersion = 9.2;
LastSwiftMigration = 1100;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */;
compatibilityVersion = "Xcode 8.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 504EC2FB1FED79650016851F;
packageReferences = (
);
productRefGroup = 504EC3051FED79650016851F /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
504EC3031FED79650016851F /* App */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
504EC3021FED79650016851F /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */,
50B271D11FEDC1A000F3C39B /* public in Resources */,
504EC30F1FED79650016851F /* Assets.xcassets in Resources */,
50379B232058CBB4000EE86E /* capacitor.config.json in Resources */,
504EC30D1FED79650016851F /* Main.storyboard in Resources */,
2FAD9763203C412B000D30F8 /* config.xml in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
504EC3001FED79650016851F /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
504EC3081FED79650016851F /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
504EC30B1FED79650016851F /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
504EC30C1FED79650016851F /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
504EC3101FED79650016851F /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
504EC3111FED79650016851F /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
504EC3141FED79650016851F /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
504EC3151FED79650016851F /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
504EC3171FED79650016851F /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 1.0;
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
PRODUCT_BUNDLE_IDENTIFIER = com.example.[[normalizedAppName]];
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
504EC3181FED79650016851F /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.[[normalizedAppName]];
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = {
isa = XCConfigurationList;
buildConfigurations = (
504EC3141FED79650016851F /* Debug */,
504EC3151FED79650016851F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = {
isa = XCConfigurationList;
buildConfigurations = (
504EC3171FED79650016851F /* Debug */,
504EC3181FED79650016851F /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 504EC2FC1FED79650016851F /* Project object */;
}
=== ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.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>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
=== ios/App/App/AppDelegate.swift ===
import UIKit
import Capacitor
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
}
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
// Called when the app was launched with a url. Feel free to add additional processing here,
// but if you want the App API to support tracking app url opens, make sure to keep this call
return ApplicationDelegateProxy.shared.application(app, open: url, options: options)
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// Called when the app was launched with an activity, including Universal Links.
// Feel free to add additional processing here, but if you want the App API to support
// tracking app url opens, make sure to keep this call
return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler)
}
}
=== ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png ===
[binary hash="29e4777e319de3ee5a52c3a8004ec19d0568414004257e36d7c94a077d71c93b"]
=== ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json ===
{
"images" : [
{
"filename" : "AppIcon-512@2x.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
=== ios/App/App/Assets.xcassets/Contents.json ===
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}
=== ios/App/App/Assets.xcassets/Splash.imageset/Contents.json ===
{
"images" : [
{
"idiom" : "universal",
"filename" : "splash-2732x2732-2.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "splash-2732x2732-1.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "splash-2732x2732.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
=== ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png ===
[binary hash="1b5002b74a5500e697298ced06ca2811ac33f2771f236f3c720ff23243890530"]
=== ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png ===
[binary hash="1b5002b74a5500e697298ced06ca2811ac33f2771f236f3c720ff23243890530"]
=== ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png ===
[binary hash="1b5002b74a5500e697298ced06ca2811ac33f2771f236f3c720ff23243890530"]
=== ios/App/App/Base.lproj/LaunchScreen.storyboard ===
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17132" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="retina4_7" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17105"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<imageView key="view" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Splash" id="snD-IY-ifK">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
</imageView>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="Splash" width="1366" height="1366"/>
<systemColor name="systemBackgroundColor">
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</systemColor>
</resources>
</document>
=== ios/App/App/Base.lproj/Main.storyboard ===
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14111" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
</dependencies>
<scenes>
<!--Bridge View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="CAPBridgeViewController" customModule="Capacitor" sceneMemberID="viewController"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
=== ios/App/App/Info.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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>[[appName]]</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
</dict>
</plist>
=== ios/App/Podfile ===
require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers'
platform :ios, '14.0'
use_frameworks!
# workaround to avoid Xcode caching of Pods that requires
# Product -> Clean Build Folder after new Cordova plugins installed
# Requires CocoaPods 1.6 or newer
install! 'cocoapods', :disable_input_output_paths => true
def capacitor_pods
pod 'Capacitor', :path => '../../node_modules/@capacitor/ios'
pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios'
end
target 'App' do
capacitor_pods
# Add your Pods here
end
post_install do |installer|
assertDeploymentTarget(installer)
end
=== package.json ===
{
"name": "vite_react_shadcn_ts",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"build:dev": "vite build --mode development",
"lint": "eslint .",
"preview": "vite preview"
},
"dependencies": {
"@capacitor/android": "<scrubbed>",
"@capacitor/cli": "<scrubbed>",
"@capacitor/core": "<scrubbed>",
"@capacitor/ios": "<scrubbed>",
"@hookform/resolvers": "^3.9.0",
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-alert-dialog": "^1.1.1",
"@radix-ui/react-aspect-ratio": "^1.1.0",
"@radix-ui/react-avatar": "^1.1.0",
"@radix-ui/react-checkbox": "^1.1.1",
"@radix-ui/react-collapsible": "^1.1.0",
"@radix-ui/react-context-menu": "^2.2.1",
"@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-hover-card": "^1.1.1",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-menubar": "^1.1.1",
"@radix-ui/react-navigation-menu": "^1.2.0",
"@radix-ui/react-popover": "^1.1.1",
"@radix-ui/react-progress": "^1.1.0",
"@radix-ui/react-radio-group": "^1.2.0",
"@radix-ui/react-scroll-area": "^1.1.0",
"@radix-ui/react-select": "^2.1.1",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slider": "^1.2.0",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-switch": "^1.1.0",
"@radix-ui/react-tabs": "^1.1.0",
"@radix-ui/react-toast": "^1.2.1",
"@radix-ui/react-toggle": "^1.1.0",
"@radix-ui/react-toggle-group": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.4",
"@tanstack/react-query": "^5.56.2",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.0.0",
"date-fns": "^3.6.0",
"embla-carousel-react": "^8.3.0",
"input-otp": "^1.2.4",
"lucide-react": "^0.462.0",
"next-themes": "^0.3.0",
"react": "^18.3.1",
"react-day-picker": "^8.10.1",
"react-dom": "^18.3.1",
"react-hook-form": "^7.53.0",
"react-resizable-panels": "^2.1.3",
"react-router-dom": "^6.26.2",
"recharts": "^2.12.7",
"sonner": "^1.5.0",
"tailwind-merge": "^2.5.2",
"tailwindcss-animate": "^1.0.7",
"vaul": "^0.9.3",
"zod": "^3.23.8"
},
"devDependencies": {
"@dyad-sh/react-vite-component-tagger": "^0.8.0",
"@eslint/js": "^9.9.0",
"@tailwindcss/typography": "^0.5.15",
"@types/node": "^22.5.5",
"@types/react": "^18.3.3",
"@types/react-dom": "^18.3.0",
"@vitejs/plugin-react-swc": "^3.9.0",
"autoprefixer": "^10.4.20",
"eslint": "^9.9.0",
"eslint-plugin-react-hooks": "^5.1.0-rc.0",
"eslint-plugin-react-refresh": "^0.4.9",
"globals": "^15.9.0",
"postcss": "^8.4.47",
"tailwindcss": "^3.4.11",
"typescript": "^5.5.3",
"typescript-eslint": "^8.0.1",
"vite": "^6.3.4"
},
"packageManager": "<scrubbed>"
}
=== postcss.config.js ===
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
=== public/favicon.ico ===
[binary hash="a75a75f315bbed01f033fd813195a1728acfbad637888935298604e6467d34ab"]
=== public/placeholder.svg ===
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1200" fill="none"><rect width="1200" height="1200" fill="#EAEAEA" rx="3"/><g opacity=".5"><g opacity=".5"><path fill="#FAFAFA" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 736.5c-75.454 0-136.621-61.167-136.621-136.62 0-75.454 61.167-136.621 136.621-136.621 75.453 0 136.62 61.167 136.62 136.621 0 75.453-61.167 136.62-136.62 136.62Z"/></g><path stroke="url(#a)" stroke-width="2.418" d="M0-1.209h553.581" transform="scale(1 -1) rotate(45 1163.11 91.165)"/><path stroke="url(#b)" stroke-width="2.418" d="M404.846 598.671h391.726"/><path stroke="url(#c)" stroke-width="2.418" d="M599.5 795.742V404.017"/><path stroke="url(#d)" stroke-width="2.418" d="m795.717 796.597-391.441-391.44"/><path fill="#fff" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/><g clip-path="url(#e)"><path fill="#666" fill-rule="evenodd" d="M616.426 586.58h-31.434v16.176l3.553-3.554.531-.531h9.068l.074-.074 8.463-8.463h2.565l7.18 7.181V586.58Zm-15.715 14.654 3.698 3.699 1.283 1.282-2.565 2.565-1.282-1.283-5.2-5.199h-6.066l-5.514 5.514-.073.073v2.876a2.418 2.418 0 0 0 2.418 2.418h26.598a2.418 2.418 0 0 0 2.418-2.418v-8.317l-8.463-8.463-7.181 7.181-.071.072Zm-19.347 5.442v4.085a6.045 6.045 0 0 0 6.046 6.045h26.598a6.044 6.044 0 0 0 6.045-6.045v-7.108l1.356-1.355-1.282-1.283-.074-.073v-17.989h-38.689v23.43l-.146.146.146.147Z" clip-rule="evenodd"/></g><path stroke="#C9C9C9" stroke-width="2.418" d="M600.709 656.704c-31.384 0-56.825-25.441-56.825-56.824 0-31.384 25.441-56.825 56.825-56.825 31.383 0 56.824 25.441 56.824 56.825 0 31.383-25.441 56.824-56.824 56.824Z"/></g><defs><linearGradient id="a" x1="554.061" x2="-.48" y1=".083" y2=".087" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="b" x1="796.912" x2="404.507" y1="599.963" y2="599.965" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="c" x1="600.792" x2="600.794" y1="403.677" y2="796.082" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><linearGradient id="d" x1="404.85" x2="796.972" y1="403.903" y2="796.02" gradientUnits="userSpaceOnUse"><stop stop-color="#C9C9C9" stop-opacity="0"/><stop offset=".208" stop-color="#C9C9C9"/><stop offset=".792" stop-color="#C9C9C9"/><stop offset="1" stop-color="#C9C9C9" stop-opacity="0"/></linearGradient><clipPath id="e"><path fill="#fff" d="M581.364 580.535h38.689v38.689h-38.689z"/></clipPath></defs></svg>
=== public/robots.txt ===
User-agent: Googlebot
Allow: /
User-agent: Bingbot
Allow: /
User-agent: Twitterbot
Allow: /
User-agent: facebookexternalhit
Allow: /
User-agent: *
Allow: /
=== README.md ===
# Welcome to your Dyad app
=== src/App.css ===
#root {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
transition: filter 300ms;
}
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.react:hover {
filter: drop-shadow(0 0 2em #61dafbaa);
}
@keyframes logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: no-preference) {
a:nth-of-type(2) .logo {
animation: logo-spin infinite 20s linear;
}
}
.card {
padding: 2em;
}
.read-the-docs {
color: #888;
}
=== src/App.tsx ===
import { Toaster } from "@/components/ui/toaster";
import { Toaster as Sonner } from "@/components/ui/sonner";
import { TooltipProvider } from "@/components/ui/tooltip";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import Index from "./pages/Index";
import NotFound from "./pages/NotFound";
const queryClient = new QueryClient();
const App = () => (
<QueryClientProvider client={queryClient}>
<TooltipProvider>
<Toaster />
<Sonner />
<BrowserRouter>
<Routes>
<Route path="/" element={<Index />} />
{/* ADD ALL CUSTOM ROUTES ABOVE THE CATCH-ALL "*" ROUTE */}
<Route path="*" element={<NotFound />} />
</Routes>
</BrowserRouter>
</TooltipProvider>
</QueryClientProvider>
);
export default App;
=== src/components/made-with-dyad.tsx ===
export const MadeWithDyad = () => {
return (
<div className="p-4 text-center">
<a
href="https://www.dyad.sh/"
target="_blank"
rel="noopener noreferrer"
className="text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200"
>
Made with Dyad
</a>
</div>
);
};
=== src/components/ui/accordion.tsx ===
import * as React from "react";
import * as AccordionPrimitive from "@radix-ui/react-accordion";
import { ChevronDown } from "lucide-react";
import { cn } from "@/lib/utils";
const Accordion = AccordionPrimitive.Root;
const AccordionItem = React.forwardRef<
React.ElementRef<typeof AccordionPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
>(({ className, ...props }, ref) => (
<AccordionPrimitive.Item
ref={ref}
className={cn("border-b", className)}
{...props}
/>
));
AccordionItem.displayName = "AccordionItem";
const AccordionTrigger = React.forwardRef<
React.ElementRef<typeof AccordionPrimitive.Trigger>,
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
>(({ className, children, ...props }, ref) => (
<AccordionPrimitive.Header className="flex">
<AccordionPrimitive.Trigger
ref={ref}
className={cn(
"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
className,
)}
{...props}
>
{children}
<ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-200" />
</AccordionPrimitive.Trigger>
</AccordionPrimitive.Header>
));
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
const AccordionContent = React.forwardRef<
React.ElementRef<typeof AccordionPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
>(({ className, children, ...props }, ref) => (
<AccordionPrimitive.Content
ref={ref}
className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
{...props}
>
<div className={cn("pb-4 pt-0", className)}>{children}</div>
</AccordionPrimitive.Content>
));
AccordionContent.displayName = AccordionPrimitive.Content.displayName;
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
=== src/components/ui/alert-dialog.tsx ===
import * as React from "react";
import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
import { cn } from "@/lib/utils";
import { buttonVariants } from "@/components/ui/button";
const AlertDialog = AlertDialogPrimitive.Root;
const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
const AlertDialogPortal = AlertDialogPrimitive.Portal;
const AlertDialogOverlay = React.forwardRef<
React.ElementRef<typeof AlertDialogPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<AlertDialogPrimitive.Overlay
className={cn(
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
className,
)}
{...props}
ref={ref}
/>
));
AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
const AlertDialogContent = React.forwardRef<
React.ElementRef<typeof AlertDialogPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>
>(({ className, ...props }, ref) => (
<AlertDialogPortal>
<AlertDialogOverlay />
<AlertDialogPrimitive.Content
ref={ref}
className={cn(
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
className,
)}
{...props}
/>
</AlertDialogPortal>
));
AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
const AlertDialogHeader = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col space-y-2 text-center sm:text-left",
className,
)}
{...props}
/>
);
AlertDialogHeader.displayName = "AlertDialogHeader";
const AlertDialogFooter = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
className,
)}
{...props}
/>
);
AlertDialogFooter.displayName = "AlertDialogFooter";
const AlertDialogTitle = React.forwardRef<
React.ElementRef<typeof AlertDialogPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>
>(({ className, ...props }, ref) => (
<AlertDialogPrimitive.Title
ref={ref}
className={cn("text-lg font-semibold", className)}
{...props}
/>
));
AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
const AlertDialogDescription = React.forwardRef<
React.ElementRef<typeof AlertDialogPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>
>(({ className, ...props }, ref) => (
<AlertDialogPrimitive.Description
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
));
AlertDialogDescription.displayName =
AlertDialogPrimitive.Description.displayName;
const AlertDialogAction = React.forwardRef<
React.ElementRef<typeof AlertDialogPrimitive.Action>,
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>
>(({ className, ...props }, ref) => (
<AlertDialogPrimitive.Action
ref={ref}
className={cn(buttonVariants(), className)}
{...props}
/>
));
AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
const AlertDialogCancel = React.forwardRef<
React.ElementRef<typeof AlertDialogPrimitive.Cancel>,
React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>
>(({ className, ...props }, ref) => (
<AlertDialogPrimitive.Cancel
ref={ref}
className={cn(
buttonVariants({ variant: "outline" }),
"mt-2 sm:mt-0",
className,
)}
{...props}
/>
));
AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
export {
AlertDialog,
AlertDialogPortal,
AlertDialogOverlay,
AlertDialogTrigger,
AlertDialogContent,
AlertDialogHeader,
AlertDialogFooter,
AlertDialogTitle,
AlertDialogDescription,
AlertDialogAction,
AlertDialogCancel,
};
=== src/components/ui/alert.tsx ===
import * as React from "react";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
const alertVariants = cva(
"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
{
variants: {
variant: {
default: "bg-background text-foreground",
destructive:
"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive",
},
},
defaultVariants: {
variant: "default",
},
},
);
const Alert = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>
>(({ className, variant, ...props }, ref) => (
<div
ref={ref}
role="alert"
className={cn(alertVariants({ variant }), className)}
{...props}
/>
));
Alert.displayName = "Alert";
const AlertTitle = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLHeadingElement>
>(({ className, ...props }, ref) => (
<h5
ref={ref}
className={cn("mb-1 font-medium leading-none tracking-tight", className)}
{...props}
/>
));
AlertTitle.displayName = "AlertTitle";
const AlertDescription = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLParagraphElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("text-sm [&_p]:leading-relaxed", className)}
{...props}
/>
));
AlertDescription.displayName = "AlertDescription";
export { Alert, AlertTitle, AlertDescription };
=== src/components/ui/aspect-ratio.tsx ===
import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
const AspectRatio = AspectRatioPrimitive.Root;
export { AspectRatio };
=== src/components/ui/avatar.tsx ===
import * as React from "react";
import * as AvatarPrimitive from "@radix-ui/react-avatar";
import { cn } from "@/lib/utils";
const Avatar = React.forwardRef<
React.ElementRef<typeof AvatarPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>
>(({ className, ...props }, ref) => (
<AvatarPrimitive.Root
ref={ref}
className={cn(
"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
className,
)}
{...props}
/>
));
Avatar.displayName = AvatarPrimitive.Root.displayName;
const AvatarImage = React.forwardRef<
React.ElementRef<typeof AvatarPrimitive.Image>,
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>
>(({ className, ...props }, ref) => (
<AvatarPrimitive.Image
ref={ref}
className={cn("aspect-square h-full w-full", className)}
{...props}
/>
));
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
const AvatarFallback = React.forwardRef<
React.ElementRef<typeof AvatarPrimitive.Fallback>,
React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>
>(({ className, ...props }, ref) => (
<AvatarPrimitive.Fallback
ref={ref}
className={cn(
"flex h-full w-full items-center justify-center rounded-full bg-muted",
className,
)}
{...props}
/>
));
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
export { Avatar, AvatarImage, AvatarFallback };
=== src/components/ui/badge.tsx ===
import * as React from "react";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
const badgeVariants = cva(
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
{
variants: {
variant: {
default:
"border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
secondary:
"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
destructive:
"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
outline: "text-foreground",
},
},
defaultVariants: {
variant: "default",
},
},
);
export interface BadgeProps
extends React.HTMLAttributes<HTMLDivElement>,
VariantProps<typeof badgeVariants> {}
function Badge({ className, variant, ...props }: BadgeProps) {
return (
<div className={cn(badgeVariants({ variant }), className)} {...props} />
);
}
export { Badge, badgeVariants };
=== src/components/ui/breadcrumb.tsx ===
import * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { ChevronRight, MoreHorizontal } from "lucide-react";
import { cn } from "@/lib/utils";
const Breadcrumb = React.forwardRef<
HTMLElement,
React.ComponentPropsWithoutRef<"nav"> & {
separator?: React.ReactNode;
}
>(({ ...props }, ref) => <nav ref={ref} aria-label="breadcrumb" {...props} />);
Breadcrumb.displayName = "Breadcrumb";
const BreadcrumbList = React.forwardRef<
HTMLOListElement,
React.ComponentPropsWithoutRef<"ol">
>(({ className, ...props }, ref) => (
<ol
ref={ref}
className={cn(
"flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5",
className,
)}
{...props}
/>
));
BreadcrumbList.displayName = "BreadcrumbList";
const BreadcrumbItem = React.forwardRef<
HTMLLIElement,
React.ComponentPropsWithoutRef<"li">
>(({ className, ...props }, ref) => (
<li
ref={ref}
className={cn("inline-flex items-center gap-1.5", className)}
{...props}
/>
));
BreadcrumbItem.displayName = "BreadcrumbItem";
const BreadcrumbLink = React.forwardRef<
HTMLAnchorElement,
React.ComponentPropsWithoutRef<"a"> & {
asChild?: boolean;
}
>(({ asChild, className, ...props }, ref) => {
const Comp = asChild ? Slot : "a";
return (
<Comp
ref={ref}
className={cn("transition-colors hover:text-foreground", className)}
{...props}
/>
);
});
BreadcrumbLink.displayName = "BreadcrumbLink";
const BreadcrumbPage = React.forwardRef<
HTMLSpanElement,
React.ComponentPropsWithoutRef<"span">
>(({ className, ...props }, ref) => (
<span
ref={ref}
role="link"
aria-disabled="true"
aria-current="page"
className={cn("font-normal text-foreground", className)}
{...props}
/>
));
BreadcrumbPage.displayName = "BreadcrumbPage";
const BreadcrumbSeparator = ({
children,
className,
...props
}: React.ComponentProps<"li">) => (
<li
role="presentation"
aria-hidden="true"
className={cn("[&>svg]:size-3.5", className)}
{...props}
>
{children ?? <ChevronRight />}
</li>
);
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
const BreadcrumbEllipsis = ({
className,
...props
}: React.ComponentProps<"span">) => (
<span
role="presentation"
aria-hidden="true"
className={cn("flex h-9 w-9 items-center justify-center", className)}
{...props}
>
<MoreHorizontal className="h-4 w-4" />
<span className="sr-only">More</span>
</span>
);
BreadcrumbEllipsis.displayName = "BreadcrumbElipssis";
export {
Breadcrumb,
BreadcrumbList,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbPage,
BreadcrumbSeparator,
BreadcrumbEllipsis,
};
=== src/components/ui/button.tsx ===
import * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
{
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
destructive:
"bg-destructive text-destructive-foreground hover:bg-destructive/90",
outline:
"border border-input bg-background hover:bg-accent hover:text-accent-foreground",
secondary:
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-10 px-4 py-2",
sm: "h-9 rounded-md px-3",
lg: "h-11 rounded-md px-8",
icon: "h-10 w-10",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
},
);
export interface ButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
VariantProps<typeof buttonVariants> {
asChild?: boolean;
}
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
({ className, variant, size, asChild = false, ...props }, ref) => {
const Comp = asChild ? Slot : "button";
return (
<Comp
className={cn(buttonVariants({ variant, size, className }))}
ref={ref}
{...props}
/>
);
},
);
Button.displayName = "Button";
export { Button, buttonVariants };
=== src/components/ui/calendar.tsx ===
import * as React from "react";
import { ChevronLeft, ChevronRight } from "lucide-react";
import { DayPicker } from "react-day-picker";
import { cn } from "@/lib/utils";
import { buttonVariants } from "@/components/ui/button";
export type CalendarProps = React.ComponentProps<typeof DayPicker>;
function Calendar({
className,
classNames,
showOutsideDays = true,
...props
}: CalendarProps) {
return (
<DayPicker
showOutsideDays={showOutsideDays}
className={cn("p-3", className)}
classNames={{
months: "flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0",
month: "space-y-4",
caption: "flex justify-center pt-1 relative items-center",
caption_label: "text-sm font-medium",
nav: "space-x-1 flex items-center",
nav_button: cn(
buttonVariants({ variant: "outline" }),
"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100",
),
nav_button_previous: "absolute left-1",
nav_button_next: "absolute right-1",
table: "w-full border-collapse space-y-1",
head_row: "flex",
head_cell:
"text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]",
row: "flex w-full mt-2",
cell: "h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20",
day: cn(
buttonVariants({ variant: "ghost" }),
"h-9 w-9 p-0 font-normal aria-selected:opacity-100",
),
day_range_end: "day-range-end",
day_selected:
"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
day_today: "bg-accent text-accent-foreground",
day_outside:
"day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30",
day_disabled: "text-muted-foreground opacity-50",
day_range_middle:
"aria-selected:bg-accent aria-selected:text-accent-foreground",
day_hidden: "invisible",
...classNames,
}}
components={{
IconLeft: ({ ..._props }) => <ChevronLeft className="h-4 w-4" />,
IconRight: ({ ..._props }) => <ChevronRight className="h-4 w-4" />,
}}
{...props}
/>
);
}
Calendar.displayName = "Calendar";
export { Calendar };
=== src/components/ui/card.tsx ===
import * as React from "react";
import { cn } from "@/lib/utils";
const Card = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn(
"rounded-lg border bg-card text-card-foreground shadow-sm",
className,
)}
{...props}
/>
));
Card.displayName = "Card";
const CardHeader = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex flex-col space-y-1.5 p-6", className)}
{...props}
/>
));
CardHeader.displayName = "CardHeader";
const CardTitle = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLHeadingElement>
>(({ className, ...props }, ref) => (
<h3
ref={ref}
className={cn(
"text-2xl font-semibold leading-none tracking-tight",
className,
)}
{...props}
/>
));
CardTitle.displayName = "CardTitle";
const CardDescription = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLParagraphElement>
>(({ className, ...props }, ref) => (
<p
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
));
CardDescription.displayName = "CardDescription";
const CardContent = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div ref={ref} className={cn("p-6 pt-0", className)} {...props} />
));
CardContent.displayName = "CardContent";
const CardFooter = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => (
<div
ref={ref}
className={cn("flex items-center p-6 pt-0", className)}
{...props}
/>
));
CardFooter.displayName = "CardFooter";
export {
Card,
CardHeader,
CardFooter,
CardTitle,
CardDescription,
CardContent,
};
=== src/components/ui/carousel.tsx ===
import * as React from "react";
import useEmblaCarousel, {
type UseEmblaCarouselType,
} from "embla-carousel-react";
import { ArrowLeft, ArrowRight } from "lucide-react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
type CarouselApi = UseEmblaCarouselType[1];
type UseCarouselParameters = Parameters<typeof useEmblaCarousel>;
type CarouselOptions = UseCarouselParameters[0];
type CarouselPlugin = UseCarouselParameters[1];
type CarouselProps = {
opts?: CarouselOptions;
plugins?: CarouselPlugin;
orientation?: "horizontal" | "vertical";
setApi?: (api: CarouselApi) => void;
};
type CarouselContextProps = {
carouselRef: ReturnType<typeof useEmblaCarousel>[0];
api: ReturnType<typeof useEmblaCarousel>[1];
scrollPrev: () => void;
scrollNext: () => void;
canScrollPrev: boolean;
canScrollNext: boolean;
} & CarouselProps;
const CarouselContext = React.createContext<CarouselContextProps | null>(null);
function useCarousel() {
const context = React.useContext(CarouselContext);
if (!context) {
throw new Error("useCarousel must be used within a <Carousel />");
}
return context;
}
const Carousel = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement> & CarouselProps
>(
(
{
orientation = "horizontal",
opts,
setApi,
plugins,
className,
children,
...props
},
ref,
) => {
const [carouselRef, api] = useEmblaCarousel(
{
...opts,
axis: orientation === "horizontal" ? "x" : "y",
},
plugins,
);
const [canScrollPrev, setCanScrollPrev] = React.useState(false);
const [canScrollNext, setCanScrollNext] = React.useState(false);
const onSelect = React.useCallback((api: CarouselApi) => {
if (!api) {
return;
}
setCanScrollPrev(api.canScrollPrev());
setCanScrollNext(api.canScrollNext());
}, []);
const scrollPrev = React.useCallback(() => {
api?.scrollPrev();
}, [api]);
const scrollNext = React.useCallback(() => {
api?.scrollNext();
}, [api]);
const handleKeyDown = React.useCallback(
(event: React.KeyboardEvent<HTMLDivElement>) => {
if (event.key === "ArrowLeft") {
event.preventDefault();
scrollPrev();
} else if (event.key === "ArrowRight") {
event.preventDefault();
scrollNext();
}
},
[scrollPrev, scrollNext],
);
React.useEffect(() => {
if (!api || !setApi) {
return;
}
setApi(api);
}, [api, setApi]);
React.useEffect(() => {
if (!api) {
return;
}
onSelect(api);
api.on("reInit", onSelect);
api.on("select", onSelect);
return () => {
api?.off("select", onSelect);
};
}, [api, onSelect]);
return (
<CarouselContext.Provider
value={{
carouselRef,
api: api,
opts,
orientation:
orientation || (opts?.axis === "y" ? "vertical" : "horizontal"),
scrollPrev,
scrollNext,
canScrollPrev,
canScrollNext,
}}
>
<div
ref={ref}
onKeyDownCapture={handleKeyDown}
className={cn("relative", className)}
role="region"
aria-roledescription="carousel"
{...props}
>
{children}
</div>
</CarouselContext.Provider>
);
},
);
Carousel.displayName = "Carousel";
const CarouselContent = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => {
const { carouselRef, orientation } = useCarousel();
return (
<div ref={carouselRef} className="overflow-hidden">
<div
ref={ref}
className={cn(
"flex",
orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col",
className,
)}
{...props}
/>
</div>
);
});
CarouselContent.displayName = "CarouselContent";
const CarouselItem = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => {
const { orientation } = useCarousel();
return (
<div
ref={ref}
role="group"
aria-roledescription="slide"
className={cn(
"min-w-0 shrink-0 grow-0 basis-full",
orientation === "horizontal" ? "pl-4" : "pt-4",
className,
)}
{...props}
/>
);
});
CarouselItem.displayName = "CarouselItem";
const CarouselPrevious = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<typeof Button>
>(({ className, variant = "outline", size = "icon", ...props }, ref) => {
const { orientation, scrollPrev, canScrollPrev } = useCarousel();
return (
<Button
ref={ref}
variant={variant}
size={size}
className={cn(
"absolute h-8 w-8 rounded-full",
orientation === "horizontal"
? "-left-12 top-1/2 -translate-y-1/2"
: "-top-12 left-1/2 -translate-x-1/2 rotate-90",
className,
)}
disabled={!canScrollPrev}
onClick={scrollPrev}
{...props}
>
<ArrowLeft className="h-4 w-4" />
<span className="sr-only">Previous slide</span>
</Button>
);
});
CarouselPrevious.displayName = "CarouselPrevious";
const CarouselNext = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<typeof Button>
>(({ className, variant = "outline", size = "icon", ...props }, ref) => {
const { orientation, scrollNext, canScrollNext } = useCarousel();
return (
<Button
ref={ref}
variant={variant}
size={size}
className={cn(
"absolute h-8 w-8 rounded-full",
orientation === "horizontal"
? "-right-12 top-1/2 -translate-y-1/2"
: "-bottom-12 left-1/2 -translate-x-1/2 rotate-90",
className,
)}
disabled={!canScrollNext}
onClick={scrollNext}
{...props}
>
<ArrowRight className="h-4 w-4" />
<span className="sr-only">Next slide</span>
</Button>
);
});
CarouselNext.displayName = "CarouselNext";
export {
type CarouselApi,
Carousel,
CarouselContent,
CarouselItem,
CarouselPrevious,
CarouselNext,
};
=== src/components/ui/chart.tsx ===
import * as React from "react";
import * as RechartsPrimitive from "recharts";
import { cn } from "@/lib/utils";
// Format: { THEME_NAME: CSS_SELECTOR }
const THEMES = { light: "", dark: ".dark" } as const;
export type ChartConfig = {
[k in string]: {
label?: React.ReactNode;
icon?: React.ComponentType;
} & (
| { color?: string; theme?: never }
| { color?: never; theme: Record<keyof typeof THEMES, string> }
);
};
type ChartContextProps = {
config: ChartConfig;
};
const ChartContext = React.createContext<ChartContextProps | null>(null);
function useChart() {
const context = React.useContext(ChartContext);
if (!context) {
throw new Error("useChart must be used within a <ChartContainer />");
}
return context;
}
const ChartContainer = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div"> & {
config: ChartConfig;
children: React.ComponentProps<
typeof RechartsPrimitive.ResponsiveContainer
>["children"];
}
>(({ id, className, children, config, ...props }, ref) => {
const uniqueId = React.useId();
const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
return (
<ChartContext.Provider value={{ config }}>
<div
data-chart={chartId}
ref={ref}
className={cn(
"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none",
className,
)}
{...props}
>
<ChartStyle id={chartId} config={config} />
<RechartsPrimitive.ResponsiveContainer>
{children}
</RechartsPrimitive.ResponsiveContainer>
</div>
</ChartContext.Provider>
);
});
ChartContainer.displayName = "Chart";
const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
const colorConfig = Object.entries(config).filter(
([_, config]) => config.theme || config.color,
);
if (!colorConfig.length) {
return null;
}
return (
<style
dangerouslySetInnerHTML={{
__html: Object.entries(THEMES)
.map(
([theme, prefix]) => `
${prefix} [data-chart=${id}] {
${colorConfig
.map(([key, itemConfig]) => {
const color =
itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||
itemConfig.color;
return color ? ` --color-${key}: ${color};` : null;
})
.join("\n")}
}
`,
)
.join("\n"),
}}
/>
);
};
const ChartTooltip = RechartsPrimitive.Tooltip;
const ChartTooltipContent = React.forwardRef<
HTMLDivElement,
React.ComponentProps<typeof RechartsPrimitive.Tooltip> &
React.ComponentProps<"div"> & {
hideLabel?: boolean;
hideIndicator?: boolean;
indicator?: "line" | "dot" | "dashed";
nameKey?: string;
labelKey?: string;
}
>(
(
{
active,
payload,
className,
indicator = "dot",
hideLabel = false,
hideIndicator = false,
label,
labelFormatter,
labelClassName,
formatter,
color,
nameKey,
labelKey,
},
ref,
) => {
const { config } = useChart();
const tooltipLabel = React.useMemo(() => {
if (hideLabel || !payload?.length) {
return null;
}
const [item] = payload;
const key = `${labelKey || item.dataKey || item.name || "value"}`;
const itemConfig = getPayloadConfigFromPayload(config, item, key);
const value =
!labelKey && typeof label === "string"
? config[label as keyof typeof config]?.label || label
: itemConfig?.label;
if (labelFormatter) {
return (
<div className={cn("font-medium", labelClassName)}>
{labelFormatter(value, payload)}
</div>
);
}
if (!value) {
return null;
}
return <div className={cn("font-medium", labelClassName)}>{value}</div>;
}, [
label,
labelFormatter,
payload,
hideLabel,
labelClassName,
config,
labelKey,
]);
if (!active || !payload?.length) {
return null;
}
const nestLabel = payload.length === 1 && indicator !== "dot";
return (
<div
ref={ref}
className={cn(
"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl",
className,
)}
>
{!nestLabel ? tooltipLabel : null}
<div className="grid gap-1.5">
{payload.map((item, index) => {
const key = `${nameKey || item.name || item.dataKey || "value"}`;
const itemConfig = getPayloadConfigFromPayload(config, item, key);
const indicatorColor = color || item.payload.fill || item.color;
return (
<div
key={item.dataKey}
className={cn(
"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground",
indicator === "dot" && "items-center",
)}
>
{formatter && item?.value !== undefined && item.name ? (
formatter(item.value, item.name, item, index, item.payload)
) : (
<>
{itemConfig?.icon ? (
<itemConfig.icon />
) : (
!hideIndicator && (
<div
className={cn(
"shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]",
{
"h-2.5 w-2.5": indicator === "dot",
"w-1": indicator === "line",
"w-0 border-[1.5px] border-dashed bg-transparent":
indicator === "dashed",
"my-0.5": nestLabel && indicator === "dashed",
},
)}
style={
{
"--color-bg": indicatorColor,
"--color-border": indicatorColor,
} as React.CSSProperties
}
/>
)
)}
<div
className={cn(
"flex flex-1 justify-between leading-none",
nestLabel ? "items-end" : "items-center",
)}
>
<div className="grid gap-1.5">
{nestLabel ? tooltipLabel : null}
<span className="text-muted-foreground">
{itemConfig?.label || item.name}
</span>
</div>
{item.value && (
<span className="font-mono font-medium tabular-nums text-foreground">
{item.value.toLocaleString()}
</span>
)}
</div>
</>
)}
</div>
);
})}
</div>
</div>
);
},
);
ChartTooltipContent.displayName = "ChartTooltip";
const ChartLegend = RechartsPrimitive.Legend;
const ChartLegendContent = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div"> &
Pick<RechartsPrimitive.LegendProps, "payload" | "verticalAlign"> & {
hideIcon?: boolean;
nameKey?: string;
}
>(
(
{ className, hideIcon = false, payload, verticalAlign = "bottom", nameKey },
ref,
) => {
const { config } = useChart();
if (!payload?.length) {
return null;
}
return (
<div
ref={ref}
className={cn(
"flex items-center justify-center gap-4",
verticalAlign === "top" ? "pb-3" : "pt-3",
className,
)}
>
{payload.map((item) => {
const key = `${nameKey || item.dataKey || "value"}`;
const itemConfig = getPayloadConfigFromPayload(config, item, key);
return (
<div
key={item.value}
className={cn(
"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground",
)}
>
{itemConfig?.icon && !hideIcon ? (
<itemConfig.icon />
) : (
<div
className="h-2 w-2 shrink-0 rounded-[2px]"
style={{
backgroundColor: item.color,
}}
/>
)}
{itemConfig?.label}
</div>
);
})}
</div>
);
},
);
ChartLegendContent.displayName = "ChartLegend";
// Helper to extract item config from a payload.
function getPayloadConfigFromPayload(
config: ChartConfig,
payload: unknown,
key: string,
) {
if (typeof payload !== "object" || payload === null) {
return undefined;
}
const payloadPayload =
"payload" in payload &&
typeof payload.payload === "object" &&
payload.payload !== null
? payload.payload
: undefined;
let configLabelKey: string = key;
if (
key in payload &&
typeof payload[key as keyof typeof payload] === "string"
) {
configLabelKey = payload[key as keyof typeof payload] as string;
} else if (
payloadPayload &&
key in payloadPayload &&
typeof payloadPayload[key as keyof typeof payloadPayload] === "string"
) {
configLabelKey = payloadPayload[
key as keyof typeof payloadPayload
] as string;
}
return configLabelKey in config
? config[configLabelKey]
: config[key as keyof typeof config];
}
export {
ChartContainer,
ChartTooltip,
ChartTooltipContent,
ChartLegend,
ChartLegendContent,
ChartStyle,
};
=== src/components/ui/checkbox.tsx ===
import * as React from "react";
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
import { Check } from "lucide-react";
import { cn } from "@/lib/utils";
const Checkbox = React.forwardRef<
React.ElementRef<typeof CheckboxPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>
>(({ className, ...props }, ref) => (
<CheckboxPrimitive.Root
ref={ref}
className={cn(
"peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
className,
)}
{...props}
>
<CheckboxPrimitive.Indicator
className={cn("flex items-center justify-center text-current")}
>
<Check className="h-4 w-4" />
</CheckboxPrimitive.Indicator>
</CheckboxPrimitive.Root>
));
Checkbox.displayName = CheckboxPrimitive.Root.displayName;
export { Checkbox };
=== src/components/ui/collapsible.tsx ===
import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
const Collapsible = CollapsiblePrimitive.Root;
const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;
const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;
export { Collapsible, CollapsibleTrigger, CollapsibleContent };
=== src/components/ui/command.tsx ===
import * as React from "react";
import { type DialogProps } from "@radix-ui/react-dialog";
import { Command as CommandPrimitive } from "cmdk";
import { Search } from "lucide-react";
import { cn } from "@/lib/utils";
import { Dialog, DialogContent } from "@/components/ui/dialog";
const Command = React.forwardRef<
React.ElementRef<typeof CommandPrimitive>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive>
>(({ className, ...props }, ref) => (
<CommandPrimitive
ref={ref}
className={cn(
"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
className,
)}
{...props}
/>
));
Command.displayName = CommandPrimitive.displayName;
interface CommandDialogProps extends DialogProps {}
const CommandDialog = ({ children, ...props }: CommandDialogProps) => {
return (
<Dialog {...props}>
<DialogContent className="overflow-hidden p-0 shadow-lg">
<Command className="[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5">
{children}
</Command>
</DialogContent>
</Dialog>
);
};
const CommandInput = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.Input>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>
>(({ className, ...props }, ref) => (
<div className="flex items-center border-b px-3" cmdk-input-wrapper="">
<Search className="mr-2 h-4 w-4 shrink-0 opacity-50" />
<CommandPrimitive.Input
ref={ref}
className={cn(
"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
className,
)}
{...props}
/>
</div>
));
CommandInput.displayName = CommandPrimitive.Input.displayName;
const CommandList = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.List>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>
>(({ className, ...props }, ref) => (
<CommandPrimitive.List
ref={ref}
className={cn("max-h-[300px] overflow-y-auto overflow-x-hidden", className)}
{...props}
/>
));
CommandList.displayName = CommandPrimitive.List.displayName;
const CommandEmpty = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.Empty>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>
>((props, ref) => (
<CommandPrimitive.Empty
ref={ref}
className="py-6 text-center text-sm"
{...props}
/>
));
CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
const CommandGroup = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.Group>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>
>(({ className, ...props }, ref) => (
<CommandPrimitive.Group
ref={ref}
className={cn(
"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground",
className,
)}
{...props}
/>
));
CommandGroup.displayName = CommandPrimitive.Group.displayName;
const CommandSeparator = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.Separator>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>
>(({ className, ...props }, ref) => (
<CommandPrimitive.Separator
ref={ref}
className={cn("-mx-1 h-px bg-border", className)}
{...props}
/>
));
CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
const CommandItem = React.forwardRef<
React.ElementRef<typeof CommandPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>
>(({ className, ...props }, ref) => (
<CommandPrimitive.Item
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50",
className,
)}
{...props}
/>
));
CommandItem.displayName = CommandPrimitive.Item.displayName;
const CommandShortcut = ({
className,
...props
}: React.HTMLAttributes<HTMLSpanElement>) => {
return (
<span
className={cn(
"ml-auto text-xs tracking-widest text-muted-foreground",
className,
)}
{...props}
/>
);
};
CommandShortcut.displayName = "CommandShortcut";
export {
Command,
CommandDialog,
CommandInput,
CommandList,
CommandEmpty,
CommandGroup,
CommandItem,
CommandShortcut,
CommandSeparator,
};
=== src/components/ui/context-menu.tsx ===
import * as React from "react";
import * as ContextMenuPrimitive from "@radix-ui/react-context-menu";
import { Check, ChevronRight, Circle } from "lucide-react";
import { cn } from "@/lib/utils";
const ContextMenu = ContextMenuPrimitive.Root;
const ContextMenuTrigger = ContextMenuPrimitive.Trigger;
const ContextMenuGroup = ContextMenuPrimitive.Group;
const ContextMenuPortal = ContextMenuPrimitive.Portal;
const ContextMenuSub = ContextMenuPrimitive.Sub;
const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup;
const ContextMenuSubTrigger = React.forwardRef<
React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {
inset?: boolean;
}
>(({ className, inset, children, ...props }, ref) => (
<ContextMenuPrimitive.SubTrigger
ref={ref}
className={cn(
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
inset && "pl-8",
className,
)}
{...props}
>
{children}
<ChevronRight className="ml-auto h-4 w-4" />
</ContextMenuPrimitive.SubTrigger>
));
ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName;
const ContextMenuSubContent = React.forwardRef<
React.ElementRef<typeof ContextMenuPrimitive.SubContent>,
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>
>(({ className, ...props }, ref) => (
<ContextMenuPrimitive.SubContent
ref={ref}
className={cn(
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
/>
));
ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName;
const ContextMenuContent = React.forwardRef<
React.ElementRef<typeof ContextMenuPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>
>(({ className, ...props }, ref) => (
<ContextMenuPrimitive.Portal>
<ContextMenuPrimitive.Content
ref={ref}
className={cn(
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
/>
</ContextMenuPrimitive.Portal>
));
ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName;
const ContextMenuItem = React.forwardRef<
React.ElementRef<typeof ContextMenuPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {
inset?: boolean;
}
>(({ className, inset, ...props }, ref) => (
<ContextMenuPrimitive.Item
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
inset && "pl-8",
className,
)}
{...props}
/>
));
ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName;
const ContextMenuCheckboxItem = React.forwardRef<
React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>
>(({ className, children, checked, ...props }, ref) => (
<ContextMenuPrimitive.CheckboxItem
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className,
)}
checked={checked}
{...props}
>
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<ContextMenuPrimitive.ItemIndicator>
<Check className="h-4 w-4" />
</ContextMenuPrimitive.ItemIndicator>
</span>
{children}
</ContextMenuPrimitive.CheckboxItem>
));
ContextMenuCheckboxItem.displayName =
ContextMenuPrimitive.CheckboxItem.displayName;
const ContextMenuRadioItem = React.forwardRef<
React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>
>(({ className, children, ...props }, ref) => (
<ContextMenuPrimitive.RadioItem
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className,
)}
{...props}
>
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<ContextMenuPrimitive.ItemIndicator>
<Circle className="h-2 w-2 fill-current" />
</ContextMenuPrimitive.ItemIndicator>
</span>
{children}
</ContextMenuPrimitive.RadioItem>
));
ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName;
const ContextMenuLabel = React.forwardRef<
React.ElementRef<typeof ContextMenuPrimitive.Label>,
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {
inset?: boolean;
}
>(({ className, inset, ...props }, ref) => (
<ContextMenuPrimitive.Label
ref={ref}
className={cn(
"px-2 py-1.5 text-sm font-semibold text-foreground",
inset && "pl-8",
className,
)}
{...props}
/>
));
ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName;
const ContextMenuSeparator = React.forwardRef<
React.ElementRef<typeof ContextMenuPrimitive.Separator>,
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>
>(({ className, ...props }, ref) => (
<ContextMenuPrimitive.Separator
ref={ref}
className={cn("-mx-1 my-1 h-px bg-border", className)}
{...props}
/>
));
ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName;
const ContextMenuShortcut = ({
className,
...props
}: React.HTMLAttributes<HTMLSpanElement>) => {
return (
<span
className={cn(
"ml-auto text-xs tracking-widest text-muted-foreground",
className,
)}
{...props}
/>
);
};
ContextMenuShortcut.displayName = "ContextMenuShortcut";
export {
ContextMenu,
ContextMenuTrigger,
ContextMenuContent,
ContextMenuItem,
ContextMenuCheckboxItem,
ContextMenuRadioItem,
ContextMenuLabel,
ContextMenuSeparator,
ContextMenuShortcut,
ContextMenuGroup,
ContextMenuPortal,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuRadioGroup,
};
=== src/components/ui/dialog.tsx ===
import * as React from "react";
import * as DialogPrimitive from "@radix-ui/react-dialog";
import { X } from "lucide-react";
import { cn } from "@/lib/utils";
const Dialog = DialogPrimitive.Root;
const DialogTrigger = DialogPrimitive.Trigger;
const DialogPortal = DialogPrimitive.Portal;
const DialogClose = DialogPrimitive.Close;
const DialogOverlay = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Overlay
ref={ref}
className={cn(
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
className,
)}
{...props}
/>
));
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
const DialogContent = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
>(({ className, children, ...props }, ref) => (
<DialogPortal>
<DialogOverlay />
<DialogPrimitive.Content
ref={ref}
className={cn(
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
className,
)}
{...props}
>
{children}
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
<X className="h-4 w-4" />
<span className="sr-only">Close</span>
</DialogPrimitive.Close>
</DialogPrimitive.Content>
</DialogPortal>
));
DialogContent.displayName = DialogPrimitive.Content.displayName;
const DialogHeader = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col space-y-1.5 text-center sm:text-left",
className,
)}
{...props}
/>
);
DialogHeader.displayName = "DialogHeader";
const DialogFooter = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
className,
)}
{...props}
/>
);
DialogFooter.displayName = "DialogFooter";
const DialogTitle = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Title
ref={ref}
className={cn(
"text-lg font-semibold leading-none tracking-tight",
className,
)}
{...props}
/>
));
DialogTitle.displayName = DialogPrimitive.Title.displayName;
const DialogDescription = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Description
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
));
DialogDescription.displayName = DialogPrimitive.Description.displayName;
export {
Dialog,
DialogPortal,
DialogOverlay,
DialogClose,
DialogTrigger,
DialogContent,
DialogHeader,
DialogFooter,
DialogTitle,
DialogDescription,
};
=== src/components/ui/drawer.tsx ===
import * as React from "react";
import { Drawer as DrawerPrimitive } from "vaul";
import { cn } from "@/lib/utils";
const Drawer = ({
shouldScaleBackground = true,
...props
}: React.ComponentProps<typeof DrawerPrimitive.Root>) => (
<DrawerPrimitive.Root
shouldScaleBackground={shouldScaleBackground}
{...props}
/>
);
Drawer.displayName = "Drawer";
const DrawerTrigger = DrawerPrimitive.Trigger;
const DrawerPortal = DrawerPrimitive.Portal;
const DrawerClose = DrawerPrimitive.Close;
const DrawerOverlay = React.forwardRef<
React.ElementRef<typeof DrawerPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<DrawerPrimitive.Overlay
ref={ref}
className={cn("fixed inset-0 z-50 bg-black/80", className)}
{...props}
/>
));
DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
const DrawerContent = React.forwardRef<
React.ElementRef<typeof DrawerPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>
>(({ className, children, ...props }, ref) => (
<DrawerPortal>
<DrawerOverlay />
<DrawerPrimitive.Content
ref={ref}
className={cn(
"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background",
className,
)}
{...props}
>
<div className="mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted" />
{children}
</DrawerPrimitive.Content>
</DrawerPortal>
));
DrawerContent.displayName = "DrawerContent";
const DrawerHeader = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn("grid gap-1.5 p-4 text-center sm:text-left", className)}
{...props}
/>
);
DrawerHeader.displayName = "DrawerHeader";
const DrawerFooter = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn("mt-auto flex flex-col gap-2 p-4", className)}
{...props}
/>
);
DrawerFooter.displayName = "DrawerFooter";
const DrawerTitle = React.forwardRef<
React.ElementRef<typeof DrawerPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>
>(({ className, ...props }, ref) => (
<DrawerPrimitive.Title
ref={ref}
className={cn(
"text-lg font-semibold leading-none tracking-tight",
className,
)}
{...props}
/>
));
DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
const DrawerDescription = React.forwardRef<
React.ElementRef<typeof DrawerPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>
>(({ className, ...props }, ref) => (
<DrawerPrimitive.Description
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
));
DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
export {
Drawer,
DrawerPortal,
DrawerOverlay,
DrawerTrigger,
DrawerClose,
DrawerContent,
DrawerHeader,
DrawerFooter,
DrawerTitle,
DrawerDescription,
};
=== src/components/ui/dropdown-menu.tsx ===
import * as React from "react";
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu";
import { Check, ChevronRight, Circle } from "lucide-react";
import { cn } from "@/lib/utils";
const DropdownMenu = DropdownMenuPrimitive.Root;
const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
const DropdownMenuGroup = DropdownMenuPrimitive.Group;
const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
const DropdownMenuSub = DropdownMenuPrimitive.Sub;
const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
const DropdownMenuSubTrigger = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
inset?: boolean;
}
>(({ className, inset, children, ...props }, ref) => (
<DropdownMenuPrimitive.SubTrigger
ref={ref}
className={cn(
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",
inset && "pl-8",
className,
)}
{...props}
>
{children}
<ChevronRight className="ml-auto h-4 w-4" />
</DropdownMenuPrimitive.SubTrigger>
));
DropdownMenuSubTrigger.displayName =
DropdownMenuPrimitive.SubTrigger.displayName;
const DropdownMenuSubContent = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
>(({ className, ...props }, ref) => (
<DropdownMenuPrimitive.SubContent
ref={ref}
className={cn(
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
/>
));
DropdownMenuSubContent.displayName =
DropdownMenuPrimitive.SubContent.displayName;
const DropdownMenuContent = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>
>(({ className, sideOffset = 4, ...props }, ref) => (
<DropdownMenuPrimitive.Portal>
<DropdownMenuPrimitive.Content
ref={ref}
sideOffset={sideOffset}
className={cn(
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
/>
</DropdownMenuPrimitive.Portal>
));
DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
const DropdownMenuItem = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {
inset?: boolean;
}
>(({ className, inset, ...props }, ref) => (
<DropdownMenuPrimitive.Item
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
inset && "pl-8",
className,
)}
{...props}
/>
));
DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
const DropdownMenuCheckboxItem = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>
>(({ className, children, checked, ...props }, ref) => (
<DropdownMenuPrimitive.CheckboxItem
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className,
)}
checked={checked}
{...props}
>
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<DropdownMenuPrimitive.ItemIndicator>
<Check className="h-4 w-4" />
</DropdownMenuPrimitive.ItemIndicator>
</span>
{children}
</DropdownMenuPrimitive.CheckboxItem>
));
DropdownMenuCheckboxItem.displayName =
DropdownMenuPrimitive.CheckboxItem.displayName;
const DropdownMenuRadioItem = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>
>(({ className, children, ...props }, ref) => (
<DropdownMenuPrimitive.RadioItem
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className,
)}
{...props}
>
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<DropdownMenuPrimitive.ItemIndicator>
<Circle className="h-2 w-2 fill-current" />
</DropdownMenuPrimitive.ItemIndicator>
</span>
{children}
</DropdownMenuPrimitive.RadioItem>
));
DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
const DropdownMenuLabel = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.Label>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {
inset?: boolean;
}
>(({ className, inset, ...props }, ref) => (
<DropdownMenuPrimitive.Label
ref={ref}
className={cn(
"px-2 py-1.5 text-sm font-semibold",
inset && "pl-8",
className,
)}
{...props}
/>
));
DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
const DropdownMenuSeparator = React.forwardRef<
React.ElementRef<typeof DropdownMenuPrimitive.Separator>,
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>
>(({ className, ...props }, ref) => (
<DropdownMenuPrimitive.Separator
ref={ref}
className={cn("-mx-1 my-1 h-px bg-muted", className)}
{...props}
/>
));
DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
const DropdownMenuShortcut = ({
className,
...props
}: React.HTMLAttributes<HTMLSpanElement>) => {
return (
<span
className={cn("ml-auto text-xs tracking-widest opacity-60", className)}
{...props}
/>
);
};
DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
export {
DropdownMenu,
DropdownMenuTrigger,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuCheckboxItem,
DropdownMenuRadioItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuGroup,
DropdownMenuPortal,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuRadioGroup,
};
=== src/components/ui/form.tsx ===
import * as React from "react";
import * as LabelPrimitive from "@radix-ui/react-label";
import { Slot } from "@radix-ui/react-slot";
import {
Controller,
ControllerProps,
FieldPath,
FieldValues,
FormProvider,
useFormContext,
} from "react-hook-form";
import { cn } from "@/lib/utils";
import { Label } from "@/components/ui/label";
const Form = FormProvider;
type FormFieldContextValue<
TFieldValues extends FieldValues = FieldValues,
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
> = {
name: TName;
};
const FormFieldContext = React.createContext<FormFieldContextValue>(
{} as FormFieldContextValue,
);
const FormField = <
TFieldValues extends FieldValues = FieldValues,
TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
>({
...props
}: ControllerProps<TFieldValues, TName>) => {
return (
<FormFieldContext.Provider value={{ name: props.name }}>
<Controller {...props} />
</FormFieldContext.Provider>
);
};
const useFormField = () => {
const fieldContext = React.useContext(FormFieldContext);
const itemContext = React.useContext(FormItemContext);
const { getFieldState, formState } = useFormContext();
const fieldState = getFieldState(fieldContext.name, formState);
if (!fieldContext) {
throw new Error("useFormField should be used within <FormField>");
}
const { id } = itemContext;
return {
id,
name: fieldContext.name,
formItemId: `${id}-form-item`,
formDescriptionId: `${id}-form-item-description`,
formMessageId: `${id}-form-item-message`,
...fieldState,
};
};
type FormItemContextValue = {
id: string;
};
const FormItemContext = React.createContext<FormItemContextValue>(
{} as FormItemContextValue,
);
const FormItem = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => {
const id = React.useId();
return (
<FormItemContext.Provider value={{ id }}>
<div ref={ref} className={cn("space-y-2", className)} {...props} />
</FormItemContext.Provider>
);
});
FormItem.displayName = "FormItem";
const FormLabel = React.forwardRef<
React.ElementRef<typeof LabelPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>
>(({ className, ...props }, ref) => {
const { error, formItemId } = useFormField();
return (
<Label
ref={ref}
className={cn(error && "text-destructive", className)}
htmlFor={formItemId}
{...props}
/>
);
});
FormLabel.displayName = "FormLabel";
const FormControl = React.forwardRef<
React.ElementRef<typeof Slot>,
React.ComponentPropsWithoutRef<typeof Slot>
>(({ ...props }, ref) => {
const { error, formItemId, formDescriptionId, formMessageId } =
useFormField();
return (
<Slot
ref={ref}
id={formItemId}
aria-describedby={
!error
? `${formDescriptionId}`
: `${formDescriptionId} ${formMessageId}`
}
aria-invalid={!!error}
{...props}
/>
);
});
FormControl.displayName = "FormControl";
const FormDescription = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLParagraphElement>
>(({ className, ...props }, ref) => {
const { formDescriptionId } = useFormField();
return (
<p
ref={ref}
id={formDescriptionId}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
);
});
FormDescription.displayName = "FormDescription";
const FormMessage = React.forwardRef<
HTMLParagraphElement,
React.HTMLAttributes<HTMLParagraphElement>
>(({ className, children, ...props }, ref) => {
const { error, formMessageId } = useFormField();
const body = error ? String(error?.message) : children;
if (!body) {
return null;
}
return (
<p
ref={ref}
id={formMessageId}
className={cn("text-sm font-medium text-destructive", className)}
{...props}
>
{body}
</p>
);
});
FormMessage.displayName = "FormMessage";
export {
useFormField,
Form,
FormItem,
FormLabel,
FormControl,
FormDescription,
FormMessage,
FormField,
};
=== src/components/ui/hover-card.tsx ===
import * as React from "react";
import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
import { cn } from "@/lib/utils";
const HoverCard = HoverCardPrimitive.Root;
const HoverCardTrigger = HoverCardPrimitive.Trigger;
const HoverCardContent = React.forwardRef<
React.ElementRef<typeof HoverCardPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>
>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
<HoverCardPrimitive.Content
ref={ref}
align={align}
sideOffset={sideOffset}
className={cn(
"z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
/>
));
HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;
export { HoverCard, HoverCardTrigger, HoverCardContent };
=== src/components/ui/input-otp.tsx ===
import * as React from "react";
import { OTPInput, OTPInputContext } from "input-otp";
import { Dot } from "lucide-react";
import { cn } from "@/lib/utils";
const InputOTP = React.forwardRef<
React.ElementRef<typeof OTPInput>,
React.ComponentPropsWithoutRef<typeof OTPInput>
>(({ className, containerClassName, ...props }, ref) => (
<OTPInput
ref={ref}
containerClassName={cn(
"flex items-center gap-2 has-[:disabled]:opacity-50",
containerClassName,
)}
className={cn("disabled:cursor-not-allowed", className)}
{...props}
/>
));
InputOTP.displayName = "InputOTP";
const InputOTPGroup = React.forwardRef<
React.ElementRef<"div">,
React.ComponentPropsWithoutRef<"div">
>(({ className, ...props }, ref) => (
<div ref={ref} className={cn("flex items-center", className)} {...props} />
));
InputOTPGroup.displayName = "InputOTPGroup";
const InputOTPSlot = React.forwardRef<
React.ElementRef<"div">,
React.ComponentPropsWithoutRef<"div"> & { index: number }
>(({ index, className, ...props }, ref) => {
const inputOTPContext = React.useContext(OTPInputContext);
const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index];
return (
<div
ref={ref}
className={cn(
"relative flex h-10 w-10 items-center justify-center border-y border-r border-input text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md",
isActive && "z-10 ring-2 ring-ring ring-offset-background",
className,
)}
{...props}
>
{char}
{hasFakeCaret && (
<div className="pointer-events-none absolute inset-0 flex items-center justify-center">
<div className="h-4 w-px animate-caret-blink bg-foreground duration-1000" />
</div>
)}
</div>
);
});
InputOTPSlot.displayName = "InputOTPSlot";
const InputOTPSeparator = React.forwardRef<
React.ElementRef<"div">,
React.ComponentPropsWithoutRef<"div">
>(({ ...props }, ref) => (
<div ref={ref} role="separator" {...props}>
<Dot />
</div>
));
InputOTPSeparator.displayName = "InputOTPSeparator";
export { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator };
=== src/components/ui/input.tsx ===
import * as React from "react";
import { cn } from "@/lib/utils";
const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
({ className, type, ...props }, ref) => {
return (
<input
type={type}
className={cn(
"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
className,
)}
ref={ref}
{...props}
/>
);
},
);
Input.displayName = "Input";
export { Input };
=== src/components/ui/label.tsx ===
import * as React from "react";
import * as LabelPrimitive from "@radix-ui/react-label";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
const labelVariants = cva(
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
);
const Label = React.forwardRef<
React.ElementRef<typeof LabelPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
VariantProps<typeof labelVariants>
>(({ className, ...props }, ref) => (
<LabelPrimitive.Root
ref={ref}
className={cn(labelVariants(), className)}
{...props}
/>
));
Label.displayName = LabelPrimitive.Root.displayName;
export { Label };
=== src/components/ui/menubar.tsx ===
import * as React from "react";
import * as MenubarPrimitive from "@radix-ui/react-menubar";
import { Check, ChevronRight, Circle } from "lucide-react";
import { cn } from "@/lib/utils";
const MenubarMenu = MenubarPrimitive.Menu;
const MenubarGroup = MenubarPrimitive.Group;
const MenubarPortal = MenubarPrimitive.Portal;
const MenubarSub = MenubarPrimitive.Sub;
const MenubarRadioGroup = MenubarPrimitive.RadioGroup;
const Menubar = React.forwardRef<
React.ElementRef<typeof MenubarPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>
>(({ className, ...props }, ref) => (
<MenubarPrimitive.Root
ref={ref}
className={cn(
"flex h-10 items-center space-x-1 rounded-md border bg-background p-1",
className,
)}
{...props}
/>
));
Menubar.displayName = MenubarPrimitive.Root.displayName;
const MenubarTrigger = React.forwardRef<
React.ElementRef<typeof MenubarPrimitive.Trigger>,
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>
>(({ className, ...props }, ref) => (
<MenubarPrimitive.Trigger
ref={ref}
className={cn(
"flex cursor-default select-none items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
className,
)}
{...props}
/>
));
MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;
const MenubarSubTrigger = React.forwardRef<
React.ElementRef<typeof MenubarPrimitive.SubTrigger>,
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {
inset?: boolean;
}
>(({ className, inset, children, ...props }, ref) => (
<MenubarPrimitive.SubTrigger
ref={ref}
className={cn(
"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground",
inset && "pl-8",
className,
)}
{...props}
>
{children}
<ChevronRight className="ml-auto h-4 w-4" />
</MenubarPrimitive.SubTrigger>
));
MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;
const MenubarSubContent = React.forwardRef<
React.ElementRef<typeof MenubarPrimitive.SubContent>,
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>
>(({ className, ...props }, ref) => (
<MenubarPrimitive.SubContent
ref={ref}
className={cn(
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
/>
));
MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;
const MenubarContent = React.forwardRef<
React.ElementRef<typeof MenubarPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>
>(
(
{ className, align = "start", alignOffset = -4, sideOffset = 8, ...props },
ref,
) => (
<MenubarPrimitive.Portal>
<MenubarPrimitive.Content
ref={ref}
align={align}
alignOffset={alignOffset}
sideOffset={sideOffset}
className={cn(
"z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
/>
</MenubarPrimitive.Portal>
),
);
MenubarContent.displayName = MenubarPrimitive.Content.displayName;
const MenubarItem = React.forwardRef<
React.ElementRef<typeof MenubarPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {
inset?: boolean;
}
>(({ className, inset, ...props }, ref) => (
<MenubarPrimitive.Item
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
inset && "pl-8",
className,
)}
{...props}
/>
));
MenubarItem.displayName = MenubarPrimitive.Item.displayName;
const MenubarCheckboxItem = React.forwardRef<
React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.CheckboxItem>
>(({ className, children, checked, ...props }, ref) => (
<MenubarPrimitive.CheckboxItem
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className,
)}
checked={checked}
{...props}
>
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<MenubarPrimitive.ItemIndicator>
<Check className="h-4 w-4" />
</MenubarPrimitive.ItemIndicator>
</span>
{children}
</MenubarPrimitive.CheckboxItem>
));
MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName;
const MenubarRadioItem = React.forwardRef<
React.ElementRef<typeof MenubarPrimitive.RadioItem>,
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.RadioItem>
>(({ className, children, ...props }, ref) => (
<MenubarPrimitive.RadioItem
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className,
)}
{...props}
>
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<MenubarPrimitive.ItemIndicator>
<Circle className="h-2 w-2 fill-current" />
</MenubarPrimitive.ItemIndicator>
</span>
{children}
</MenubarPrimitive.RadioItem>
));
MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName;
const MenubarLabel = React.forwardRef<
React.ElementRef<typeof MenubarPrimitive.Label>,
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Label> & {
inset?: boolean;
}
>(({ className, inset, ...props }, ref) => (
<MenubarPrimitive.Label
ref={ref}
className={cn(
"px-2 py-1.5 text-sm font-semibold",
inset && "pl-8",
className,
)}
{...props}
/>
));
MenubarLabel.displayName = MenubarPrimitive.Label.displayName;
const MenubarSeparator = React.forwardRef<
React.ElementRef<typeof MenubarPrimitive.Separator>,
React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>
>(({ className, ...props }, ref) => (
<MenubarPrimitive.Separator
ref={ref}
className={cn("-mx-1 my-1 h-px bg-muted", className)}
{...props}
/>
));
MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;
const MenubarShortcut = ({
className,
...props
}: React.HTMLAttributes<HTMLSpanElement>) => {
return (
<span
className={cn(
"ml-auto text-xs tracking-widest text-muted-foreground",
className,
)}
{...props}
/>
);
};
MenubarShortcut.displayname = "MenubarShortcut";
export {
Menubar,
MenubarMenu,
MenubarTrigger,
MenubarContent,
MenubarItem,
MenubarSeparator,
MenubarLabel,
MenubarCheckboxItem,
MenubarRadioGroup,
MenubarRadioItem,
MenubarPortal,
MenubarSubContent,
MenubarSubTrigger,
MenubarGroup,
MenubarSub,
MenubarShortcut,
};
=== src/components/ui/navigation-menu.tsx ===
import * as React from "react";
import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
import { cva } from "class-variance-authority";
import { ChevronDown } from "lucide-react";
import { cn } from "@/lib/utils";
const NavigationMenu = React.forwardRef<
React.ElementRef<typeof NavigationMenuPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root>
>(({ className, children, ...props }, ref) => (
<NavigationMenuPrimitive.Root
ref={ref}
className={cn(
"relative z-10 flex max-w-max flex-1 items-center justify-center",
className,
)}
{...props}
>
{children}
<NavigationMenuViewport />
</NavigationMenuPrimitive.Root>
));
NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName;
const NavigationMenuList = React.forwardRef<
React.ElementRef<typeof NavigationMenuPrimitive.List>,
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List>
>(({ className, ...props }, ref) => (
<NavigationMenuPrimitive.List
ref={ref}
className={cn(
"group flex flex-1 list-none items-center justify-center space-x-1",
className,
)}
{...props}
/>
));
NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
const NavigationMenuItem = NavigationMenuPrimitive.Item;
const navigationMenuTriggerStyle = cva(
"group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50",
);
const NavigationMenuTrigger = React.forwardRef<
React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>
>(({ className, children, ...props }, ref) => (
<NavigationMenuPrimitive.Trigger
ref={ref}
className={cn(navigationMenuTriggerStyle(), "group", className)}
{...props}
>
{children}{" "}
<ChevronDown
className="relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180"
aria-hidden="true"
/>
</NavigationMenuPrimitive.Trigger>
));
NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName;
const NavigationMenuContent = React.forwardRef<
React.ElementRef<typeof NavigationMenuPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content>
>(({ className, ...props }, ref) => (
<NavigationMenuPrimitive.Content
ref={ref}
className={cn(
"left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto ",
className,
)}
{...props}
/>
));
NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName;
const NavigationMenuLink = NavigationMenuPrimitive.Link;
const NavigationMenuViewport = React.forwardRef<
React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>
>(({ className, ...props }, ref) => (
<div className={cn("absolute left-0 top-full flex justify-center")}>
<NavigationMenuPrimitive.Viewport
className={cn(
"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]",
className,
)}
ref={ref}
{...props}
/>
</div>
));
NavigationMenuViewport.displayName =
NavigationMenuPrimitive.Viewport.displayName;
const NavigationMenuIndicator = React.forwardRef<
React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,
React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Indicator>
>(({ className, ...props }, ref) => (
<NavigationMenuPrimitive.Indicator
ref={ref}
className={cn(
"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in",
className,
)}
{...props}
>
<div className="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" />
</NavigationMenuPrimitive.Indicator>
));
NavigationMenuIndicator.displayName =
NavigationMenuPrimitive.Indicator.displayName;
export {
navigationMenuTriggerStyle,
NavigationMenu,
NavigationMenuList,
NavigationMenuItem,
NavigationMenuContent,
NavigationMenuTrigger,
NavigationMenuLink,
NavigationMenuIndicator,
NavigationMenuViewport,
};
=== src/components/ui/pagination.tsx ===
import * as React from "react";
import { ChevronLeft, ChevronRight, MoreHorizontal } from "lucide-react";
import { cn } from "@/lib/utils";
import { ButtonProps, buttonVariants } from "@/components/ui/button";
const Pagination = ({ className, ...props }: React.ComponentProps<"nav">) => (
<nav
role="navigation"
aria-label="pagination"
className={cn("mx-auto flex w-full justify-center", className)}
{...props}
/>
);
Pagination.displayName = "Pagination";
const PaginationContent = React.forwardRef<
HTMLUListElement,
React.ComponentProps<"ul">
>(({ className, ...props }, ref) => (
<ul
ref={ref}
className={cn("flex flex-row items-center gap-1", className)}
{...props}
/>
));
PaginationContent.displayName = "PaginationContent";
const PaginationItem = React.forwardRef<
HTMLLIElement,
React.ComponentProps<"li">
>(({ className, ...props }, ref) => (
<li ref={ref} className={cn("", className)} {...props} />
));
PaginationItem.displayName = "PaginationItem";
type PaginationLinkProps = {
isActive?: boolean;
} & Pick<ButtonProps, "size"> &
React.ComponentProps<"a">;
const PaginationLink = ({
className,
isActive,
size = "icon",
...props
}: PaginationLinkProps) => (
<a
aria-current={isActive ? "page" : undefined}
className={cn(
buttonVariants({
variant: isActive ? "outline" : "ghost",
size,
}),
className,
)}
{...props}
/>
);
PaginationLink.displayName = "PaginationLink";
const PaginationPrevious = ({
className,
...props
}: React.ComponentProps<typeof PaginationLink>) => (
<PaginationLink
aria-label="Go to previous page"
size="default"
className={cn("gap-1 pl-2.5", className)}
{...props}
>
<ChevronLeft className="h-4 w-4" />
<span>Previous</span>
</PaginationLink>
);
PaginationPrevious.displayName = "PaginationPrevious";
const PaginationNext = ({
className,
...props
}: React.ComponentProps<typeof PaginationLink>) => (
<PaginationLink
aria-label="Go to next page"
size="default"
className={cn("gap-1 pr-2.5", className)}
{...props}
>
<span>Next</span>
<ChevronRight className="h-4 w-4" />
</PaginationLink>
);
PaginationNext.displayName = "PaginationNext";
const PaginationEllipsis = ({
className,
...props
}: React.ComponentProps<"span">) => (
<span
aria-hidden
className={cn("flex h-9 w-9 items-center justify-center", className)}
{...props}
>
<MoreHorizontal className="h-4 w-4" />
<span className="sr-only">More pages</span>
</span>
);
PaginationEllipsis.displayName = "PaginationEllipsis";
export {
Pagination,
PaginationContent,
PaginationEllipsis,
PaginationItem,
PaginationLink,
PaginationNext,
PaginationPrevious,
};
=== src/components/ui/popover.tsx ===
import * as React from "react";
import * as PopoverPrimitive from "@radix-ui/react-popover";
import { cn } from "@/lib/utils";
const Popover = PopoverPrimitive.Root;
const PopoverTrigger = PopoverPrimitive.Trigger;
const PopoverContent = React.forwardRef<
React.ElementRef<typeof PopoverPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>
>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
<PopoverPrimitive.Portal>
<PopoverPrimitive.Content
ref={ref}
align={align}
sideOffset={sideOffset}
className={cn(
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
/>
</PopoverPrimitive.Portal>
));
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
export { Popover, PopoverTrigger, PopoverContent };
=== src/components/ui/progress.tsx ===
import * as React from "react";
import * as ProgressPrimitive from "@radix-ui/react-progress";
import { cn } from "@/lib/utils";
const Progress = React.forwardRef<
React.ElementRef<typeof ProgressPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>
>(({ className, value, ...props }, ref) => (
<ProgressPrimitive.Root
ref={ref}
className={cn(
"relative h-4 w-full overflow-hidden rounded-full bg-secondary",
className,
)}
{...props}
>
<ProgressPrimitive.Indicator
className="h-full w-full flex-1 bg-primary transition-all"
style={{ transform: `translateX(-${100 - (value || 0)}%)` }}
/>
</ProgressPrimitive.Root>
));
Progress.displayName = ProgressPrimitive.Root.displayName;
export { Progress };
=== src/components/ui/radio-group.tsx ===
import * as React from "react";
import * as RadioGroupPrimitive from "@radix-ui/react-radio-group";
import { Circle } from "lucide-react";
import { cn } from "@/lib/utils";
const RadioGroup = React.forwardRef<
React.ElementRef<typeof RadioGroupPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>
>(({ className, ...props }, ref) => {
return (
<RadioGroupPrimitive.Root
className={cn("grid gap-2", className)}
{...props}
ref={ref}
/>
);
});
RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
const RadioGroupItem = React.forwardRef<
React.ElementRef<typeof RadioGroupPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>
>(({ className, ...props }, ref) => {
return (
<RadioGroupPrimitive.Item
ref={ref}
className={cn(
"aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
className,
)}
{...props}
>
<RadioGroupPrimitive.Indicator className="flex items-center justify-center">
<Circle className="h-2.5 w-2.5 fill-current text-current" />
</RadioGroupPrimitive.Indicator>
</RadioGroupPrimitive.Item>
);
});
RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
export { RadioGroup, RadioGroupItem };
=== src/components/ui/resizable.tsx ===
import { GripVertical } from "lucide-react";
import * as ResizablePrimitive from "react-resizable-panels";
import { cn } from "@/lib/utils";
const ResizablePanelGroup = ({
className,
...props
}: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => (
<ResizablePrimitive.PanelGroup
className={cn(
"flex h-full w-full data-[panel-group-direction=vertical]:flex-col",
className,
)}
{...props}
/>
);
const ResizablePanel = ResizablePrimitive.Panel;
const ResizableHandle = ({
withHandle,
className,
...props
}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {
withHandle?: boolean;
}) => (
<ResizablePrimitive.PanelResizeHandle
className={cn(
"relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90",
className,
)}
{...props}
>
{withHandle && (
<div className="z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border">
<GripVertical className="h-2.5 w-2.5" />
</div>
)}
</ResizablePrimitive.PanelResizeHandle>
);
export { ResizablePanelGroup, ResizablePanel, ResizableHandle };
=== src/components/ui/scroll-area.tsx ===
import * as React from "react";
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
import { cn } from "@/lib/utils";
const ScrollArea = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
>(({ className, children, ...props }, ref) => (
<ScrollAreaPrimitive.Root
ref={ref}
className={cn("relative overflow-hidden", className)}
{...props}
>
<ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">
{children}
</ScrollAreaPrimitive.Viewport>
<ScrollBar />
<ScrollAreaPrimitive.Corner />
</ScrollAreaPrimitive.Root>
));
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
const ScrollBar = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
>(({ className, orientation = "vertical", ...props }, ref) => (
<ScrollAreaPrimitive.ScrollAreaScrollbar
ref={ref}
orientation={orientation}
className={cn(
"flex touch-none select-none transition-colors",
orientation === "vertical" &&
"h-full w-2.5 border-l border-l-transparent p-[1px]",
orientation === "horizontal" &&
"h-2.5 flex-col border-t border-t-transparent p-[1px]",
className,
)}
{...props}
>
<ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-border" />
</ScrollAreaPrimitive.ScrollAreaScrollbar>
));
ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
export { ScrollArea, ScrollBar };
=== src/components/ui/select.tsx ===
import * as React from "react";
import * as SelectPrimitive from "@radix-ui/react-select";
import { Check, ChevronDown, ChevronUp } from "lucide-react";
import { cn } from "@/lib/utils";
const Select = SelectPrimitive.Root;
const SelectGroup = SelectPrimitive.Group;
const SelectValue = SelectPrimitive.Value;
const SelectTrigger = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.Trigger>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
>(({ className, children, ...props }, ref) => (
<SelectPrimitive.Trigger
ref={ref}
className={cn(
"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",
className,
)}
{...props}
>
{children}
<SelectPrimitive.Icon asChild>
<ChevronDown className="h-4 w-4 opacity-50" />
</SelectPrimitive.Icon>
</SelectPrimitive.Trigger>
));
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
const SelectScrollUpButton = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>
>(({ className, ...props }, ref) => (
<SelectPrimitive.ScrollUpButton
ref={ref}
className={cn(
"flex cursor-default items-center justify-center py-1",
className,
)}
{...props}
>
<ChevronUp className="h-4 w-4" />
</SelectPrimitive.ScrollUpButton>
));
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
const SelectScrollDownButton = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>
>(({ className, ...props }, ref) => (
<SelectPrimitive.ScrollDownButton
ref={ref}
className={cn(
"flex cursor-default items-center justify-center py-1",
className,
)}
{...props}
>
<ChevronDown className="h-4 w-4" />
</SelectPrimitive.ScrollDownButton>
));
SelectScrollDownButton.displayName =
SelectPrimitive.ScrollDownButton.displayName;
const SelectContent = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
>(({ className, children, position = "popper", ...props }, ref) => (
<SelectPrimitive.Portal>
<SelectPrimitive.Content
ref={ref}
className={cn(
"relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
position === "popper" &&
"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
className,
)}
position={position}
{...props}
>
<SelectScrollUpButton />
<SelectPrimitive.Viewport
className={cn(
"p-1",
position === "popper" &&
"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]",
)}
>
{children}
</SelectPrimitive.Viewport>
<SelectScrollDownButton />
</SelectPrimitive.Content>
</SelectPrimitive.Portal>
));
SelectContent.displayName = SelectPrimitive.Content.displayName;
const SelectLabel = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.Label>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
>(({ className, ...props }, ref) => (
<SelectPrimitive.Label
ref={ref}
className={cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className)}
{...props}
/>
));
SelectLabel.displayName = SelectPrimitive.Label.displayName;
const SelectItem = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
>(({ className, children, ...props }, ref) => (
<SelectPrimitive.Item
ref={ref}
className={cn(
"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className,
)}
{...props}
>
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
<SelectPrimitive.ItemIndicator>
<Check className="h-4 w-4" />
</SelectPrimitive.ItemIndicator>
</span>
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
</SelectPrimitive.Item>
));
SelectItem.displayName = SelectPrimitive.Item.displayName;
const SelectSeparator = React.forwardRef<
React.ElementRef<typeof SelectPrimitive.Separator>,
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
>(({ className, ...props }, ref) => (
<SelectPrimitive.Separator
ref={ref}
className={cn("-mx-1 my-1 h-px bg-muted", className)}
{...props}
/>
));
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
export {
Select,
SelectGroup,
SelectValue,
SelectTrigger,
SelectContent,
SelectLabel,
SelectItem,
SelectSeparator,
SelectScrollUpButton,
SelectScrollDownButton,
};
=== src/components/ui/separator.tsx ===
import * as React from "react";
import * as SeparatorPrimitive from "@radix-ui/react-separator";
import { cn } from "@/lib/utils";
const Separator = React.forwardRef<
React.ElementRef<typeof SeparatorPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>
>(
(
{ className, orientation = "horizontal", decorative = true, ...props },
ref,
) => (
<SeparatorPrimitive.Root
ref={ref}
decorative={decorative}
orientation={orientation}
className={cn(
"shrink-0 bg-border",
orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
className,
)}
{...props}
/>
),
);
Separator.displayName = SeparatorPrimitive.Root.displayName;
export { Separator };
=== src/components/ui/sheet.tsx ===
import * as SheetPrimitive from "@radix-ui/react-dialog";
import { cva, type VariantProps } from "class-variance-authority";
import { X } from "lucide-react";
import * as React from "react";
import { cn } from "@/lib/utils";
const Sheet = SheetPrimitive.Root;
const SheetTrigger = SheetPrimitive.Trigger;
const SheetClose = SheetPrimitive.Close;
const SheetPortal = SheetPrimitive.Portal;
const SheetOverlay = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<SheetPrimitive.Overlay
className={cn(
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
className,
)}
{...props}
ref={ref}
/>
));
SheetOverlay.displayName = SheetPrimitive.Overlay.displayName;
const sheetVariants = cva(
"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
{
variants: {
side: {
top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
bottom:
"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
right:
"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
},
},
defaultVariants: {
side: "right",
},
},
);
interface SheetContentProps
extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,
VariantProps<typeof sheetVariants> {}
const SheetContent = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Content>,
SheetContentProps
>(({ side = "right", className, children, ...props }, ref) => (
<SheetPortal>
<SheetOverlay />
<SheetPrimitive.Content
ref={ref}
className={cn(sheetVariants({ side }), className)}
{...props}
>
{children}
<SheetPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary">
<X className="h-4 w-4" />
<span className="sr-only">Close</span>
</SheetPrimitive.Close>
</SheetPrimitive.Content>
</SheetPortal>
));
SheetContent.displayName = SheetPrimitive.Content.displayName;
const SheetHeader = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col space-y-2 text-center sm:text-left",
className,
)}
{...props}
/>
);
SheetHeader.displayName = "SheetHeader";
const SheetFooter = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
className,
)}
{...props}
/>
);
SheetFooter.displayName = "SheetFooter";
const SheetTitle = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>
>(({ className, ...props }, ref) => (
<SheetPrimitive.Title
ref={ref}
className={cn("text-lg font-semibold text-foreground", className)}
{...props}
/>
));
SheetTitle.displayName = SheetPrimitive.Title.displayName;
const SheetDescription = React.forwardRef<
React.ElementRef<typeof SheetPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>
>(({ className, ...props }, ref) => (
<SheetPrimitive.Description
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
));
SheetDescription.displayName = SheetPrimitive.Description.displayName;
export {
Sheet,
SheetClose,
SheetContent,
SheetDescription,
SheetFooter,
SheetHeader,
SheetOverlay,
SheetPortal,
SheetTitle,
SheetTrigger,
};
=== src/components/ui/sidebar.tsx ===
import * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { VariantProps, cva } from "class-variance-authority";
import { PanelLeft } from "lucide-react";
import { useIsMobile } from "@/hooks/use-mobile";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Separator } from "@/components/ui/separator";
import { Sheet, SheetContent } from "@/components/ui/sheet";
import { Skeleton } from "@/components/ui/skeleton";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
const SIDEBAR_COOKIE_NAME = "sidebar:state";
const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
const SIDEBAR_WIDTH = "16rem";
const SIDEBAR_WIDTH_MOBILE = "18rem";
const SIDEBAR_WIDTH_ICON = "3rem";
const SIDEBAR_KEYBOARD_SHORTCUT = "b";
type SidebarContext = {
state: "expanded" | "collapsed";
open: boolean;
setOpen: (open: boolean) => void;
openMobile: boolean;
setOpenMobile: (open: boolean) => void;
isMobile: boolean;
toggleSidebar: () => void;
};
const SidebarContext = React.createContext<SidebarContext | null>(null);
function useSidebar() {
const context = React.useContext(SidebarContext);
if (!context) {
throw new Error("useSidebar must be used within a SidebarProvider.");
}
return context;
}
const SidebarProvider = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div"> & {
defaultOpen?: boolean;
open?: boolean;
onOpenChange?: (open: boolean) => void;
}
>(
(
{
defaultOpen = true,
open: openProp,
onOpenChange: setOpenProp,
className,
style,
children,
...props
},
ref,
) => {
const isMobile = useIsMobile();
const [openMobile, setOpenMobile] = React.useState(false);
// This is the internal state of the sidebar.
// We use openProp and setOpenProp for control from outside the component.
const [_open, _setOpen] = React.useState(defaultOpen);
const open = openProp ?? _open;
const setOpen = React.useCallback(
(value: boolean | ((value: boolean) => boolean)) => {
const openState = typeof value === "function" ? value(open) : value;
if (setOpenProp) {
setOpenProp(openState);
} else {
_setOpen(openState);
}
// This sets the cookie to keep the sidebar state.
document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
},
[setOpenProp, open],
);
// Helper to toggle the sidebar.
const toggleSidebar = React.useCallback(() => {
return isMobile
? setOpenMobile((open) => !open)
: setOpen((open) => !open);
}, [isMobile, setOpen, setOpenMobile]);
// Adds a keyboard shortcut to toggle the sidebar.
React.useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => {
if (
event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
(event.metaKey || event.ctrlKey)
) {
event.preventDefault();
toggleSidebar();
}
};
window.addEventListener("keydown", handleKeyDown);
return () => window.removeEventListener("keydown", handleKeyDown);
}, [toggleSidebar]);
// We add a state so that we can do data-state="expanded" or "collapsed".
// This makes it easier to style the sidebar with Tailwind classes.
const state = open ? "expanded" : "collapsed";
const contextValue = React.useMemo<SidebarContext>(
() => ({
state,
open,
setOpen,
isMobile,
openMobile,
setOpenMobile,
toggleSidebar,
}),
[
state,
open,
setOpen,
isMobile,
openMobile,
setOpenMobile,
toggleSidebar,
],
);
return (
<SidebarContext.Provider value={contextValue}>
<TooltipProvider delayDuration={0}>
<div
style={
{
"--sidebar-width": SIDEBAR_WIDTH,
"--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
...style,
} as React.CSSProperties
}
className={cn(
"group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar",
className,
)}
ref={ref}
{...props}
>
{children}
</div>
</TooltipProvider>
</SidebarContext.Provider>
);
},
);
SidebarProvider.displayName = "SidebarProvider";
const Sidebar = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div"> & {
side?: "left" | "right";
variant?: "sidebar" | "floating" | "inset";
collapsible?: "offcanvas" | "icon" | "none";
}
>(
(
{
side = "left",
variant = "sidebar",
collapsible = "offcanvas",
className,
children,
...props
},
ref,
) => {
const { isMobile, state, openMobile, setOpenMobile } = useSidebar();
if (collapsible === "none") {
return (
<div
className={cn(
"flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground",
className,
)}
ref={ref}
{...props}
>
{children}
</div>
);
}
if (isMobile) {
return (
<Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
<SheetContent
data-sidebar="sidebar"
data-mobile="true"
className="w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
style={
{
"--sidebar-width": SIDEBAR_WIDTH_MOBILE,
} as React.CSSProperties
}
side={side}
>
<div className="flex h-full w-full flex-col">{children}</div>
</SheetContent>
</Sheet>
);
}
return (
<div
ref={ref}
className="group peer hidden md:block text-sidebar-foreground"
data-state={state}
data-collapsible={state === "collapsed" ? collapsible : ""}
data-variant={variant}
data-side={side}
>
{/* This is what handles the sidebar gap on desktop */}
<div
className={cn(
"duration-200 relative h-svh w-[--sidebar-width] bg-transparent transition-[width] ease-linear",
"group-data-[collapsible=offcanvas]:w-0",
"group-data-[side=right]:rotate-180",
variant === "floating" || variant === "inset"
? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
: "group-data-[collapsible=icon]:w-[--sidebar-width-icon]",
)}
/>
<div
className={cn(
"duration-200 fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] ease-linear md:flex",
side === "left"
? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
: "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
// Adjust the padding for floating and inset variants.
variant === "floating" || variant === "inset"
? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
: "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",
className,
)}
{...props}
>
<div
data-sidebar="sidebar"
className="flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"
>
{children}
</div>
</div>
</div>
);
},
);
Sidebar.displayName = "Sidebar";
const SidebarTrigger = React.forwardRef<
React.ElementRef<typeof Button>,
React.ComponentProps<typeof Button>
>(({ className, onClick, ...props }, ref) => {
const { toggleSidebar } = useSidebar();
return (
<Button
ref={ref}
data-sidebar="trigger"
variant="ghost"
size="icon"
className={cn("h-7 w-7", className)}
onClick={(event) => {
onClick?.(event);
toggleSidebar();
}}
{...props}
>
<PanelLeft />
<span className="sr-only">Toggle Sidebar</span>
</Button>
);
});
SidebarTrigger.displayName = "SidebarTrigger";
const SidebarRail = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<"button">
>(({ className, ...props }, ref) => {
const { toggleSidebar } = useSidebar();
return (
<button
ref={ref}
data-sidebar="rail"
aria-label="Toggle Sidebar"
tabIndex={-1}
onClick={toggleSidebar}
title="Toggle Sidebar"
className={cn(
"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex",
"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize",
"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar",
"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
className,
)}
{...props}
/>
);
});
SidebarRail.displayName = "SidebarRail";
const SidebarInset = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"main">
>(({ className, ...props }, ref) => {
return (
<main
ref={ref}
className={cn(
"relative flex min-h-svh flex-1 flex-col bg-background",
"peer-data-[variant=inset]:min-h-[calc(100svh-theme(spacing.4))] md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
className,
)}
{...props}
/>
);
});
SidebarInset.displayName = "SidebarInset";
const SidebarInput = React.forwardRef<
React.ElementRef<typeof Input>,
React.ComponentProps<typeof Input>
>(({ className, ...props }, ref) => {
return (
<Input
ref={ref}
data-sidebar="input"
className={cn(
"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
className,
)}
{...props}
/>
);
});
SidebarInput.displayName = "SidebarInput";
const SidebarHeader = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div">
>(({ className, ...props }, ref) => {
return (
<div
ref={ref}
data-sidebar="header"
className={cn("flex flex-col gap-2 p-2", className)}
{...props}
/>
);
});
SidebarHeader.displayName = "SidebarHeader";
const SidebarFooter = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div">
>(({ className, ...props }, ref) => {
return (
<div
ref={ref}
data-sidebar="footer"
className={cn("flex flex-col gap-2 p-2", className)}
{...props}
/>
);
});
SidebarFooter.displayName = "SidebarFooter";
const SidebarSeparator = React.forwardRef<
React.ElementRef<typeof Separator>,
React.ComponentProps<typeof Separator>
>(({ className, ...props }, ref) => {
return (
<Separator
ref={ref}
data-sidebar="separator"
className={cn("mx-2 w-auto bg-sidebar-border", className)}
{...props}
/>
);
});
SidebarSeparator.displayName = "SidebarSeparator";
const SidebarContent = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div">
>(({ className, ...props }, ref) => {
return (
<div
ref={ref}
data-sidebar="content"
className={cn(
"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
className,
)}
{...props}
/>
);
});
SidebarContent.displayName = "SidebarContent";
const SidebarGroup = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div">
>(({ className, ...props }, ref) => {
return (
<div
ref={ref}
data-sidebar="group"
className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
{...props}
/>
);
});
SidebarGroup.displayName = "SidebarGroup";
const SidebarGroupLabel = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div"> & { asChild?: boolean }
>(({ className, asChild = false, ...props }, ref) => {
const Comp = asChild ? Slot : "div";
return (
<Comp
ref={ref}
data-sidebar="group-label"
className={cn(
"duration-200 flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opa] ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
className,
)}
{...props}
/>
);
});
SidebarGroupLabel.displayName = "SidebarGroupLabel";
const SidebarGroupAction = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<"button"> & { asChild?: boolean }
>(({ className, asChild = false, ...props }, ref) => {
const Comp = asChild ? Slot : "button";
return (
<Comp
ref={ref}
data-sidebar="group-action"
className={cn(
"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
// Increases the hit area of the button on mobile.
"after:absolute after:-inset-2 after:md:hidden",
"group-data-[collapsible=icon]:hidden",
className,
)}
{...props}
/>
);
});
SidebarGroupAction.displayName = "SidebarGroupAction";
const SidebarGroupContent = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div">
>(({ className, ...props }, ref) => (
<div
ref={ref}
data-sidebar="group-content"
className={cn("w-full text-sm", className)}
{...props}
/>
));
SidebarGroupContent.displayName = "SidebarGroupContent";
const SidebarMenu = React.forwardRef<
HTMLUListElement,
React.ComponentProps<"ul">
>(({ className, ...props }, ref) => (
<ul
ref={ref}
data-sidebar="menu"
className={cn("flex w-full min-w-0 flex-col gap-1", className)}
{...props}
/>
));
SidebarMenu.displayName = "SidebarMenu";
const SidebarMenuItem = React.forwardRef<
HTMLLIElement,
React.ComponentProps<"li">
>(({ className, ...props }, ref) => (
<li
ref={ref}
data-sidebar="menu-item"
className={cn("group/menu-item relative", className)}
{...props}
/>
));
SidebarMenuItem.displayName = "SidebarMenuItem";
const sidebarMenuButtonVariants = cva(
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
{
variants: {
variant: {
default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
outline:
"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]",
},
size: {
default: "h-8 text-sm",
sm: "h-7 text-xs",
lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
},
);
const SidebarMenuButton = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<"button"> & {
asChild?: boolean;
isActive?: boolean;
tooltip?: string | React.ComponentProps<typeof TooltipContent>;
} & VariantProps<typeof sidebarMenuButtonVariants>
>(
(
{
asChild = false,
isActive = false,
variant = "default",
size = "default",
tooltip,
className,
...props
},
ref,
) => {
const Comp = asChild ? Slot : "button";
const { isMobile, state } = useSidebar();
const button = (
<Comp
ref={ref}
data-sidebar="menu-button"
data-size={size}
data-active={isActive}
className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
{...props}
/>
);
if (!tooltip) {
return button;
}
if (typeof tooltip === "string") {
tooltip = {
children: tooltip,
};
}
return (
<Tooltip>
<TooltipTrigger asChild>{button}</TooltipTrigger>
<TooltipContent
side="right"
align="center"
hidden={state !== "collapsed" || isMobile}
{...tooltip}
/>
</Tooltip>
);
},
);
SidebarMenuButton.displayName = "SidebarMenuButton";
const SidebarMenuAction = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<"button"> & {
asChild?: boolean;
showOnHover?: boolean;
}
>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
const Comp = asChild ? Slot : "button";
return (
<Comp
ref={ref}
data-sidebar="menu-action"
className={cn(
"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0",
// Increases the hit area of the button on mobile.
"after:absolute after:-inset-2 after:md:hidden",
"peer-data-[size=sm]/menu-button:top-1",
"peer-data-[size=default]/menu-button:top-1.5",
"peer-data-[size=lg]/menu-button:top-2.5",
"group-data-[collapsible=icon]:hidden",
showOnHover &&
"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",
className,
)}
{...props}
/>
);
});
SidebarMenuAction.displayName = "SidebarMenuAction";
const SidebarMenuBadge = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div">
>(({ className, ...props }, ref) => (
<div
ref={ref}
data-sidebar="menu-badge"
className={cn(
"absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground select-none pointer-events-none",
"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
"peer-data-[size=sm]/menu-button:top-1",
"peer-data-[size=default]/menu-button:top-1.5",
"peer-data-[size=lg]/menu-button:top-2.5",
"group-data-[collapsible=icon]:hidden",
className,
)}
{...props}
/>
));
SidebarMenuBadge.displayName = "SidebarMenuBadge";
const SidebarMenuSkeleton = React.forwardRef<
HTMLDivElement,
React.ComponentProps<"div"> & {
showIcon?: boolean;
}
>(({ className, showIcon = false, ...props }, ref) => {
// Random width between 50 to 90%.
const width = React.useMemo(() => {
return `${Math.floor(Math.random() * 40) + 50}%`;
}, []);
return (
<div
ref={ref}
data-sidebar="menu-skeleton"
className={cn("rounded-md h-8 flex gap-2 px-2 items-center", className)}
{...props}
>
{showIcon && (
<Skeleton
className="size-4 rounded-md"
data-sidebar="menu-skeleton-icon"
/>
)}
<Skeleton
className="h-4 flex-1 max-w-[--skeleton-width]"
data-sidebar="menu-skeleton-text"
style={
{
"--skeleton-width": width,
} as React.CSSProperties
}
/>
</div>
);
});
SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
const SidebarMenuSub = React.forwardRef<
HTMLUListElement,
React.ComponentProps<"ul">
>(({ className, ...props }, ref) => (
<ul
ref={ref}
data-sidebar="menu-sub"
className={cn(
"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5",
"group-data-[collapsible=icon]:hidden",
className,
)}
{...props}
/>
));
SidebarMenuSub.displayName = "SidebarMenuSub";
const SidebarMenuSubItem = React.forwardRef<
HTMLLIElement,
React.ComponentProps<"li">
>(({ ...props }, ref) => <li ref={ref} {...props} />);
SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
const SidebarMenuSubButton = React.forwardRef<
HTMLAnchorElement,
React.ComponentProps<"a"> & {
asChild?: boolean;
size?: "sm" | "md";
isActive?: boolean;
}
>(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
const Comp = asChild ? Slot : "a";
return (
<Comp
ref={ref}
data-sidebar="menu-sub-button"
data-size={size}
data-active={isActive}
className={cn(
"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
size === "sm" && "text-xs",
size === "md" && "text-sm",
"group-data-[collapsible=icon]:hidden",
className,
)}
{...props}
/>
);
});
SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
export {
Sidebar,
SidebarContent,
SidebarFooter,
SidebarGroup,
SidebarGroupAction,
SidebarGroupContent,
SidebarGroupLabel,
SidebarHeader,
SidebarInput,
SidebarInset,
SidebarMenu,
SidebarMenuAction,
SidebarMenuBadge,
SidebarMenuButton,
SidebarMenuItem,
SidebarMenuSkeleton,
SidebarMenuSub,
SidebarMenuSubButton,
SidebarMenuSubItem,
SidebarProvider,
SidebarRail,
SidebarSeparator,
SidebarTrigger,
useSidebar,
};
=== src/components/ui/skeleton.tsx ===
import { cn } from "@/lib/utils";
function Skeleton({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) {
return (
<div
className={cn("animate-pulse rounded-md bg-muted", className)}
{...props}
/>
);
}
export { Skeleton };
=== src/components/ui/slider.tsx ===
import * as React from "react";
import * as SliderPrimitive from "@radix-ui/react-slider";
import { cn } from "@/lib/utils";
const Slider = React.forwardRef<
React.ElementRef<typeof SliderPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>
>(({ className, ...props }, ref) => (
<SliderPrimitive.Root
ref={ref}
className={cn(
"relative flex w-full touch-none select-none items-center",
className,
)}
{...props}
>
<SliderPrimitive.Track className="relative h-2 w-full grow overflow-hidden rounded-full bg-secondary">
<SliderPrimitive.Range className="absolute h-full bg-primary" />
</SliderPrimitive.Track>
<SliderPrimitive.Thumb className="block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50" />
</SliderPrimitive.Root>
));
Slider.displayName = SliderPrimitive.Root.displayName;
export { Slider };
=== src/components/ui/sonner.tsx ===
import { useTheme } from "next-themes";
import { Toaster as Sonner } from "sonner";
type ToasterProps = React.ComponentProps<typeof Sonner>;
const Toaster = ({ ...props }: ToasterProps) => {
const { theme = "system" } = useTheme();
return (
<Sonner
theme={theme as ToasterProps["theme"]}
className="toaster group"
toastOptions={{
classNames: {
toast:
"group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
description: "group-[.toast]:text-muted-foreground",
actionButton:
"group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
cancelButton:
"group-[.toast]:bg-muted group-[.toast]:text-muted-foreground",
},
}}
{...props}
/>
);
};
export { Toaster };
=== src/components/ui/switch.tsx ===
import * as React from "react";
import * as SwitchPrimitives from "@radix-ui/react-switch";
import { cn } from "@/lib/utils";
const Switch = React.forwardRef<
React.ElementRef<typeof SwitchPrimitives.Root>,
React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>
>(({ className, ...props }, ref) => (
<SwitchPrimitives.Root
className={cn(
"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input",
className,
)}
{...props}
ref={ref}
>
<SwitchPrimitives.Thumb
className={cn(
"pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0",
)}
/>
</SwitchPrimitives.Root>
));
Switch.displayName = SwitchPrimitives.Root.displayName;
export { Switch };
=== src/components/ui/table.tsx ===
import * as React from "react";
import { cn } from "@/lib/utils";
const Table = React.forwardRef<
HTMLTableElement,
React.HTMLAttributes<HTMLTableElement>
>(({ className, ...props }, ref) => (
<div className="relative w-full overflow-auto">
<table
ref={ref}
className={cn("w-full caption-bottom text-sm", className)}
{...props}
/>
</div>
));
Table.displayName = "Table";
const TableHeader = React.forwardRef<
HTMLTableSectionElement,
React.HTMLAttributes<HTMLTableSectionElement>
>(({ className, ...props }, ref) => (
<thead ref={ref} className={cn("[&_tr]:border-b", className)} {...props} />
));
TableHeader.displayName = "TableHeader";
const TableBody = React.forwardRef<
HTMLTableSectionElement,
React.HTMLAttributes<HTMLTableSectionElement>
>(({ className, ...props }, ref) => (
<tbody
ref={ref}
className={cn("[&_tr:last-child]:border-0", className)}
{...props}
/>
));
TableBody.displayName = "TableBody";
const TableFooter = React.forwardRef<
HTMLTableSectionElement,
React.HTMLAttributes<HTMLTableSectionElement>
>(({ className, ...props }, ref) => (
<tfoot
ref={ref}
className={cn(
"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0",
className,
)}
{...props}
/>
));
TableFooter.displayName = "TableFooter";
const TableRow = React.forwardRef<
HTMLTableRowElement,
React.HTMLAttributes<HTMLTableRowElement>
>(({ className, ...props }, ref) => (
<tr
ref={ref}
className={cn(
"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted",
className,
)}
{...props}
/>
));
TableRow.displayName = "TableRow";
const TableHead = React.forwardRef<
HTMLTableCellElement,
React.ThHTMLAttributes<HTMLTableCellElement>
>(({ className, ...props }, ref) => (
<th
ref={ref}
className={cn(
"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0",
className,
)}
{...props}
/>
));
TableHead.displayName = "TableHead";
const TableCell = React.forwardRef<
HTMLTableCellElement,
React.TdHTMLAttributes<HTMLTableCellElement>
>(({ className, ...props }, ref) => (
<td
ref={ref}
className={cn("p-4 align-middle [&:has([role=checkbox])]:pr-0", className)}
{...props}
/>
));
TableCell.displayName = "TableCell";
const TableCaption = React.forwardRef<
HTMLTableCaptionElement,
React.HTMLAttributes<HTMLTableCaptionElement>
>(({ className, ...props }, ref) => (
<caption
ref={ref}
className={cn("mt-4 text-sm text-muted-foreground", className)}
{...props}
/>
));
TableCaption.displayName = "TableCaption";
export {
Table,
TableHeader,
TableBody,
TableFooter,
TableHead,
TableRow,
TableCell,
TableCaption,
};
=== src/components/ui/tabs.tsx ===
import * as React from "react";
import * as TabsPrimitive from "@radix-ui/react-tabs";
import { cn } from "@/lib/utils";
const Tabs = TabsPrimitive.Root;
const TabsList = React.forwardRef<
React.ElementRef<typeof TabsPrimitive.List>,
React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>
>(({ className, ...props }, ref) => (
<TabsPrimitive.List
ref={ref}
className={cn(
"inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground",
className,
)}
{...props}
/>
));
TabsList.displayName = TabsPrimitive.List.displayName;
const TabsTrigger = React.forwardRef<
React.ElementRef<typeof TabsPrimitive.Trigger>,
React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>
>(({ className, ...props }, ref) => (
<TabsPrimitive.Trigger
ref={ref}
className={cn(
"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm",
className,
)}
{...props}
/>
));
TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
const TabsContent = React.forwardRef<
React.ElementRef<typeof TabsPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>
>(({ className, ...props }, ref) => (
<TabsPrimitive.Content
ref={ref}
className={cn(
"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
className,
)}
{...props}
/>
));
TabsContent.displayName = TabsPrimitive.Content.displayName;
export { Tabs, TabsList, TabsTrigger, TabsContent };
=== src/components/ui/textarea.tsx ===
import * as React from "react";
import { cn } from "@/lib/utils";
export interface TextareaProps
extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}
const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
({ className, ...props }, ref) => {
return (
<textarea
className={cn(
"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
className,
)}
ref={ref}
{...props}
/>
);
},
);
Textarea.displayName = "Textarea";
export { Textarea };
=== src/components/ui/toast.tsx ===
import * as React from "react";
import * as ToastPrimitives from "@radix-ui/react-toast";
import { cva, type VariantProps } from "class-variance-authority";
import { X } from "lucide-react";
import { cn } from "@/lib/utils";
const ToastProvider = ToastPrimitives.Provider;
const ToastViewport = React.forwardRef<
React.ElementRef<typeof ToastPrimitives.Viewport>,
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>
>(({ className, ...props }, ref) => (
<ToastPrimitives.Viewport
ref={ref}
className={cn(
"fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]",
className,
)}
{...props}
/>
));
ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
const toastVariants = cva(
"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
{
variants: {
variant: {
default: "border bg-background text-foreground",
destructive:
"destructive group border-destructive bg-destructive text-destructive-foreground",
},
},
defaultVariants: {
variant: "default",
},
},
);
const Toast = React.forwardRef<
React.ElementRef<typeof ToastPrimitives.Root>,
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &
VariantProps<typeof toastVariants>
>(({ className, variant, ...props }, ref) => {
return (
<ToastPrimitives.Root
ref={ref}
className={cn(toastVariants({ variant }), className)}
{...props}
/>
);
});
Toast.displayName = ToastPrimitives.Root.displayName;
const ToastAction = React.forwardRef<
React.ElementRef<typeof ToastPrimitives.Action>,
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>
>(({ className, ...props }, ref) => (
<ToastPrimitives.Action
ref={ref}
className={cn(
"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",
className,
)}
{...props}
/>
));
ToastAction.displayName = ToastPrimitives.Action.displayName;
const ToastClose = React.forwardRef<
React.ElementRef<typeof ToastPrimitives.Close>,
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>
>(({ className, ...props }, ref) => (
<ToastPrimitives.Close
ref={ref}
className={cn(
"absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600",
className,
)}
toast-close=""
{...props}
>
<X className="h-4 w-4" />
</ToastPrimitives.Close>
));
ToastClose.displayName = ToastPrimitives.Close.displayName;
const ToastTitle = React.forwardRef<
React.ElementRef<typeof ToastPrimitives.Title>,
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>
>(({ className, ...props }, ref) => (
<ToastPrimitives.Title
ref={ref}
className={cn("text-sm font-semibold", className)}
{...props}
/>
));
ToastTitle.displayName = ToastPrimitives.Title.displayName;
const ToastDescription = React.forwardRef<
React.ElementRef<typeof ToastPrimitives.Description>,
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>
>(({ className, ...props }, ref) => (
<ToastPrimitives.Description
ref={ref}
className={cn("text-sm opacity-90", className)}
{...props}
/>
));
ToastDescription.displayName = ToastPrimitives.Description.displayName;
type ToastProps = React.ComponentPropsWithoutRef<typeof Toast>;
type ToastActionElement = React.ReactElement<typeof ToastAction>;
export {
type ToastProps,
type ToastActionElement,
ToastProvider,
ToastViewport,
Toast,
ToastTitle,
ToastDescription,
ToastClose,
ToastAction,
};
=== src/components/ui/toaster.tsx ===
import { useToast } from "@/hooks/use-toast";
import {
Toast,
ToastClose,
ToastDescription,
ToastProvider,
ToastTitle,
ToastViewport,
} from "@/components/ui/toast";
export function Toaster() {
const { toasts } = useToast();
return (
<ToastProvider>
{toasts.map(function ({ id, title, description, action, ...props }) {
return (
<Toast key={id} {...props}>
<div className="grid gap-1">
{title && <ToastTitle>{title}</ToastTitle>}
{description && (
<ToastDescription>{description}</ToastDescription>
)}
</div>
{action}
<ToastClose />
</Toast>
);
})}
<ToastViewport />
</ToastProvider>
);
}
=== src/components/ui/toggle-group.tsx ===
import * as React from "react";
import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
import { type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
import { toggleVariants } from "@/components/ui/toggle";
const ToggleGroupContext = React.createContext<
VariantProps<typeof toggleVariants>
>({
size: "default",
variant: "default",
});
const ToggleGroup = React.forwardRef<
React.ElementRef<typeof ToggleGroupPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &
VariantProps<typeof toggleVariants>
>(({ className, variant, size, children, ...props }, ref) => (
<ToggleGroupPrimitive.Root
ref={ref}
className={cn("flex items-center justify-center gap-1", className)}
{...props}
>
<ToggleGroupContext.Provider value={{ variant, size }}>
{children}
</ToggleGroupContext.Provider>
</ToggleGroupPrimitive.Root>
));
ToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;
const ToggleGroupItem = React.forwardRef<
React.ElementRef<typeof ToggleGroupPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &
VariantProps<typeof toggleVariants>
>(({ className, children, variant, size, ...props }, ref) => {
const context = React.useContext(ToggleGroupContext);
return (
<ToggleGroupPrimitive.Item
ref={ref}
className={cn(
toggleVariants({
variant: context.variant || variant,
size: context.size || size,
}),
className,
)}
{...props}
>
{children}
</ToggleGroupPrimitive.Item>
);
});
ToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;
export { ToggleGroup, ToggleGroupItem };
=== src/components/ui/toggle.tsx ===
import * as React from "react";
import * as TogglePrimitive from "@radix-ui/react-toggle";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/lib/utils";
const toggleVariants = cva(
"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground",
{
variants: {
variant: {
default: "bg-transparent",
outline:
"border border-input bg-transparent hover:bg-accent hover:text-accent-foreground",
},
size: {
default: "h-10 px-3",
sm: "h-9 px-2.5",
lg: "h-11 px-5",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
},
);
const Toggle = React.forwardRef<
React.ElementRef<typeof TogglePrimitive.Root>,
React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &
VariantProps<typeof toggleVariants>
>(({ className, variant, size, ...props }, ref) => (
<TogglePrimitive.Root
ref={ref}
className={cn(toggleVariants({ variant, size, className }))}
{...props}
/>
));
Toggle.displayName = TogglePrimitive.Root.displayName;
export { Toggle, toggleVariants };
=== src/components/ui/tooltip.tsx ===
import * as React from "react";
import * as TooltipPrimitive from "@radix-ui/react-tooltip";
import { cn } from "@/lib/utils";
const TooltipProvider = TooltipPrimitive.Provider;
const Tooltip = TooltipPrimitive.Root;
const TooltipTrigger = TooltipPrimitive.Trigger;
const TooltipContent = React.forwardRef<
React.ElementRef<typeof TooltipPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
>(({ className, sideOffset = 4, ...props }, ref) => (
<TooltipPrimitive.Content
ref={ref}
sideOffset={sideOffset}
className={cn(
"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
className,
)}
{...props}
/>
));
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };
=== src/components/ui/use-toast.ts ===
import { useToast, toast } from "@/hooks/use-toast";
export { useToast, toast };
=== src/globals.css ===
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--card: 0 0% 100%;
--card-foreground: 222.2 84% 4.9%;
--popover: 0 0% 100%;
--popover-foreground: 222.2 84% 4.9%;
--primary: 222.2 47.4% 11.2%;
--primary-foreground: 210 40% 98%;
--secondary: 210 40% 96.1%;
--secondary-foreground: 222.2 47.4% 11.2%;
--muted: 210 40% 96.1%;
--muted-foreground: 215.4 16.3% 46.9%;
--accent: 210 40% 96.1%;
--accent-foreground: 222.2 47.4% 11.2%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 210 40% 98%;
--border: 214.3 31.8% 91.4%;
--input: 214.3 31.8% 91.4%;
--ring: 222.2 84% 4.9%;
--radius: 0.5rem;
--sidebar-background: 0 0% 98%;
--sidebar-foreground: 240 5.3% 26.1%;
--sidebar-primary: 240 5.9% 10%;
--sidebar-primary-foreground: 0 0% 98%;
--sidebar-accent: 240 4.8% 95.9%;
--sidebar-accent-foreground: 240 5.9% 10%;
--sidebar-border: 220 13% 91%;
--sidebar-ring: 217.2 91.2% 59.8%;
}
.dark {
--background: 222.2 84% 4.9%;
--foreground: 210 40% 98%;
--card: 222.2 84% 4.9%;
--card-foreground: 210 40% 98%;
--popover: 222.2 84% 4.9%;
--popover-foreground: 210 40% 98%;
--primary: 210 40% 98%;
--primary-foreground: 222.2 47.4% 11.2%;
--secondary: 217.2 32.6% 17.5%;
--secondary-foreground: 210 40% 98%;
--muted: 217.2 32.6% 17.5%;
--muted-foreground: 215 20.2% 65.1%;
--accent: 217.2 32.6% 17.5%;
--accent-foreground: 210 40% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 210 40% 98%;
--border: 217.2 32.6% 17.5%;
--input: 217.2 32.6% 17.5%;
--ring: 212.7 26.8% 83.9%;
--sidebar-background: 240 5.9% 10%;
--sidebar-foreground: 240 4.8% 95.9%;
--sidebar-primary: 224.3 76.3% 48%;
--sidebar-primary-foreground: 0 0% 100%;
--sidebar-accent: 240 3.7% 15.9%;
--sidebar-accent-foreground: 240 4.8% 95.9%;
--sidebar-border: 240 3.7% 15.9%;
--sidebar-ring: 217.2 91.2% 59.8%;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
}
}
=== src/hooks/use-mobile.tsx ===
import * as React from "react";
const MOBILE_BREAKPOINT = 768;
export function useIsMobile() {
const [isMobile, setIsMobile] = React.useState<boolean | undefined>(
undefined,
);
React.useEffect(() => {
const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
const onChange = () => {
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
};
mql.addEventListener("change", onChange);
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
return () => mql.removeEventListener("change", onChange);
}, []);
return !!isMobile;
}
=== src/hooks/use-toast.ts ===
import * as React from "react";
import type { ToastActionElement, ToastProps } from "@/components/ui/toast";
const TOAST_LIMIT = 1;
const TOAST_REMOVE_DELAY = 1000000;
type ToasterToast = ToastProps & {
id: string;
title?: React.ReactNode;
description?: React.ReactNode;
action?: ToastActionElement;
};
const _actionTypes = {
ADD_TOAST: "ADD_TOAST",
UPDATE_TOAST: "UPDATE_TOAST",
DISMISS_TOAST: "DISMISS_TOAST",
REMOVE_TOAST: "REMOVE_TOAST",
} as const;
let count = 0;
function genId() {
count = (count + 1) % Number.MAX_SAFE_INTEGER;
return count.toString();
}
type ActionType = typeof _actionTypes;
type Action =
| {
type: ActionType["ADD_TOAST"];
toast: ToasterToast;
}
| {
type: ActionType["UPDATE_TOAST"];
toast: Partial<ToasterToast>;
}
| {
type: ActionType["DISMISS_TOAST"];
toastId?: ToasterToast["id"];
}
| {
type: ActionType["REMOVE_TOAST"];
toastId?: ToasterToast["id"];
};
interface State {
toasts: ToasterToast[];
}
const toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();
const addToRemoveQueue = (toastId: string) => {
if (toastTimeouts.has(toastId)) {
return;
}
const timeout = setTimeout(() => {
toastTimeouts.delete(toastId);
dispatch({
type: "REMOVE_TOAST",
toastId: toastId,
});
}, TOAST_REMOVE_DELAY);
toastTimeouts.set(toastId, timeout);
};
export const reducer = (state: State, action: Action): State => {
switch (action.type) {
case "ADD_TOAST":
return {
...state,
toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),
};
case "UPDATE_TOAST":
return {
...state,
toasts: state.toasts.map((t) =>
t.id === action.toast.id ? { ...t, ...action.toast } : t,
),
};
case "DISMISS_TOAST": {
const { toastId } = action;
// ! Side effects ! - This could be extracted into a dismissToast() action,
// but I'll keep it here for simplicity
if (toastId) {
addToRemoveQueue(toastId);
} else {
state.toasts.forEach((toast) => {
addToRemoveQueue(toast.id);
});
}
return {
...state,
toasts: state.toasts.map((t) =>
t.id === toastId || toastId === undefined
? {
...t,
open: false,
}
: t,
),
};
}
case "REMOVE_TOAST":
if (action.toastId === undefined) {
return {
...state,
toasts: [],
};
}
return {
...state,
toasts: state.toasts.filter((t) => t.id !== action.toastId),
};
}
};
const listeners: Array<(state: State) => void> = [];
let memoryState: State = { toasts: [] };
function dispatch(action: Action) {
memoryState = reducer(memoryState, action);
listeners.forEach((listener) => {
listener(memoryState);
});
}
type Toast = Omit<ToasterToast, "id">;
function toast({ ...props }: Toast) {
const id = genId();
const update = (props: ToasterToast) =>
dispatch({
type: "UPDATE_TOAST",
toast: { ...props, id },
});
const dismiss = () => dispatch({ type: "DISMISS_TOAST", toastId: id });
dispatch({
type: "ADD_TOAST",
toast: {
...props,
id,
open: true,
onOpenChange: (open) => {
if (!open) dismiss();
},
},
});
return {
id: id,
dismiss,
update,
};
}
function useToast() {
const [state, setState] = React.useState<State>(memoryState);
React.useEffect(() => {
listeners.push(setState);
return () => {
const index = listeners.indexOf(setState);
if (index > -1) {
listeners.splice(index, 1);
}
};
}, [state]);
return {
...state,
toast,
dismiss: (toastId?: string) => dispatch({ type: "DISMISS_TOAST", toastId }),
};
}
export { useToast, toast };
=== src/lib/utils.ts ===
import { clsx, type ClassValue } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
=== src/main.tsx ===
import { createRoot } from "react-dom/client";
import App from "./App.tsx";
import "./globals.css";
createRoot(document.getElementById("root")!).render(<App />);
=== src/pages/Index.tsx ===
// Update this page (the content is just a fallback if you fail to update the page)
import { MadeWithDyad } from "@/components/made-with-dyad";
const Index = () => {
return (
<div className="min-h-screen flex items-center justify-center bg-gray-100">
<div className="text-center">
<h1 className="text-4xl font-bold mb-4">Welcome to Your Blank App</h1>
<p className="text-xl text-gray-600">
Start building your amazing project here!
</p>
</div>
<MadeWithDyad />
</div>
);
};
export default Index;
=== src/pages/NotFound.tsx ===
import { useLocation } from "react-router-dom";
import { useEffect } from "react";
const NotFound = () => {
const location = useLocation();
useEffect(() => {
console.error(
"404 Error: User attempted to access non-existent route:",
location.pathname,
);
}, [location.pathname]);
return (
<div className="min-h-screen flex items-center justify-center bg-gray-100">
<div className="text-center">
<h1 className="text-4xl font-bold mb-4">404</h1>
<p className="text-xl text-gray-600 mb-4">Oops! Page not found</p>
<a href="/" className="text-blue-500 hover:text-blue-700 underline">
Return to Home
</a>
</div>
</div>
);
};
export default NotFound;
=== src/utils/toast.ts ===
import { toast } from "sonner";
export const showSuccess = (message: string) => {
toast.success(message);
};
export const showError = (message: string) => {
toast.error(message);
};
export const showLoading = (message: string) => {
return toast.loading(message);
};
export const dismissToast = (toastId: string) => {
toast.dismiss(toastId);
};
=== src/vite-env.d.ts ===
/// <reference types="vite/client" />
=== tailwind.config.ts ===
import type { Config } from "tailwindcss";
export default {
darkMode: ["class"],
content: [
"./pages/**/*.{ts,tsx}",
"./components/**/*.{ts,tsx}",
"./app/**/*.{ts,tsx}",
"./src/**/*.{ts,tsx}",
],
prefix: "",
theme: {
container: {
center: true,
padding: "2rem",
screens: {
"2xl": "1400px",
},
},
extend: {
colors: {
border: "hsl(var(--border))",
input: "hsl(var(--input))",
ring: "hsl(var(--ring))",
background: "hsl(var(--background))",
foreground: "hsl(var(--foreground))",
primary: {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
secondary: {
DEFAULT: "hsl(var(--secondary))",
foreground: "hsl(var(--secondary-foreground))",
},
destructive: {
DEFAULT: "hsl(var(--destructive))",
foreground: "hsl(var(--destructive-foreground))",
},
muted: {
DEFAULT: "hsl(var(--muted))",
foreground: "hsl(var(--muted-foreground))",
},
accent: {
DEFAULT: "hsl(var(--accent))",
foreground: "hsl(var(--accent-foreground))",
},
popover: {
DEFAULT: "hsl(var(--popover))",
foreground: "hsl(var(--popover-foreground))",
},
card: {
DEFAULT: "hsl(var(--card))",
foreground: "hsl(var(--card-foreground))",
},
sidebar: {
DEFAULT: "hsl(var(--sidebar-background))",
foreground: "hsl(var(--sidebar-foreground))",
primary: "hsl(var(--sidebar-primary))",
"primary-foreground": "hsl(var(--sidebar-primary-foreground))",
accent: "hsl(var(--sidebar-accent))",
"accent-foreground": "hsl(var(--sidebar-accent-foreground))",
border: "hsl(var(--sidebar-border))",
ring: "hsl(var(--sidebar-ring))",
},
},
borderRadius: {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",
sm: "calc(var(--radius) - 4px)",
},
keyframes: {
"accordion-down": {
from: {
height: "0",
},
to: {
height: "var(--radix-accordion-content-height)",
},
},
"accordion-up": {
from: {
height: "var(--radix-accordion-content-height)",
},
to: {
height: "0",
},
},
},
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
},
},
},
plugins: [require("tailwindcss-animate")],
} satisfies Config;
=== tsconfig.app.json ===
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "react-jsx",
/* Linting */
"strict": false,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noImplicitAny": false,
"noFallthroughCasesInSwitch": false,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["src"]
}
=== tsconfig.json ===
{
"files": [],
"references": [
{ "path": "./tsconfig.app.json" },
{ "path": "./tsconfig.node.json" }
],
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
},
"noImplicitAny": false,
"noUnusedParameters": false,
"skipLibCheck": true,
"allowJs": true,
"noUnusedLocals": false,
"strictNullChecks": false
}
}
=== tsconfig.node.json ===
{
"compilerOptions": {
"target": "ES2022",
"lib": ["ES2023"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
/* Linting */
"strict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noFallthroughCasesInSwitch": true
},
"include": ["vite.config.ts"]
}
=== vercel.json ===
{
"$schema": "https://openapi.vercel.sh/vercel.json",
"rewrites": [
{
"source": "/(.*)",
"destination": "/index.html"
}
]
}
=== vite.config.ts ===
import { defineConfig } from "vite";
import dyadComponentTagger from "@dyad-sh/react-vite-component-tagger";
import react from "@vitejs/plugin-react-swc";
import path from "path";
export default defineConfig(() => ({
server: {
host: "::",
port: 8080,
},
plugins: [dyadComponentTagger(), react()],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
}));