Repository: nini22P/Iris Branch: main Commit: 30f54182ae8a Files: 202 Total size: 1.2 MB Directory structure: gitextract_lt5ecz80/ ├── .github/ │ └── workflows/ │ └── ci.yml ├── .gitignore ├── .metadata ├── .vscode/ │ ├── launch.json │ └── settings.json ├── CHANGELOG.md ├── LICENSE ├── PRIVACY.md ├── README.md ├── README_CN.md ├── analysis_options.yaml ├── android/ │ ├── .gitignore │ ├── app/ │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src/ │ │ ├── debug/ │ │ │ └── AndroidManifest.xml │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin/ │ │ │ │ └── nini22p/ │ │ │ │ └── iris/ │ │ │ │ └── MainActivity.kt │ │ │ └── res/ │ │ │ ├── drawable/ │ │ │ │ └── launch_background.xml │ │ │ ├── drawable-v21/ │ │ │ │ └── launch_background.xml │ │ │ ├── mipmap-anydpi-v26/ │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── values/ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ └── styles.xml │ │ │ └── values-night/ │ │ │ └── styles.xml │ │ └── profile/ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── gradle/ │ │ └── wrapper/ │ │ └── gradle-wrapper.properties │ ├── gradle.properties │ └── settings.gradle ├── devtools_options.yaml ├── extract_log.py ├── inno.iss ├── ios/ │ ├── .gitignore │ ├── Flutter/ │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── Runner/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ └── LaunchImage.imageset/ │ │ │ ├── Contents.json │ │ │ └── README.md │ │ ├── Base.lproj/ │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ ├── Info.plist │ │ └── Runner-Bridging-Header.h │ ├── Runner.xcodeproj/ │ │ ├── project.pbxproj │ │ ├── project.xcworkspace/ │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata/ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata/ │ │ └── xcschemes/ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings │ └── RunnerTests/ │ └── RunnerTests.swift ├── l10n.yaml ├── lib/ │ ├── globals.dart │ ├── hooks/ │ │ ├── player/ │ │ │ ├── use_fvp_player.dart │ │ │ └── use_media_kit_player.dart │ │ ├── ui/ │ │ │ ├── use_full_screen.dart │ │ │ ├── use_orientation.dart │ │ │ └── use_resize_window.dart │ │ ├── use_app_lifecycle.dart │ │ ├── use_brightness.dart │ │ ├── use_cover.dart │ │ ├── use_gesture.dart │ │ ├── use_keyboard.dart │ │ └── use_volume.dart │ ├── info.dart │ ├── l10n/ │ │ ├── app_en.arb │ │ ├── app_zh.arb │ │ ├── iso_639.dart │ │ └── languages.dart │ ├── main.dart │ ├── models/ │ │ ├── file.dart │ │ ├── player.dart │ │ ├── progress.dart │ │ ├── storages/ │ │ │ ├── ftp.dart │ │ │ ├── local.dart │ │ │ ├── storage.dart │ │ │ └── webdav.dart │ │ └── store/ │ │ ├── app_state.dart │ │ ├── history_state.dart │ │ ├── play_queue_state.dart │ │ ├── player_ui_state.dart │ │ └── storage_state.dart │ ├── oss_licenses.dart │ ├── pages/ │ │ ├── home/ │ │ │ └── home.dart │ │ └── player/ │ │ ├── audio.dart │ │ ├── control_bar/ │ │ │ ├── control_bar.dart │ │ │ ├── control_bar_slider.dart │ │ │ ├── volume_control.dart │ │ │ └── volume_slider.dart │ │ ├── overlays/ │ │ │ ├── controls_overlay.dart │ │ │ ├── gesture_overlay.dart │ │ │ ├── minimal_progress_overlay.dart │ │ │ └── speed_selector.dart │ │ ├── player.dart │ │ ├── player_view.dart │ │ ├── title_bar.dart │ │ └── video_view.dart │ ├── store/ │ │ ├── persistent_store.dart │ │ ├── use_app_store.dart │ │ ├── use_history_store.dart │ │ ├── use_play_queue_store.dart │ │ ├── use_player_ui_store.dart │ │ └── use_storage_store.dart │ ├── theme.dart │ ├── utils/ │ │ ├── check_content_type.dart │ │ ├── check_data_source_type.dart │ │ ├── data_migration.dart │ │ ├── file_size_convert.dart │ │ ├── files_sort.dart │ │ ├── format_duration_to_minutes.dart │ │ ├── get_latest_release.dart │ │ ├── get_localizations.dart │ │ ├── get_shuffle_play_queue.dart │ │ ├── get_subtitle_map.dart │ │ ├── logger.dart │ │ ├── path.dart │ │ ├── path_conv.dart │ │ ├── platform.dart │ │ ├── request_storage_permission.dart │ │ └── url.dart │ └── widgets/ │ ├── bottom_sheets/ │ │ └── show_open_link_bottom_sheet.dart │ ├── card.dart │ ├── chip.dart │ ├── dialogs/ │ │ ├── show_folder_dialog.dart │ │ ├── show_ftp_dialog.dart │ │ ├── show_language_dialog.dart │ │ ├── show_open_link_dialog.dart │ │ ├── show_orientation_dialog.dart │ │ ├── show_rate_dialog.dart │ │ ├── show_release_dialog.dart │ │ ├── show_theme_mode_dialog.dart │ │ └── show_webdav_dialog.dart │ ├── drag_area.dart │ ├── popup.dart │ └── popups/ │ ├── history.dart │ ├── play_queue.dart │ ├── settings/ │ │ ├── about.dart │ │ ├── dependencies.dart │ │ ├── general.dart │ │ ├── play.dart │ │ └── settings.dart │ ├── storages/ │ │ ├── favorites.dart │ │ ├── files.dart │ │ ├── storages.dart │ │ └── storages_list.dart │ └── track/ │ ├── audio_track_list.dart │ ├── subtitle_and_audio_track.dart │ └── subtitle_list.dart ├── linux/ │ ├── .gitignore │ ├── CMakeLists.txt │ ├── flutter/ │ │ ├── CMakeLists.txt │ │ ├── generated_plugin_registrant.cc │ │ ├── generated_plugin_registrant.h │ │ └── generated_plugins.cmake │ ├── main.cc │ ├── my_application.cc │ └── my_application.h ├── macos/ │ ├── .gitignore │ ├── Flutter/ │ │ ├── Flutter-Debug.xcconfig │ │ ├── Flutter-Release.xcconfig │ │ └── GeneratedPluginRegistrant.swift │ ├── Runner/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ └── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ └── MainMenu.xib │ │ ├── Configs/ │ │ │ ├── AppInfo.xcconfig │ │ │ ├── Debug.xcconfig │ │ │ ├── Release.xcconfig │ │ │ └── Warnings.xcconfig │ │ ├── DebugProfile.entitlements │ │ ├── Info.plist │ │ ├── MainFlutterWindow.swift │ │ └── Release.entitlements │ ├── Runner.xcodeproj/ │ │ ├── project.pbxproj │ │ ├── project.xcworkspace/ │ │ │ └── xcshareddata/ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcshareddata/ │ │ └── xcschemes/ │ │ └── Runner.xcscheme │ ├── Runner.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ └── RunnerTests/ │ └── RunnerTests.swift ├── pubspec.yaml ├── test/ │ └── widget_test.dart └── windows/ ├── .gitignore ├── CMakeLists.txt ├── flutter/ │ ├── CMakeLists.txt │ ├── generated_plugin_registrant.cc │ ├── generated_plugin_registrant.h │ └── generated_plugins.cmake ├── inno-languages/ │ ├── ChineseSimplified.isl │ └── English.isl ├── iris-updater.bat └── runner/ ├── CMakeLists.txt ├── Runner.rc ├── flutter_window.cpp ├── flutter_window.h ├── main.cpp ├── resource.h ├── runner.exe.manifest ├── utils.cpp ├── utils.h ├── win32_window.cpp └── win32_window.h ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/workflows/ci.yml ================================================ name: ci on: push: branches: - main - dev paths-ignore: - README.md - README_CN.md - LICENSE pull_request: paths-ignore: - README.md - README_CN.md - LICENSE jobs: build-windows: runs-on: windows-2022 steps: - name: Clone repository uses: actions/checkout@v4 - name: Set up Flutter uses: subosito/flutter-action@v2 with: channel: stable - name: Generate code run: flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs - name: Build Flutter application for Windows run: flutter build windows - name: Create ZIP archive run: | # Create a directory to hold the files mkdir IRIS # Copy the build output to the IRIS directory Copy-Item -Path "build\windows\x64\runner\Release\*" -Destination "IRIS" -Recurse -Force # Create a ZIP file Compress-Archive -Path "IRIS" -DestinationPath "IRIS-windows.zip" - name: Upload artifact uses: actions/upload-artifact@v4 with: name: IRIS-windows.zip path: IRIS-windows.zip - name: Remove updater run: Remove-Item -Path build\windows\x64\runner\Release\iris-updater.bat -Force - name: Create installer run: iscc inno.iss - name: Upload installer uses: actions/upload-artifact@v4 with: name: IRIS-windows-installer.exe path: build\windows\x64\runner\Release\IRIS-windows-installer.exe - name: Clean up run: Remove-Item -Path build\windows\x64\runner\Release\ -Recurse -Force - name: Build store msix run: dart run msix:build --store true - name: Remove updater run: Remove-Item -Path build\windows\x64\runner\Release\iris-updater.bat -Force - name: Pack store msix run: dart run msix:pack --store true --output-name IRIS-windows-store - name: Upload msix uses: actions/upload-artifact@v4 with: name: IRIS-windows-store.msix path: build\windows\x64\runner\Release\IRIS-windows-store.msix build-android: runs-on: ubuntu-latest steps: - name: Clone repository uses: actions/checkout@v4 - name: Set up Flutter uses: subosito/flutter-action@v2 with: channel: stable - name: Generate code run: flutter pub get && flutter pub run build_runner build --delete-conflicting-outputs - name: Set up Java uses: actions/setup-java@v4 with: distribution: zulu java-version: 21 - name: Decode and save keystore run: | echo "${{ secrets.KEYSTORE }}" | base64 --decode > android/app/keystore.jks - name: Save key.properties run: | echo "storePassword=${{ secrets.STORE_PASSWORD }}" >> android/key.properties echo "keyPassword=${{ secrets.KEY_PASSWORD }}" >> android/key.properties echo "keyAlias=${{ secrets.KEY_ALIAS }}" >> android/key.properties echo "storeFile=keystore.jks" >> android/key.properties - name: Build Flutter application for Android run: flutter build apk --split-per-abi - name: Rename armeabi-v7a APK run: mv build/app/outputs/flutter-apk/app-armeabi-v7a-release.apk IRIS-android-armeabi-v7a.apk - name: Rename arm64-v8a APK run: mv build/app/outputs/flutter-apk/app-arm64-v8a-release.apk IRIS-android-arm64-v8a.apk - name: Rename x86_64 APK run: mv build/app/outputs/flutter-apk/app-x86_64-release.apk IRIS-android-x86_64.apk - name: Upload armeabi-v7a APK uses: actions/upload-artifact@v4 with: name: IRIS-android-armeabi-v7a.apk path: IRIS-android-armeabi-v7a.apk - name: Upload arm64-v8a APK uses: actions/upload-artifact@v4 with: name: IRIS-android-arm64-v8a.apk path: IRIS-android-arm64-v8a.apk - name: Upload x86_64 APK uses: actions/upload-artifact@v4 with: name: IRIS-android-x86_64.apk path: IRIS-android-x86_64.apk release: if: github.event_name == 'push' && github.ref == 'refs/heads/main' runs-on: ubuntu-latest needs: - build-windows - build-android steps: - name: Checkout uses: actions/checkout@v4 - name: Get version id: yq uses: mikefarah/yq@master with: cmd: yq '.version' 'pubspec.yaml' - name: Print version run: echo ${{ steps.yq.outputs.result }} - name: Prepare tag name id: tag_name run: | VERSION="${{ steps.yq.outputs.result }}" TAG_NAME="v${VERSION%%+*}" echo "TAG_NAME=$TAG_NAME" >> "$GITHUB_OUTPUT" - name: Check tag uses: mukunku/tag-exists-action@v1.6.0 id: check-tag with: tag: ${{ steps.tag_name.outputs.TAG_NAME }} - name: Eextract log if: steps.check-tag.outputs.exists == 'false' run: python extract_log.py ${{ steps.tag_name.outputs.TAG_NAME }} - name: Download artifact if: steps.check-tag.outputs.exists == 'false' uses: actions/download-artifact@v4 with: path: artifacts merge-multiple: true - name: Release if: steps.check-tag.outputs.exists == 'false' uses: softprops/action-gh-release@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: ${{ steps.tag_name.outputs.TAG_NAME }} body_path: CHANGELOG_${{ steps.tag_name.outputs.TAG_NAME }}.md draft: false prerelease: false files: | artifacts/IRIS-windows.zip artifacts/IRIS-windows-installer.exe artifacts/IRIS-android-armeabi-v7a.apk artifacts/IRIS-android-arm64-v8a.apk artifacts/IRIS-android-x86_64.apk ================================================ FILE: .gitignore ================================================ # Miscellaneous *.class *.log *.pyc *.swp .DS_Store .atom/ .buildlog/ .history .svn/ migrate_working_dir/ # IntelliJ related *.iml *.ipr *.iws .idea/ # The .vscode folder contains launch configuration and tasks you configure in # VS Code which you may wish to be included in version control, so this line # is commented out by default. #.vscode/ # Flutter/Dart/Pub related **/doc/api/ **/ios/Flutter/.last_build_id .dart_tool/ .flutter-plugins .flutter-plugins-dependencies .pub-cache/ .pub/ /build/ # Symbolication related app.*.symbols # Obfuscation related app.*.map.json # Android Studio will place build artifacts here /android/app/debug /android/app/profile /android/app/release # freezed & json_serializable generated files **/*.freezed.dart **/*.g.dart # l10n lib/l10n/app_localizations*.dart ================================================ FILE: .metadata ================================================ # This file tracks properties of this Flutter project. # Used by Flutter tool to assess capabilities and perform upgrades etc. # # This file should be version controlled and should not be manually edited. version: revision: "dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668" channel: "stable" project_type: app # Tracks metadata for the flutter migrate command migration: platforms: - platform: root create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 - platform: android create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 - platform: ios create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 - platform: linux create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 - platform: macos create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 - platform: web create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 - platform: windows create_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 base_revision: dec2ee5c1f98f8e84a7d5380c05eb8a3d0a81668 # User provided section # List of Local paths (relative to this file) that should be # ignored by the migrate tool. # # Files that are not part of the templates will be ignored by default. unmanaged_files: - 'lib/main.dart' - 'ios/Runner.xcodeproj/project.pbxproj' ================================================ FILE: .vscode/launch.json ================================================ { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "iris", "request": "launch", "type": "dart" }, { "name": "iris (profile mode)", "request": "launch", "type": "dart", "flutterMode": "profile" }, { "name": "iris (release mode)", "request": "launch", "type": "dart", "flutterMode": "release" } ] } ================================================ FILE: .vscode/settings.json ================================================ { "arb-editor.suppressedWarnings": [ "missing_metadata_for_key" ], } ================================================ FILE: CHANGELOG.md ================================================ ## v1.5.2 ### Changelog * Migrate to MPL-2.0 license * Add more media type support * Fix key open subtitle and audio track issue * Fix popup layer cannot be closed with `Esc` key issue ### 更新日志 * 迁移到 MPL-2.0 许可证 * 添加更多媒体类型支持 * 修复按键打开字幕和音频轨道的问题 * 修复弹出层无法使用 `Esc` 键关闭的问题 ## v1.5.1 ### Changelog * Adjusted the playback control bar style in compact layout * Clicking “Check update” in the Microsoft Store version redirects to the Store page * Fixed forward and backward issues ### 更新日志 * 调整了紧凑布局下的播放控制栏样式 * 微软商店版本中点击检查更新将跳转至商店页面 * 修复了快退快进的问题 ## v1.5.0 ### Changelog * Updated app icon * Added a stop and an exit button * Added a playback-speed selector that activates with a touch-and-hold gesture * Fixed URI handling * Improved stability and performance ### 更新日志 * 更换应用图标 * 添加停止按钮和退出按钮 * 添加触控长按激活的播放速度选择器 * 修复 uri 处理 * 优化了稳定性和性能 ## v1.4.2 ### Changelog * Fix audio cover issue * Improve uri handling ### 更新日志 * 修复音频封面问题 * 改进 uri 处理 ## v1.4.1 ### Changelog * Dynamic FTP streaming url ### 更新日志 * FTP 串流使用动态 url ## v1.4.0 ### Changelog * Supports FTP storage * Supports adding local folders to the storage list * Storage list support remote disk and network shortcuts on Windows * Add Windows installer ### 更新日志 * 支持 FTP 存储 * 支持添加本地文件夹到存储列表 * Windows 版本存储列表支持远程磁盘和网络快捷方式 * 添加 Windows 版本安装器 ## v1.3.4 ### Changelog * The Android version allows you to set the screen orientation. * Add playback speed button. * Add hotkeys: Step forward `+`, Step backward `-`. ### 更新日志 * 安卓版本可以设置屏幕方向。 * 添加播放速度按钮。 * 添加快捷键:帧进 `+`,帧退 `-`。 ## v1.3.3 ### Changelog * Fix issue of not being able to continue playback after startup ### 更新日志 * 修复启动后无法继续播放的问题 ## v1.3.2 ### Changelog * Support for custom https ports when adding WebDAV storage ### 更新日志 * 添加 WebDAV 存储时支持自定义 https 端口 ## v1.3.1 ### Changelog * The data save location for the Windows version has been changed to `C:\Users\\AppData\Roaming\nini22P\iris` * Updated upstream dependencies and fixed the issue with switching subtitles in the FVP player backend ### 更新日志 * Windows 版本数据保存位置已修改为 `C:\Users\\AppData\Roaming\nini22P\iris` * 更新上游依赖,修复 FVP 播放器后端切换字幕的问题 ## v1.3.0 ### Changelog * Add [FVP](https://github.com/wang-bin/fvp) player backend (Experimental, with unknown bugs) * Adding volume adjust * Add file sort * Add hotkeys: Volume up ( `Arrow Up` ), Volume down ( `Arrow Down` ), Volume mute ( `Ctrl + M` ), Toggle always on top ( `F10` ), Close currently media file ( `Ctrl + C` ), Exit application ( `Alt + X` ) * Improved some visual effects ### 更新日志 * 添加 [FVP](https://github.com/wang-bin/fvp) 播放器后端(实验性,有未知bug) * 添加音量调整 * 添加文件排序 * 添加快捷键:提升音量( `Arrow Up` )、降低音量( `Arrow Down` )、静音(`Ctrl + M`)、切换窗口置顶( `F10` )、关闭当前媒体文件( `Ctrl + C` )、退出应用( `Alt + X` ) * 改进了部分视觉效果 ## v1.2.1 ### Changelog * Split APKs by architecture to reduce installation size. ### 更新日志 * 拆分不同架构的 APK 以减小安装包大小 ## v1.2.0 ### Changelog * Support jumping to video playback from external clicks (Windows version can play by command line or dragging files to the window) * Support adjusting brightness and volume gestures (Brightness gestures are not available on Windows version) * Support playing online links * Add an option to always start playback from the beginning * On Android 11 and above, file reading is changed to using the "Manage All Files" permission * Improved WebDAV connection test function * Improved some visual effects ### 更新日志 * 支持从外部点击视频跳转播放(Windows 版本可以通过命令行或者拖拽文件到窗口播放) * 支持调整亮度和音量手势(Windows 版本调整亮度手势不可用) * 支持播放在线链接 * 添加总是从头开始播放的选项 * Android 11 以上读取文件时改为使用 `管理所有文件` 权限 * 改进 WebDAV 测试连接功能 * 改进了部分视觉效果 ## v1.1.1 ### Changelog * Restore old update method for windows version (Double-click the `iris-updater.bat` in the same directory as the executable file to upgrade if you have problems updating.) ### 更新日志 * windows 版本恢复为旧的更新方式(更新出问题的可双击打开可执行文件同级目录下的 `iris-updater.bat` 升级) ## v1.1.0 ### Breaking Changes * All configurations will be cleared. Please reconfigure ### Changlog * Display all local storage * Support playback history * Support random playback * Support loop playback * Support video zoom ### 重大变更 * 所有配置将被清空,请重新配置 ### 更新日志 * 显示所有本地存储 * 支持播放历史 * 支持随机播放 * 支持循环播放 * 支持视频缩放 ## v1.0.3 ### Changelog * Improve Windows version installation updates * Fixes an issue where subtitles may not be found ### 更新日志 * 改进 Windows 版本安装更新 * 修复可能无法找到字幕的问题 ## v1.0.2 ### Changelog * Support for switching built-in audio tracks * Reduce package size for Windows version ### 更新日志 * 支持切换内置音轨 * 减小 Windows 版本包体大小 ## v1.0.1 ### Changelog * Windows version support auto update ### 更新日志 * Windows 版本支持自动更新 ## v1.0.0 ### Changelog * Supports WebDAV and local storage video playback ### 更新日志 * 支持 WebDAV 和本地存储视频播放 ================================================ FILE: LICENSE ================================================ Mozilla Public License Version 2.0 ================================== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. 1.5. "Incompatible With Secondary Licenses" means (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. 1.6. "Executable Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. 1.10. "Modifications" means any of the following: (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or (b) any new file in Source Code Form that contains any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. 1.13. "Source Code Form" means the form of the work preferred for making modifications. 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants and Conditions -------------------------------- 2.1. Grants Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. 2.2. Effective Date The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. 2.3. Limitations on Grant Scope The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: (a) for any code that a Contributor has removed from Covered Software; or (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). 2.4. Subsequent Licenses No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). 2.5. Representation Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. 2.6. Fair Use This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. 2.7. Conditions Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. 3. Responsibilities ------------------- 3.1. Distribution of Source Form All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. 3.2. Distribution of Executable Form If You distribute Covered Software in Executable Form then: (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. 3.3. Distribution of a Larger Work You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). 3.4. Notices You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. 4. Inability to Comply Due to Statute or Regulation --------------------------------------------------- If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Termination -------------- 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. ************************************************************************ * * * 6. Disclaimer of Warranty * * ------------------------- * * * * Covered Software is provided under this License on an "as is" * * basis, without warranty of any kind, either expressed, implied, or * * statutory, including, without limitation, warranties that the * * Covered Software is free of defects, merchantable, fit for a * * particular purpose or non-infringing. The entire risk as to the * * quality and performance of the Covered Software is with You. * * Should any Covered Software prove defective in any respect, You * * (not any Contributor) assume the cost of any necessary servicing, * * repair, or correction. This disclaimer of warranty constitutes an * * essential part of this License. No use of any Covered Software is * * authorized under this License except under this disclaimer. * * * ************************************************************************ ************************************************************************ * * * 7. Limitation of Liability * * -------------------------- * * * * Under no circumstances and under no legal theory, whether tort * * (including negligence), contract, or otherwise, shall any * * Contributor, or anyone who distributes Covered Software as * * permitted above, be liable to You for any direct, indirect, * * special, incidental, or consequential damages of any character * * including, without limitation, damages for lost profits, loss of * * goodwill, work stoppage, computer failure or malfunction, or any * * and all other commercial damages or losses, even if such party * * shall have been informed of the possibility of such damages. This * * limitation of liability shall not apply to liability for death or * * personal injury resulting from such party's negligence to the * * extent applicable law prohibits such limitation. Some * * jurisdictions do not allow the exclusion or limitation of * * incidental or consequential damages, so this exclusion and * * limitation may not apply to You. * * * ************************************************************************ 8. Litigation ------------- Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. 9. Miscellaneous ---------------- This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. 10. Versions of the License --------------------------- 10.1. New Versions Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. 10.2. Effect of New Versions You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. 10.3. Modified Versions If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice ------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at . If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" Notice --------------------------------------------------------- This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. ================================================ FILE: PRIVACY.md ================================================ # IRIS Privacy Policy **Last Updated:** June 7, 2025 Thank you for using IRIS ("the Application"). We are committed to protecting your privacy. This Privacy Policy explains how we handle information in connection with your use of the Application. Please read this Privacy Policy carefully before using the Application. By using the Application, you agree to the terms of this policy. ### Information We Collect To provide and improve our services, the Application collects the following types of information: 1. **Information You Provide** * **Network Storage Credentials**: When you configure access to your network storage (like WebDAV), you will be asked to provide connection details such as server address, username, and password. * **Online Video Links**: When you use the "Open Link" feature, you provide the URL for the video. 2. **Information We Collect Automatically** * **Playback History and Preferences**: To enhance your experience, the Application locally stores your playback history (including playback progress) and personal preferences (such as playback speed, volume, and theme mode) on your device. ### How We Use Your Information We strictly adhere to the principles of lawfulness, legitimacy, and necessity in collecting and using your information. This information is used solely to implement product features, specifically to: * Access and play media files from your local device or your configured network storage (like WebDAV). * Stream and play videos from online URLs you provide. * Remember your playback progress to allow you to resume watching. * Save your settings and preferences for a personalized experience. * Check for application updates to provide you with the latest features and bug fixes. ### Information Storage and Security We place great importance on the security of your information. * **Storage Location**: All your personal data, including WebDAV credentials, playback history, and application settings, is **stored only locally on your device**. We do not upload this information to any external servers. * **Security Measures**: We use industry-standard security technologies to protect sensitive information stored on your device from unauthorized access, use, or disclosure. ### Information Sharing and Disclosure We do not sell, trade, or otherwise transfer your personally identifiable information to outside parties. All data is stored locally on your device. ### Children's Privacy The Application is not intended for use by children under the age of 13. We do not knowingly collect personally identifiable information from children under 13. ### Changes to This Privacy Policy We may update our Privacy Policy from time to time. Any changes will be posted on this page, and we encourage you to review this policy periodically for any updates. Your continued use of the Application after we post any modifications will constitute your acknowledgment of the changes and your consent to abide and be bound by the modified Privacy Policy. ### Contact Us If you have any questions or suggestions about this Privacy Policy, please feel free to contact us by creating an issue on our GitHub page: * [https://github.com/nini22P/iris/issues](https://github.com/nini22P/iris/issues) ================================================ FILE: README.md ================================================ logo # IRIS - A lightweight video player [![Build Status](https://github.com/nini22P/iris/actions/workflows/ci.yml/badge.svg)](https://github.com/nini22P/iris/actions/workflows/ci.yml) Afdian [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/nini22p) English | [中文](./README_CN.md) ## Features - [X] Base on [Media Kit](https://github.com/media-kit/media-kit) | [FVP](https://github.com/wang-bin/fvp), supports multiple video formats - [X] Local storage, WebDAV and FTP support - [X] Switchable subtitle and audio track - [X] Playback queue support for random and repeat - [X] Comprehensive gesture support ## Download | Platform | Arch/Channel | Download Link | Notes | | :------- | :---------------- | :----------------------------------------------------------------------------------------------------------------- | :--------------------- | | Windows | **Microsoft Store** | [Microsoft Store](https://apps.microsoft.com/detail/9NML7WNHNRTJ) | **Recommended**, auto-updates | | | Installer | [IRIS-windows-installer.exe](https://github.com/nini22P/iris/releases/latest/download/IRIS-windows-installer.exe) | | | | Portable | [IRIS-windows.zip](https://github.com/nini22P/iris/releases/latest/download/IRIS-windows.zip) | Unzip and run | | Android | arm64-v8a | [IRIS-android-arm64-v8a.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-arm64-v8a.apk) | For 64-bit devices | | | armeabi-v7a | [IRIS-android-armeabi-v7a.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-armeabi-v7a.apk) | For 32-bit devices | | | x86_64 | [IRIS-android-x86_64.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-x86_64.apk) | For emulators/x86 devices | ## Keyboard and Gesture Controls ### Keyboard Controls | Key | Description | | ---------------------- | -------------------------------------------------- | | `Space` | Play / Pause / Select file | | `Arrow Left` | Fast backward | | `Arrow Right` | Fast forward | | `Arrow Up` | Volume up | | `Arrow Down` | Volume down | | `Ctrl + Arrow Left` | Previous | | `Ctrl + Arrow Right` | Next | | `Ctrl + X` | Shuffle | | `Ctrl + R` | Repeat | | `Ctrl + V` | Video zoom | | `Ctrl + M` | Volume mute | | `S` | Subtitles and audio tracks | | `P` | Play queue | | `F` | Storages | | `Ctrl + O` | Open file | | `Ctrl + L` | Open link | | `Ctrl + C` | Close currently media file | | `Ctrl + H` | Play history | | `Ctrl + P` | Settings | | `+` | Step forward | | `-` | Step backward | | `Enter` | Enter full screen / Exit full screen / Select file | | `F11` | Enter full screen / Exit full screen | | `Esc` | Exit current Menu / Go back / Exit full screen | | `F10` | Toggle always on top | | `Alt + X` | Exit application | ### Gesture Controls | Gesture | Description | | --------------------------------- | ----------------------------- | | Tap | Select an item or open a menu | | Double tap center | Play / Pause | | Double tap left side | Fast backward | | Double tap right side | Fast forward | | Swipe left / right | Adjust playback progress | | Swipe up / down on left side | Adjust screen brightness | | Swipe up / down on right side | Adjust device volume | | Long press | Display Playback Speed Selector | | Long press and swipe left / right | Adjust speed playback speed | ## Contribution Contributions of any kind are welcome! If you have suggestions, bug reports, or want to add new features, please submit an [issue](https://github.com/nini22P/iris/issues) or directly submit a Pull Request. ## Sponsorship If you like this project and want to support me, you can sponsor me through the following platforms: - [Afdian](https://afdian.com/a/nini22P) - [Ko-fi](https://ko-fi.com/nini22p) Thank you for your support! ## License This project is licensed under the MPL-2.0 license. For more details, please see the [LICENSE](./LICENSE) file. ================================================ FILE: README_CN.md ================================================ logo # IRIS - 轻量级视频播放器 [![Build Status](https://github.com/nini22P/iris/actions/workflows/ci.yml/badge.svg)](https://github.com/nini22P/iris/actions/workflows/ci.yml) 爱发电 [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/nini22p) [English](./README.md) | 中文 ## 特性 - [X] 基于 [Media Kit](https://github.com/media-kit/media-kit) | [FVP](https://github.com/wang-bin/fvp),可播放多种视频格式 - [X] 支持本地存储、WebDAV 和 FTP - [X] 可切换字幕和音轨 - [X] 播放队列支持随机和重复 - [X] 完善的手势支持 ## 下载 | 平台 | 架构/渠道 | 下载链接 | 备注 | | :------ | :------------ | :----------------------------------------------------------------------------------------------------------------- | :--------------- | | Windows | **微软商店** | [Microsoft Store](https://apps.microsoft.com/detail/9NML7WNHNRTJ) | **推荐**,自动更新 | | | 安装包 | [IRIS-windows-installer.exe](https://github.com/nini22P/iris/releases/latest/download/IRIS-windows-installer.exe) | | | | 便携版 | [IRIS-windows.zip](https://github.com/nini22P/iris/releases/latest/download/IRIS-windows.zip) | 解压即用 | | Android | arm64-v8a | [IRIS-android-arm64-v8a.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-arm64-v8a.apk) | 64位设备 | | | armeabi-v7a | [IRIS-android-armeabi-v7a.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-armeabi-v7a.apk) | 32位设备 | | | x86_64 | [IRIS-android-x86_64.apk](https://github.com/nini22P/iris/releases/latest/download/IRIS-android-x86_64.apk) | 模拟器/x86设备 | ## 键位和手势 ### 键位操作 | 键位 | 描述 | | ---------------------- | ------------------------------------ | | `Space` | 播放 / 暂停 / 选择文件 | | `Arrow Left` | 快退 | | `Arrow Right` | 快进 | | `Arrow Up` | 提升音量 | | `Arrow Down` | 降低音量 | | `Ctrl + Arrow Left` | 上一个 | | `Ctrl + Arrow Right` | 下一个 | | `Ctrl + X` | 随机 | | `Ctrl + R` | 重复 | | `Ctrl + V` | 视频缩放 | | `Ctrl + M` | 静音 | | `S` | 字幕和音轨 | | `P` | 播放队列 | | `F` | 存储 | | `Ctrl + O` | 打开文件 | | `Ctrl + L` | 打开链接 | | `Ctrl + C` | 关闭当前媒体文件 | | `Ctrl + H` | 播放历史 | | `Ctrl + P` | 设置 | | `+` | 帧进 | | `-` | 帧退 | | `Enter` | 进入全屏 / 退出全屏 / 选择文件 | | `F11` | 进入全屏 / 退出全屏 | | `Esc` | 退出当前菜单 / 返回上一级 / 关闭全屏 | | `F10` | 切换窗口置顶 | | `Alt + X` | 退出应用 | ### 手势操作 | 手势 | 描述 | | ---------------- | ------------------ | | 单击 | 选择项目或打开菜单 | | 双击屏幕中心 | 播放 / 暂停 | | 双击屏幕左侧 | 快退 | | 双击屏幕右侧 | 快进 | | 左右滑动 | 调整播放进度 | | 屏幕左侧上下滑动 | 调整屏幕亮度 | | 屏幕右侧上下滑动 | 调整设备音量 | | 长按 | 显示播放速度选择器 | | 长按后左右滑动 | 调整播放速度 | ## 贡献 欢迎任何形式的贡献!如果您有建议、bug 报告或想要添加新功能,请提交 [issue](https://github.com/nini22P/iris/issues) 或者直接提交 Pull Request。 ## 赞助 如果您喜欢这个项目并希望支持我,可以通过以下方式赞助我: - [爱发电](https://afdian.com/a/nini22P) - [Ko-fi](https://ko-fi.com/nini22p) 感谢您的支持! ## 许可证 本项目采用 MPL-2.0 许可证,详细信息请查看 [LICENSE](./LICENSE) 文件。 ================================================ FILE: analysis_options.yaml ================================================ # This file configures the analyzer, which statically analyzes Dart code to # check for errors, warnings, and lints. # # The issues identified by the analyzer are surfaced in the UI of Dart-enabled # IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be # invoked from the command line by running `flutter analyze`. # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. include: package:flutter_lints/flutter.yaml linter: # The lint rules applied to this project can be customized in the # section below to disable rules from the `package:flutter_lints/flutter.yaml` # included above or to enable additional rules. A list of all available lints # and their documentation is published at https://dart.dev/lints. # # Instead of disabling a lint rule for the entire project in the # section below, it can also be suppressed for a single line of code # or a specific dart file by using the `// ignore: name_of_lint` and # `// ignore_for_file: name_of_lint` syntax on the line or in the file # producing the lint. rules: # avoid_print: false # Uncomment to disable the `avoid_print` rule # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule # Additional information about this file can be found at # https://dart.dev/guides/language/analysis-options analyzer: plugins: # - custom_lint errors: invalid_annotation_target: ignore ================================================ FILE: android/.gitignore ================================================ gradle-wrapper.jar /.gradle /captures/ /gradlew /gradlew.bat /local.properties GeneratedPluginRegistrant.java .cxx # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore key.properties **/*.keystore **/*.jks /app/src/main/assets/flutter_assets .kotlin build ================================================ FILE: android/app/build.gradle ================================================ import java.nio.file.Files import java.security.MessageDigest plugins { id "com.android.application" id "kotlin-android" // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. id "dev.flutter.flutter-gradle-plugin" } def keystoreProperties = new Properties() def keystorePropertiesFile = rootProject.file('key.properties') if (keystorePropertiesFile.exists()) { keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) } android { namespace = "nini22p.iris" compileSdk = flutter.compileSdkVersion ndkVersion = "27.0.12077973" compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = JavaVersion.VERSION_17 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId = "nini22p.iris" // You can update the following values to match your application needs. // For more information, see: https://flutter.dev/to/review-gradle-config. minSdk = flutter.minSdkVersion targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName } signingConfigs { release { keyAlias = keystoreProperties['keyAlias'] keyPassword = keystoreProperties['keyPassword'] storeFile = keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null storePassword = keystoreProperties['storePassword'] } } buildTypes { release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. signingConfig = signingConfigs.release } } } flutter { source = "../.." } task downloadFiles(type: Exec) { def filesToDownload = [ [ "url": "https://github.com/notofonts/noto-cjk/raw/refs/heads/main/Sans/OTF/SimplifiedChinese/NotoSansCJKsc-Medium.otf", "md5": "58c83279d990b2cf88d40a0a34832e31", "destination": file("./src/main/assets/flutter_assets/assets/fonts/NotoSansCJKsc-Medium.otf") ] ] filesToDownload.each { fileInfo -> def destFile = fileInfo.destination if (destFile.exists()) { def calculatedMD5 = MessageDigest.getInstance("MD5").digest(Files.readAllBytes(destFile.toPath())).encodeHex().toString() if (calculatedMD5 != fileInfo.md5) { destFile.delete() println "MD5 mismatch. File deleted: ${destFile}" } } if (!destFile.exists()) { destFile.parentFile.mkdirs() println "Downloading file from: ${fileInfo.url}" destFile.withOutputStream { os -> os << new URL(fileInfo.url).openStream() } def calculatedMD5 = MessageDigest.getInstance("MD5").digest(Files.readAllBytes(destFile.toPath())).encodeHex().toString() if (calculatedMD5 != fileInfo.md5) { throw new GradleException("MD5 verification failed for ${destFile}") } } } } assemble.dependsOn(downloadFiles) ================================================ FILE: android/app/proguard-rules.pro ================================================ -dontwarn com.google.errorprone.annotations.CanIgnoreReturnValue -dontwarn com.google.errorprone.annotations.CheckReturnValue -dontwarn com.google.errorprone.annotations.Immutable -dontwarn com.google.errorprone.annotations.RestrictedApi -dontwarn javax.annotation.Nullable -dontwarn javax.annotation.concurrent.GuardedBy ================================================ FILE: android/app/src/debug/AndroidManifest.xml ================================================ ================================================ FILE: android/app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: android/app/src/main/kotlin/nini22p/iris/MainActivity.kt ================================================ package nini22p.iris import io.flutter.embedding.android.FlutterActivity class MainActivity: FlutterActivity() ================================================ FILE: android/app/src/main/res/drawable/launch_background.xml ================================================ ================================================ FILE: android/app/src/main/res/drawable-v21/launch_background.xml ================================================ ================================================ FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml ================================================ ================================================ FILE: android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml ================================================ ================================================ FILE: android/app/src/main/res/values/ic_launcher_background.xml ================================================ #2F2F2F ================================================ FILE: android/app/src/main/res/values/styles.xml ================================================ ================================================ FILE: android/app/src/main/res/values-night/styles.xml ================================================ ================================================ FILE: android/app/src/profile/AndroidManifest.xml ================================================ ================================================ FILE: android/build.gradle ================================================ allprojects { repositories { google() mavenCentral() } } rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } subprojects { project.evaluationDependsOn(":app") } tasks.register("clean", Delete) { delete rootProject.buildDir } ================================================ FILE: android/gradle/wrapper/gradle-wrapper.properties ================================================ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip ================================================ FILE: android/gradle.properties ================================================ org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true ================================================ FILE: android/settings.gradle ================================================ pluginManagement { def flutterSdkPath = { def properties = new Properties() file("local.properties").withInputStream { properties.load(it) } def flutterSdkPath = properties.getProperty("flutter.sdk") assert flutterSdkPath != null, "flutter.sdk not set in local.properties" return flutterSdkPath }() includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") repositories { google() mavenCentral() gradlePluginPortal() } } plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" id "com.android.application" version "8.12.0" apply false id "org.jetbrains.kotlin.android" version "2.2.20" apply false } include ":app" ================================================ FILE: devtools_options.yaml ================================================ description: This file stores settings for Dart & Flutter DevTools. documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states extensions: ================================================ FILE: extract_log.py ================================================ import sys def extract_log(version): try: with open("CHANGELOG.md", "r", encoding="utf-8") as file: lines = file.readlines() except FileNotFoundError: print("Error: not found CHANGELOG.md") return found = False changelog_lines = [] for line in lines: if line.startswith(f"## {version}"): found = True continue elif line.startswith("## ") and found: break if found: changelog_lines.append(line) while changelog_lines and not changelog_lines[-1].strip(): changelog_lines.pop() output = "".join(changelog_lines).strip() output_file = f"CHANGELOG_{version}.md" with open(output_file, "w", encoding="utf-8") as file: file.write(output) print(f"Changelog for {version} saved to {output_file}") if __name__ == "__main__": if len(sys.argv) != 2: print("Usage: python extract_log.py ") sys.exit(1) version = sys.argv[1] extract_log(version) ================================================ FILE: inno.iss ================================================ ; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "IRIS" #define MyAppVersion "1.5.2" #define MyAppPublisher "nini22P" #define MyAppURL "https://github.com/nini22P/iris" #define MyAppExeName "iris.exe" #define MyAppAssocName MyAppPublisher + "." + MyAppName + ".AssocFile" #define MyAppDesc "IRIS player" #define MySetupMutex "iris_player" #define MyProcessName "iris" [Setup] ; NOTE: The value of AppId uniquely identifies this application. Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{E6C83B69-C1A7-4C23-9D74-799BC7A053DB} AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={autopf}\{#MyAppName} UninstallDisplayIcon={app}\{#MyAppExeName} ; "ArchitecturesAllowed=x64compatible" specifies that Setup cannot run ; on anything but x64 and Windows 11 on Arm. ArchitecturesAllowed=x64compatible ; "ArchitecturesInstallIn64BitMode=x64compatible" requests that the ; install be done in "64-bit mode" on x64 or Windows 11 on Arm, ; meaning it should use the native 64-bit Program Files directory and ; the 64-bit view of the registry. ArchitecturesInstallIn64BitMode=x64compatible DisableProgramGroupPage=yes ; Uncomment the following line to run in non administrative install mode (install for current user only). ;PrivilegesRequired=lowest OutputDir=build\windows\x64\runner\Release OutputBaseFilename=IRIS-windows-installer SolidCompression=yes WizardStyle=modern CloseApplications=force SetupMutex={#MySetupMutex} [Languages] Name: "english"; MessagesFile: "windows\inno-languages\English.isl"; LicenseFile: "LICENSE" Name: "chinesesimplified"; MessagesFile: "windows\inno-languages\ChineseSimplified.isl"; LicenseFile: "LICENSE" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "build\windows\x64\runner\Release\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion Source: "build\windows\x64\runner\Release\*.dll"; DestDir: "{app}"; Flags: ignoreversion Source: "build\windows\x64\runner\Release\data\*"; DestDir: "{app}\data"; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Registry] Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}"; Flags: uninsdeletekey Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}"; ValueType: string; ValueName: "FriendlyAppName"; ValueData: "IRIS" ; --- 定义核心的 Programmatic Identifier (ProgID) --- Root: HKA; Subkey: "Software\Classes\{#MyAppAssocName}"; ValueType: string; ValueName: ""; ValueData: "IRIS Media File"; Flags: uninsdeletekey Root: HKA; Subkey: "Software\Classes\{#MyAppAssocName}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName},0" Root: HKA; Subkey: "Software\Classes\{#MyAppAssocName}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}"" ""%1""" ; --- ProgID 添加到各文件类型的 "Open With" 列表 --- ; Audio Files Root: HKA; Subkey: "Software\Classes\.aac\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.aiff\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.alac\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.amr\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.ape\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.caf\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.cda\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.dsd\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.dts\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.flac\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.m4a\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.midi\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mp3\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mpc\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.oga\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.ogg\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.opus\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.raw\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.spx\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.tak\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.tta\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.wav\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.wma\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.wv\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue ; Video Files Root: HKA; Subkey: "Software\Classes\.3gp\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.amv\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.asf\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.avi\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.divx\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.dpx\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.drc\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.dv\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.f4v\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.flv\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.h264\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.h265\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.hevc\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.m2ts\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.m4p\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.m4v\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mkv\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mng\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mov\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mp2\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mp4\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mpe\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mpeg\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mpg\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mpv\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mts\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.mxf\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.nsv\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.ogv\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.qt\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.rm\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.rmvb\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.ts\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.vob\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.webm\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.wmv\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue Root: HKA; Subkey: "Software\Classes\.yuv\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocName}"; ValueData: ""; Flags: uninsdeletevalue ; --- 注册应用程序的 Capabilities --- Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}"; Flags: uninsdeletekey Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities"; ValueType: string; ValueName: "ApplicationName"; ValueData: "{#MyAppName}"; Flags: uninsdeletekey Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities"; ValueType: string; ValueName: "ApplicationDescription"; ValueData: "{#MyAppDesc}" ; Audio Files Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".aac"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".aiff"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".alac"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".cda"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".dsd"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".flac"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".m4a"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".midi"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".mp3"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".ogg"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".opus"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".raw"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".wav"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".wma"; ValueData: "{#MyAppAssocName}" ; Video Files Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".3gp"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".avi"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".dpx"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".dv"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".f4v"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".flv"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".he264"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".hevc"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".h265"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".mkv"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".mp4"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".mpeg"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".mpg"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".mov"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".nsv"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".rm"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".rmvb"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".ts"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".vob"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".webm"; ValueData: "{#MyAppAssocName}" Root: HKA; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities\FileAssociations"; ValueType: string; ValueName: ".wmv"; ValueData: "{#MyAppAssocName}" ; --- 在 HKLM 中注册应用以支持 Capabilities --- Root: HKLM; Subkey: "Software\RegisteredApplications"; ValueType: string; ValueName: "{#MyAppName}"; ValueData: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities"; Flags: uninsdeletevalue Root: HKLM; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities"; ValueType: string; ValueName: "ApplicationName"; ValueData: "{#MyAppName}"; Flags: uninsdeletekey Root: HKLM; Subkey: "Software\{#MyAppPublisher}\{#MyAppName}\Capabilities"; ValueType: string; ValueName: "ApplicationDescription"; ValueData: "{#MyAppDesc}" ; --- 注册应用程序路径 --- Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\App Paths\{#MyAppExeName}"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName}"; Flags: uninsdeletekey Root: HKLM; Subkey: "Software\Microsoft\Windows\CurrentVersion\App Paths\{#MyAppExeName}"; ValueType: string; ValueName: "Path"; ValueData: "{app}" [Icons] Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent [Code] function ReadFileContent(const FileName: String): String; var StringList: TStringList; begin Result := ''; StringList := TStringList.Create; try StringList.LoadFromFile(FileName); Result := StringList.Text; finally StringList.Free; end; end; function GetProcessPIDs(const ProcessName: string): String; var ResultCode: Integer; Cmd: String; OutputFile: String; begin OutputFile := ExpandConstant('{tmp}\..\pid_output.txt'); Cmd := '-Command "Get-Process -Name ''' + ProcessName + ''' | ForEach-Object { if ($_.Path -and (Test-Path (Join-Path (Split-Path $_.Path) ''libass.dll''))) { $_.Id } } > ''' + OutputFile + '''"'; if Exec('powershell.exe', Cmd, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then begin Result := ReadFileContent(OutputFile); end else begin Result := ''; end; if FileExists(OutputFile) then DeleteFile(OutputFile); end; function InitializeUninstall(): Boolean; var ErrorCode: Integer; UserResponse: Integer; PIDs: String; PIDList: TStringList; i: Integer; begin PIDs := GetProcessPIDs('{#MyProcessName}'); if PIDs <> '' then begin UserResponse := MsgBox(FmtMessage(CustomMessage('CloseRunningAppToContinueUninstall'), ['{#MyAppName}']), mbConfirmation, MB_YESNO); if UserResponse = IDNO then begin Result := False; Exit; end else begin PIDList := TStringList.Create; try PIDList.CommaText := PIDs; for i := 0 to PIDList.Count - 1 do begin ShellExec('open', 'taskkill.exe', '/f /pid ' + PIDList[i], '', SW_HIDE, ewNoWait, ErrorCode); end; finally PIDList.Free; end; end; end; Result := True; end; ================================================ FILE: ios/.gitignore ================================================ **/dgph *.mode1v3 *.mode2v3 *.moved-aside *.pbxuser *.perspectivev3 **/*sync/ .sconsign.dblite .tags* **/.vagrant/ **/DerivedData/ Icon? **/Pods/ **/.symlinks/ profile xcuserdata **/.generated/ Flutter/App.framework Flutter/Flutter.framework Flutter/Flutter.podspec Flutter/Generated.xcconfig Flutter/ephemeral/ Flutter/app.flx Flutter/app.zip Flutter/flutter_assets/ Flutter/flutter_export_environment.sh ServiceDefinitions.json Runner/GeneratedPluginRegistrant.* # Exceptions to above rules. !default.mode1v3 !default.mode2v3 !default.pbxuser !default.perspectivev3 ================================================ FILE: ios/Flutter/AppFrameworkInfo.plist ================================================ CFBundleDevelopmentRegion en CFBundleExecutable App CFBundleIdentifier io.flutter.flutter.app CFBundleInfoDictionaryVersion 6.0 CFBundleName App CFBundlePackageType FMWK CFBundleShortVersionString 1.0 CFBundleSignature ???? CFBundleVersion 1.0 MinimumOSVersion 12.0 ================================================ FILE: ios/Flutter/Debug.xcconfig ================================================ #include "Generated.xcconfig" ================================================ FILE: ios/Flutter/Release.xcconfig ================================================ #include "Generated.xcconfig" ================================================ FILE: ios/Runner/AppDelegate.swift ================================================ import Flutter import UIKit @main @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } } ================================================ FILE: ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "size" : "20x20", "idiom" : "iphone", "filename" : "Icon-App-20x20@2x.png", "scale" : "2x" }, { "size" : "20x20", "idiom" : "iphone", "filename" : "Icon-App-20x20@3x.png", "scale" : "3x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "Icon-App-29x29@1x.png", "scale" : "1x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "Icon-App-29x29@2x.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "iphone", "filename" : "Icon-App-29x29@3x.png", "scale" : "3x" }, { "size" : "40x40", "idiom" : "iphone", "filename" : "Icon-App-40x40@2x.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "iphone", "filename" : "Icon-App-40x40@3x.png", "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "Icon-App-60x60@2x.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "Icon-App-60x60@3x.png", "scale" : "3x" }, { "size" : "20x20", "idiom" : "ipad", "filename" : "Icon-App-20x20@1x.png", "scale" : "1x" }, { "size" : "20x20", "idiom" : "ipad", "filename" : "Icon-App-20x20@2x.png", "scale" : "2x" }, { "size" : "29x29", "idiom" : "ipad", "filename" : "Icon-App-29x29@1x.png", "scale" : "1x" }, { "size" : "29x29", "idiom" : "ipad", "filename" : "Icon-App-29x29@2x.png", "scale" : "2x" }, { "size" : "40x40", "idiom" : "ipad", "filename" : "Icon-App-40x40@1x.png", "scale" : "1x" }, { "size" : "40x40", "idiom" : "ipad", "filename" : "Icon-App-40x40@2x.png", "scale" : "2x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "Icon-App-76x76@1x.png", "scale" : "1x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "Icon-App-76x76@2x.png", "scale" : "2x" }, { "size" : "83.5x83.5", "idiom" : "ipad", "filename" : "Icon-App-83.5x83.5@2x.png", "scale" : "2x" }, { "size" : "1024x1024", "idiom" : "ios-marketing", "filename" : "Icon-App-1024x1024@1x.png", "scale" : "1x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "LaunchImage.png", "scale" : "1x" }, { "idiom" : "universal", "filename" : "LaunchImage@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "LaunchImage@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md ================================================ # Launch Screen Assets You can customize the launch screen with your own desired assets by replacing the image files in this directory. You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. ================================================ FILE: ios/Runner/Base.lproj/LaunchScreen.storyboard ================================================ ================================================ FILE: ios/Runner/Base.lproj/Main.storyboard ================================================ ================================================ FILE: ios/Runner/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName IRIS CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName iris CFBundlePackageType APPL CFBundleShortVersionString $(FLUTTER_BUILD_NAME) CFBundleSignature ???? CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen UIMainStoryboardFile Main UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight CADisableMinimumFrameDurationOnPhone UIApplicationSupportsIndirectInputEvents ================================================ FILE: ios/Runner/Runner-Bridging-Header.h ================================================ #import "GeneratedPluginRegistrant.h" ================================================ FILE: ios/Runner.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 97C146E61CF9000F007C117D /* Project object */; proxyType = 1; remoteGlobalIDString = 97C146ED1CF9000F007C117D; remoteInfo = Runner; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 9705A1C41CF9048500538489 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( 331C807B294A618700263BE5 /* RunnerTests.swift */, ); path = RunnerTests; sourceTree = ""; }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 9740EEB31CF90195004384FC /* Generated.xcconfig */, ); name = Flutter; sourceTree = ""; }; 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, ); sourceTree = ""; }; 97C146EF1CF9000F007C117D /* Products */ = { isa = PBXGroup; children = ( 97C146EE1CF9000F007C117D /* Runner.app */, 331C8081294A63A400263BE5 /* RunnerTests.xctest */, ); name = Products; sourceTree = ""; }; 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( 97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 97C147021CF9000F007C117D /* Info.plist */, 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, ); path = Runner; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 331C8080294A63A400263BE5 /* RunnerTests */ = { isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, ); buildRules = ( ); dependencies = ( 331C8086294A63A400263BE5 /* PBXTargetDependency */, ); name = RunnerTests; productName = RunnerTests; productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; 97C146ED1CF9000F007C117D /* Runner */ = { isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, ); buildRules = ( ); dependencies = ( ); name = Runner; productName = Runner; productReference = 97C146EE1CF9000F007C117D /* Runner.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C8080294A63A400263BE5 = { CreatedOnToolsVersion = 14.0; TestTargetID = 97C146ED1CF9000F007C117D; }; 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; LastSwiftMigration = 1100; }; }; }; buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 97C146E51CF9000F007C117D; productRefGroup = 97C146EF1CF9000F007C117D /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, 331C8080294A63A400263BE5 /* RunnerTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 331C807F294A63A400263BE5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 97C146EC1CF9000F007C117D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Run Script"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 331C807D294A63A400263BE5 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 97C146EA1CF9000F007C117D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 97C146ED1CF9000F007C117D /* Runner */; targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 97C146FA1CF9000F007C117D /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( 97C146FB1CF9000F007C117D /* Base */, ); name = Main.storyboard; sourceTree = ""; }; 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( 97C147001CF9000F007C117D /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 249021D3217E4FDB00AE95B9 /* Profile */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 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_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 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_IMPLICIT_RETAIN_SELF = 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_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; 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 = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Profile; }; 249021D4217E4FDB00AE95B9 /* Profile */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = nini22p.iris; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Profile; }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; }; name = Debug; }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; }; name = Release; }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; }; name = Profile; }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 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_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 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_IMPLICIT_RETAIN_SELF = 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_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; 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 = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 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_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 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_IMPLICIT_RETAIN_SELF = 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_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; GCC_C_LANGUAGE_STANDARD = gnu99; 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 = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; }; 97C147061CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = nini22p.iris; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Debug; }; 97C147071CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = nini22p.iris; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 331C8088294A63A400263BE5 /* Debug */, 331C8089294A63A400263BE5 /* Release */, 331C808A294A63A400263BE5 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( 97C147031CF9000F007C117D /* Debug */, 97C147041CF9000F007C117D /* Release */, 249021D3217E4FDB00AE95B9 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( 97C147061CF9000F007C117D /* Debug */, 97C147071CF9000F007C117D /* Release */, 249021D4217E4FDB00AE95B9 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 97C146E61CF9000F007C117D /* Project object */; } ================================================ FILE: ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings ================================================ PreviewsEnabled ================================================ FILE: ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme ================================================ ================================================ FILE: ios/Runner.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings ================================================ PreviewsEnabled ================================================ FILE: ios/RunnerTests/RunnerTests.swift ================================================ import Flutter import UIKit import XCTest class RunnerTests: XCTestCase { func testExample() { // If you add code to the Runner application, consider adding tests here. // See https://developer.apple.com/documentation/xctest for more information about using XCTest. } } ================================================ FILE: l10n.yaml ================================================ arb-dir: lib/l10n template-arb-file: app_en.arb output-localization-file: app_localizations.dart synthetic-package: false ================================================ FILE: lib/globals.dart ================================================ // ignore: unnecessary_library_name library my_app.globals; import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; List arguments = []; String? initUri; PermissionStatus? storagePermissionStatus; final moreMenuKey = GlobalKey(); final rateMenuKey = GlobalKey(); const double speedSelectorItemWidth = 64.0; const List speedStops = [ 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, ]; ================================================ FILE: lib/hooks/player/use_fvp_player.dart ================================================ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:fvp/fvp.dart'; import 'package:iris/globals.dart' as globals; import 'package:iris/models/file.dart'; import 'package:iris/models/player.dart'; import 'package:iris/models/progress.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/models/store/app_state.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_history_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/store/use_storage_store.dart'; import 'package:iris/utils/check_data_source_type.dart'; import 'package:iris/utils/logger.dart'; import 'package:iris/utils/platform.dart'; import 'package:media_stream/media_stream.dart'; import 'package:saf_util/saf_util.dart'; import 'package:video_player/video_player.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; FvpPlayer useFvpPlayer(BuildContext context) { final autoPlay = useAppStore().select(context, (state) => state.autoPlay); final rate = useAppStore().select(context, (state) => state.rate); final volume = useAppStore().select(context, (state) => state.volume); final isMuted = useAppStore().select(context, (state) => state.isMuted); final repeat = useAppStore().select(context, (state) => state.repeat); final playQueue = usePlayQueueStore().select(context, (state) => state.playQueue); final currentIndex = usePlayQueueStore().select(context, (state) => state.currentIndex); final bool alwaysPlayFromBeginning = useAppStore().select(context, (state) => state.alwaysPlayFromBeginning); final history = useHistoryStore().select(context, (state) => state.history); final looping = useMemoized(() => repeat == Repeat.one ? true : false, [repeat]); final int currentPlayIndex = useMemoized( () => playQueue.indexWhere((element) => element.index == currentIndex), [playQueue, currentIndex]); final FileItem? file = useMemoized( () => playQueue.isEmpty || currentPlayIndex < 0 ? null : playQueue[currentPlayIndex].file, [playQueue, currentPlayIndex]); final externalSubtitle = useState(null); final List externalSubtitles = useMemoized(() => file?.subtitles ?? [], [file?.subtitles]); final isInitializing = useState(false); MediaStream mediaStream = useMemoized(() => MediaStream()); final streamUrl = useMemoized(() => mediaStream.url); final controller = useState(VideoPlayerController.networkUrl(Uri.parse(''))); final isPlaying = useListenableSelector( controller.value, () => controller.value.value.isPlaying); final position = useListenableSelector( controller.value, () => controller.value.value.position); final duration = useListenableSelector( controller.value, () => controller.value.value.duration); final buffered = useListenableSelector( controller.value, () => controller.value.value.buffered); final width = useListenableSelector( controller.value, () => controller.value.value.size.width); final height = useListenableSelector( controller.value, () => controller.value.value.size.height); useEffect(() { if (file?.type != ContentType.video) { usePlayerUiStore().updateAspectRatio(0); return; } if (width != 0 && height != 0) { usePlayerUiStore().updateAspectRatio(width / height); } else { usePlayerUiStore().updateAspectRatio(0); } return; }, [file?.type, width, height]); Future init(FileItem? file) async { isInitializing.value = true; try { if (controller.value.value.isInitialized) { logger('Dispose player'); controller.value.dispose(); } if (file == null || file.uri.isEmpty) { controller.value = VideoPlayerController.networkUrl(Uri.parse('')); } else { final storage = useStorageStore().findById(file.storageId); final auth = storage?.getAuth(); logger('Open file: $file'); switch (checkDataSourceType(file)) { case DataSourceType.file: controller.value = VideoPlayerController.file( File(file.uri), httpHeaders: auth != null ? {'authorization': auth} : {}, ); case DataSourceType.contentUri: final isExists = await SafUtil().exists(file.uri, false); controller.value = VideoPlayerController.contentUri( isExists ? Uri.parse(file.uri) : Uri.parse(''), ); default: controller.value = VideoPlayerController.networkUrl( Uri.parse(file.storageType == StorageType.ftp ? '$streamUrl/${file.uri}' : file.uri), httpHeaders: auth != null ? {'authorization': auth} : {}, ); } } await controller.value.initialize(); await controller.value.setLooping(repeat == Repeat.one ? true : false); await controller.value.setPlaybackSpeed(rate); await controller.value.setVolume(isMuted ? 0 : volume / 100); } catch (e) { logger('Error initializing player: $e'); } finally { isInitializing.value = false; } } useEffect(() { init(file); return; }, [file?.uri]); useEffect(() { return () { if (controller.value.value.isInitialized) { controller.value.dispose(); } }; }, []); useEffect(() { () async { final currentExternalSubtitle = externalSubtitle.value; if (currentExternalSubtitle == null || externalSubtitles.isEmpty) { controller.value.setExternalSubtitle(''); } else if (externalSubtitle.value! < externalSubtitles.length) { bool isExists = true; final uri = file?.storageType == StorageType.ftp ? '$streamUrl/${externalSubtitles[currentExternalSubtitle].uri}' : externalSubtitles[currentExternalSubtitle].uri; logger('External subtitle uri: $uri'); if (Platform.isAndroid && externalSubtitles[currentExternalSubtitle] .uri .startsWith('content://')) { isExists = await SafUtil().exists(uri, false); } if (isExists) { controller.value.setExternalSubtitle(uri); } else { externalSubtitle.value = null; } } }(); return; }, [externalSubtitles, externalSubtitle.value]); useEffect(() { () async { if (file != null && controller.value.value.isCompleted && controller.value.value.position != Duration.zero && controller.value.value.duration != Duration.zero) { logger('Completed: ${file.name}'); if (repeat == Repeat.one) return; if (currentPlayIndex == playQueue.length - 1) { if (repeat == Repeat.all) { await usePlayQueueStore().updateCurrentIndex(playQueue[0].index); } } else { await usePlayQueueStore() .updateCurrentIndex(playQueue[currentPlayIndex + 1].index); } } }(); return; }, [controller.value.value.isCompleted]); useEffect(() { if (controller.value.value.isInitialized) { controller.value.setPlaybackSpeed(rate); } return; }, [rate]); useEffect(() { if (controller.value.value.isInitialized) { controller.value.setVolume(isMuted ? 0 : volume / 100); } return; }, [volume, isMuted]); useEffect(() { if (controller.value.value.isInitialized) { logger('Set looping: $looping'); controller.value.setLooping(repeat == Repeat.one ? true : false); } return; }, [looping]); useEffect(() { () async { if (controller.value.value.duration != Duration.zero && file != null && file.type == ContentType.video) { Progress? progress = history[file.getID()]; if (progress != null) { if (!alwaysPlayFromBeginning && (progress.duration.inMilliseconds - progress.position.inMilliseconds) > 5000) { logger( 'Resume progress: ${file.name} position: ${progress.position} duration: ${progress.duration}'); await controller.value.seekTo(progress.position); } } } if (autoPlay) { controller.value.play(); } if (externalSubtitles.isNotEmpty) { externalSubtitle.value = 0; } }(); return; }, [controller.value.value.duration]); useEffect(() { return () { if (isAndroid && globals.initUri == file?.uri && globals.initUri != null && globals.initUri!.startsWith('content://')) { return; } if (file != null && controller.value.value.isInitialized && controller.value.value.duration.inSeconds != 0) { logger( 'Save progress: ${file.name}, position: ${controller.value.value.position}, duration: ${controller.value.value.duration}'); useHistoryStore().add(Progress( dateTime: DateTime.now().toUtc(), position: controller.value.value.position, duration: controller.value.value.duration, file: file, )); } }; }, [file]); useEffect(() { if (controller.value.value.isPlaying) { logger('Enable wakelock'); WakelockPlus.enable(); } else { logger('Disable wakelock'); WakelockPlus.disable(); } return; }, [controller.value.value.isPlaying]); Future play() async { if (!controller.value.value.isInitialized && !isInitializing.value && file != null) { init(file); } controller.value.play(); } Future pause() async { controller.value.pause(); } Future seek(Duration newPosition) async { logger('Seek to: $newPosition'); if (controller.value.value.duration == Duration.zero) return; newPosition.inSeconds < 0 ? await controller.value.seekTo(Duration.zero) : newPosition.inSeconds > controller.value.value.duration.inSeconds ? await controller.value.seekTo(controller.value.value.duration) : await controller.value.seekTo(newPosition); } Future backward(int seconds) async => await seek( Duration(seconds: controller.value.value.position.inSeconds - seconds)); Future forward(int seconds) async => await seek( Duration(seconds: controller.value.value.position.inSeconds + seconds)); Future stepBackward() async { if (file?.type == ContentType.video) { await controller.value.step(frames: -1); logger('Step backward'); } } Future stepForward() async { if (file?.type == ContentType.video) { await controller.value.step(frames: 1); logger('Step forward'); } } Future saveProgress() async { if (isAndroid && globals.initUri == file?.uri && globals.initUri != null && globals.initUri!.startsWith('content://')) { return; } if (file != null && controller.value.value.duration != Duration.zero) { logger( 'Save progress: ${file.name}, position: ${controller.value.value.position}, duration: ${controller.value.value.duration}'); useHistoryStore().add(Progress( dateTime: DateTime.now().toUtc(), position: controller.value.value.position, duration: controller.value.value.duration, file: file, )); } } useEffect(() => saveProgress, []); final fvpPlayer = useMemoized( () => FvpPlayer( controller: controller.value, isInitializing: isInitializing.value, isPlaying: isPlaying, externalSubtitle: externalSubtitle, externalSubtitles: externalSubtitles, position: !controller.value.value.isInitialized || duration == Duration.zero ? Duration.zero : position, duration: controller.value.value.isInitialized ? duration : Duration.zero, buffer: buffered.isEmpty || duration == Duration.zero ? Duration.zero : buffered.reduce((max, curr) => curr.end > max.end ? curr : max).end, width: width, height: height, play: play, pause: pause, backward: backward, forward: forward, stepBackward: stepBackward, stepForward: stepForward, seek: seek, saveProgress: saveProgress, ), [ controller.value, controller.value.value.isInitialized, isInitializing.value, isPlaying, externalSubtitle.value, externalSubtitles, position, duration, buffered, width, height, play, pause, seek, backward, forward, stepBackward, stepForward, saveProgress, ], ); return fvpPlayer; } ================================================ FILE: lib/hooks/player/use_media_kit_player.dart ================================================ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/globals.dart' as globals; import 'package:iris/models/file.dart'; import 'package:iris/models/player.dart'; import 'package:iris/models/progress.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/models/store/app_state.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_history_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/store/use_storage_store.dart'; import 'package:iris/utils/logger.dart'; import 'package:iris/utils/platform.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_kit_video/media_kit_video.dart'; import 'package:media_stream/media_stream.dart'; import 'package:path_provider/path_provider.dart'; MediaKitPlayer useMediaKitPlayer(BuildContext context) { final player = useMemoized( () => Player( configuration: const PlayerConfiguration( libass: true, ), ), ); final controller = useMemoized(() => VideoController(player)); final rate = useAppStore().select(context, (state) => state.rate); final volume = useAppStore().select(context, (state) => state.volume); final isMuted = useAppStore().select(context, (state) => state.isMuted); useEffect(() { () async { player.setSubtitleTrack(SubtitleTrack.no()); player.setRate(rate); player.setVolume(isMuted ? 0 : volume.toDouble()); if (Platform.isAndroid) { NativePlayer nativePlayer = player.platform as NativePlayer; final appSupportDir = await getApplicationSupportDirectory(); final String fontsDir = "${appSupportDir.path}/fonts"; final Directory fontsDirectory = Directory(fontsDir); if (!await fontsDirectory.exists()) { await fontsDirectory.create(recursive: true); logger('fonts directory created'); } final File file = File("$fontsDir/NotoSansCJKsc-Medium.otf"); if (!await file.exists()) { final ByteData data = await rootBundle.load("assets/fonts/NotoSansCJKsc-Medium.otf"); final Uint8List buffer = data.buffer.asUint8List(); await file.create(recursive: true); await file.writeAsBytes(buffer); logger('NotoSansCJKsc-Medium.otf copied'); } await nativePlayer.setProperty("sub-fonts-dir", fontsDir); await nativePlayer.setProperty("sub-font", "NotoSansCJKsc-Medium"); } }(); return () { player.dispose(); }; }, []); final List playQueue = usePlayQueueStore().select(context, (state) => state.playQueue); final int currentIndex = usePlayQueueStore().select(context, (state) => state.currentIndex); final bool autoPlay = useAppStore().select(context, (state) => state.autoPlay); final Repeat repeat = useAppStore().select(context, (state) => state.repeat); final bool alwaysPlayFromBeginning = useAppStore().select(context, (state) => state.alwaysPlayFromBeginning); final history = useHistoryStore().select(context, (state) => state.history); final int currentPlayIndex = useMemoized( () => playQueue.indexWhere((element) => element.index == currentIndex), [playQueue, currentIndex]); final FileItem? file = useMemoized( () => playQueue.isEmpty || currentPlayIndex < 0 ? null : playQueue[currentPlayIndex].file, [playQueue, currentPlayIndex]); final playingStream = useMemoized(() => player.stream.playing, []); bool playing = useStream(playingStream).data ?? false; final videoParamsStream = useMemoized(() => player.stream.videoParams, []); VideoParams? videoParams = useStream(videoParamsStream).data; // AudioParams? audioParams = useStream(player.stream.audioParams).data; final positionStream = useMemoized(() => player.stream.position, []); final position = useStream(positionStream).data ?? Duration.zero; final durationStream = useMemoized(() => player.stream.duration, []); Duration duration = useStream(durationStream).data ?? Duration.zero; final bufferStream = useMemoized(() => player.stream.buffer, []); Duration buffer = useStream(bufferStream).data ?? Duration.zero; final completedStream = useMemoized(() => player.stream.completed, []); bool completed = useStream(completedStream).data ?? false; // double rate = useStream(player.stream.rate).data ?? 1.0; final trackStream = useMemoized(() => player.stream.track, []); Track? track = useStream(trackStream).data; AudioTrack audio = useMemoized(() => track?.audio ?? AudioTrack.no(), [track?.audio]); SubtitleTrack subtitle = useMemoized( () => track?.subtitle ?? SubtitleTrack.no(), [track?.subtitle]); final tracksStream = useMemoized(() => player.stream.tracks, []); Tracks? tracks = useStream(tracksStream).data; List audios = useMemoized(() => (tracks?.audio ?? []), [tracks?.audio]); List subtitles = useMemoized( () => [...(tracks?.subtitle ?? [])] ..removeWhere((subtitle) => subtitle == SubtitleTrack.auto()), [tracks?.subtitle]); final List? externalSubtitles = useMemoized( () => [...file?.subtitles ?? []]..removeWhere( (subtitle) => subtitles.any((item) => item.title == subtitle.name)), [file?.subtitles, subtitles]); final isInitializing = useState(false); MediaStream mediaStream = useMemoized(() => MediaStream(), []); Future init(FileItem file) async { if (file.uri == '') return; isInitializing.value = true; try { final storage = useStorageStore().findById(file.storageId); final auth = storage?.getAuth(); logger('Open file: $file'); await player.open( Media( file.storageType == StorageType.ftp ? '${mediaStream.url}/${file.uri}' : file.uri, httpHeaders: auth != null ? {'authorization': auth} : {}, ), play: autoPlay, ); } catch (e) { logger('Error initializing player: $e'); } isInitializing.value = false; } useEffect(() { if (file == null || playQueue.isEmpty) { player.stop(); } else { init(file); } return () { if (isAndroid && globals.initUri == file?.uri && globals.initUri != null && globals.initUri!.startsWith('content://')) { return; } if (file != null && player.state.duration != Duration.zero) { logger( 'Save progress: ${file.name}, position: ${player.state.position}, duration: ${player.state.duration}'); useHistoryStore().add(Progress( dateTime: DateTime.now().toUtc(), position: player.state.position, duration: player.state.duration, file: file, )); } }; }, [file]); useEffect(() { () async { if (duration == Duration.zero) { await player.setSubtitleTrack(SubtitleTrack.no()); return; } // 查询播放进度 if (file != null && file.type == ContentType.video) { Progress? progress = history[file.getID()]; if (progress != null) { if (!alwaysPlayFromBeginning && (progress.duration.inMilliseconds - progress.position.inMilliseconds) > 5000) { logger( 'Resume progress: ${file.name} position: ${progress.position} duration: ${progress.duration}'); await player.seek(progress.position); } } } // 设置字幕 if (externalSubtitles!.isNotEmpty) { logger('Set external subtitle: ${externalSubtitles[0]}'); final uri = file?.storageType == StorageType.ftp ? '${mediaStream.url}/${externalSubtitles[0].uri}' : externalSubtitles[0].uri; logger('External subtitle uri: $uri'); await player.setSubtitleTrack( SubtitleTrack.uri( uri, title: externalSubtitles[0].name, ), ); } else if (subtitles.length > 1) { logger( 'Set subtitle: ${subtitles[1].title ?? subtitles[1].language ?? subtitles[1].id}'); await player.setSubtitleTrack(subtitles[1]); } else { await player.setSubtitleTrack(SubtitleTrack.no()); } }(); return; }, [duration]); useEffect(() { () async { if (completed) { if (repeat == Repeat.one) return; if (currentPlayIndex == playQueue.length - 1) { if (repeat == Repeat.all) { await usePlayQueueStore().updateCurrentIndex(playQueue[0].index); } } else { await usePlayQueueStore() .updateCurrentIndex(playQueue[currentPlayIndex + 1].index); } } }(); return null; }, [completed, repeat]); useEffect(() { player.setRate(rate); return; }, [rate]); useEffect(() { player.setVolume(isMuted ? 0 : volume.toDouble()); return; }, [volume, isMuted]); useEffect(() { logger('$repeat'); if (repeat == Repeat.one) { player.setPlaylistMode(PlaylistMode.loop); } else { player.setPlaylistMode(PlaylistMode.none); } return; }, [repeat]); useEffect(() { if (file?.type != ContentType.video) { usePlayerUiStore().updateAspectRatio(0); return; } final width = videoParams?.w ?? 0; final height = videoParams?.h ?? 0; if (width == 0 || height == 0) { usePlayerUiStore().updateAspectRatio(0); } else { usePlayerUiStore().updateAspectRatio(width / height); } return; }, [file?.type, videoParams?.w, videoParams?.h]); Future saveProgress() async { if (isAndroid && globals.initUri == file?.uri && globals.initUri != null && globals.initUri!.startsWith('content://')) { return; } if (file != null && player.state.duration != Duration.zero) { logger( 'Save progress: ${file.name}, position: ${player.state.position}, duration: ${player.state.duration}'); useHistoryStore().add(Progress( dateTime: DateTime.now().toUtc(), position: player.state.position, duration: player.state.duration, file: file, )); } } useEffect(() => saveProgress, []); Future play() async { if (duration == Duration.zero && file != null && !isInitializing.value) { await init(file); } await player.play(); } Future pause() async { await player.pause(); } Future seek(Duration newPosition) async => newPosition.inMilliseconds < 0 ? await player.seek(Duration.zero) : newPosition.inMilliseconds > duration.inMilliseconds ? await player.seek(duration) : await player.seek(newPosition); Future backward(int seconds) async { await seek(Duration(seconds: position.inSeconds - seconds)); } Future forward(int seconds) async { await seek(Duration(seconds: position.inSeconds + seconds)); } Future stepBackward() async { final nativePlayer = player.platform; if (nativePlayer is NativePlayer && file?.type == ContentType.video) { await nativePlayer.command(['frame-back-step']); logger('Step backward'); } } Future stepForward() async { final nativePlayer = player.platform; if (nativePlayer is NativePlayer && file?.type == ContentType.video) { await nativePlayer.command(['frame-step']); logger('Step forward'); } } final mediaKitPlayer = useMemoized( () => MediaKitPlayer( player: player, controller: controller, subtitle: subtitle, subtitles: subtitles, externalSubtitles: externalSubtitles ?? [], audio: audio, audios: audios, isInitializing: isInitializing.value, isPlaying: playing, position: duration == Duration.zero ? Duration.zero : position, duration: duration, buffer: duration == Duration.zero ? Duration.zero : buffer, width: videoParams?.w?.toDouble() ?? 0, height: videoParams?.h?.toDouble() ?? 0, saveProgress: saveProgress, play: play, pause: pause, backward: backward, forward: forward, stepBackward: stepBackward, stepForward: stepForward, seek: seek, ), [ player, controller, subtitle, subtitles, externalSubtitles, audio, audios, isInitializing.value, playing, position, duration, buffer, videoParams?.w, videoParams?.h, saveProgress, play, pause, backward, forward, stepBackward, stepForward, seek, ], ); return mediaKitPlayer; } ================================================ FILE: lib/hooks/ui/use_full_screen.dart ================================================ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; void useFullScreen() { final context = useContext(); final isFullScreen = usePlayerUiStore().select(context, (state) => state.isFullScreen); useEffect(() { () async { if (isDesktop) { await windowManager.setFullScreen(isFullScreen); } }(); return; }, [isFullScreen]); } ================================================ FILE: lib/hooks/ui/use_orientation.dart ================================================ import 'dart:io'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/store/app_state.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_player_ui_store.dart'; void useOrientation() { final context = useContext(); final orientation = useAppStore().select(context, (state) => state.orientation); final aspectRatio = usePlayerUiStore().select(context, (state) => state.aspectRatio); setOrientation(ScreenOrientation orientation, double? aspect) { if (Platform.isAndroid || Platform.isIOS) { switch (orientation) { case ScreenOrientation.device: SystemChrome.setPreferredOrientations([]); break; case ScreenOrientation.landscape: SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ]); break; case ScreenOrientation.portrait: SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]); break; } } } useEffect(() { setOrientation(orientation, aspectRatio); return () => SystemChrome.setPreferredOrientations([]); }, []); useEffect(() { setOrientation(orientation, aspectRatio); return; }, [orientation, aspectRatio]); } ================================================ FILE: lib/hooks/ui/use_resize_window.dart ================================================ import 'dart:math' as math; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/file.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/utils/logger.dart'; import 'package:iris/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; import 'package:window_size/window_size.dart'; Future _applyResize(Rect newBounds) async { if (await windowManager.isFullScreen() || await windowManager.isMaximized()) { return; } await windowManager.setBounds(newBounds, animate: true); } void useResizeWindow() { final context = useContext(); final autoResize = useAppStore().select(context, (state) => state.autoResize); final isFullScreen = usePlayerUiStore().select(context, (state) => state.isFullScreen); final aspectRatio = usePlayerUiStore().select(context, (state) => state.aspectRatio); final currentPlay = usePlayQueueStore().select(context, (state) { final index = state.playQueue.indexWhere((e) => e.index == state.currentIndex); return index != -1 ? state.playQueue[index] : null; }); final contentType = currentPlay?.file.type ?? ContentType.other; final prevIsFullScreen = usePrevious(isFullScreen); final prevAspectRatio = usePrevious(aspectRatio); useEffect(() { if (!isDesktop) return; Future performResize() async { if (isFullScreen) return; if (!autoResize) { await windowManager.setAspectRatio(0); return; } if (contentType == ContentType.audio) { await windowManager.setAspectRatio(0); return; } if (contentType == ContentType.video) { if (aspectRatio <= 0) { await windowManager.setAspectRatio(0); return; } await windowManager.setAspectRatio(aspectRatio); final oldBounds = await windowManager.getBounds(); final screen = await getCurrentScreen(); if (screen == null) return; if (oldBounds.size.aspectRatio.toStringAsFixed(2) == aspectRatio.toStringAsFixed(2)) { return; } Size newSize; final bool isPreviousPortrait = (prevAspectRatio ?? 1.0) < 1.0; final bool isCurrentLandscape = aspectRatio >= 1.0; if (isPreviousPortrait && isCurrentLandscape) { logger('Resize rule: Portrait to Landscape (Height-based)'); double newHeight = oldBounds.height; double newWidth = newHeight * aspectRatio; newSize = Size(newWidth, newHeight); } else { logger('Resize rule: Standard (Normalized Area-based)'); double currentArea = oldBounds.width * oldBounds.height; const double standardAspectRatio = 16.0 / 9.0; double normalizedHeight = math.sqrt(currentArea / standardAspectRatio); double newHeight = normalizedHeight; double newWidth = newHeight * aspectRatio; newSize = Size(newWidth, newHeight); } double maxWidth = screen.frame.width / screen.scaleFactor * 0.95; double maxHeight = screen.frame.height / screen.scaleFactor * 0.95; if (newSize.width > maxWidth) { newSize = Size(maxWidth, maxWidth / aspectRatio); } if (newSize.height > maxHeight) { newSize = Size(maxHeight * aspectRatio, maxHeight); } final newPosition = Offset( oldBounds.left + (oldBounds.width - newSize.width) / 2, oldBounds.top + (oldBounds.height - newSize.height) / 2, ); await _applyResize(Rect.fromLTWH( newPosition.dx, newPosition.dy, newSize.width, newSize.height)); } } final wasFullScreen = prevIsFullScreen == true; if (wasFullScreen && !isFullScreen) { Future.delayed(const Duration(milliseconds: 50), performResize); } else { performResize(); } return null; }, [ autoResize, isFullScreen, aspectRatio, contentType, ]); } ================================================ FILE: lib/hooks/use_app_lifecycle.dart ================================================ import 'dart:ui'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/models/player.dart'; import 'package:iris/utils/logger.dart'; import 'package:provider/provider.dart'; void useAppLifecycle() { final context = useContext(); AppLifecycleState? appLifecycleState = useAppLifecycleState(); useEffect(() { try { if (appLifecycleState == AppLifecycleState.paused) { logger('App lifecycle state: paused'); context.read().saveProgress(); } } catch (e) { logger('App lifecycle state error: $e'); } return; }, [appLifecycleState]); } ================================================ FILE: lib/hooks/use_brightness.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/utils/logger.dart'; import 'package:screen_brightness/screen_brightness.dart'; ValueNotifier useBrightness(bool isGesture) { final brightness = useState(null); useEffect(() { try { () async { if (!isGesture) return; brightness.value = await ScreenBrightness.instance.application; }(); } catch (e) { logger('Error getting brightness: $e'); } return () => brightness.value = null; }, [isGesture]); useEffect(() { try { if (brightness.value != null && isGesture) { ScreenBrightness.instance .setApplicationScreenBrightness(brightness.value!); } } catch (e) { logger('Error setting brightness: $e'); } return; }, [brightness.value]); // 退出时重置亮度 useEffect( () => () { try { ScreenBrightness.instance.resetApplicationScreenBrightness(); } catch (e) { logger('Error resetting brightness: $e'); } }, [], ); return brightness; } ================================================ FILE: lib/hooks/use_cover.dart ================================================ import 'package:collection/collection.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/storages/local.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/store/use_storage_store.dart'; FileItem? useCover() { final context = useContext(); final playQueue = usePlayQueueStore().select(context, (state) => state.playQueue); final currentIndex = usePlayQueueStore().select(context, (state) => state.currentIndex); final FileItem? file = useMemoized(() { final index = playQueue.indexWhere((element) => element.index == currentIndex); return playQueue.isEmpty || index < 0 ? null : playQueue[index].file; }, [playQueue, currentIndex]); final localStoragesFuture = useMemoized(() async => await getLocalStorages(context), []); final localStorages = useFuture(localStoragesFuture).data ?? []; final storages = useStorageStore().select(context, (state) => state.storages); final Storage? storage = useMemoized( () => file == null ? null : [...localStorages, ...storages] .firstWhereOrNull((storage) => storage.id == file.storageId), [file, localStorages, storages]); final cover = useState(null); useEffect(() { () async { if (storage == null || file == null || file.type != ContentType.audio) { cover.value = null; return; } final dir = file.path.isEmpty ? [] : ([...file.path]..removeLast()); final files = await storage.getFiles(dir); final images = files.where((file) => file.type == ContentType.image).toList(); cover.value = images.firstWhereOrNull((image) => image.name.split('.').first.toLowerCase() == 'cover') ?? images.firstWhereOrNull((image) => image.name.toLowerCase().startsWith('cover') || image.name.toLowerCase().startsWith('folder')) ?? images.firstOrNull; }(); return null; }, [storage, file]); return cover.value; } ================================================ FILE: lib/hooks/use_gesture.dart ================================================ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_volume_controller/flutter_volume_controller.dart'; import 'package:iris/globals.dart' show speedStops, speedSelectorItemWidth; import 'package:iris/hooks/use_brightness.dart'; import 'package:iris/hooks/use_volume.dart'; import 'package:iris/models/player.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/utils/logger.dart'; import 'package:iris/utils/platform.dart'; import 'package:provider/provider.dart'; import 'package:window_manager/window_manager.dart'; class Gesture { final void Function(TapDownDetails) onTapDown; final void Function() onTap; final void Function(TapDownDetails) onDoubleTapDown; final void Function(LongPressStartDetails) onLongPressStart; final void Function(LongPressMoveUpdateDetails) onLongPressMoveUpdate; final void Function(LongPressEndDetails) onLongPressEnd; final void Function() onLongPressCancel; final void Function(DragStartDetails) onPanStart; final void Function(DragUpdateDetails) onPanUpdate; final void Function(DragEndDetails) onPanEnd; final void Function() onPanCancel; final void Function(PointerHoverEvent) onHover; final bool isLongPress; final bool isLeftGesture; final bool isRightGesture; final double? brightness; final double? volume; Gesture({ required this.onTapDown, required this.onTap, required this.onDoubleTapDown, required this.onLongPressStart, required this.onLongPressMoveUpdate, required this.onLongPressEnd, required this.onLongPressCancel, required this.onPanStart, required this.onPanUpdate, required this.onPanEnd, required this.onPanCancel, required this.onHover, required this.isLongPress, required this.isLeftGesture, required this.isRightGesture, required this.brightness, required this.volume, }); } Gesture useGesture({ required void Function() showControl, required void Function() hideControl, required void Function() showProgress, required void Function(Offset position) showSpeedSelector, required void Function(double finalSpeed) hideSpeedSelector, required void Function(double speed, double visualOffset) updateSelectedSpeed, }) { final context = useContext(); final gestureState = useRef({ 'isTouch': false, 'isLongPress': false, 'isDragging': false, 'startPanOffset': Offset.zero, 'startSeekPosition': Duration.zero, 'panDirection': null, // null: 未确定, Axis.horizontal, Axis.vertical }); final isLeftGesture = useState(false); final isRightGesture = useState(false); final brightness = useBrightness(isLeftGesture.value); final volume = useVolume(isRightGesture.value); void onTapDown(TapDownDetails details) { if (details.kind == PointerDeviceKind.touch) { gestureState.value['isTouch'] = true; } } void onTap() { if (usePlayerUiStore().state.isShowControl) { hideControl(); } else { showControl(); } } void onDoubleTapDown(TapDownDetails details) { final player = context.read(); if (details.kind == PointerDeviceKind.touch) { final screenWidth = MediaQuery.sizeOf(context).width; final tapDx = details.globalPosition.dx; if (tapDx > screenWidth * 0.75) { // 右侧 25% showProgress(); player.forward(10); } else if (tapDx < screenWidth * 0.25) { // 左侧 25% showProgress(); player.backward(10); } else { // 中间 50% if (player.isPlaying) { useAppStore().updateAutoPlay(false); player.pause(); showControl(); } else { useAppStore().updateAutoPlay(true); player.play(); } } } else if (isDesktop) { // 桌面端双击切换全屏 usePlayerUiStore() .updateFullScreen(!usePlayerUiStore().state.isFullScreen); } } void onLongPressStart(LongPressStartDetails details) { if (gestureState.value['isTouch'] as bool && context.read().isPlaying) { gestureState.value['isLongPress'] = true; gestureState.value['startPanOffset'] = details.globalPosition; final currentRate = useAppStore().state.rate; final closestSpeed = speedStops.reduce( (a, b) => (a - currentRate).abs() < (b - currentRate).abs() ? a : b); gestureState.value['initialSpeedIndex'] = speedStops.indexOf(closestSpeed); showSpeedSelector(details.globalPosition); updateSelectedSpeed(closestSpeed, 0.0); } } void onLongPressMoveUpdate(LongPressMoveUpdateDetails details) { if (!(gestureState.value['isLongPress'] as bool)) return; final startDx = (gestureState.value['startPanOffset'] as Offset).dx; final currentDx = details.globalPosition.dx; final deltaDx = currentDx - startDx; const double sensitivity = speedSelectorItemWidth; final double visualOffset = deltaDx; int steps = (-visualOffset / sensitivity).round(); int initialIndex = gestureState.value['initialSpeedIndex'] as int? ?? speedStops.indexOf(1.0); int finalIndex = (initialIndex + steps).clamp(0, speedStops.length - 1); double selectedSpeed = speedStops[finalIndex]; updateSelectedSpeed(selectedSpeed, visualOffset); if (useAppStore().state.rate != selectedSpeed) { useAppStore().updateRate(selectedSpeed); } } void onLongPressEnd(LongPressEndDetails details) { if (gestureState.value['isLongPress'] as bool) { hideSpeedSelector(useAppStore().state.rate); } gestureState.value['isLongPress'] = false; gestureState.value['isTouch'] = false; } void onLongPressCancel() { if (gestureState.value['isLongPress'] as bool) { hideSpeedSelector(useAppStore().state.rate); } gestureState.value['isLongPress'] = false; gestureState.value['isTouch'] = false; } void onPanStart(DragStartDetails details) { if (isDesktop && details.kind != PointerDeviceKind.touch) { windowManager.startDragging(); return; } if (gestureState.value['isLongPress'] as bool) { return; } if (details.kind == PointerDeviceKind.touch) { const double edgeDeadZone = 48.0; final screenSize = MediaQuery.sizeOf(context); final startDx = details.globalPosition.dx; if (startDx < edgeDeadZone || startDx > screenSize.width - edgeDeadZone) { logger("Edge swipe detected. Ignoring for system navigation."); return; } gestureState.value['isTouch'] = true; gestureState.value['isDragging'] = true; gestureState.value['startPanOffset'] = details.globalPosition; gestureState.value['startSeekPosition'] = context.read().position; gestureState.value['panDirection'] = null; isLeftGesture.value = false; isRightGesture.value = false; } } void onPanUpdate(DragUpdateDetails details) { if (!(gestureState.value['isDragging'] as bool)) return; final startOffset = gestureState.value['startPanOffset'] as Offset; final totalDx = details.globalPosition.dx - startOffset.dx; final totalDy = details.globalPosition.dy - startOffset.dy; // 增加手势“死区”,防止误触 const double panDeadzone = 8.0; if (gestureState.value['panDirection'] == null) { if (totalDx.abs() > panDeadzone || totalDy.abs() > panDeadzone) { gestureState.value['panDirection'] = totalDx.abs() > totalDy.abs() ? Axis.horizontal : Axis.vertical; } } final direction = gestureState.value['panDirection']; if (direction == null) return; // 水平滑动 (Seek) if (direction == Axis.horizontal) { if (!usePlayerUiStore().state.isSeeking) { usePlayerUiStore().updateIsSeeking(true); } const double sensitivity = 3.0; // 每滑动3像素代表1秒 final double seekSecondsOffset = totalDx / sensitivity; final startSeconds = (gestureState.value['startSeekPosition'] as Duration).inSeconds; int targetSeconds = (startSeconds + seekSecondsOffset).round(); // 边界检查 targetSeconds = targetSeconds.clamp( 0, context.read().duration.inSeconds); context.read().seek(Duration(seconds: targetSeconds)); showProgress(); } // 垂直滑动 (亮度和音量) if (direction == Axis.vertical) { // 仅在垂直滑动开始时判断一次左右区域 if (!isLeftGesture.value && !isRightGesture.value) { isLeftGesture.value = startOffset.dx < MediaQuery.sizeOf(context).width / 2; isRightGesture.value = !isLeftGesture.value; if (isRightGesture.value) { FlutterVolumeController.updateShowSystemUI(false); } } final double dy = details.delta.dy; if (isLeftGesture.value && brightness.value != null) { final newBrightness = brightness.value! - dy / 200; brightness.value = newBrightness.clamp(0.0, 1.0); } if (isRightGesture.value && volume.value != null) { final newVolume = volume.value! - dy / 200; volume.value = newVolume.clamp(0.0, 1.0); } } } // ignore: no_leading_underscores_for_local_identifiers void _resetPanState() { if (usePlayerUiStore().state.isSeeking) { usePlayerUiStore().updateIsSeeking(false); } gestureState.value = { ...gestureState.value, 'isDragging': false, 'panDirection': null, }; isLeftGesture.value = false; isRightGesture.value = false; FlutterVolumeController.updateShowSystemUI(true); } void onPanEnd(DragEndDetails details) => _resetPanState(); void onPanCancel() => _resetPanState(); void onHover(PointerHoverEvent event) { if (event.kind != PointerDeviceKind.touch) { usePlayerUiStore().updateIsHovering(true); showControl(); } } return Gesture( onTapDown: onTapDown, onTap: onTap, onDoubleTapDown: onDoubleTapDown, onLongPressStart: onLongPressStart, onLongPressMoveUpdate: onLongPressMoveUpdate, onLongPressEnd: onLongPressEnd, onLongPressCancel: onLongPressCancel, onPanStart: onPanStart, onPanUpdate: onPanUpdate, onPanEnd: onPanEnd, onPanCancel: onPanCancel, onHover: onHover, isLongPress: gestureState.value['isLongPress'] as bool, isLeftGesture: isLeftGesture.value, isRightGesture: isRightGesture.value, brightness: brightness.value, volume: volume.value, ); } ================================================ FILE: lib/hooks/use_keyboard.dart ================================================ import 'dart:io'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/globals.dart'; import 'package:iris/models/player.dart'; import 'package:iris/models/storages/local.dart'; import 'package:iris/widgets/popups/history.dart'; import 'package:iris/widgets/popups/play_queue.dart'; import 'package:iris/widgets/popups/track/subtitle_and_audio_track.dart'; import 'package:iris/widgets/popups/settings/settings.dart'; import 'package:iris/widgets/popups/storages/storages.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/utils/platform.dart'; import 'package:iris/widgets/bottom_sheets/show_open_link_bottom_sheet.dart'; import 'package:iris/widgets/dialogs/show_open_link_dialog.dart'; import 'package:iris/widgets/popup.dart'; import 'package:provider/provider.dart'; import 'package:window_manager/window_manager.dart'; typedef KeyboardEvent = void Function(KeyEvent event); KeyboardEvent useKeyboard({ required void Function() showControl, required Future Function(Future) showControlForHover, required void Function() showProgress, }) { final context = useContext(); void onKeyEvent(KeyEvent event) async { final player = context.read(); if (event.runtimeType == KeyDownEvent) { if (HardwareKeyboard.instance.isAltPressed) { switch (event.logicalKey) { // 退出 case LogicalKeyboardKey.keyX: showControl(); await player.saveProgress(); if (isDesktop) { windowManager.close(); } else { SystemNavigator.pop(); exit(0); } } return; } if (HardwareKeyboard.instance.isControlPressed) { final appState = useAppStore().state; switch (event.logicalKey) { // 上一个 case LogicalKeyboardKey.arrowLeft: showControl(); usePlayQueueStore().previous(); break; // 下一个 case LogicalKeyboardKey.arrowRight: showControl(); usePlayQueueStore().next(); break; // 设置 case LogicalKeyboardKey.keyP: showControlForHover( showPopup( context: context, child: const Settings(), direction: PopupDirection.right, ), ); break; // 打开文件 case LogicalKeyboardKey.keyO: showControl(); await pickLocalFile(); showControl(); break; // 随机 case LogicalKeyboardKey.keyX: showControl(); if (appState.shuffle) { usePlayQueueStore().sort(); } else { usePlayQueueStore().shuffle(); } useAppStore().updateShuffle(!appState.shuffle); break; // 循环 case LogicalKeyboardKey.keyR: showControl(); useAppStore().toggleRepeat(); break; // 视频缩放 case LogicalKeyboardKey.keyV: showControl(); useAppStore().toggleFit(); break; // 历史 case LogicalKeyboardKey.keyH: showControlForHover( showPopup( context: context, child: const History(), direction: PopupDirection.right, ), ); break; // 打开链接 case LogicalKeyboardKey.keyL: showControl(); isDesktop ? await showOpenLinkDialog(context) : await showOpenLinkBottomSheet(context); showControl(); break; // 关闭当前播放媒体文件 case LogicalKeyboardKey.keyC: showControl(); player.pause(); usePlayQueueStore().updateCurrentIndex(-1); break; // 静音 case LogicalKeyboardKey.keyM: showControl(); useAppStore().toggleMute(); break; default: break; } return; } final playerUiState = usePlayerUiStore().state; switch (event.logicalKey) { // 播放 | 暂停 case LogicalKeyboardKey.space: case LogicalKeyboardKey.mediaPlayPause: showControl(); if (player.isPlaying) { useAppStore().updateAutoPlay(false); player.pause(); } else { useAppStore().updateAutoPlay(true); player.play(); } break; // 上一个 case LogicalKeyboardKey.mediaTrackPrevious: usePlayQueueStore().previous(); showControl(); break; // 下一个 case LogicalKeyboardKey.mediaTrackNext: showControl(); usePlayQueueStore().next(); break; // 存储 case LogicalKeyboardKey.keyF: showControlForHover( showPopup( context: context, child: const Storages(), direction: PopupDirection.right, ), ); break; // 播放队列 case LogicalKeyboardKey.keyP: showControlForHover( showPopup( context: context, child: const PlayQueue(), direction: PopupDirection.right, ), ); break; // 字幕和音轨 case LogicalKeyboardKey.keyS: showControlForHover( showPopup( context: context, child: Provider.value( value: context.read(), child: const SubtitleAndAudioTrack(), ), direction: PopupDirection.right, ), ); break; // 退出全屏 case LogicalKeyboardKey.escape: if (isDesktop && playerUiState.isFullScreen) { usePlayerUiStore().updateFullScreen(false); } break; // 全屏 case LogicalKeyboardKey.enter: case LogicalKeyboardKey.f11: if (isDesktop) { usePlayerUiStore().updateFullScreen(!playerUiState.isFullScreen); } break; case LogicalKeyboardKey.tab: showControl(); break; case LogicalKeyboardKey.f10: showControl(); await usePlayerUiStore().toggleIsAlwaysOnTop(); break; case LogicalKeyboardKey.equal: await player.stepForward(); break; case LogicalKeyboardKey.minus: await player.stepBackward(); break; case LogicalKeyboardKey.contextMenu: showControl(); moreMenuKey.currentState?.showButtonMenu(); break; default: break; } } if (event.runtimeType == KeyDownEvent || event.runtimeType == KeyRepeatEvent) { switch (event.logicalKey) { // 快退 case LogicalKeyboardKey.arrowLeft: if (usePlayerUiStore().state.isShowControl) { showControl(); } else { showProgress(); } player.backward(5); break; // 快进 case LogicalKeyboardKey.arrowRight: if (usePlayerUiStore().state.isShowControl) { showControl(); } else { showProgress(); } player.forward(5); break; // 提升音量 case LogicalKeyboardKey.arrowUp: showControl(); await useAppStore().updateVolume(useAppStore().state.volume + 1); break; // 降低音量 case LogicalKeyboardKey.arrowDown: showControl(); await useAppStore().updateVolume(useAppStore().state.volume - 1); break; default: break; } } } return onKeyEvent; } ================================================ FILE: lib/hooks/use_volume.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_volume_controller/flutter_volume_controller.dart'; import 'package:iris/utils/logger.dart'; ValueNotifier useVolume(bool isGesture) { final volume = useState(null); useEffect(() { try { () async { if (!isGesture) return; volume.value = await FlutterVolumeController.getVolume(); }(); } catch (e) { logger('Error getting volume: $e'); } return () { volume.value = null; }; }, [isGesture]); useEffect(() { try { if (volume.value != null && isGesture) { FlutterVolumeController.setVolume(volume.value!); } } catch (e) { logger('Error setting volume: $e'); } return; }, [volume.value]); return volume; } ================================================ FILE: lib/info.dart ================================================ class INFO { static const String title = 'IRIS'; static const String author = '22'; static const String authorUrl = 'https://github.com/nini22P'; static const String githubUrl = 'https://github.com/nini22P/iris'; static const String msStoreId = '9NML7WNHNRTJ'; } ================================================ FILE: lib/l10n/app_en.arb ================================================ { "@@locale": "en", "about": "About", "add": "Add", "add_favorite": "Add favorite", "add_folder": "Add folder", "add_ftp_storage": "Add FTP storage", "add_local_storage": "Add local storage", "add_storage": "Add storage", "add_to_play_queue": "Add to play queue", "add_webdav_storage": "Add WebDAV storage", "always_on_top_off": "Always on top: Off", "always_on_top_on": "Always on top: On", "always_play_from_beginning": "Always play from the beginning", "always_play_from_beginning_description": "When enabled, this option will automatically start the video from the beginning each time it is played", "app_description": "A lightweight video player", "audio": "audio", "audio_track": "Audio track", "author": "Author", "auto": "Auto", "auto_resize": "Auto resize window ratio", "back": "Back", "cancel": "Cancel", "check_update": "Check update", "checked_new_version": "Checked new version", "close": "Close", "confirmUpdate": "Confirm update", "crop": "Crop", "dark": "Datk", "dependencies": "Dependencies", "device": "Device", "download": "Download", "download_and_update": "Download and update", "download_error": "Download error", "edit": "Edit", "edit_folder": "Edit folder", "edit_ftp_storage": "Edit FTP storage", "edit_local_storage": "Edit local storage", "edit_webdav_storage": "Edit WebDAV storage", "enter_fullscreen": "Enter fullscreen", "exit": "Exit", "exit_app_back_again": "Press back again to exit.", "exit_fullscreen": "Exit fullscreen", "experimental": "Experimental", "favorites": "Favorites", "fit": "Fit", "folder": "Folder", "folder_first": "Folder first", "general": "General", "grant_storage_permission": "Grant Storage Permission", "history": "History", "home": "Home", "host": "Host", "landscape": "Landscape", "language": "Language", "last_modified": "Last modified", "light": "Light", "local_storage": "Local storage", "media_file_does_not_exist": "Media file does not exist", "menu": "Menu", "more_options": "More options", "mute": "Mute", "name": "Name", "network_storage": "Network storage", "next": "Next", "no_new_version": "No new version", "off": "Off", "ok": "OK", "on": "On", "open_file": "Open file", "open_in_folder": "Open in folder", "open_link": "Open link", "password": "Password", "path": "Path", "pause": "Pause", "play": "Play", "play_queue": "Play queue", "playback_speed": "Playback speed", "player_backend": "Player backend", "port": "Port", "portrait": "Portrait", "previous": "Previous", "refresh": "Refresh", "releasePage": "Release page", "remove": "Remove", "remove_favorite": "Remove favorite", "repeat_all": "Repeat: All", "repeat_none": "Repeat: None", "repeat_one": "Repeat: One", "retry": "Retry", "save": "Save", "screen_orientation": "ScreenOrientation", "select_language": "Select language", "settings": "Settings", "shuffle": "Shuffle", "size": "Size", "sort": "Sort", "source_code": "Source code", "stop": "Stop", "storage": "Storage", "stretch": "Stretch", "subtitle": "Subtitle", "subtitle_and_audio_track": "Subtitle and audio track", "subtitle_file_does_not_exist": "Subtitle file does not exist", "system": "System", "test_connection": "Test connection", "theme_mode": "Theme mode", "unable_to_fetch_files": "Unable to fetch files.", "unmute": "Unmute", "url": "URL", "usb_storage": "USB storage", "username": "Username", "version": "Version", "video": "Video", "video_zoom": "Video zoom", "volume": "Volume" } ================================================ FILE: lib/l10n/app_zh.arb ================================================ { "@@locale": "zh", "about": "关于", "add": "添加", "add_favorite": "添加收藏", "add_folder": "添加文件夹", "add_ftp_storage": "添加 FTP 存储", "add_local_storage": "添加本地存储", "add_storage": "添加存储", "add_to_play_queue": "添加到播放队列", "add_webdav_storage": "添加 WebDAV 存储", "always_on_top_off": "窗口置顶: 关", "always_on_top_on": "窗口置顶: 开", "always_play_from_beginning": "总是从头开始播放", "always_play_from_beginning_description": "启用此选项后,每次播放视频时将自动从头开始播放", "app_description": "轻量级视频播放器", "audio": "音频", "audio_track": "音轨", "author": "作者", "auto": "自动", "auto_resize": "自动调整窗口比例", "back": "返回", "cancel": "取消", "check_update": "检查更新", "checked_new_version": "检查到新版本", "close": "关闭", "confirmUpdate": "确认更新", "crop": "裁切", "dark": "暗色", "dependencies": "开源库", "device": "设备", "download": "下载", "download_and_update": "下载并更新", "download_error": "下载错误", "edit": "编辑", "edit_folder": "编辑文件夹", "edit_ftp_storage": "编辑 FTP 存储", "edit_local_storage": "编辑本地存储", "edit_webdav_storage": "编辑 WebDAV 存储", "enter_fullscreen": "进入全屏", "exit": "退出", "exit_app_back_again": "再次点击返回退出应用。", "exit_fullscreen": "退出全屏", "experimental": "实验性", "favorites": "收藏", "fit": "适应", "folder": "文件夹", "folder_first": "文件夹优先", "general": "通用", "grant_storage_permission": "授予存储权限", "history": "历史", "home": "主页", "host": "主机", "landscape": "横向", "language": "语言", "last_modified": "最后修改", "light": "亮色", "local_storage": "本地存储", "media_file_does_not_exist": "媒体文件不存在", "menu": "菜单", "more_options": "更多选项", "mute": "静音", "name": "名称", "network_storage": "网络存储", "next": "下一个", "no_new_version": "没有新版本", "off": "关闭", "ok": "确定", "on": "开启", "open_file": "打开文件", "open_in_folder": "打开所在文件夹", "open_link": "打开链接", "password": "密码", "path": "路径", "pause": "暂停", "play": "播放", "play_queue": "播放队列", "playback_speed": "播放速度", "player_backend": "播放器后端", "port": "端口", "portrait": "纵向", "previous": "上一个", "refresh": "刷新", "releasePage": "发布页面", "remove": "移除", "remove_favorite": "移除收藏", "repeat_all": "重复: 全部", "repeat_none": "重复: 关闭", "repeat_one": "重复: 当前文件", "retry": "重试", "save": "保存", "screen_orientation": "屏幕方向", "select_language": "选择语言", "settings": "设置", "shuffle": "随机", "size": "大小", "sort": "排序", "source_code": "源码", "stop": "停止", "storage": "存储", "stretch": "拉伸", "subtitle": "字幕", "subtitle_and_audio_track": "字幕和音轨", "subtitle_file_does_not_exist": "字幕文件不存在", "system": "系统", "test_connection": "测试连接", "theme_mode": "主题模式", "unable_to_fetch_files": "无法获取文件", "unmute": "取消静音", "url": "URL", "usb_storage": "USB 存储", "username": "用户名", "version": "版本", "video": "视频", "video_zoom": "视频缩放", "volume": "音量" } ================================================ FILE: lib/l10n/iso_639.dart ================================================ class Info { final List en; const Info({required this.en}); } const Map customLanguageCodes = { 'chs': Info(en: ['Chinese (Simplified)']), 'cht': Info(en: ['Chinese (Traditional)']), }; const Map iso_639_1 = { 'aa': Info(en: ['Afar']), 'ab': Info(en: ['Abkhazian']), 'ae': Info(en: ['Avestan']), 'af': Info(en: ['Afrikaans']), 'ak': Info(en: ['Akan']), 'am': Info(en: ['Amharic']), 'an': Info(en: ['Aragonese']), 'ar': Info(en: ['Arabic']), 'as': Info(en: ['Assamese']), 'av': Info(en: ['Avaric']), 'ay': Info(en: ['Aymara']), 'az': Info(en: ['Azerbaijani']), 'ba': Info(en: ['Bashkir']), 'be': Info(en: ['Belarusian']), 'bg': Info(en: ['Bulgarian']), 'bh': Info(en: ['Bihari languages']), 'bi': Info(en: ['Bislama']), 'bm': Info(en: ['Bambara']), 'bn': Info(en: ['Bengali']), 'bo': Info(en: ['Tibetan']), 'br': Info(en: ['Breton']), 'bs': Info(en: ['Bosnian']), 'ca': Info(en: ['Catalan', 'Valencian']), 'ce': Info(en: ['Chechen']), 'ch': Info(en: ['Chamorro']), 'co': Info(en: ['Corsican']), 'cr': Info(en: ['Cree']), 'cs': Info(en: ['Czech']), 'cu': Info(en: [ 'Church Slavic', 'Old Slavonic', 'Church Slavonic', 'Old Bulgarian', 'Old Church Slavonic' ]), 'cv': Info(en: ['Chuvash']), 'cy': Info(en: ['Welsh']), 'da': Info(en: ['Danish']), 'de': Info(en: ['German']), 'dv': Info(en: ['Divehi', 'Dhivehi', 'Maldivian']), 'dz': Info(en: ['Dzongkha']), 'ee': Info(en: ['Ewe']), 'el': Info(en: ['Greek, Modern (1453-)']), 'en': Info(en: ['English']), 'eo': Info(en: ['Esperanto']), 'es': Info(en: ['Spanish', 'Castilian']), 'et': Info(en: ['Estonian']), 'eu': Info(en: ['Basque']), 'fa': Info(en: ['Persian']), 'ff': Info(en: ['Fulah']), 'fi': Info(en: ['Finnish']), 'fj': Info(en: ['Fijian']), 'fo': Info(en: ['Faroese']), 'fr': Info(en: ['French']), 'fy': Info(en: ['Western Frisian']), 'ga': Info(en: ['Irish']), 'gd': Info(en: ['Gaelic', 'Scottish Gaelic']), 'gl': Info(en: ['Galician']), 'gn': Info(en: ['Guarani']), 'gu': Info(en: ['Gujarati']), 'gv': Info(en: ['Manx']), 'ha': Info(en: ['Hausa']), 'he': Info(en: ['Hebrew']), 'hi': Info(en: ['Hindi']), 'ho': Info(en: ['Hiri Motu']), 'hr': Info(en: ['Croatian']), 'ht': Info(en: ['Haitian', 'Haitian Creole']), 'hu': Info(en: ['Hungarian']), 'hy': Info(en: ['Armenian']), 'hz': Info(en: ['Herero']), 'ia': Info(en: ['Interlingua (International Auxiliary Language Association)']), 'id': Info(en: ['Indonesian']), 'ie': Info(en: ['Interlingue', 'Occidental']), 'ig': Info(en: ['Igbo']), 'ii': Info(en: ['Sichuan Yi', 'Nuosu']), 'ik': Info(en: ['Inupiaq']), 'io': Info(en: ['Ido']), 'is': Info(en: ['Icelandic']), 'it': Info(en: ['Italian']), 'iu': Info(en: ['Inuktitut']), 'ja': Info(en: ['Japanese']), 'jv': Info(en: ['Javanese']), 'ka': Info(en: ['Georgian']), 'kg': Info(en: ['Kongo']), 'ki': Info(en: ['Kikuyu', 'Gikuyu']), 'kj': Info(en: ['Kuanyama', 'Kwanyama']), 'kk': Info(en: ['Kazakh']), 'kl': Info(en: ['Kalaallisut', 'Greenlandic']), 'km': Info(en: ['Central Khmer']), 'kn': Info(en: ['Kannada']), 'ko': Info(en: ['Korean']), 'kr': Info(en: ['Kanuri']), 'ks': Info(en: ['Kashmiri']), 'ku': Info(en: ['Kurdish']), 'kv': Info(en: ['Komi']), 'kw': Info(en: ['Cornish']), 'ky': Info(en: ['Kirghiz', 'Kyrgyz']), 'la': Info(en: ['Latin']), 'lb': Info(en: ['Luxembourgish', 'Letzeburgesch']), 'lg': Info(en: ['Ganda']), 'li': Info(en: ['Limburgan', 'Limburger', 'Limburgish']), 'ln': Info(en: ['Lingala']), 'lo': Info(en: ['Lao']), 'lt': Info(en: ['Lithuanian']), 'lu': Info(en: ['Luba-Katanga']), 'lv': Info(en: ['Latvian']), 'mg': Info(en: ['Malagasy']), 'mh': Info(en: ['Marshallese']), 'mi': Info(en: ['Maori']), 'mk': Info(en: ['Macedonian']), 'ml': Info(en: ['Malayalam']), 'mn': Info(en: ['Mongolian']), 'mr': Info(en: ['Marathi']), 'ms': Info(en: ['Malay']), 'mt': Info(en: ['Maltese']), 'my': Info(en: ['Burmese']), 'na': Info(en: ['Nauru']), 'nb': Info(en: ['Bokmål, Norwegian', 'Norwegian Bokmål']), 'nd': Info(en: ['Ndebele, North', 'North Ndebele']), 'ne': Info(en: ['Nepali']), 'ng': Info(en: ['Ndonga']), 'nl': Info(en: ['Dutch', 'Flemish']), 'nn': Info(en: ['Norwegian Nynorsk', 'Nynorsk, Norwegian']), 'no': Info(en: ['Norwegian']), 'nr': Info(en: ['Ndebele, South', 'South Ndebele']), 'nv': Info(en: ['Navajo', 'Navaho']), 'ny': Info(en: ['Chichewa', 'Chewa', 'Nyanja']), 'oc': Info(en: ['Occitan (post 1500)']), 'oj': Info(en: ['Ojibwa']), 'om': Info(en: ['Oromo']), 'or': Info(en: ['Oriya']), 'os': Info(en: ['Ossetian', 'Ossetic']), 'pa': Info(en: ['Panjabi', 'Punjabi']), 'pi': Info(en: ['Pali']), 'pl': Info(en: ['Polish']), 'ps': Info(en: ['Pushto', 'Pashto']), 'pt': Info(en: ['Portuguese']), 'qu': Info(en: ['Quechua']), 'rm': Info(en: ['Romansh']), 'rn': Info(en: ['Rundi']), 'ro': Info(en: ['Romanian', 'Moldavian', 'Moldovan']), 'ru': Info(en: ['Russian']), 'rw': Info(en: ['Kinyarwanda']), 'sa': Info(en: ['Sanskrit']), 'sc': Info(en: ['Sardinian']), 'sd': Info(en: ['Sindhi']), 'se': Info(en: ['Northern Sami']), 'sg': Info(en: ['Sango']), 'si': Info(en: ['Sinhala', 'Sinhalese']), 'sk': Info(en: ['Slovak']), 'sl': Info(en: ['Slovenian']), 'sm': Info(en: ['Samoan']), 'sn': Info(en: ['Shona']), 'so': Info(en: ['Somali']), 'sq': Info(en: ['Albanian']), 'sr': Info(en: ['Serbian']), 'ss': Info(en: ['Swati']), 'st': Info(en: ['Sotho, Southern']), 'su': Info(en: ['Sundanese']), 'sv': Info(en: ['Swedish']), 'sw': Info(en: ['Swahili']), 'ta': Info(en: ['Tamil']), 'te': Info(en: ['Telugu']), 'tg': Info(en: ['Tajik']), 'th': Info(en: ['Thai']), 'ti': Info(en: ['Tigrinya']), 'tk': Info(en: ['Turkmen']), 'tl': Info(en: ['Tagalog']), 'tn': Info(en: ['Tswana']), 'to': Info(en: ['Tonga (Tonga Islands)']), 'tr': Info(en: ['Turkish']), 'ts': Info(en: ['Tsonga']), 'tt': Info(en: ['Tatar']), 'tw': Info(en: ['Twi']), 'ty': Info(en: ['Tahitian']), 'ug': Info(en: ['Uighur', 'Uyghur']), 'uk': Info(en: ['Ukrainian']), 'ur': Info(en: ['Urdu']), 'uz': Info(en: ['Uzbek']), 've': Info(en: ['Venda']), 'vi': Info(en: ['Vietnamese']), 'vo': Info(en: ['Volapük']), 'wa': Info(en: ['Walloon']), 'wo': Info(en: ['Wolof']), 'xh': Info(en: ['Xhosa']), 'yi': Info(en: ['Yiddish']), 'yo': Info(en: ['Yoruba']), 'za': Info(en: ['Zhuang', 'Chuang']), 'zh': Info(en: ['Chinese']), 'zu': Info(en: ['Zulu']), }; const Map iso_639_2 = { 'aar': Info(en: ['Afar']), 'abk': Info(en: ['Abkhazian']), 'ace': Info(en: ['Achinese']), 'ach': Info(en: ['Acoli']), 'ada': Info(en: ['Adangme']), 'ady': Info(en: ['Adyghe', 'Adygei']), 'afa': Info(en: ['Afro-Asiatic languages']), 'afh': Info(en: ['Afrihili']), 'afr': Info(en: ['Afrikaans']), 'ain': Info(en: ['Ainu']), 'aka': Info(en: ['Akan']), 'akk': Info(en: ['Akkadian']), 'alb': Info(en: ['Albanian']), 'ale': Info(en: ['Aleut']), 'alg': Info(en: ['Algonquian languages']), 'alt': Info(en: ['Southern Altai']), 'amh': Info(en: ['Amharic']), 'ang': Info(en: ['English, Old (ca.450-1100)']), 'anp': Info(en: ['Angika']), 'apa': Info(en: ['Apache languages']), 'ara': Info(en: ['Arabic']), 'arc': Info( en: ['Official Aramaic (700-300 BCE)', 'Imperial Aramaic (700-300 BCE)']), 'arg': Info(en: ['Aragonese']), 'arm': Info(en: ['Armenian']), 'arn': Info(en: ['Mapudungun', 'Mapuche']), 'arp': Info(en: ['Arapaho']), 'art': Info(en: ['Artificial languages']), 'arw': Info(en: ['Arawak']), 'asm': Info(en: ['Assamese']), 'ast': Info(en: ['Asturian', 'Bable', 'Leonese', 'Asturleonese']), 'ath': Info(en: ['Athapascan languages']), 'aus': Info(en: ['Australian languages']), 'ava': Info(en: ['Avaric']), 'ave': Info(en: ['Avestan']), 'awa': Info(en: ['Awadhi']), 'aym': Info(en: ['Aymara']), 'aze': Info(en: ['Azerbaijani']), 'bad': Info(en: ['Banda languages']), 'bai': Info(en: ['Bamileke languages']), 'bak': Info(en: ['Bashkir']), 'bal': Info(en: ['Baluchi']), 'bam': Info(en: ['Bambara']), 'ban': Info(en: ['Balinese']), 'baq': Info(en: ['Basque']), 'bas': Info(en: ['Basa']), 'bat': Info(en: ['Baltic languages']), 'bej': Info(en: ['Beja', 'Bedawiyet']), 'bel': Info(en: ['Belarusian']), 'bem': Info(en: ['Bemba']), 'ben': Info(en: ['Bengali']), 'ber': Info(en: ['Berber languages']), 'bho': Info(en: ['Bhojpuri']), 'bih': Info(en: ['Bihari languages']), 'bik': Info(en: ['Bikol']), 'bin': Info(en: ['Bini', 'Edo']), 'bis': Info(en: ['Bislama']), 'bla': Info(en: ['Siksika']), 'bnt': Info(en: ['Bantu languages']), 'bod': Info(en: ['Tibetan']), 'bos': Info(en: ['Bosnian']), 'bra': Info(en: ['Braj']), 'bre': Info(en: ['Breton']), 'btk': Info(en: ['Batak languages']), 'bua': Info(en: ['Buriat']), 'bug': Info(en: ['Buginese']), 'bul': Info(en: ['Bulgarian']), 'bur': Info(en: ['Burmese']), 'byn': Info(en: ['Blin', 'Bilin']), 'cad': Info(en: ['Caddo']), 'cai': Info(en: ['Central American Indian languages']), 'car': Info(en: ['Galibi Carib']), 'cat': Info(en: ['Catalan', 'Valencian']), 'cau': Info(en: ['Caucasian languages']), 'ceb': Info(en: ['Cebuano']), 'cel': Info(en: ['Celtic languages']), 'ces': Info(en: ['Czech']), 'cha': Info(en: ['Chamorro']), 'chb': Info(en: ['Chibcha']), 'che': Info(en: ['Chechen']), 'chg': Info(en: ['Chagatai']), 'chi': Info(en: ['Chinese']), 'chk': Info(en: ['Chuukese']), 'chm': Info(en: ['Mari']), 'chn': Info(en: ['Chinook jargon']), 'cho': Info(en: ['Choctaw']), 'chp': Info(en: ['Chipewyan', 'Dene Suline']), 'chr': Info(en: ['Cherokee']), 'chu': Info(en: [ 'Church Slavic', 'Old Slavonic', 'Church Slavonic', 'Old Bulgarian', 'Old Church Slavonic' ]), 'chv': Info(en: ['Chuvash']), 'chy': Info(en: ['Cheyenne']), 'cmc': Info(en: ['Chamic languages']), 'cop': Info(en: ['Coptic']), 'cor': Info(en: ['Cornish']), 'cos': Info(en: ['Corsican']), 'cpe': Info(en: ['Creoles and pidgins, English based']), 'cpf': Info(en: ['Creoles and pidgins, French-based']), 'cpp': Info(en: ['Creoles and pidgins, Portuguese-based']), 'cre': Info(en: ['Cree']), 'crh': Info(en: ['Crimean Tatar', 'Crimean Turkish']), 'crp': Info(en: ['Creoles and pidgins']), 'csb': Info(en: ['Kashubian']), 'cus': Info(en: ['Cushitic languages']), 'cym': Info(en: ['Welsh']), 'cze': Info(en: ['Czech']), 'dak': Info(en: ['Dakota']), 'dan': Info(en: ['Danish']), 'dar': Info(en: ['Dargwa']), 'day': Info(en: ['Land Dayak languages']), 'del': Info(en: ['Delaware']), 'den': Info(en: ['Slave (Athapascan)']), 'deu': Info(en: ['German']), 'dgr': Info(en: ['Dogrib']), 'din': Info(en: ['Dinka']), 'div': Info(en: ['Divehi', 'Dhivehi', 'Maldivian']), 'doi': Info(en: ['Dogri']), 'dra': Info(en: ['Dravidian languages']), 'dsb': Info(en: ['Lower Sorbian']), 'dua': Info(en: ['Duala']), 'dum': Info(en: ['Dutch, Middle (ca.1050-1350)']), 'dut': Info(en: ['Dutch', 'Flemish']), 'dyu': Info(en: ['Dyula']), 'dzo': Info(en: ['Dzongkha']), 'efi': Info(en: ['Efik']), 'egy': Info(en: ['Egyptian (Ancient)']), 'eka': Info(en: ['Ekajuk']), 'ell': Info(en: ['Greek, Modern (1453-)']), 'elx': Info(en: ['Elamite']), 'eng': Info(en: ['English']), 'enm': Info(en: ['English, Middle (1100-1500)']), 'epo': Info(en: ['Esperanto']), 'est': Info(en: ['Estonian']), 'eus': Info(en: ['Basque']), 'ewe': Info(en: ['Ewe']), 'ewo': Info(en: ['Ewondo']), 'fan': Info(en: ['Fang']), 'fao': Info(en: ['Faroese']), 'fas': Info(en: ['Persian']), 'fat': Info(en: ['Fanti']), 'fij': Info(en: ['Fijian']), 'fil': Info(en: ['Filipino', 'Pilipino']), 'fin': Info(en: ['Finnish']), 'fiu': Info(en: ['Finno-Ugrian languages']), 'fon': Info(en: ['Fon']), 'fra': Info(en: ['French']), 'fre': Info(en: ['French']), 'frm': Info(en: ['French, Middle (ca.1400-1600)']), 'fro': Info(en: ['French, Old (842-ca.1400)']), 'frr': Info(en: ['Northern Frisian']), 'frs': Info(en: ['Eastern Frisian']), 'fry': Info(en: ['Western Frisian']), 'ful': Info(en: ['Fulah']), 'fur': Info(en: ['Friulian']), 'gaa': Info(en: ['Ga']), 'gay': Info(en: ['Gayo']), 'gba': Info(en: ['Gbaya']), 'gem': Info(en: ['Germanic languages']), 'geo': Info(en: ['Georgian']), 'ger': Info(en: ['German']), 'gez': Info(en: ['Geez']), 'gil': Info(en: ['Gilbertese']), 'gla': Info(en: ['Gaelic', 'Scottish Gaelic']), 'gle': Info(en: ['Irish']), 'glg': Info(en: ['Galician']), 'glv': Info(en: ['Manx']), 'gmh': Info(en: ['German, Middle High (ca.1050-1500)']), 'goh': Info(en: ['German, Old High (ca.750-1050)']), 'gon': Info(en: ['Gondi']), 'gor': Info(en: ['Gorontalo']), 'got': Info(en: ['Gothic']), 'grb': Info(en: ['Grebo']), 'grc': Info(en: ['Greek, Ancient (to 1453)']), 'gre': Info(en: ['Greek, Modern (1453-)']), 'grn': Info(en: ['Guarani']), 'gsw': Info(en: ['Swiss German', 'Alemannic', 'Alsatian']), 'guj': Info(en: ['Gujarati']), 'gwi': Info(en: ['Gwich\'in']), 'hai': Info(en: ['Haida']), 'hat': Info(en: ['Haitian', 'Haitian Creole']), 'hau': Info(en: ['Hausa']), 'haw': Info(en: ['Hawaiian']), 'heb': Info(en: ['Hebrew']), 'her': Info(en: ['Herero']), 'hil': Info(en: ['Hiligaynon']), 'him': Info(en: ['Himachali languages', 'Western Pahari languages']), 'hin': Info(en: ['Hindi']), 'hit': Info(en: ['Hittite']), 'hmn': Info(en: ['Hmong', 'Mong']), 'hmo': Info(en: ['Hiri Motu']), 'hrv': Info(en: ['Croatian']), 'hsb': Info(en: ['Upper Sorbian']), 'hun': Info(en: ['Hungarian']), 'hup': Info(en: ['Hupa']), 'hye': Info(en: ['Armenian']), 'iba': Info(en: ['Iban']), 'ibo': Info(en: ['Igbo']), 'ice': Info(en: ['Icelandic']), 'ido': Info(en: ['Ido']), 'iii': Info(en: ['Sichuan Yi', 'Nuosu']), 'ijo': Info(en: ['Ijo languages']), 'iku': Info(en: ['Inuktitut']), 'ile': Info(en: ['Interlingue', 'Occidental']), 'ilo': Info(en: ['Iloko']), 'ina': Info(en: ['Interlingua (International Auxiliary Language Association)']), 'inc': Info(en: ['Indic languages']), 'ind': Info(en: ['Indonesian']), 'ine': Info(en: ['Indo-European languages']), 'inh': Info(en: ['Ingush']), 'ipk': Info(en: ['Inupiaq']), 'ira': Info(en: ['Iranian languages']), 'iro': Info(en: ['Iroquoian languages']), 'isl': Info(en: ['Icelandic']), 'ita': Info(en: ['Italian']), 'jav': Info(en: ['Javanese']), 'jbo': Info(en: ['Lojban']), 'jpn': Info(en: ['Japanese']), 'jpr': Info(en: ['Judeo-Persian']), 'jrb': Info(en: ['Judeo-Arabic']), 'kaa': Info(en: ['Kara-Kalpak']), 'kab': Info(en: ['Kabyle']), 'kac': Info(en: ['Kachin', 'Jingpho']), 'kal': Info(en: ['Kalaallisut', 'Greenlandic']), 'kam': Info(en: ['Kamba']), 'kan': Info(en: ['Kannada']), 'kar': Info(en: ['Karen languages']), 'kas': Info(en: ['Kashmiri']), 'kat': Info(en: ['Georgian']), 'kau': Info(en: ['Kanuri']), 'kaw': Info(en: ['Kawi']), 'kaz': Info(en: ['Kazakh']), 'kbd': Info(en: ['Kabardian']), 'kha': Info(en: ['Khasi']), 'khi': Info(en: ['Khoisan languages']), 'khm': Info(en: ['Central Khmer']), 'kho': Info(en: ['Khotanese', 'Sakan']), 'kik': Info(en: ['Kikuyu', 'Gikuyu']), 'kin': Info(en: ['Kinyarwanda']), 'kir': Info(en: ['Kirghiz', 'Kyrgyz']), 'kmb': Info(en: ['Kimbundu']), 'kok': Info(en: ['Konkani']), 'kom': Info(en: ['Komi']), 'kon': Info(en: ['Kongo']), 'kor': Info(en: ['Korean']), 'kos': Info(en: ['Kosraean']), 'kpe': Info(en: ['Kpelle']), 'krc': Info(en: ['Karachay-Balkar']), 'krl': Info(en: ['Karelian']), 'kro': Info(en: ['Kru languages']), 'kru': Info(en: ['Kurukh']), 'kua': Info(en: ['Kuanyama', 'Kwanyama']), 'kum': Info(en: ['Kumyk']), 'kur': Info(en: ['Kurdish']), 'kut': Info(en: ['Kutenai']), 'lad': Info(en: ['Ladino']), 'lah': Info(en: ['Lahnda']), 'lam': Info(en: ['Lamba']), 'lao': Info(en: ['Lao']), 'lat': Info(en: ['Latin']), 'lav': Info(en: ['Latvian']), 'lez': Info(en: ['Lezghian']), 'lim': Info(en: ['Limburgan', 'Limburger', 'Limburgish']), 'lin': Info(en: ['Lingala']), 'lit': Info(en: ['Lithuanian']), 'lol': Info(en: ['Mongo']), 'loz': Info(en: ['Lozi']), 'ltz': Info(en: ['Luxembourgish', 'Letzeburgesch']), 'lua': Info(en: ['Luba-Lulua']), 'lub': Info(en: ['Luba-Katanga']), 'lug': Info(en: ['Ganda']), 'lui': Info(en: ['Luiseno']), 'lun': Info(en: ['Lunda']), 'luo': Info(en: ['Luo (Kenya and Tanzania)']), 'lus': Info(en: ['Lushai']), 'mac': Info(en: ['Macedonian']), 'mad': Info(en: ['Madurese']), 'mag': Info(en: ['Magahi']), 'mah': Info(en: ['Marshallese']), 'mai': Info(en: ['Maithili']), 'mak': Info(en: ['Makasar']), 'mal': Info(en: ['Malayalam']), 'man': Info(en: ['Mandingo']), 'mao': Info(en: ['Maori']), 'map': Info(en: ['Austronesian languages']), 'mar': Info(en: ['Marathi']), 'mas': Info(en: ['Masai']), 'may': Info(en: ['Malay']), 'mdf': Info(en: ['Moksha']), 'mdr': Info(en: ['Mandar']), 'men': Info(en: ['Mende']), 'mga': Info(en: ['Irish, Middle (900-1200)']), 'mic': Info(en: ['Mi\'kmaq', 'Micmac']), 'min': Info(en: ['Minangkabau']), 'mis': Info(en: ['Uncoded languages']), 'mkd': Info(en: ['Macedonian']), 'mkh': Info(en: ['Mon-Khmer languages']), 'mlg': Info(en: ['Malagasy']), 'mlt': Info(en: ['Maltese']), 'mnc': Info(en: ['Manchu']), 'mni': Info(en: ['Manipuri']), 'mno': Info(en: ['Manobo languages']), 'moh': Info(en: ['Mohawk']), 'mon': Info(en: ['Mongolian']), 'mos': Info(en: ['Mossi']), 'mri': Info(en: ['Maori']), 'msa': Info(en: ['Malay']), 'mul': Info(en: ['Multiple languages']), 'mun': Info(en: ['Munda languages']), 'mus': Info(en: ['Creek']), 'mwl': Info(en: ['Mirandese']), 'mwr': Info(en: ['Marwari']), 'mya': Info(en: ['Burmese']), 'myn': Info(en: ['Mayan languages']), 'myv': Info(en: ['Erzya']), 'nah': Info(en: ['Nahuatl languages']), 'nai': Info(en: ['North American Indian languages']), 'nap': Info(en: ['Neapolitan']), 'nau': Info(en: ['Nauru']), 'nav': Info(en: ['Navajo', 'Navaho']), 'nbl': Info(en: ['Ndebele, South', 'South Ndebele']), 'nde': Info(en: ['Ndebele, North', 'North Ndebele']), 'ndo': Info(en: ['Ndonga']), 'nds': Info(en: ['Low German', 'Low Saxon', 'German, Low', 'Saxon, Low']), 'nep': Info(en: ['Nepali']), 'new': Info(en: ['Nepal Bhasa', 'Newari']), 'nia': Info(en: ['Nias']), 'nic': Info(en: ['Niger-Kordofanian languages']), 'niu': Info(en: ['Niuean']), 'nld': Info(en: ['Dutch', 'Flemish']), 'nno': Info(en: ['Norwegian Nynorsk', 'Nynorsk, Norwegian']), 'nob': Info(en: ['Bokmål, Norwegian', 'Norwegian Bokmål']), 'nog': Info(en: ['Nogai']), 'non': Info(en: ['Norse, Old']), 'nor': Info(en: ['Norwegian']), 'nqo': Info(en: ['N\'Ko']), 'nso': Info(en: ['Pedi', 'Sepedi', 'Northern Sotho']), 'nub': Info(en: ['Nubian languages']), 'nwc': Info(en: ['Classical Newari', 'Old Newari', 'Classical Nepal Bhasa']), 'nya': Info(en: ['Chichewa', 'Chewa', 'Nyanja']), 'nym': Info(en: ['Nyamwezi']), 'nyn': Info(en: ['Nyankole']), 'nyo': Info(en: ['Nyoro']), 'nzi': Info(en: ['Nzima']), 'oci': Info(en: ['Occitan (post 1500)']), 'oji': Info(en: ['Ojibwa']), 'ori': Info(en: ['Oriya']), 'orm': Info(en: ['Oromo']), 'osa': Info(en: ['Osage']), 'oss': Info(en: ['Ossetian', 'Ossetic']), 'ota': Info(en: ['Turkish, Ottoman (1500-1928)']), 'oto': Info(en: ['Otomian languages']), 'paa': Info(en: ['Papuan languages']), 'pag': Info(en: ['Pangasinan']), 'pal': Info(en: ['Pahlavi']), 'pam': Info(en: ['Pampanga', 'Kapampangan']), 'pan': Info(en: ['Panjabi', 'Punjabi']), 'pap': Info(en: ['Papiamento']), 'pau': Info(en: ['Palauan']), 'peo': Info(en: ['Persian, Old (ca.600-400 B.C.)']), 'per': Info(en: ['Persian']), 'phi': Info(en: ['Philippine languages']), 'phn': Info(en: ['Phoenician']), 'pli': Info(en: ['Pali']), 'pol': Info(en: ['Polish']), 'pon': Info(en: ['Pohnpeian']), 'por': Info(en: ['Portuguese']), 'pra': Info(en: ['Prakrit languages']), 'pro': Info(en: ['Provençal, Old (to 1500)', 'Occitan, Old (to 1500)']), 'pus': Info(en: ['Pushto', 'Pashto']), 'que': Info(en: ['Quechua']), 'raj': Info(en: ['Rajasthani']), 'rap': Info(en: ['Rapanui']), 'rar': Info(en: ['Rarotongan', 'Cook Islands Maori']), 'roa': Info(en: ['Romance languages']), 'roh': Info(en: ['Romansh']), 'rom': Info(en: ['Romany']), 'ron': Info(en: ['Romanian', 'Moldavian', 'Moldovan']), 'rum': Info(en: ['Romanian', 'Moldavian', 'Moldovan']), 'run': Info(en: ['Rundi']), 'rup': Info(en: ['Aromanian', 'Arumanian', 'Macedo-Romanian']), 'rus': Info(en: ['Russian']), 'sad': Info(en: ['Sandawe']), 'sag': Info(en: ['Sango']), 'sah': Info(en: ['Yakut']), 'sai': Info(en: ['South American Indian languages']), 'sal': Info(en: ['Salishan languages']), 'sam': Info(en: ['Samaritan Aramaic']), 'san': Info(en: ['Sanskrit']), 'sas': Info(en: ['Sasak']), 'sat': Info(en: ['Santali']), 'scn': Info(en: ['Sicilian']), 'sco': Info(en: ['Scots']), 'sel': Info(en: ['Selkup']), 'sem': Info(en: ['Semitic languages']), 'sga': Info(en: ['Irish, Old (to 900)']), 'sgn': Info(en: ['Sign Languages']), 'shn': Info(en: ['Shan']), 'sid': Info(en: ['Sidamo']), 'sin': Info(en: ['Sinhala', 'Sinhalese']), 'sio': Info(en: ['Siouan languages']), 'sit': Info(en: ['Sino-Tibetan languages']), 'sla': Info(en: ['Slavic languages']), 'slk': Info(en: ['Slovak']), 'slo': Info(en: ['Slovak']), 'slv': Info(en: ['Slovenian']), 'sma': Info(en: ['Southern Sami']), 'sme': Info(en: ['Northern Sami']), 'smi': Info(en: ['Sami languages']), 'smj': Info(en: ['Lule Sami']), 'smn': Info(en: ['Inari Sami']), 'smo': Info(en: ['Samoan']), 'sms': Info(en: ['Skolt Sami']), 'sna': Info(en: ['Shona']), 'snd': Info(en: ['Sindhi']), 'snk': Info(en: ['Soninke']), 'sog': Info(en: ['Sogdian']), 'som': Info(en: ['Somali']), 'son': Info(en: ['Songhai languages']), 'sot': Info(en: ['Sotho, Southern']), 'spa': Info(en: ['Spanish', 'Castilian']), 'sqi': Info(en: ['Albanian']), 'srd': Info(en: ['Sardinian']), 'srn': Info(en: ['Sranan Tongo']), 'srp': Info(en: ['Serbian']), 'srr': Info(en: ['Serer']), 'ssa': Info(en: ['Nilo-Saharan languages']), 'ssw': Info(en: ['Swati']), 'suk': Info(en: ['Sukuma']), 'sun': Info(en: ['Sundanese']), 'sus': Info(en: ['Susu']), 'sux': Info(en: ['Sumerian']), 'swa': Info(en: ['Swahili']), 'swe': Info(en: ['Swedish']), 'syc': Info(en: ['Classical Syriac']), 'syr': Info(en: ['Syriac']), 'tah': Info(en: ['Tahitian']), 'tai': Info(en: ['Tai languages']), 'tam': Info(en: ['Tamil']), 'tat': Info(en: ['Tatar']), 'tel': Info(en: ['Telugu']), 'tem': Info(en: ['Timne']), 'ter': Info(en: ['Tereno']), 'tet': Info(en: ['Tetum']), 'tgk': Info(en: ['Tajik']), 'tgl': Info(en: ['Tagalog']), 'tha': Info(en: ['Thai']), 'tib': Info(en: ['Tibetan']), 'tig': Info(en: ['Tigre']), 'tir': Info(en: ['Tigrinya']), 'tiv': Info(en: ['Tiv']), 'tkl': Info(en: ['Tokelau']), 'tlh': Info(en: ['Klingon', 'tlhIngan-Hol']), 'tli': Info(en: ['Tlingit']), 'tmh': Info(en: ['Tamashek']), 'tog': Info(en: ['Tonga (Nyasa)']), 'ton': Info(en: ['Tonga (Tonga Islands)']), 'tpi': Info(en: ['Tok Pisin']), 'tsi': Info(en: ['Tsimshian']), 'tsn': Info(en: ['Tswana']), 'tso': Info(en: ['Tsonga']), 'tuk': Info(en: ['Turkmen']), 'tum': Info(en: ['Tumbuka']), 'tup': Info(en: ['Tupi languages']), 'tur': Info(en: ['Turkish']), 'tut': Info(en: ['Altaic languages']), 'tvl': Info(en: ['Tuvalu']), 'twi': Info(en: ['Twi']), 'tyv': Info(en: ['Tuvinian']), 'udm': Info(en: ['Udmurt']), 'uga': Info(en: ['Ugaritic']), 'uig': Info(en: ['Uighur', 'Uyghur']), 'ukr': Info(en: ['Ukrainian']), 'umb': Info(en: ['Umbundu']), 'und': Info(en: ['Undetermined']), 'urd': Info(en: ['Urdu']), 'uzb': Info(en: ['Uzbek']), 'vai': Info(en: ['Vai']), 'ven': Info(en: ['Venda']), 'vie': Info(en: ['Vietnamese']), 'vol': Info(en: ['Volapük']), 'vot': Info(en: ['Votic']), 'wak': Info(en: ['Wakashan languages']), 'wal': Info(en: ['Wolaitta', 'Wolaytta']), 'war': Info(en: ['Waray']), 'was': Info(en: ['Washo']), 'wel': Info(en: ['Welsh']), 'wen': Info(en: ['Sorbian languages']), 'wln': Info(en: ['Walloon']), 'wol': Info(en: ['Wolof']), 'xal': Info(en: ['Kalmyk', 'Oirat']), 'xho': Info(en: ['Xhosa']), 'yao': Info(en: ['Yao']), 'yap': Info(en: ['Yapese']), 'yid': Info(en: ['Yiddish']), 'yor': Info(en: ['Yoruba']), 'ypk': Info(en: ['Yupik languages']), 'zap': Info(en: ['Zapotec']), 'zbl': Info(en: ['Blissymbols', 'Blissymbolics', 'Bliss']), 'zen': Info(en: ['Zenaga']), 'zgh': Info(en: ['Standard Moroccan Tamazight']), 'zha': Info(en: ['Zhuang', 'Chuang']), 'zho': Info(en: ['Chinese']), 'znd': Info(en: ['Zande languages']), 'zul': Info(en: ['Zulu']), 'zun': Info(en: ['Zuni']), 'zxx': Info(en: ['No linguistic content', 'Not applicable']), 'zza': Info(en: ['Zaza', 'Dimili', 'Dimli', 'Kirdki', 'Kirmanjki', 'Zazaki']), }; ================================================ FILE: lib/l10n/languages.dart ================================================ const Map languages = { 'zh': '简体中文', 'en': 'English', }; ================================================ FILE: lib/main.dart ================================================ import 'dart:io'; import 'package:app_links/app_links.dart'; import 'package:flutter/services.dart'; import 'package:fvp/fvp.dart' as fvp; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/info.dart'; import 'package:iris/l10n/app_localizations.dart'; import 'package:iris/models/file.dart'; import 'package:iris/pages/home/home.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/theme.dart'; import 'package:iris/utils/logger.dart'; import 'package:iris/utils/platform.dart'; import 'package:iris/utils/request_storage_permission.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_stream/media_stream.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:saf_util/saf_util.dart'; import 'package:window_manager/window_manager.dart'; import 'package:dynamic_color/dynamic_color.dart'; import 'globals.dart' as globals; void main(List arguments) async { logger('arguments: $arguments'); globals.arguments = arguments; WidgetsFlutterBinding.ensureInitialized(); MediaKit.ensureInitialized(); fvp.registerWith(options: { // 'fastSeek': true, 'player': { if (Platform.isAndroid) 'audio.renderer': 'AudioTrack', 'avio.reconnect': '1', 'avio.reconnect_delay_max': '7', 'buffer': '2000+80000', 'demux.buffer.ranges': '8', }, if (Platform.isAndroid) 'subtitleFontFile': 'assets/fonts/NotoSansCJKsc-Medium.otf', 'global': { 'log': 'debug', } }); final appLinks = AppLinks(); final initUri = await appLinks.getInitialLinkString(); if (initUri != null) { logger('initUri: $initUri'); globals.initUri = initUri; } if (isDesktop) { await windowManager.ensureInitialized(); WindowOptions windowOptions = const WindowOptions( size: Size(1280, 720), minimumSize: Size(427, 240), center: true, backgroundColor: Colors.transparent, skipTaskbar: false, titleBarStyle: TitleBarStyle.hidden, ); windowManager.waitUntilReadyToShow(windowOptions, () async { await windowManager.show(); await windowManager.focus(); }); } SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); MediaStream mediaStream = MediaStream(); mediaStream.startServer(); runApp(const StoreScope(child: MyApp())); } class MyApp extends HookWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { useEffect(() { () async { globals.storagePermissionStatus = Platform.isAndroid ? await isAndroid11OrHigher() ? await Permission.manageExternalStorage.status : await Permission.storage.status : PermissionStatus.granted; }(); return null; }, []); ThemeMode themeMode = useAppStore().select(context, (state) => state.themeMode); String language = useAppStore().select(context, (state) => state.language); final appLinks = useMemoized(() => AppLinks()); final String? uri = useStream(appLinks.stringLinkStream).data; useEffect(() { () async { if (uri != null && globals.initUri != uri) { logger('Uri: $uri'); if (Platform.isAndroid) { final file = await SafUtil().documentFileFromUri(uri, false); if (file != null) { await useAppStore().updateAutoPlay(true); await usePlayQueueStore().update( playQueue: [ PlayQueueItem( file: FileItem( name: file.name, uri: file.uri, size: file.length, ), index: 0, ), ], index: 0, ); } } } }(); return null; }, [uri]); return DynamicColorBuilder(builder: ( ColorScheme? lightDynamic, ColorScheme? darkDynamic, ) { final theme = getTheme( context: context, lightDynamic: lightDynamic, darkDynamic: darkDynamic, ); return MaterialApp( title: INFO.title, theme: theme.light, darkTheme: theme.dark, themeMode: themeMode, home: const Home(), locale: language == 'system' || language == 'auto' ? null : Locale(language), localizationsDelegates: AppLocalizations.localizationsDelegates, localeResolutionCallback: (locale, supportedLocales) => supportedLocales .map((e) => e.languageCode) .toList() .contains(locale!.languageCode) ? null : const Locale('en'), supportedLocales: AppLocalizations.supportedLocales, ); }); } } ================================================ FILE: lib/models/file.dart ================================================ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:flutter/foundation.dart'; import 'package:iris/models/storages/storage.dart'; part 'file.freezed.dart'; part 'file.g.dart'; enum ContentType { video, audio, image, other, } enum FileOptions { addToPlayQueue, remove, openInFolder, } @freezed abstract class FileItem with _$FileItem { const FileItem._(); const factory FileItem({ @Default('') String storageId, @Default(StorageType.none) StorageType storageType, required String name, required String uri, @Default([]) List path, @Default(false) bool isDir, @Default(0) int size, DateTime? lastModified, @Default(ContentType.video) ContentType type, @Default([]) List subtitles, }) = _FileItem; factory FileItem.fromJson(Map json) => _$FileItemFromJson(json); String getID() => '$storageId:$uri'; } @freezed abstract class Subtitle with _$Subtitle { const factory Subtitle({ required String name, required String uri, }) = _Subtitle; factory Subtitle.fromJson(Map json) => _$SubtitleFromJson(json); } @freezed abstract class PlayQueueItem with _$PlayQueueItem { const factory PlayQueueItem({ required FileItem file, required int index, }) = _PlayQueueItem; factory PlayQueueItem.fromJson(Map json) => _$PlayQueueItemFromJson(json); } ================================================ FILE: lib/models/player.dart ================================================ import 'package:flutter/material.dart'; import 'package:iris/models/file.dart'; import 'package:media_kit/media_kit.dart' as media_kit; import 'package:media_kit_video/media_kit_video.dart' as media_kit_video; import 'package:video_player/video_player.dart'; class MediaPlayer { final bool isInitializing; final bool isPlaying; final List externalSubtitles; final Duration position; final Duration duration; final Duration buffer; final double width; final double height; final Future Function() saveProgress; final Future Function() play; final Future Function() pause; final Future Function(int) backward; final Future Function(int) forward; final Future Function() stepBackward; final Future Function() stepForward; final Future Function(Duration) seek; MediaPlayer({ required this.isInitializing, required this.isPlaying, required this.externalSubtitles, required this.position, required this.duration, required this.buffer, required this.width, required this.height, required this.saveProgress, required this.play, required this.pause, required this.backward, required this.forward, required this.stepBackward, required this.stepForward, required this.seek, }); } class MediaKitPlayer extends MediaPlayer { final media_kit.Player player; final media_kit_video.VideoController controller; final media_kit.SubtitleTrack subtitle; final List subtitles; final media_kit.AudioTrack audio; final List audios; MediaKitPlayer({ required this.player, required this.controller, required this.subtitle, required this.subtitles, required super.externalSubtitles, required this.audio, required this.audios, required super.isInitializing, required super.isPlaying, required super.position, required super.duration, required super.buffer, required super.width, required super.height, required super.saveProgress, required super.play, required super.pause, required super.backward, required super.forward, required super.stepBackward, required super.stepForward, required super.seek, }); } class FvpPlayer extends MediaPlayer { final VideoPlayerController controller; final ValueNotifier externalSubtitle; FvpPlayer({ required this.controller, required super.isInitializing, required super.isPlaying, required this.externalSubtitle, required super.externalSubtitles, required super.position, required super.duration, required super.buffer, required super.width, required super.height, required super.saveProgress, required super.play, required super.pause, required super.backward, required super.forward, required super.stepBackward, required super.stepForward, required super.seek, }); } ================================================ FILE: lib/models/progress.dart ================================================ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:flutter/foundation.dart'; import 'package:iris/models/file.dart'; part 'progress.freezed.dart'; part 'progress.g.dart'; @freezed abstract class Progress with _$Progress { const factory Progress({ required DateTime dateTime, required Duration position, required Duration duration, required FileItem file, }) = _Progress; factory Progress.fromJson(Map json) => _$ProgressFromJson(json); } ================================================ FILE: lib/models/storages/ftp.dart ================================================ import 'dart:convert'; import 'package:iris/models/file.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/utils/check_content_type.dart'; import 'package:iris/utils/get_subtitle_map.dart'; import 'package:iris/utils/logger.dart'; import 'package:path/path.dart' as p; import 'package:pure_ftp/pure_ftp.dart'; Future> getFTPFiles( FTPStorage storage, List path) async { final username = storage.username.isEmpty ? 'anonymous' : storage.username; final client = FtpClient( socketInitOptions: FtpSocketInitOptions( host: storage.host, port: int.tryParse(storage.port), ), authOptions: FtpAuthOptions( username: username, password: storage.password, account: '', ), logCallback: null, ); try { await client.connect(); await client.fs.changeDirectory(path.join('/').replaceAll('//', '/')); final files = await client.fs.listDirectory(); await client.disconnect(); final baseUri = 'ftp?host=${storage.host}&port=${storage.port}&path=${path.join('/').replaceAll('//', '/')}'; String getUri(String fileName) { final separator = baseUri.endsWith('/') ? '' : '/'; return Uri.encodeFull('$baseUri$separator$fileName'); } final subtitleMap = getSubtitleMap( files: files, getName: (file) => file.name, getUri: (file) => getUri(file.name), ); List fileItems = []; for (final file in files) { final basename = p.basenameWithoutExtension(file.name).split('.').first; fileItems.add( FileItem( storageId: storage.id, storageType: StorageType.ftp, name: file.name, uri: getUri(file.name), path: [...path, file.name], isDir: file.isDirectory, size: file.isDirectory ? 0 : file.info?.size ?? 0, lastModified: file.info?.modifyTime != null ? DateTime.tryParse(file.info!.modifyTime!) : null, type: file.isDirectory ? ContentType.other : checkContentType(file.name), subtitles: isVideoFile(file.name) ? subtitleMap[basename] ?? [] : [], ), ); } return fileItems; } catch (error) { logger('Error getting FTP files: $error'); return []; } } Future testFTP(FTPStorage storage) async { final client = FtpClient( socketInitOptions: FtpSocketInitOptions( host: storage.host, port: int.tryParse(storage.port), ), authOptions: FtpAuthOptions( username: storage.username.isEmpty ? 'anonymous' : storage.username, password: storage.password, account: '', ), logCallback: null, ); try { await client.connect(); await client.fs.listDirectory(); await client.disconnect(); return true; } catch (error) { logger('Error testing FTP: $error'); return false; } } String getFTPAuth(FTPStorage storage) => 'Basic ${base64Encode(utf8.encode('${storage.username.isEmpty ? 'anonymous' : storage.username}:${storage.password}'))}'; ================================================ FILE: lib/models/storages/local.dart ================================================ import 'dart:io'; import 'package:android_x_storage/android_x_storage.dart'; import 'package:disks_desktop/disks_desktop.dart'; import 'package:drives_windows/drives_windows.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/models/store/play_queue_state.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/utils/files_sort.dart'; import 'package:iris/utils/get_subtitle_map.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/logger.dart'; import 'package:iris/utils/path_conv.dart'; import 'package:iris/utils/platform.dart'; import 'package:path/path.dart' as p; import 'package:iris/models/file.dart'; import 'package:iris/utils/check_content_type.dart'; import 'package:saf_util/saf_util.dart'; import 'package:saf_util/saf_util_platform_interface.dart'; Future> getLocalStorages( BuildContext context, ) async { final t = getLocalizations(context); if (isDesktop) { List storages = []; if (isWindows) { final drivesWindows = DrivesWindows(); final drives = drivesWindows.getDrives(); final networkShortcuts = drivesWindows.getNetworkShortcuts(); for (var drive in drives) { if (drive.type == DriveType.noRootDirectory) continue; final type = drive.type == DriveType.network ? StorageType.network : StorageType.internal; final name = drive.volumeLabel != null ? '${drive.volumeLabel} (${drive.name})' : '${drive.type == DriveType.network ? t.network_storage : t.local_storage} (${drive.name})'; final root = drive.root.replaceAll('\\', ''); final storage = LocalStorage( type: type, name: name, basePath: [root], ); storages.add(storage); } for (var shortcut in networkShortcuts) { if (shortcut.path == null) continue; final storage = LocalStorage( type: StorageType.network, name: shortcut.name, basePath: [shortcut.path!], ); storages.add(storage); } } else { final repository = DisksRepository(); final disks = await repository.query; List storages = []; for (var disk in disks) { for (var mountpoint in disk.mountpoints) { final storage = LocalStorage( type: StorageType.internal, name: '${t.local_storage} (${mountpoint.path.replaceAll('\\', '')})', basePath: [mountpoint.path.replaceAll('\\', '')], ); storages.add(storage); } } } return storages; } else if (isAndroid) { final androidXStorage = AndroidXStorage(); final external = await androidXStorage.getExternalStorageDirectory().catchError((error) { logger('Error getting external storage: $error'); return null; }); final sdcard = await androidXStorage.getSDCardStorageDirectory().catchError((error) { logger('Error getting SD card: $error'); return null; }); final usbs = await androidXStorage.getUSBStorageDirectories().catchError((error) { logger('Error getting USB storages: $error'); return []; }); List storages = []; if (external != null) { final storage = LocalStorage( type: StorageType.internal, name: t.local_storage, basePath: [external], ); storages.add(storage); } if (sdcard != null) { final storage = LocalStorage( type: StorageType.sdcard, name: 'SD Card', basePath: [sdcard], ); storages.add(storage); } for (var usb in usbs) { if (usb != null) { final storage = LocalStorage( type: StorageType.usb, name: t.usb_storage, basePath: [usb], ); storages.add(storage); } } return storages; } return []; } Future getLocalPlayQueue(String filePath) async { final type = checkContentType(filePath); if (type != ContentType.video && type != ContentType.audio) { return null; } final convedPath = pathConv(filePath); final dirPath = convedPath.sublist(0, convedPath.length - 1); final files = await LocalStorage( type: StorageType.internal, name: convedPath.last, basePath: dirPath, ).getFiles(dirPath); final List sortedFiles = filesSort(files: files); final List filteredFiles = sortedFiles .where( (file) => [ContentType.video, ContentType.audio].contains(file.type)) .toList(); final List playQueue = filteredFiles .asMap() .entries .map((entry) => PlayQueueItem(file: entry.value, index: entry.key)) .toList(); final clickedFile = filteredFiles.where((file) => file.uri == filePath).first; final index = filteredFiles.indexOf(clickedFile); return PlayQueueState( playQueue: playQueue, currentIndex: index < 0 || index >= playQueue.length ? 0 : index, ); } Future pickLocalFile() async { FilePickerResult? result = await FilePicker.platform.pickFiles( type: FileType.custom, allowedExtensions: [...Formats.video, ...Formats.audio], ); final filePath = result?.files.first.path; if (filePath != null) { final playQueue = await getLocalPlayQueue(filePath); if (playQueue == null || playQueue.playQueue.isEmpty) return; await useAppStore().updateAutoPlay(true); await usePlayQueueStore().update( playQueue: playQueue.playQueue, index: playQueue.currentIndex, ); } } Future> getLocalFiles( LocalStorage storage, List path) async { final directoryPath = p.joinAll(path); final directory = Directory(directoryPath); if (!await directory.exists()) { logger('Error: Directory does not exist at $directoryPath'); return []; } final Map> groupedEntities = {}; final allEntities = await directory.list().toList(); for (final entity in allEntities) { final baseName = p.basenameWithoutExtension(entity.path); groupedEntities.putIfAbsent(baseName, () => []).add(entity); } final List fileItems = []; final subtitleExtensions = {'ass', 'srt', 'vtt', 'sub'}; for (final group in groupedEntities.values) { final videos = group .where((e) => e is! Directory && checkContentType(e.path) == ContentType.video) .toList(); final subtitles = group.where((e) { final ext = p.extension(e.path).replaceFirst('.', ''); return e is! Directory && subtitleExtensions.contains(ext); }).toList(); final others = group .where((e) => !videos.contains(e) && !subtitles.contains(e)) .toList(); for (final video in videos) { final videoStat = await video.stat(); final associatedSubtitles = subtitles.map((sub) { final baseName = p.basenameWithoutExtension(video.path); String subTitleName = p.basename(sub.path); final regex = RegExp(r'^' + RegExp.escape(baseName) + r'\.(.+?)\.'); final match = regex.firstMatch(subTitleName); if (match != null) { subTitleName = match.group(1) ?? subTitleName; } return Subtitle(name: subTitleName, uri: sub.path); }).toList(); fileItems.add(FileItem( storageId: storage.id, storageType: storage.type, name: p.basename(video.path), uri: video.path, path: [...path, p.basename(video.path)], isDir: false, size: videoStat.size, lastModified: videoStat.modified, type: ContentType.video, subtitles: associatedSubtitles, )); } for (final entity in others) { final stat = await entity.stat(); final isDir = entity is Directory; fileItems.add(FileItem( storageId: storage.id, storageType: storage.type, name: p.basename(entity.path), uri: entity.path, path: [...path, p.basename(entity.path)], isDir: isDir, size: isDir ? 0 : stat.size, lastModified: stat.modified, type: isDir ? ContentType.other : checkContentType(entity.path), subtitles: [], )); } } return fileItems; } Future pickContentFile() async { final file = await SafUtil().pickFile(mimeTypes: ['video/*', 'audio/*']); if (file != null) { await useAppStore().updateAutoPlay(true); await usePlayQueueStore().update( playQueue: [ PlayQueueItem( file: FileItem( name: file.name, uri: file.uri, size: file.length, ), index: 0, ), ], index: 0, ); } } Future> getContentFiles(String uri) async { final files = await SafUtil().list(uri); final subtitleMap = getSubtitleMap( files: files, getName: (file) => file.name, getUri: (file) => file.uri, ); List fileItems = []; for (final file in files) { final basename = p.basenameWithoutExtension(file.name).split('.').first; fileItems.add(FileItem( name: file.name, uri: file.uri, path: [uri, file.name], isDir: file.isDir, size: file.isDir ? 0 : file.length, lastModified: DateTime.fromMillisecondsSinceEpoch(file.lastModified), type: file.isDir ? ContentType.other : checkContentType(file.name), subtitles: isVideoFile(file.name) ? subtitleMap[basename] ?? [] : [], )); } return fileItems; } ================================================ FILE: lib/models/storages/storage.dart ================================================ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/storages/ftp.dart'; import 'package:iris/models/storages/local.dart'; import 'package:iris/models/storages/webdav.dart'; import 'package:iris/utils/platform.dart'; import 'package:iris/widgets/popup.dart'; import 'package:iris/widgets/popups/storages/storages.dart'; import 'package:iris/store/use_storage_store.dart'; part 'storage.freezed.dart'; part 'storage.g.dart'; const String localStorageId = 'local'; enum StorageType { none, internal, network, usb, sdcard, webdav, ftp, } enum StorageOptions { edit, remove, } abstract class _Storage { String get id; StorageType get type; String get name; List get basePath; Map toJson(); Future> getFiles(List path); String? getAuth(); } @freezed sealed class Storage with _$Storage implements _Storage { const Storage._(); factory Storage.local({ @Default(localStorageId) String id, required StorageType type, required String name, required List basePath, }) = LocalStorage; factory Storage.webdav({ required String id, @Default(StorageType.webdav) StorageType type, required String name, @JsonKey(name: 'url') required String host, required List basePath, required String port, required String username, required String password, required bool https, }) = WebDAVStorage; factory Storage.ftp({ required String id, @Default(StorageType.ftp) StorageType type, required String name, required String host, required List basePath, required String port, required String username, required String password, }) = FTPStorage; factory Storage.fromJson(Map json) => _$StorageFromJson(json); @override Future> getFiles(List path) async { switch (type) { case StorageType.internal: case StorageType.network: case StorageType.usb: case StorageType.sdcard: if (isAndroid && path[0].startsWith('content://')) { return await getContentFiles(path.join('%2F')); } else { return await getLocalFiles(this as LocalStorage, path); } case StorageType.webdav: return await getWebDAVFiles(this as WebDAVStorage, path); case StorageType.ftp: return await getFTPFiles(this as FTPStorage, path); case StorageType.none: return []; } } @override String? getAuth() { switch (type) { case StorageType.webdav: return getWebDAVAuth(this as WebDAVStorage); case StorageType.ftp: return getFTPAuth(this as FTPStorage); default: return null; } } } Future openInFolder(BuildContext context, FileItem file) async { if (file.path.isEmpty) return; useStorageStore() .updateCurrentPath(file.path.sublist(0, file.path.length - 1)); Storage? storage = useStorageStore().findById(file.storageId); if (storage != null) { useStorageStore().updateCurrentStorage(storage); } else { final localStorages = await getLocalStorages(context); Storage? storage = localStorages .firstWhereOrNull((element) => element.basePath[0] == file.path[0]); if (storage != null) { useStorageStore().updateCurrentStorage(storage); } else { useStorageStore().updateCurrentStorage( LocalStorage( type: file.storageType, name: file.path[0], basePath: [file.path[0]], ), ); } } if (context.mounted) { replacePopup( context: context, child: Storages(), direction: PopupDirection.right, ); } } ================================================ FILE: lib/models/storages/webdav.dart ================================================ import 'dart:convert'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/utils/check_content_type.dart'; import 'package:iris/utils/get_subtitle_map.dart'; import 'package:iris/utils/logger.dart'; import 'package:path/path.dart' as p; import 'package:webdav_client/webdav_client.dart' as webdav; import 'package:iris/models/file.dart'; Future testWebDAV(WebDAVStorage storage) async { final host = storage.host; final port = storage.port; final username = storage.username; final password = storage.password; final https = storage.https; final basePath = storage.basePath; try { var client = webdav.newClient( "http${https ? 's' : ''}://$host:$port", user: username, password: password, debug: false, ); client.setHeaders({'accept-charset': 'utf-8'}); client.setConnectTimeout(4000); client.setSendTimeout(4000); client.setReceiveTimeout(4000); // await client.ping(); await client.readDir(basePath.join('/')); return true; } catch (e) { logger(e.toString()); return false; } } Future> getWebDAVFiles( WebDAVStorage storage, List path, ) async { final id = storage.id; final host = storage.host; final port = storage.port; final username = storage.username; final password = storage.password; final https = storage.https; var client = webdav.newClient( "http${https ? 's' : ''}://$host:$port", user: username, password: password, debug: false, ); client.setHeaders({'accept-charset': 'utf-8'}); client.setConnectTimeout(8000); client.setSendTimeout(8000); client.setReceiveTimeout(8000); var files = await client.readDir(path.join('/')); final cleanPathSegments = path.map((e) => e.replaceAll('/', '')).toList(); final baseUri = Uri( scheme: storage.https ? 'https' : 'http', host: storage.host, port: int.tryParse(storage.port), pathSegments: cleanPathSegments, ); final baseUriString = baseUri.toString(); String getUri(String fileName) { try { final dirUri = Uri.parse( baseUriString.endsWith('/') ? baseUriString : '$baseUriString/'); return dirUri.resolve(fileName).toString(); } catch (e) { final separator = baseUriString.endsWith('/') ? '' : '/'; return '$baseUriString$separator$fileName'; } } final subtitleMap = getSubtitleMap( files: files, getName: (file) => file.name ?? '', getUri: (file) => getUri(file.name ?? ''), ); List fileItems = []; for (final file in files) { final fileName = file.name; if (fileName == null) continue; final isDir = file.isDir; final basename = p.basenameWithoutExtension(fileName).split('.').first; fileItems.add(FileItem( storageId: id, storageType: StorageType.webdav, name: fileName, uri: getUri(fileName), path: [...path, fileName], isDir: isDir ?? false, size: file.size ?? 0, lastModified: file.mTime, type: isDir ?? false ? ContentType.other : checkContentType(fileName), subtitles: isVideoFile(fileName) ? subtitleMap[basename] ?? [] : [], )); } return fileItems; } String getWebDAVAuth(WebDAVStorage storage) => 'Basic ${base64Encode(utf8.encode('${storage.username}:${storage.password}'))}'; ================================================ FILE: lib/models/store/app_state.dart ================================================ import 'package:flutter/material.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; part 'app_state.freezed.dart'; part 'app_state.g.dart'; enum PlayerBackend { mediaKit, fvp, } enum Repeat { none, all, one, } enum SortBy { name, size, lastModified, } enum SortOrder { asc, desc, } enum ScreenOrientation { device, landscape, portrait, } @freezed abstract class AppState with _$AppState { const factory AppState({ @Default(false) bool autoPlay, @Default(false) bool shuffle, @Default(Repeat.none) Repeat repeat, @Default(BoxFit.contain) BoxFit fit, @Default(1) double rate, @Default(80) int volume, @Default(false) bool isMuted, @Default(ThemeMode.system) ThemeMode themeMode, @Default('none') String preferedSubtitleLanguage, @Default('system') String language, @Default(false) bool autoCheckUpdate, @Default(false) bool autoResize, @Default(false) bool alwaysPlayFromBeginning, @Default(PlayerBackend.mediaKit) PlayerBackend playerBackend, @Default(SortBy.name) SortBy sortBy, @Default(SortOrder.asc) SortOrder sortOrder, @Default(true) bool folderFirst, @Default(ScreenOrientation.device) ScreenOrientation orientation, }) = _AppState; factory AppState.fromJson(Map json) => _$AppStateFromJson(json); } ================================================ FILE: lib/models/store/history_state.dart ================================================ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:flutter/foundation.dart'; import 'package:iris/models/progress.dart'; part 'history_state.freezed.dart'; part 'history_state.g.dart'; @freezed abstract class HistoryState with _$HistoryState { const factory HistoryState({ @Default({}) Map history, }) = _HistoryState; factory HistoryState.fromJson(Map json) => _$HistoryStateFromJson(json); } ================================================ FILE: lib/models/store/play_queue_state.dart ================================================ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:flutter/foundation.dart'; import 'package:iris/models/file.dart'; part 'play_queue_state.freezed.dart'; part 'play_queue_state.g.dart'; @freezed abstract class PlayQueueState with _$PlayQueueState { const factory PlayQueueState({ @Default([]) List playQueue, @Default(0) int currentIndex, }) = _PlayQueueState; factory PlayQueueState.fromJson(Map json) => _$PlayQueueStateFromJson(json); } ================================================ FILE: lib/models/store/player_ui_state.dart ================================================ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:flutter/foundation.dart'; part 'player_ui_state.freezed.dart'; part 'player_ui_state.g.dart'; @freezed abstract class PlayerUiState with _$PlayerUiState { const factory PlayerUiState({ @Default(0) double aspectRatio, @Default(false) bool isAlwaysOnTop, @Default(false) bool isFullScreen, @Default(false) bool isSeeking, @Default(false) bool isHovering, @Default(true) bool isShowControl, @Default(false) bool isShowProgress, }) = _PlayerUiState; factory PlayerUiState.fromJson(Map json) => _$PlayerUiStateFromJson(json); } ================================================ FILE: lib/models/store/storage_state.dart ================================================ import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:flutter/foundation.dart'; import 'package:iris/models/storages/storage.dart'; part 'storage_state.freezed.dart'; part 'storage_state.g.dart'; @freezed abstract class Favorite with _$Favorite { factory Favorite({ required String storageId, required List path, }) = _Favorite; factory Favorite.fromJson(Map json) => _$FavoriteFromJson(json); } @freezed abstract class StorageState with _$StorageState { factory StorageState({ @Default([]) List storages, @Default([]) List favorites, @Default(null) Storage? currentStorage, @Default([]) List currentPath, }) = _StorageState; factory StorageState.fromJson(Map json) => _$StorageStateFromJson(json); } ================================================ FILE: lib/oss_licenses.dart ================================================ // dart format off // cSpell:disable // ignore_for_file: always_put_required_named_parameters_first // ignore_for_file: constant_identifier_names // ignore_for_file: sort_constructors_first // This code was generated by dart_pubspec_licenses // https://pub.dev/packages/dart_pubspec_licenses /// All dependencies including transitive dependencies. const allDependencies = [ __fe_analyzer_shared, _analyzer, _analyzer_plugin, _android_x_storage, _app_links, _app_links_linux, _app_links_platform_interface, _app_links_web, _archive, _args, _asn1lib, _async, _boolean_selector, _build, _build_config, _build_daemon, _build_runner, _built_collection, _built_value, _characters, _charset, _checked_yaml, _ci, _cli_util, _clock, _code_builder, _collection, _console, _convert, _cross_file, _crypto, _cryptography, _csslib, _cupertino_icons, _custom_lint, _custom_lint_builder, _custom_lint_core, _custom_lint_visitor, _dart_pubspec_licenses, _dart_style, _dbus, _desktop_drop, _device_info_plus, _device_info_plus_platform_interface, _dio, _dio_web_adapter, _disks_desktop, _drives_windows, _dynamic_color, _equatable, _fake_async, _ffi, _file, _file_picker, _fixnum, _flutter, _flutter_breadcrumb, _flutter_hooks, _flutter_hooks_lint, _flutter_lints, _flutter_markdown, _flutter_plugin_android_lifecycle, _flutter_secure_storage, _flutter_secure_storage_linux, _flutter_secure_storage_macos, _flutter_secure_storage_platform_interface, _flutter_secure_storage_web, _flutter_secure_storage_windows, _flutter_volume_controller, _flutter_web_plugins, _flutter_zustand, _freezed, _freezed_annotation, _frontend_server_client, _fvp, _get_it, _glob, _google_fonts, _graphs, _gtk, _hotreloader, _html, _http, _http_methods, _http_multi_server, _http_parser, _image, _intl, _io, _js, _json_annotation, _json_serializable, _leak_tracker, _leak_tracker_flutter_testing, _leak_tracker_testing, _lints, _logging, _markdown, _matcher, _material_color_utilities, _media_kit, _media_kit_libs_android_video, _media_kit_libs_ios_video, _media_kit_libs_linux, _media_kit_libs_macos_video, _media_kit_libs_video, _media_kit_libs_windows_video, _media_kit_video, _media_stream, _meta, _mime, _msix, _mutex, _nested, _package_config, _package_info_plus, _package_info_plus_platform_interface, _path, _path_provider, _path_provider_android, _path_provider_foundation, _path_provider_linux, _path_provider_platform_interface, _path_provider_windows, _pedantic, _permission_handler, _permission_handler_android, _permission_handler_apple, _permission_handler_html, _permission_handler_platform_interface, _permission_handler_windows, _petitparser, _platform, _plugin_platform_interface, _pointycastle, _pool, _popover, _posix, _provider, _pub_semver, _pubspec_parse, _pure_ftp, _rxdart, _saf_util, _safe_local_storage, _screen_brightness, _screen_brightness_android, _screen_brightness_ios, _screen_brightness_macos, _screen_brightness_ohos, _screen_brightness_platform_interface, _screen_brightness_windows, _screen_retriever, _screen_retriever_linux, _screen_retriever_macos, _screen_retriever_platform_interface, _screen_retriever_windows, _scrollable_positioned_list, _shelf, _shelf_router, _shelf_web_socket, _smb_connect, _source_gen, _source_helper, _source_span, _sprintf, _stack_trace, _stream_channel, _stream_transform, _string_scanner, _synchronized, _term_glyph, _test_api, _typed_data, _universal_platform, _uri_parser, _url_launcher, _url_launcher_android, _url_launcher_ios, _url_launcher_linux, _url_launcher_macos, _url_launcher_platform_interface, _url_launcher_web, _url_launcher_windows, _uuid, _vector_math, _video_player, _video_player_android, _video_player_avfoundation, _video_player_platform_interface, _video_player_web, _vm_service, _volume_controller, _wakelock_plus, _wakelock_plus_platform_interface, _watcher, _web, _web_socket, _web_socket_channel, _webdav_client, _win32, _win32_registry, _window_manager, _window_size, _xdg_directories, _xml, _yaml, _zustand ]; /// Direct `dependencies`. const dependencies = [ _flutter, _cupertino_icons, _intl, _file_picker, _flutter_breadcrumb, _flutter_hooks, _flutter_secure_storage, _flutter_zustand, _media_kit, _media_kit_video, _media_kit_libs_video, _path, _path_provider, _package_info_plus, _provider, _webdav_client, _window_manager, _url_launcher, _scrollable_positioned_list, _google_fonts, _dynamic_color, _window_size, _uuid, _flutter_markdown, _http, _collection, _json_annotation, _freezed_annotation, _disks_desktop, _android_x_storage, _permission_handler, _desktop_drop, _app_links, _device_info_plus, _saf_util, _screen_brightness, _flutter_volume_controller, _fvp, _video_player, _wakelock_plus, _popover, _pure_ftp, _drives_windows, _media_stream ]; /// Direct `dev_dependencies`. const devDependencies = [ _flutter_lints, _dart_pubspec_licenses, _build_runner, _freezed, _json_serializable, _msix, _flutter_hooks_lint, _custom_lint ]; /// Package license definition. class Package { /// Package name final String name; /// Description final String description; /// Authors final List authors; /// Whether the license is in markdown format or not (plain text). final bool isMarkdown; /// Whether the package is included in the SDK or not. final bool isSdk; /// Direct dependencies final List dependencies; /// Website URL final String? homepage; /// Repository URL final String? repository; /// Version final String? version; /// License final String? license; const Package({ required this.name, required this.description, required this.authors, required this.isMarkdown, required this.isSdk, required this.dependencies, this.homepage, this.repository, this.version, this.license, }); } class PackageRef { final String name; const PackageRef(this.name); Package resolve() => allDependencies.firstWhere((d) => d.name == name); } /// _fe_analyzer_shared 88.0.0 const __fe_analyzer_shared = Package( name: '_fe_analyzer_shared', description: 'Logic that is shared between the front_end and analyzer packages.', repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/_fe_analyzer_shared', authors: [], version: '88.0.0', license: '''Copyright 2019, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta')]); /// analyzer 8.1.1 const _analyzer = Package( name: 'analyzer', description: 'This package provides a library that performs static analysis of Dart code.', repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/analyzer', authors: [], version: '8.1.1', license: '''Copyright 2013, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('_fe_analyzer_shared'), PackageRef('collection'), PackageRef('convert'), PackageRef('crypto'), PackageRef('glob'), PackageRef('meta'), PackageRef('package_config'), PackageRef('path'), PackageRef('pub_semver'), PackageRef('source_span'), PackageRef('watcher'), PackageRef('yaml') ]); /// analyzer_plugin 0.13.7 const _analyzer_plugin = Package( name: 'analyzer_plugin', description: 'A framework and support code for building plugins for the analysis server.', repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/analyzer_plugin', authors: [], version: '0.13.7', license: '''Copyright 2017, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('analyzer'), PackageRef('collection'), PackageRef('dart_style'), PackageRef('pub_semver'), PackageRef('yaml'), PackageRef('path') ]); /// android_x_storage 1.0.2 const _android_x_storage = Package( name: 'android_x_storage', description: 'A new Flutter plugin for Android to get the external storage directories.', homepage: 'https://github.com/djeddi-yacine/android_x_storage', repository: 'https://github.com/djeddi-yacine/android_x_storage', authors: [], version: '1.0.2', license: '''BSD 3-Clause License Copyright (c) 2023 Djeddi Yacine All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface') ]); /// app_links 6.4.1 const _app_links = Package( name: 'app_links', description: 'Android App Links, Deep Links, iOs Universal Links and Custom URL schemes handler for Flutter (desktop included).', homepage: 'https://github.com/llfbandit/app_links', authors: [], version: '6.4.1', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('app_links_linux'), PackageRef('app_links_platform_interface'), PackageRef('app_links_web') ]); /// app_links_linux 1.0.3 const _app_links_linux = Package( name: 'app_links_linux', description: 'Linux platform implementation of app_links plugin.', homepage: 'https://github.com/llfbandit/app_links/tree/master/app_links_linux', authors: [], version: '1.0.3', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('app_links_platform_interface'), PackageRef('gtk') ]); /// app_links_platform_interface 2.0.2 const _app_links_platform_interface = Package( name: 'app_links_platform_interface', description: 'A common platform interface for the app_links plugin.', homepage: 'https://github.com/llfbandit/app_links/tree/master/app_links_platform_interface', authors: [], version: '2.0.2', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface') ]); /// app_links_web 1.0.4 const _app_links_web = Package( name: 'app_links_web', description: 'Web platform implementation of app_links plugin.', homepage: 'https://github.com/llfbandit/app_links/tree/master/app_links_web', authors: [], version: '1.0.4', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_web_plugins'), PackageRef('app_links_platform_interface'), PackageRef('web') ]); /// archive 4.0.7 const _archive = Package( name: 'archive', description: 'Provides encoders and decoders for various archive and compression formats such as zip, tar, bzip2, gzip, and zlib.', repository: 'https://github.com/brendan-duncan/archive', authors: [], version: '4.0.7', license: '''The MIT License Copyright (c) 2013-2021 Brendan Duncan. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('crypto'), PackageRef('path'), PackageRef('posix') ]); /// args 2.7.0 const _args = Package( name: 'args', description: 'Library for defining parsers for parsing raw command-line arguments into a set of options and values using GNU and POSIX style options.', repository: 'https://github.com/dart-lang/core/tree/main/pkgs/args', authors: [], version: '2.7.0', license: '''Copyright 2013, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// asn1lib 1.6.5 const _asn1lib = Package( name: 'asn1lib', description: 'An ASN1 parser library for Dart. Encodes / decodes from ASN1 Objects to BER bytes', homepage: 'https://github.com/wstrange/asn1lib', authors: [], version: '1.6.5', license: '''http://opensource.org/licenses/BSD-3-Clause Copyright (c) 2015, Warren Strange All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// async 2.13.0 const _async = Package( name: 'async', description: "Utility functions and classes related to the 'dart:async' library.", repository: 'https://github.com/dart-lang/core/tree/main/pkgs/async', authors: [], version: '2.13.0', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('collection'), PackageRef('meta')]); /// boolean_selector 2.1.2 const _boolean_selector = Package( name: 'boolean_selector', description: "A flexible syntax for boolean expressions, based on a simplified version of Dart's expression syntax.", repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/boolean_selector', authors: [], version: '2.1.2', license: '''Copyright 2016, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('source_span'), PackageRef('string_scanner')]); /// build 4.0.0 const _build = Package( name: 'build', description: 'A package for authoring build_runner compatible code generators.', repository: 'https://github.com/dart-lang/build/tree/master/build', authors: [], version: '4.0.0', license: '''Copyright 2016, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('analyzer'), PackageRef('crypto'), PackageRef('glob'), PackageRef('logging'), PackageRef('package_config'), PackageRef('path') ]); /// build_config 1.2.0 const _build_config = Package( name: 'build_config', description: 'Format definition and support for parsing `build.yaml` configuration.', repository: 'https://github.com/dart-lang/build/tree/master/build_config', authors: [], version: '1.2.0', license: '''Copyright 2017, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('checked_yaml'), PackageRef('json_annotation'), PackageRef('path'), PackageRef('pubspec_parse') ]); /// build_daemon 4.0.4 const _build_daemon = Package( name: 'build_daemon', description: 'A daemon for running Dart builds.', repository: 'https://github.com/dart-lang/build/tree/master/build_daemon', authors: [], version: '4.0.4', license: '''Copyright 2019, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('built_collection'), PackageRef('built_value'), PackageRef('crypto'), PackageRef('http_multi_server'), PackageRef('logging'), PackageRef('path'), PackageRef('pool'), PackageRef('shelf'), PackageRef('shelf_web_socket'), PackageRef('stream_transform'), PackageRef('watcher'), PackageRef('web_socket_channel') ]); /// build_runner 2.8.0 const _build_runner = Package( name: 'build_runner', description: 'A build system for Dart code generation and modular compilation.', repository: 'https://github.com/dart-lang/build/tree/master/build_runner', authors: [], version: '2.8.0', license: '''Copyright 2016, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('analyzer'), PackageRef('args'), PackageRef('async'), PackageRef('build'), PackageRef('build_config'), PackageRef('build_daemon'), PackageRef('built_collection'), PackageRef('built_value'), PackageRef('code_builder'), PackageRef('collection'), PackageRef('convert'), PackageRef('crypto'), PackageRef('dart_style'), PackageRef('frontend_server_client'), PackageRef('glob'), PackageRef('graphs'), PackageRef('http_multi_server'), PackageRef('io'), PackageRef('json_annotation'), PackageRef('logging'), PackageRef('meta'), PackageRef('mime'), PackageRef('package_config'), PackageRef('path'), PackageRef('pool'), PackageRef('pub_semver'), PackageRef('shelf'), PackageRef('shelf_web_socket'), PackageRef('stack_trace'), PackageRef('stream_transform'), PackageRef('watcher'), PackageRef('web_socket_channel'), PackageRef('yaml') ]); /// built_collection 5.1.1 const _built_collection = Package( name: 'built_collection', description: '''Immutable collections based on the SDK collections. Each SDK collection class is split into a new immutable collection class and a corresponding mutable builder class. ''', homepage: 'https://github.com/google/built_collection.dart', authors: [], version: '5.1.1', license: '''Copyright 2015, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// built_value 8.12.0 const _built_value = Package( name: 'built_value', description: '''Value types with builders, Dart classes as enums, and serialization. This library is the runtime dependency. ''', repository: 'https://github.com/google/built_value.dart/tree/master/built_value', authors: [], version: '8.12.0', license: '''Copyright 2015, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('built_collection'), PackageRef('collection'), PackageRef('fixnum'), PackageRef('meta') ]); /// characters 1.4.0 const _characters = Package( name: 'characters', description: 'String replacement with operations that are Unicode/grapheme cluster aware.', repository: 'https://github.com/dart-lang/core/tree/main/pkgs/characters', authors: [], version: '1.4.0', license: '''Copyright 2019, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// charset 2.0.1 const _charset = Package( name: 'charset', description: 'Charset encoding and decoding Library, include iso-(2-15), windows series, gbk, euc-jp, euc-kr, shift-jis. And supportted charset detect, canEncode, canDecode.', repository: 'https://github.com/shirne/charset-dart', authors: [], version: '2.0.1', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: []); /// checked_yaml 2.0.4 const _checked_yaml = Package( name: 'checked_yaml', description: 'Generate more helpful exceptions when decoding YAML documents using package:json_serializable and package:yaml.', repository: 'https://github.com/google/json_serializable.dart/tree/master/checked_yaml', authors: [], version: '2.0.4', license: '''Copyright 2019, the Dart project authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('json_annotation'), PackageRef('source_span'), PackageRef('yaml') ]); /// ci 0.1.0 const _ci = Package( name: 'ci', description: "Detect whether you're running in a CI environment and information about the CI vendor.", repository: 'https://github.com/invertase/dart-cli-utilities/tree/main/packages/ci', authors: [], version: '0.1.0', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2021 Invertase Limited 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: []); /// cli_util 0.4.2 const _cli_util = Package( name: 'cli_util', description: 'A library to help in building Dart command-line apps.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/cli_util', authors: [], version: '0.4.2', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta'), PackageRef('path')]); /// clock 1.1.2 const _clock = Package( name: 'clock', description: 'A fakeable wrapper for dart:core clock APIs.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/clock', authors: [], version: '1.1.2', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: []); /// code_builder 4.11.0 const _code_builder = Package( name: 'code_builder', description: 'A fluent, builder-based library for generating valid Dart code.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/code_builder', authors: [], version: '4.11.0', license: '''Copyright 2016, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('built_collection'), PackageRef('built_value'), PackageRef('collection'), PackageRef('matcher'), PackageRef('meta') ]); /// collection 1.19.1 const _collection = Package( name: 'collection', description: 'Collections and utilities functions and classes related to collections.', repository: 'https://github.com/dart-lang/core/tree/main/pkgs/collection', authors: [], version: '1.19.1', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// console 4.1.0 const _console = Package( name: 'console', description: 'A library for common features required by console applications, including color formatting, keyboard input, and progress bars.', homepage: 'https://github.com/DirectMyFile/console.dart', authors: ['Kenneth Endfinger '], version: '4.1.0', license: '''``` The MIT License (MIT) Copyright (c) 2014 DirectCode Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ```''', isMarkdown: true, isSdk: false, dependencies: [PackageRef('vector_math')]); /// convert 3.1.2 const _convert = Package( name: 'convert', description: 'Utilities for converting between data representations. Provides a number of Sink, Codec, Decoder, and Encoder types.', repository: 'https://github.com/dart-lang/core/tree/main/pkgs/convert', authors: [], version: '3.1.2', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('typed_data')]); /// cross_file 0.3.4+2 const _cross_file = Package( name: 'cross_file', description: 'An abstraction to allow working with files across multiple platforms.', repository: 'https://github.com/flutter/packages/tree/main/packages/cross_file', authors: [], version: '0.3.4+2', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta'), PackageRef('web')]); /// crypto 3.0.6 const _crypto = Package( name: 'crypto', description: 'Implementations of SHA, MD5, and HMAC cryptographic functions.', repository: 'https://github.com/dart-lang/core/tree/main/pkgs/crypto', authors: [], version: '3.0.6', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('typed_data')]); /// cryptography 2.7.0 const _cryptography = Package( name: 'cryptography', description: 'Cryptographic algorithms for encryption, digital signatures, key agreement, authentication, and hashing. AES, Chacha20, ED25519, X25519, Argon2, and more. Good cross-platform support.', homepage: 'https://github.com/dint-dev/cryptography', authors: [], version: '2.7.0', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('collection'), PackageRef('crypto'), PackageRef('ffi'), PackageRef('js'), PackageRef('meta'), PackageRef('typed_data') ]); /// csslib 1.0.2 const _csslib = Package( name: 'csslib', description: 'A library for parsing and analyzing CSS (Cascading Style Sheets).', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/csslib', authors: [], version: '1.0.2', license: '''Copyright 2013, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('source_span')]); /// cupertino_icons 1.0.8 const _cupertino_icons = Package( name: 'cupertino_icons', description: 'Default icons asset for Cupertino widgets based on Apple styled icons', repository: 'https://github.com/flutter/packages/tree/main/third_party/packages/cupertino_icons', authors: [], version: '1.0.8', license: '''The MIT License (MIT) Copyright (c) 2016 Vladimir Kharlampidi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: []); /// custom_lint 0.8.1 const _custom_lint = Package( name: 'custom_lint', description: 'Lint rules are a powerful way to improve the maintainability of a project. Custom Lint allows package authors and developers to easily write custom lint rules.', repository: 'https://github.com/invertase/dart_custom_lint', authors: [], version: '0.8.1', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2020 Invertase Limited 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('analyzer'), PackageRef('analyzer_plugin'), PackageRef('args'), PackageRef('async'), PackageRef('ci'), PackageRef('cli_util'), PackageRef('collection'), PackageRef('custom_lint_core'), PackageRef('freezed_annotation'), PackageRef('json_annotation'), PackageRef('meta'), PackageRef('package_config'), PackageRef('path'), PackageRef('pub_semver'), PackageRef('pubspec_parse'), PackageRef('rxdart'), PackageRef('uuid'), PackageRef('yaml') ]); /// custom_lint_builder 0.8.1 const _custom_lint_builder = Package( name: 'custom_lint_builder', description: 'A package to help writing custom linters', repository: 'https://github.com/invertase/dart_custom_lint', authors: [], version: '0.8.1', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2020 Invertase Limited 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('analyzer'), PackageRef('analyzer_plugin'), PackageRef('collection'), PackageRef('custom_lint'), PackageRef('custom_lint_core'), PackageRef('custom_lint_visitor'), PackageRef('glob'), PackageRef('hotreloader'), PackageRef('meta'), PackageRef('package_config'), PackageRef('path'), PackageRef('pubspec_parse'), PackageRef('rxdart') ]); /// custom_lint_core 0.8.1 const _custom_lint_core = Package( name: 'custom_lint_core', description: 'A package to help writing custom linters', repository: 'https://github.com/invertase/dart_custom_lint', authors: [], version: '0.8.1', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2020 Invertase Limited 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('analyzer'), PackageRef('analyzer_plugin'), PackageRef('collection'), PackageRef('custom_lint_visitor'), PackageRef('glob'), PackageRef('matcher'), PackageRef('meta'), PackageRef('package_config'), PackageRef('path'), PackageRef('pubspec_parse'), PackageRef('source_span'), PackageRef('uuid'), PackageRef('yaml') ]); /// custom_lint_visitor 1.0.0+8.1.1 const _custom_lint_visitor = Package( name: 'custom_lint_visitor', description: 'A package that exports visitors for CustomLint.', repository: 'https://github.com/invertase/dart_custom_lint', authors: [], version: '1.0.0+8.1.1', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2020 Invertase Limited 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('analyzer')]); /// dart_pubspec_licenses 3.0.8 const _dart_pubspec_licenses = Package( name: 'dart_pubspec_licenses', description: 'A library to make it easy to extract OSS license information from Dart packages using pubspec.yaml', homepage: 'https://github.com/espresso3389/flutter_oss_licenses/tree/master/packages/dart_pubspec_licenses', repository: 'https://github.com/espresso3389/flutter_oss_licenses', authors: [], version: '3.0.8', license: '''MIT License Copyright (c) 2019 Takashi Kawasaki Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('yaml'), PackageRef('path'), PackageRef('json_annotation'), PackageRef('args') ]); /// dart_style 3.1.2 const _dart_style = Package( name: 'dart_style', description: 'Opinionated, automatic Dart source code formatter. Provides an API and a CLI tool.', repository: 'https://github.com/dart-lang/dart_style', authors: [], version: '3.1.2', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('analyzer'), PackageRef('args'), PackageRef('collection'), PackageRef('package_config'), PackageRef('path'), PackageRef('pub_semver'), PackageRef('source_span'), PackageRef('yaml') ]); /// dbus 0.7.11 const _dbus = Package( name: 'dbus', description: 'A native Dart implementation of the D-Bus message bus client. This package allows Dart applications to directly access services on the Linux desktop.', homepage: 'https://github.com/canonical/dbus.dart', authors: [], version: '0.7.11', license: '''Mozilla Public License Version 2.0 ================================== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. 1.5. "Incompatible With Secondary Licenses" means (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. 1.6. "Executable Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. 1.10. "Modifications" means any of the following: (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or (b) any new file in Source Code Form that contains any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. 1.13. "Source Code Form" means the form of the work preferred for making modifications. 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants and Conditions -------------------------------- 2.1. Grants Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. 2.2. Effective Date The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. 2.3. Limitations on Grant Scope The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: (a) for any code that a Contributor has removed from Covered Software; or (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). 2.4. Subsequent Licenses No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). 2.5. Representation Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. 2.6. Fair Use This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. 2.7. Conditions Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. 3. Responsibilities ------------------- 3.1. Distribution of Source Form All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. 3.2. Distribution of Executable Form If You distribute Covered Software in Executable Form then: (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. 3.3. Distribution of a Larger Work You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). 3.4. Notices You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. 4. Inability to Comply Due to Statute or Regulation --------------------------------------------------- If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Termination -------------- 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. ************************************************************************ * * * 6. Disclaimer of Warranty * * ------------------------- * * * * Covered Software is provided under this License on an "as is" * * basis, without warranty of any kind, either expressed, implied, or * * statutory, including, without limitation, warranties that the * * Covered Software is free of defects, merchantable, fit for a * * particular purpose or non-infringing. The entire risk as to the * * quality and performance of the Covered Software is with You. * * Should any Covered Software prove defective in any respect, You * * (not any Contributor) assume the cost of any necessary servicing, * * repair, or correction. This disclaimer of warranty constitutes an * * essential part of this License. No use of any Covered Software is * * authorized under this License except under this disclaimer. * * * ************************************************************************ ************************************************************************ * * * 7. Limitation of Liability * * -------------------------- * * * * Under no circumstances and under no legal theory, whether tort * * (including negligence), contract, or otherwise, shall any * * Contributor, or anyone who distributes Covered Software as * * permitted above, be liable to You for any direct, indirect, * * special, incidental, or consequential damages of any character * * including, without limitation, damages for lost profits, loss of * * goodwill, work stoppage, computer failure or malfunction, or any * * and all other commercial damages or losses, even if such party * * shall have been informed of the possibility of such damages. This * * limitation of liability shall not apply to liability for death or * * personal injury resulting from such party's negligence to the * * extent applicable law prohibits such limitation. Some * * jurisdictions do not allow the exclusion or limitation of * * incidental or consequential damages, so this exclusion and * * limitation may not apply to You. * * * ************************************************************************ 8. Litigation ------------- Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. 9. Miscellaneous ---------------- This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. 10. Versions of the License --------------------------- 10.1. New Versions Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. 10.2. Effect of New Versions You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. 10.3. Modified Versions If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice ------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" Notice --------------------------------------------------------- This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('args'), PackageRef('ffi'), PackageRef('meta'), PackageRef('xml') ]); /// desktop_drop 0.6.1 const _desktop_drop = Package( name: 'desktop_drop', description: 'A plugin which allows user dragging files to your flutter desktop applications.', homepage: 'https://github.com/MixinNetwork/flutter-plugins/tree/main/packages/desktop_drop', authors: [], version: '0.6.1', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [2021] [Mixin] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_web_plugins'), PackageRef('cross_file'), PackageRef('web'), PackageRef('universal_platform') ]); /// device_info_plus 12.1.0 const _device_info_plus = Package( name: 'device_info_plus', description: 'Flutter plugin providing detailed information about the device (make, model, etc.), and Android or iOS version the app is running on.', homepage: 'https://github.com/fluttercommunity/plus_plugins', repository: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/device_info_plus/device_info_plus', authors: [], version: '12.1.0', license: '''Copyright 2017 The Chromium Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('device_info_plus_platform_interface'), PackageRef('ffi'), PackageRef('file'), PackageRef('flutter'), PackageRef('flutter_web_plugins'), PackageRef('meta'), PackageRef('web'), PackageRef('win32'), PackageRef('win32_registry') ]); /// device_info_plus_platform_interface 7.0.3 const _device_info_plus_platform_interface = Package( name: 'device_info_plus_platform_interface', description: 'A common platform interface for the device_info_plus plugin.', homepage: 'https://github.com/fluttercommunity/plus_plugins', repository: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/', authors: [], version: '7.0.3', license: '''Copyright 2017 The Chromium Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('meta'), PackageRef('plugin_platform_interface') ]); /// dio 5.9.0 const _dio = Package( name: 'dio', description: '''A powerful HTTP networking package, supports Interceptors, Aborting and canceling a request, Custom adapters, Transformers, etc. ''', homepage: 'https://github.com/cfug/dio', repository: 'https://github.com/cfug/dio/blob/main/dio', authors: [], version: '5.9.0', license: '''MIT License Copyright (c) 2018 Wen Du (wendux) Copyright (c) 2022 The CFUG Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('async'), PackageRef('collection'), PackageRef('http_parser'), PackageRef('meta'), PackageRef('mime'), PackageRef('path'), PackageRef('dio_web_adapter') ]); /// dio_web_adapter 2.1.1 const _dio_web_adapter = Package( name: 'dio_web_adapter', description: 'An adapter that supports Dio on Web.', homepage: 'https://github.com/cfug/dio', repository: 'https://github.com/cfug/dio/blob/main/plugins/web_adapter', authors: [], version: '2.1.1', license: '''MIT License Copyright (c) 2018 Wen Du (wendux) Copyright (c) 2022 The CFUG Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('dio'), PackageRef('http_parser'), PackageRef('meta'), PackageRef('web') ]); /// disks_desktop 1.0.1 const _disks_desktop = Package( name: 'disks_desktop', description: 'A Flutter desktop library able to retrieve the installed devices information', homepage: 'https://www.angelocassano.it', repository: 'https://github.com/AngeloAvv/disks', authors: [], version: '1.0.1', license: '''Copyright (c) 2022 Angelo Cassano Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('equatable'), PackageRef('path') ]); /// drives_windows 0.0.1 const _drives_windows = Package( name: 'drives_windows', description: 'A Flutter plugin get drives and network shortcuts on Windows', homepage: 'https://github.com/nini22P/drives_windows', repository: 'https://github.com/nini22P/drives_windows', authors: [], version: '0.0.1', license: '''MIT License Copyright (c) 2025 22 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('ffi'), PackageRef('flutter'), PackageRef('path'), PackageRef('win32') ]); /// dynamic_color 1.8.1 const _dynamic_color = Package( name: 'dynamic_color', description: "A Flutter package to create Material color schemes based on a platform's implementation of dynamic color.", repository: 'https://github.com/material-foundation/flutter-packages/tree/main/packages/dynamic_color', authors: [], version: '1.8.1', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('material_color_utilities') ]); /// equatable 2.0.7 const _equatable = Package( name: 'equatable', description: 'A Dart package that helps to implement value based equality without needing to explicitly override == and hashCode.', homepage: 'https://github.com/felangel/equatable', repository: 'https://github.com/felangel/equatable', authors: [], version: '2.0.7', license: '''MIT License Copyright (c) 2024 Felix Angelov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('collection'), PackageRef('meta')]); /// fake_async 1.3.3 const _fake_async = Package( name: 'fake_async', description: 'Fake asynchronous events such as timers and microtasks for deterministic testing.', repository: 'https://github.com/dart-lang/test/tree/master/pkgs/fake_async', authors: [], version: '1.3.3', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('clock'), PackageRef('collection')]); /// ffi 2.1.4 const _ffi = Package( name: 'ffi', description: 'Utilities for working with Foreign Function Interface (FFI) code.', repository: 'https://github.com/dart-lang/native/tree/main/pkgs/ffi', authors: [], version: '2.1.4', license: '''Copyright 2019, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// file 7.0.1 const _file = Package( name: 'file', description: 'A pluggable, mockable file system abstraction for Dart. Supports local file system access, as well as in-memory file systems, record-replay file systems, and chroot file systems.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/file', authors: [], version: '7.0.1', license: '''Copyright 2017, the Dart project authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta'), PackageRef('path')]); /// file_picker 10.3.3 const _file_picker = Package( name: 'file_picker', description: 'A package that allows you to use a native file explorer to pick single or multiple absolute file paths, with extension filtering support.', homepage: 'https://github.com/miguelpruivo/plugins_flutter_file_picker', repository: 'https://github.com/miguelpruivo/flutter_file_picker', authors: [], version: '10.3.3', license: '''MIT License Copyright (c) 2018 Miguel Ruivo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_web_plugins'), PackageRef('flutter_plugin_android_lifecycle'), PackageRef('plugin_platform_interface'), PackageRef('ffi'), PackageRef('path'), PackageRef('win32'), PackageRef('cross_file'), PackageRef('web'), PackageRef('dbus') ]); /// fixnum 1.1.1 const _fixnum = Package( name: 'fixnum', description: 'Library for 32- and 64-bit signed fixed-width integers with consistent behavior between native and JS runtimes.', repository: 'https://github.com/dart-lang/core/tree/main/pkgs/fixnum', authors: [], version: '1.1.1', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// flutter 3.35.3 const _flutter = Package( name: 'flutter', description: 'A framework for writing Flutter applications', homepage: 'https://flutter.dev', authors: [], version: '3.35.3', license: '''Copyright 2014 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: true, dependencies: [ PackageRef('characters'), PackageRef('collection'), PackageRef('material_color_utilities'), PackageRef('meta'), PackageRef('vector_math') ]); /// flutter_breadcrumb 1.0.1 const _flutter_breadcrumb = Package( name: 'flutter_breadcrumb', description: 'Flutter Widget that can easily create Breadcrumb in Flutter.', homepage: 'https://github.com/payam-zahedi/flutter_breadcrumb', repository: 'https://github.com/payam-zahedi/flutter_breadcrumb', authors: [], version: '1.0.1', license: '''BSD 3-Clause License Copyright (c) 2020, Payam Zahedi All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('flutter'), PackageRef('pedantic')]); /// flutter_hooks 0.21.3+1 const _flutter_hooks = Package( name: 'flutter_hooks', description: 'A flutter implementation of React hooks. It adds a new kind of widget with enhanced code reuse.', homepage: 'https://github.com/rrousselGit/flutter_hooks', repository: 'https://github.com/rrousselGit/flutter_hooks/tree/master/packages/flutter_hooks', authors: [], version: '0.21.3+1', license: '''MIT License Copyright (c) 2018 Remi Rousselet Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('flutter')]); /// flutter_hooks_lint 1.4.0 const _flutter_hooks_lint = Package( name: 'flutter_hooks_lint', description: 'A lint package providing guidelines for using flutter_hooks in your Flutter widget!', homepage: 'https://github.com/nikaera/flutter_hooks_lint', repository: 'https://github.com/nikaera/flutter_hooks_lint', authors: [], version: '1.4.0', license: '''MIT License Copyright (c) 2024 nikaera Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('analyzer'), PackageRef('custom_lint_builder')]); /// flutter_lints 6.0.0 const _flutter_lints = Package( name: 'flutter_lints', description: 'Recommended lints for Flutter apps, packages, and plugins to encourage good coding practices.', repository: 'https://github.com/flutter/packages/tree/main/packages/flutter_lints', authors: [], version: '6.0.0', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('lints')]); /// flutter_markdown 0.7.7+1 const _flutter_markdown = Package( name: 'flutter_markdown', description: 'A Markdown renderer for Flutter. Create rich text output, including text styles, tables, links, and more, from plain text data formatted with simple Markdown tags.', repository: 'https://github.com/flutter/packages/tree/main/packages/flutter_markdown', authors: [], version: '0.7.7+1', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('markdown'), PackageRef('meta'), PackageRef('path') ]); /// flutter_plugin_android_lifecycle 2.0.30 const _flutter_plugin_android_lifecycle = Package( name: 'flutter_plugin_android_lifecycle', description: 'Flutter plugin for accessing an Android Lifecycle within other plugins.', repository: 'https://github.com/flutter/packages/tree/main/packages/flutter_plugin_android_lifecycle', authors: [], version: '2.0.30', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('flutter')]); /// flutter_secure_storage 8.1.0 const _flutter_secure_storage = Package( name: 'flutter_secure_storage', description: 'Flutter Secure Storage provides API to store data in secure storage. Keychain is used in iOS, KeyStore based solution is used in Android.', repository: 'https://github.com/mogol/flutter_secure_storage/tree/develop/flutter_secure_storage', authors: [], version: '8.1.0', license: '''BSD 3-Clause License Copyright 2017 German Saprykin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_secure_storage_linux'), PackageRef('flutter_secure_storage_macos'), PackageRef('flutter_secure_storage_platform_interface'), PackageRef('flutter_secure_storage_web'), PackageRef('flutter_secure_storage_windows'), PackageRef('meta') ]); /// flutter_secure_storage_linux 1.2.3 const _flutter_secure_storage_linux = Package( name: 'flutter_secure_storage_linux', description: 'Linux implementation of flutter_secure_storage', repository: 'https://github.com/mogol/flutter_secure_storage', authors: [], version: '1.2.3', license: '''BSD 3-Clause License Copyright 2017 German Saprykin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_secure_storage_platform_interface') ]); /// flutter_secure_storage_macos 3.1.3 const _flutter_secure_storage_macos = Package( name: 'flutter_secure_storage_macos', description: 'macOS implementation of flutter_secure_storage', repository: 'https://github.com/mogol/flutter_secure_storage', authors: [], version: '3.1.3', license: '''BSD 3-Clause License Copyright 2017 German Saprykin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_secure_storage_platform_interface') ]); /// flutter_secure_storage_platform_interface 1.1.2 const _flutter_secure_storage_platform_interface = Package( name: 'flutter_secure_storage_platform_interface', description: 'A common platform interface for the flutter_secure_storage plugin.', homepage: 'https://github.com/mogol/flutter_secure_storage', authors: [], version: '1.1.2', license: '''BSD 3-Clause License Copyright 2017 German Saprykin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface') ]); /// flutter_secure_storage_web 1.2.1 const _flutter_secure_storage_web = Package( name: 'flutter_secure_storage_web', description: 'Web implementation of flutter_secure_storage. Use flutter_secure_storage for the full flutter package.', repository: 'https://github.com/mogol/flutter_secure_storage', authors: [], version: '1.2.1', license: '''BSD 3-Clause License Copyright 2017 German Saprykin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_secure_storage_platform_interface'), PackageRef('flutter_web_plugins'), PackageRef('js') ]); /// flutter_secure_storage_windows 2.1.1 const _flutter_secure_storage_windows = Package( name: 'flutter_secure_storage_windows', description: 'Windows implementation of flutter_secure_storage. Please use flutter_secure_storage instead of this package.', repository: 'https://github.com/mogol/flutter_secure_storage', authors: [], version: '2.1.1', license: '''BSD 3-Clause License Copyright 2017 German Saprykin All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_secure_storage_platform_interface') ]); /// flutter_volume_controller 1.3.3 const _flutter_volume_controller = Package( name: 'flutter_volume_controller', description: 'A Flutter plugin to control system volume and listen for volume changes on different platforms.', homepage: 'https://github.com/yosemiteyss/flutter_volume_controller', authors: [], version: '1.3.3', license: '''MIT License Copyright (c) 2022 yosemiteyss Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_plugin_android_lifecycle') ]); /// flutter_web_plugins null const _flutter_web_plugins = Package( name: 'flutter_web_plugins', description: 'Library to register Flutter Web plugins', homepage: 'https://flutter.dev', authors: [], isMarkdown: false, isSdk: true, dependencies: [PackageRef('flutter')]); /// flutter_zustand 0.0.5 const _flutter_zustand = Package( name: 'flutter_zustand', description: "Brings zustand's bear necessities for state management to Flutter", homepage: 'https://github.com/josiahsrc/flutter_zustand/tree/main/packages/flutter_zustand', repository: 'https://github.com/josiahsrc/flutter_zustand/tree/main/packages/flutter_zustand', authors: [], version: '0.0.5', license: '''MIT License Copyright (c) 2024 Josiah Saunders Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('provider'), PackageRef('zustand') ]); /// freezed 3.2.3 const _freezed = Package( name: 'freezed', description: '''Code generation for immutable classes that has a simple syntax/API without compromising on the features. ''', repository: 'https://github.com/rrousselGit/freezed', authors: [], version: '3.2.3', license: '''MIT License Copyright (c) 2020 Remi Rousselet Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('analyzer'), PackageRef('build'), PackageRef('build_config'), PackageRef('collection'), PackageRef('meta'), PackageRef('source_gen'), PackageRef('freezed_annotation'), PackageRef('json_annotation'), PackageRef('dart_style'), PackageRef('pub_semver') ]); /// freezed_annotation 3.1.0 const _freezed_annotation = Package( name: 'freezed_annotation', description: '''Annotations for the freezed code-generator. This package does nothing without freezed too. ''', repository: 'https://github.com/rrousselGit/freezed', authors: [], version: '3.1.0', license: '''MIT License Copyright (c) 2020 Remi Rousselet Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('collection'), PackageRef('json_annotation'), PackageRef('meta') ]); /// frontend_server_client 4.0.0 const _frontend_server_client = Package( name: 'frontend_server_client', description: 'Client code to start and interact with the frontend_server compiler from the Dart SDK.', repository: 'https://github.com/dart-lang/webdev/tree/master/frontend_server_client', authors: [], version: '4.0.0', license: '''Copyright 2020, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('async'), PackageRef('path')]); /// fvp 0.34.0 const _fvp = Package( name: 'fvp', description: 'video_player plugin and backend APIs. Support all desktop/mobile platforms with hardware decoders, optimal renders. Supports most formats via FFmpeg', homepage: 'https://github.com/wang-bin/fvp', authors: [], version: '0.34.0', license: '''BSD-3-Clause License Copyright 2022 Wang Bin. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('ffi'), PackageRef('flutter'), PackageRef('logging'), PackageRef('path'), PackageRef('plugin_platform_interface'), PackageRef('video_player'), PackageRef('video_player_platform_interface'), PackageRef('path_provider'), PackageRef('http') ]); /// get_it 8.2.0 const _get_it = Package( name: 'get_it', description: 'Simple direct Service Locator that allows to decouple the interface from a concrete implementation and to access the concrete implementation from everywhere in your App"', homepage: 'https://github.com/flutter-it/get_it', authors: [], version: '8.2.0', license: '''MIT License Copyright (c) 2018 Thomas Burkhart Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('async'), PackageRef('collection'), PackageRef('meta') ]); /// glob 2.1.3 const _glob = Package( name: 'glob', description: 'A library to perform Bash-style file and directory globbing.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/glob', authors: [], version: '2.1.3', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('async'), PackageRef('collection'), PackageRef('file'), PackageRef('path'), PackageRef('string_scanner') ]); /// google_fonts 6.3.1 const _google_fonts = Package( name: 'google_fonts', description: 'A Flutter package to use fonts from fonts.google.com. Supports HTTP fetching, caching, and asset bundling.', repository: 'https://github.com/flutter/packages/tree/main/packages/google_fonts', authors: [], version: '6.3.1', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('crypto'), PackageRef('flutter'), PackageRef('http'), PackageRef('path_provider') ]); /// graphs 2.3.2 const _graphs = Package( name: 'graphs', description: 'Graph algorithms that operate on graphs in any representation.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/graphs', authors: [], version: '2.3.2', license: '''Copyright 2017, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('collection')]); /// gtk 2.1.0 const _gtk = Package( name: 'gtk', description: 'GTK+ utilities for Flutter Linux applications.', homepage: 'https://github.com/ubuntu-flutter-community/gtk.dart', repository: 'https://github.com/ubuntu-flutter-community/gtk.dart', authors: [], version: '2.1.0', license: '''Mozilla Public License Version 2.0 ================================== 1. Definitions -------------- 1.1. "Contributor" means each individual or legal entity that creates, contributes to the creation of, or owns Covered Software. 1.2. "Contributor Version" means the combination of the Contributions of others (if any) used by a Contributor and that particular Contributor's Contribution. 1.3. "Contribution" means Covered Software of a particular Contributor. 1.4. "Covered Software" means Source Code Form to which the initial Contributor has attached the notice in Exhibit A, the Executable Form of such Source Code Form, and Modifications of such Source Code Form, in each case including portions thereof. 1.5. "Incompatible With Secondary Licenses" means (a) that the initial Contributor has attached the notice described in Exhibit B to the Covered Software; or (b) that the Covered Software was made available under the terms of version 1.1 or earlier of the License, but not also under the terms of a Secondary License. 1.6. "Executable Form" means any form of the work other than Source Code Form. 1.7. "Larger Work" means a work that combines Covered Software with other material, in a separate file or files, that is not Covered Software. 1.8. "License" means this document. 1.9. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently, any and all of the rights conveyed by this License. 1.10. "Modifications" means any of the following: (a) any file in Source Code Form that results from an addition to, deletion from, or modification of the contents of Covered Software; or (b) any new file in Source Code Form that contains any Covered Software. 1.11. "Patent Claims" of a Contributor means any patent claim(s), including without limitation, method, process, and apparatus claims, in any patent Licensable by such Contributor that would be infringed, but for the grant of the License, by the making, using, selling, offering for sale, having made, import, or transfer of either its Contributions or its Contributor Version. 1.12. "Secondary License" means either the GNU General Public License, Version 2.0, the GNU Lesser General Public License, Version 2.1, the GNU Affero General Public License, Version 3.0, or any later versions of those licenses. 1.13. "Source Code Form" means the form of the work preferred for making modifications. 1.14. "You" (or "Your") means an individual or a legal entity exercising rights under this License. For legal entities, "You" includes any entity that controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. License Grants and Conditions -------------------------------- 2.1. Grants Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license: (a) under intellectual property rights (other than patent or trademark) Licensable by such Contributor to use, reproduce, make available, modify, display, perform, distribute, and otherwise exploit its Contributions, either on an unmodified basis, with Modifications, or as part of a Larger Work; and (b) under Patent Claims of such Contributor to make, use, sell, offer for sale, have made, import, and otherwise transfer either its Contributions or its Contributor Version. 2.2. Effective Date The licenses granted in Section 2.1 with respect to any Contribution become effective for each Contribution on the date the Contributor first distributes such Contribution. 2.3. Limitations on Grant Scope The licenses granted in this Section 2 are the only rights granted under this License. No additional rights or licenses will be implied from the distribution or licensing of Covered Software under this License. Notwithstanding Section 2.1(b) above, no patent license is granted by a Contributor: (a) for any code that a Contributor has removed from Covered Software; or (b) for infringements caused by: (i) Your and any other third party's modifications of Covered Software, or (ii) the combination of its Contributions with other software (except as part of its Contributor Version); or (c) under Patent Claims infringed by Covered Software in the absence of its Contributions. This License does not grant any rights in the trademarks, service marks, or logos of any Contributor (except as may be necessary to comply with the notice requirements in Section 3.4). 2.4. Subsequent Licenses No Contributor makes additional grants as a result of Your choice to distribute the Covered Software under a subsequent version of this License (see Section 10.2) or under the terms of a Secondary License (if permitted under the terms of Section 3.3). 2.5. Representation Each Contributor represents that the Contributor believes its Contributions are its original creation(s) or it has sufficient rights to grant the rights to its Contributions conveyed by this License. 2.6. Fair Use This License is not intended to limit any rights You have under applicable copyright doctrines of fair use, fair dealing, or other equivalents. 2.7. Conditions Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in Section 2.1. 3. Responsibilities ------------------- 3.1. Distribution of Source Form All distribution of Covered Software in Source Code Form, including any Modifications that You create or to which You contribute, must be under the terms of this License. You must inform recipients that the Source Code Form of the Covered Software is governed by the terms of this License, and how they can obtain a copy of this License. You may not attempt to alter or restrict the recipients' rights in the Source Code Form. 3.2. Distribution of Executable Form If You distribute Covered Software in Executable Form then: (a) such Covered Software must also be made available in Source Code Form, as described in Section 3.1, and You must inform recipients of the Executable Form how they can obtain a copy of such Source Code Form by reasonable means in a timely manner, at a charge no more than the cost of distribution to the recipient; and (b) You may distribute such Executable Form under the terms of this License, or sublicense it under different terms, provided that the license for the Executable Form does not attempt to limit or alter the recipients' rights in the Source Code Form under this License. 3.3. Distribution of a Larger Work You may create and distribute a Larger Work under terms of Your choice, provided that You also comply with the requirements of this License for the Covered Software. If the Larger Work is a combination of Covered Software with a work governed by one or more Secondary Licenses, and the Covered Software is not Incompatible With Secondary Licenses, this License permits You to additionally distribute such Covered Software under the terms of such Secondary License(s), so that the recipient of the Larger Work may, at their option, further distribute the Covered Software under the terms of either this License or such Secondary License(s). 3.4. Notices You may not remove or alter the substance of any license notices (including copyright notices, patent notices, disclaimers of warranty, or limitations of liability) contained within the Source Code Form of the Covered Software, except that You may alter any license notices to the extent required to remedy known factual inaccuracies. 3.5. Application of Additional Terms You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Software. However, You may do so only on Your own behalf, and not on behalf of any Contributor. You must make it absolutely clear that any such warranty, support, indemnity, or liability obligation is offered by You alone, and You hereby agree to indemnify every Contributor for any liability incurred by such Contributor as a result of warranty, support, indemnity or liability terms You offer. You may include additional disclaimers of warranty and limitations of liability specific to any jurisdiction. 4. Inability to Comply Due to Statute or Regulation --------------------------------------------------- If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Software due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be placed in a text file included with all distributions of the Covered Software under this License. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Termination -------------- 5.1. The rights granted under this License will terminate automatically if You fail to comply with any of its terms. However, if You become compliant, then the rights granted under this License from a particular Contributor are reinstated (a) provisionally, unless and until such Contributor explicitly and finally terminates Your grants, and (b) on an ongoing basis, if such Contributor fails to notify You of the non-compliance by some reasonable means prior to 60 days after You have come back into compliance. Moreover, Your grants from a particular Contributor are reinstated on an ongoing basis if such Contributor notifies You of the non-compliance by some reasonable means, this is the first time You have received notice of non-compliance with this License from such Contributor, and You become compliant prior to 30 days after Your receipt of the notice. 5.2. If You initiate litigation against any entity by asserting a patent infringement claim (excluding declaratory judgment actions, counter-claims, and cross-claims) alleging that a Contributor Version directly or indirectly infringes any patent, then the rights granted to You by any and all Contributors for the Covered Software under Section 2.1 of this License shall terminate. 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or Your distributors under this License prior to termination shall survive termination. ************************************************************************ * * * 6. Disclaimer of Warranty * * ------------------------- * * * * Covered Software is provided under this License on an "as is" * * basis, without warranty of any kind, either expressed, implied, or * * statutory, including, without limitation, warranties that the * * Covered Software is free of defects, merchantable, fit for a * * particular purpose or non-infringing. The entire risk as to the * * quality and performance of the Covered Software is with You. * * Should any Covered Software prove defective in any respect, You * * (not any Contributor) assume the cost of any necessary servicing, * * repair, or correction. This disclaimer of warranty constitutes an * * essential part of this License. No use of any Covered Software is * * authorized under this License except under this disclaimer. * * * ************************************************************************ ************************************************************************ * * * 7. Limitation of Liability * * -------------------------- * * * * Under no circumstances and under no legal theory, whether tort * * (including negligence), contract, or otherwise, shall any * * Contributor, or anyone who distributes Covered Software as * * permitted above, be liable to You for any direct, indirect, * * special, incidental, or consequential damages of any character * * including, without limitation, damages for lost profits, loss of * * goodwill, work stoppage, computer failure or malfunction, or any * * and all other commercial damages or losses, even if such party * * shall have been informed of the possibility of such damages. This * * limitation of liability shall not apply to liability for death or * * personal injury resulting from such party's negligence to the * * extent applicable law prohibits such limitation. Some * * jurisdictions do not allow the exclusion or limitation of * * incidental or consequential damages, so this exclusion and * * limitation may not apply to You. * * * ************************************************************************ 8. Litigation ------------- Any litigation relating to this License may be brought only in the courts of a jurisdiction where the defendant maintains its principal place of business and such litigation shall be governed by laws of that jurisdiction, without reference to its conflict-of-law provisions. Nothing in this Section shall prevent a party's ability to bring cross-claims or counter-claims. 9. Miscellaneous ---------------- This License represents the complete agreement concerning the subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not be used to construe this License against a Contributor. 10. Versions of the License --------------------------- 10.1. New Versions Mozilla Foundation is the license steward. Except as provided in Section 10.3, no one other than the license steward has the right to modify or publish new versions of this License. Each version will be given a distinguishing version number. 10.2. Effect of New Versions You may distribute the Covered Software under the terms of the version of the License under which You originally received the Covered Software, or under the terms of any subsequent version published by the license steward. 10.3. Modified Versions If you create software not governed by this License, and you want to create a new license for such software, you may create and use a modified version of this License if you rename the license and remove any references to the name of the license steward (except to note that such modified license differs from this License). 10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses If You choose to distribute Source Code Form that is Incompatible With Secondary Licenses under the terms of this version of the License, the notice described in Exhibit B of this License must be attached. Exhibit A - Source Code Form License Notice ------------------------------------------- This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. If it is not possible or desirable to put the notice in a particular file, then You may include the notice in a location (such as a LICENSE file in a relevant directory) where a recipient would be likely to look for such a notice. You may add additional accurate notices of copyright ownership. Exhibit B - "Incompatible With Secondary Licenses" Notice --------------------------------------------------------- This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('ffi'), PackageRef('flutter'), PackageRef('meta') ]); /// hotreloader 4.3.0 const _hotreloader = Package( name: 'hotreloader', description: '''Automatic hot code reloader for Dart projects that monitors the source files of a Dart project for changes and automatically applies them to the running Dart process. ''', homepage: 'https://github.com/vegardit/dart-hotreloader', repository: 'https://github.com/vegardit/dart-hotreloader.git', authors: [], version: '4.3.0', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('collection'), PackageRef('logging'), PackageRef('path'), PackageRef('stream_transform'), PackageRef('vm_service'), PackageRef('watcher') ]); /// html 0.15.6 const _html = Package( name: 'html', description: 'APIs for parsing and manipulating HTML content outside the browser.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/html', authors: [], version: '0.15.6', license: '''Copyright (c) 2006-2012 The Authors Contributors: James Graham - jg307@cam.ac.uk Anne van Kesteren - annevankesteren@gmail.com Lachlan Hunt - lachlan.hunt@lachy.id.au Matt McDonald - kanashii@kanashii.ca Sam Ruby - rubys@intertwingly.net Ian Hickson (Google) - ian@hixie.ch Thomas Broyer - t.broyer@ltgt.net Jacques Distler - distler@golem.ph.utexas.edu Henri Sivonen - hsivonen@iki.fi Adam Barth - abarth@webkit.org Eric Seidel - eric@webkit.org The Mozilla Foundation (contributions from Henri Sivonen since 2008) David Flanagan (Mozilla) - dflanagan@mozilla.com Google LLC (contributed the Dart port) - misc@dartlang.org Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('csslib'), PackageRef('source_span')]); /// http 1.5.0 const _http = Package( name: 'http', description: 'A composable, multi-platform, Future-based API for HTTP requests.', repository: 'https://github.com/dart-lang/http/tree/master/pkgs/http', authors: [], version: '1.5.0', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('async'), PackageRef('http_parser'), PackageRef('meta'), PackageRef('web') ]); /// http_methods 1.1.1 const _http_methods = Package( name: 'http_methods', description: '''List of all HTTP methods registered with IANA as list of strings, and metadata such as whether a method idempotent. ''', homepage: 'https://github.com/google/dart-neats/tree/master/http_methods', repository: 'https://github.com/google/dart-neats.git', authors: [], version: '1.1.1', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: []); /// http_multi_server 3.2.2 const _http_multi_server = Package( name: 'http_multi_server', description: 'A dart:io HttpServer wrapper that handles requests from multiple servers.', repository: 'https://github.com/dart-lang/http/tree/master/pkgs/http_multi_server', authors: [], version: '3.2.2', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('async')]); /// http_parser 4.1.2 const _http_parser = Package( name: 'http_parser', description: 'A platform-independent package for parsing and serializing HTTP formats.', repository: 'https://github.com/dart-lang/http/tree/master/pkgs/http_parser', authors: [], version: '4.1.2', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('collection'), PackageRef('source_span'), PackageRef('string_scanner'), PackageRef('typed_data') ]); /// image 4.5.4 const _image = Package( name: 'image', description: 'Dart Image Library provides server and web apps the ability to load, manipulate, and save images with various image file formats.', homepage: 'https://github.com/brendan-duncan/image', authors: [], version: '4.5.4', license: '''The MIT License Copyright (c) 2013-2022 Brendan Duncan. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('archive'), PackageRef('meta'), PackageRef('xml') ]); /// intl 0.20.2 const _intl = Package( name: 'intl', description: 'Contains code to deal with internationalized/localized messages, date and number formatting and parsing, bi-directional text, and other internationalization issues.', repository: 'https://github.com/dart-lang/i18n/tree/main/pkgs/intl', authors: [], version: '0.20.2', license: '''Copyright 2013, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('clock'), PackageRef('meta'), PackageRef('path') ]); /// io 1.0.5 const _io = Package( name: 'io', description: 'Utilities for the Dart VM Runtime including support for ANSI colors, file copying, and standard exit code values.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/io', authors: [], version: '1.0.5', license: '''Copyright 2017, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('meta'), PackageRef('path'), PackageRef('string_scanner') ]); /// js 0.6.7 const _js = Package( name: 'js', description: 'Annotations to create static Dart interfaces for JavaScript APIs.', repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/js', authors: [], version: '0.6.7', license: '''Copyright 2012, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta')]); /// json_annotation 4.9.0 const _json_annotation = Package( name: 'json_annotation', description: 'Classes and helper functions that support JSON code generation via the `json_serializable` package.', repository: 'https://github.com/google/json_serializable.dart/tree/master/json_annotation', authors: [], version: '4.9.0', license: '''Copyright 2017, the Dart project authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta')]); /// json_serializable 6.11.1 const _json_serializable = Package( name: 'json_serializable', description: 'Automatically generate code for converting to and from JSON by annotating Dart classes.', repository: 'https://github.com/google/json_serializable.dart/tree/master/json_serializable', authors: [], version: '6.11.1', license: '''Copyright 2017, the Dart project authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('analyzer'), PackageRef('async'), PackageRef('build'), PackageRef('build_config'), PackageRef('dart_style'), PackageRef('json_annotation'), PackageRef('meta'), PackageRef('path'), PackageRef('pub_semver'), PackageRef('pubspec_parse'), PackageRef('source_gen'), PackageRef('source_helper') ]); /// leak_tracker 11.0.2 const _leak_tracker = Package( name: 'leak_tracker', description: 'A framework for memory leak tracking for Dart and Flutter applications.', repository: 'https://github.com/dart-lang/leak_tracker/tree/main/pkgs/leak_tracker', authors: [], version: '11.0.2', license: '''Copyright 2022, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('clock'), PackageRef('collection'), PackageRef('meta'), PackageRef('path'), PackageRef('vm_service') ]); /// leak_tracker_flutter_testing 3.0.10 const _leak_tracker_flutter_testing = Package( name: 'leak_tracker_flutter_testing', description: 'An internal package to test leak tracking with Flutter.', repository: 'https://github.com/dart-lang/leak_tracker/tree/main/pkgs/leak_tracker_flutter_testing', authors: [], version: '3.0.10', license: '''Copyright 2022, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('leak_tracker'), PackageRef('leak_tracker_testing'), PackageRef('matcher'), PackageRef('meta') ]); /// leak_tracker_testing 3.0.2 const _leak_tracker_testing = Package( name: 'leak_tracker_testing', description: 'Leak tracking code intended for usage in tests.', repository: 'https://github.com/dart-lang/leak_tracker/tree/main/pkgs/leak_tracker_testing', authors: [], version: '3.0.2', license: '''Copyright 2022, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('leak_tracker'), PackageRef('matcher'), PackageRef('meta') ]); /// lints 6.0.0 const _lints = Package( name: 'lints', description: """Official Dart lint rules. Defines the 'core' and 'recommended' set of lints suggested by the Dart team. """, repository: 'https://github.com/dart-lang/core/tree/main/pkgs/lints', authors: [], version: '6.0.0', license: '''Copyright 2021, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// logging 1.3.0 const _logging = Package( name: 'logging', description: 'Provides APIs for debugging and error logging, similar to loggers in other languages, such as the Closure JS Logger and java.util.logging.Logger.', repository: 'https://github.com/dart-lang/core/tree/main/pkgs/logging', authors: [], version: '1.3.0', license: '''Copyright 2013, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// markdown 7.3.0 const _markdown = Package( name: 'markdown', description: 'A portable Markdown library written in Dart that can parse Markdown into HTML.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/markdown', authors: [], version: '7.3.0', license: '''Copyright 2012, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('args'), PackageRef('meta')]); /// matcher 0.12.17 const _matcher = Package( name: 'matcher', description: 'Support for specifying test expectations via an extensible Matcher class. Also includes a number of built-in Matcher implementations for common cases.', repository: 'https://github.com/dart-lang/test/tree/master/pkgs/matcher', authors: [], version: '0.12.17', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('async'), PackageRef('meta'), PackageRef('stack_trace'), PackageRef('term_glyph'), PackageRef('test_api') ]); /// material_color_utilities 0.11.1 const _material_color_utilities = Package( name: 'material_color_utilities', description: 'Algorithms and utilities that power the Material Design 3 color system, including choosing theme colors from images and creating tones of colors; all in a new color space.', repository: 'https://github.com/material-foundation/material-color-utilities/tree/main/dart', authors: [], version: '0.11.1', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2021 Google LLC 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('collection')]); /// media_kit 1.2.0 const _media_kit = Package( name: 'media_kit', description: 'A cross-platform video player & audio player for Flutter & Dart. Performant, stable, feature-proof & modular.', homepage: 'https://github.com/media-kit/media-kit', repository: 'https://github.com/media-kit/media-kit', authors: [], version: '1.2.0', license: '''MIT License Copyright (c) 2021 & onwards Hitesh Kumar Saini Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('collection'), PackageRef('http'), PackageRef('image'), PackageRef('meta'), PackageRef('path'), PackageRef('safe_local_storage'), PackageRef('synchronized'), PackageRef('universal_platform'), PackageRef('web'), PackageRef('uri_parser'), PackageRef('uuid') ]); /// media_kit_libs_android_video 1.3.7 const _media_kit_libs_android_video = Package( name: 'media_kit_libs_android_video', description: 'Android package providing video (& audio) native libraries for package:media_kit.', homepage: 'https://github.com/media-kit/media-kit.git', repository: 'https://github.com/media-kit/media-kit.git', authors: [], version: '1.3.7', license: '''MIT License Copyright (c) 2021 & onwards Hitesh Kumar Saini Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface') ]); /// media_kit_libs_ios_video 1.1.4 const _media_kit_libs_ios_video = Package( name: 'media_kit_libs_ios_video', description: 'iOS package providing video (& audio) native libraries for package:media_kit.', homepage: 'https://github.com/media-kit/media-kit.git', repository: 'https://github.com/media-kit/media-kit.git', authors: [], version: '1.1.4', license: '''MIT License Copyright (c) 2021 & onwards Hitesh Kumar Saini Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface') ]); /// media_kit_libs_linux 1.2.1 const _media_kit_libs_linux = Package( name: 'media_kit_libs_linux', description: 'GNU/Linux dependency package for package:media_kit. Necessary for initialization.', homepage: 'https://github.com/media-kit/media-kit.git', repository: 'https://github.com/media-kit/media-kit.git', authors: [], version: '1.2.1', license: '''MIT License Copyright (c) 2021 & onwards Hitesh Kumar Saini Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('flutter')]); /// media_kit_libs_macos_video 1.1.4 const _media_kit_libs_macos_video = Package( name: 'media_kit_libs_macos_video', description: 'macOS package providing video (& audio) native libraries for package:media_kit.', homepage: 'https://github.com/media-kit/media-kit.git', repository: 'https://github.com/media-kit/media-kit.git', authors: [], version: '1.1.4', license: '''MIT License Copyright (c) 2021 & onwards Hitesh Kumar Saini Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface') ]); /// media_kit_libs_video 1.0.6 const _media_kit_libs_video = Package( name: 'media_kit_libs_video', description: 'package:media_kit video (& audio) playback native libraries for all platforms.', homepage: 'https://github.com/media-kit/media-kit.git', repository: 'https://github.com/media-kit/media-kit.git', authors: [], version: '1.0.6', license: '''MIT License Copyright (c) 2021 & onwards Hitesh Kumar Saini Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('media_kit_libs_android_video'), PackageRef('media_kit_libs_ios_video'), PackageRef('media_kit_libs_macos_video'), PackageRef('media_kit_libs_windows_video'), PackageRef('media_kit_libs_linux') ]); /// media_kit_libs_windows_video 1.0.11 const _media_kit_libs_windows_video = Package( name: 'media_kit_libs_windows_video', description: 'Windows package providing video (& audio) native libraries for package:media_kit.', homepage: 'https://github.com/media-kit/media-kit.git', repository: 'https://github.com/media-kit/media-kit.git', authors: [], version: '1.0.11', license: '''MIT License Copyright (c) 2021 & onwards Hitesh Kumar Saini Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('flutter')]); /// media_kit_video 1.3.0 const _media_kit_video = Package( name: 'media_kit_video', description: 'Native implementation for video playback in package:media_kit.', homepage: 'https://github.com/media-kit/media-kit', repository: 'https://github.com/media-kit/media-kit', authors: [], version: '1.3.0', license: '''MIT License Copyright (c) 2021 & onwards Hitesh Kumar Saini Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('media_kit'), PackageRef('synchronized'), PackageRef('wakelock_plus'), PackageRef('screen_brightness_android'), PackageRef('screen_brightness_platform_interface'), PackageRef('volume_controller'), PackageRef('universal_platform'), PackageRef('plugin_platform_interface'), PackageRef('web') ]); /// media_stream 0.0.1 const _media_stream = Package( name: 'media_stream', description: 'A server to stream media from FTP and SMB via HTTP.', homepage: 'https://github.com/nini22P/media_stream', repository: 'https://github.com/nini22P/media_stream', authors: [], version: '0.0.1', license: '''MIT License Copyright (c) 2025 22 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('pure_ftp'), PackageRef('smb_connect'), PackageRef('shelf'), PackageRef('shelf_router') ]); /// meta 1.16.0 const _meta = Package( name: 'meta', description: "Annotations used to express developer intentions that can't otherwise be deduced by statically analyzing source code.", repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/meta', authors: [], version: '1.16.0', license: '''Copyright 2016, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// mime 2.0.0 const _mime = Package( name: 'mime', description: 'Utilities for handling media (MIME) types, including determining a type from a file extension and file contents.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/mime', authors: [], version: '2.0.0', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// msix 3.16.12 const _msix = Package( name: 'msix', description: 'A command-line tool that create Msix installer from your flutter windows-build files.', homepage: 'https://github.com/YehudaKremer/msix', authors: [], version: '3.16.12', license: '''MIT License Copyright (c) 2022 Yehuda Kremer Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('args'), PackageRef('yaml'), PackageRef('path'), PackageRef('package_config'), PackageRef('get_it'), PackageRef('image'), PackageRef('pub_semver'), PackageRef('console'), PackageRef('cli_util') ]); /// mutex 3.1.0 const _mutex = Package( name: 'mutex', description: 'Mutual exclusion with implementation of normal and read-write mutex', homepage: 'https://github.com/hoylen/dart-mutex', authors: [], version: '3.1.0', license: '''Copyright (c) 2016, Hoylen Sue. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// nested 1.0.0 const _nested = Package( name: 'nested', description: 'A Flutter Widget which helps nest multiple widgets without needing to manually nest them.', repository: 'https://github.com/rrousselGit/nested', authors: [], version: '1.0.0', license: '''MIT License Copyright (c) 2019 Remi Rousselet Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('flutter')]); /// package_config 2.2.0 const _package_config = Package( name: 'package_config', description: 'Support for reading and writing Dart Package Configuration files.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/package_config', authors: [], version: '2.2.0', license: '''Copyright 2019, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('path')]); /// package_info_plus 9.0.0 const _package_info_plus = Package( name: 'package_info_plus', description: 'Flutter plugin for querying information about the application package, such as CFBundleVersion on iOS or versionCode on Android.', homepage: 'https://github.com/fluttercommunity/plus_plugins', repository: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/package_info_plus/package_info_plus', authors: [], version: '9.0.0', license: '''Copyright 2017 The Chromium Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('ffi'), PackageRef('flutter'), PackageRef('flutter_web_plugins'), PackageRef('http'), PackageRef('meta'), PackageRef('path'), PackageRef('package_info_plus_platform_interface'), PackageRef('web'), PackageRef('win32'), PackageRef('clock') ]); /// package_info_plus_platform_interface 3.2.1 const _package_info_plus_platform_interface = Package( name: 'package_info_plus_platform_interface', description: 'A common platform interface for the package_info_plus plugin.', homepage: 'https://github.com/fluttercommunity/plus_plugins', repository: 'https://github.com/fluttercommunity/plus_plugins/tree/main/packages/', authors: [], version: '3.2.1', license: '''Copyright 2017 The Chromium Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('meta'), PackageRef('plugin_platform_interface') ]); /// path 1.9.1 const _path = Package( name: 'path', description: 'A string-based path manipulation library. All of the path operations you know and love, with solid support for Windows, POSIX (Linux and Mac OS X), and the web.', repository: 'https://github.com/dart-lang/core/tree/main/pkgs/path', authors: [], version: '1.9.1', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// path_provider 2.1.5 const _path_provider = Package( name: 'path_provider', description: 'Flutter plugin for getting commonly used locations on host platform file systems, such as the temp and app data directories.', repository: 'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider', authors: [], version: '2.1.5', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('path_provider_android'), PackageRef('path_provider_foundation'), PackageRef('path_provider_linux'), PackageRef('path_provider_platform_interface'), PackageRef('path_provider_windows') ]); /// path_provider_android 2.2.18 const _path_provider_android = Package( name: 'path_provider_android', description: 'Android implementation of the path_provider plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_android', authors: [], version: '2.2.18', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('path_provider_platform_interface') ]); /// path_provider_foundation 2.4.2 const _path_provider_foundation = Package( name: 'path_provider_foundation', description: 'iOS and macOS implementation of the path_provider plugin', repository: 'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_foundation', authors: [], version: '2.4.2', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('path_provider_platform_interface') ]); /// path_provider_linux 2.2.1 const _path_provider_linux = Package( name: 'path_provider_linux', description: 'Linux implementation of the path_provider plugin', repository: 'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_linux', authors: [], version: '2.2.1', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('ffi'), PackageRef('flutter'), PackageRef('path'), PackageRef('path_provider_platform_interface'), PackageRef('xdg_directories') ]); /// path_provider_platform_interface 2.1.2 const _path_provider_platform_interface = Package( name: 'path_provider_platform_interface', description: 'A common platform interface for the path_provider plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_platform_interface', authors: [], version: '2.1.2', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('platform'), PackageRef('plugin_platform_interface') ]); /// path_provider_windows 2.3.0 const _path_provider_windows = Package( name: 'path_provider_windows', description: 'Windows implementation of the path_provider plugin', repository: 'https://github.com/flutter/packages/tree/main/packages/path_provider/path_provider_windows', authors: [], version: '2.3.0', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('ffi'), PackageRef('flutter'), PackageRef('path'), PackageRef('path_provider_platform_interface') ]); /// pedantic 1.11.1 const _pedantic = Package( name: 'pedantic', description: 'The Dart analyzer settings and best practices used internally at Google.', homepage: 'https://github.com/google/pedantic', authors: [], version: '1.11.1', license: '''Copyright 2017, the Dart project authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// permission_handler 12.0.1 const _permission_handler = Package( name: 'permission_handler', description: 'Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.', repository: 'https://github.com/baseflow/flutter-permission-handler', authors: [], version: '12.0.1', license: '''MIT License Copyright (c) 2018 Baseflow Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('meta'), PackageRef('permission_handler_android'), PackageRef('permission_handler_apple'), PackageRef('permission_handler_html'), PackageRef('permission_handler_windows'), PackageRef('permission_handler_platform_interface') ]); /// permission_handler_android 13.0.1 const _permission_handler_android = Package( name: 'permission_handler_android', description: 'Permission plugin for Flutter. This plugin provides the Android API to request and check permissions.', homepage: 'https://github.com/baseflow/flutter-permission-handler', authors: [], version: '13.0.1', license: '''MIT License Copyright (c) 2018 Baseflow Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('permission_handler_platform_interface') ]); /// permission_handler_apple 9.4.7 const _permission_handler_apple = Package( name: 'permission_handler_apple', description: 'Permission plugin for Flutter. This plugin provides the iOS API to request and check permissions.', repository: 'https://github.com/baseflow/flutter-permission-handler', authors: [], version: '9.4.7', license: '''MIT License Copyright (c) 2018 Baseflow Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('permission_handler_platform_interface') ]); /// permission_handler_html 0.1.3+5 const _permission_handler_html = Package( name: 'permission_handler_html', description: 'Permission plugin for Flutter. This plugin provides the web API to request and check permissions.', homepage: 'https://github.com/baseflow/flutter-permission-handler', authors: [], version: '0.1.3+5', license: '''MIT License Copyright (c) 2018 Baseflow Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_web_plugins'), PackageRef('permission_handler_platform_interface'), PackageRef('web') ]); /// permission_handler_platform_interface 4.3.0 const _permission_handler_platform_interface = Package( name: 'permission_handler_platform_interface', description: 'A common platform interface for the permission_handler plugin.', homepage: 'https://github.com/baseflow/flutter-permission-handler/tree/master/permission_handler_platform_interface', authors: [], version: '4.3.0', license: '''MIT License Copyright (c) 2018 Baseflow Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('meta'), PackageRef('plugin_platform_interface') ]); /// permission_handler_windows 0.2.1 const _permission_handler_windows = Package( name: 'permission_handler_windows', description: 'Permission plugin for Flutter. This plugin provides the Windows API to request and check permissions.', homepage: 'https://github.com/baseflow/flutter-permission-handler', authors: [], version: '0.2.1', license: '''MIT License Copyright (c) 2018 Baseflow Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('permission_handler_platform_interface') ]); /// petitparser 7.0.1 const _petitparser = Package( name: 'petitparser', description: 'A dynamic parser framework to build efficient grammars and parsers quickly.', homepage: 'https://petitparser.github.io', repository: 'https://github.com/petitparser/dart-petitparser', authors: [], version: '7.0.1', license: '''The MIT License Copyright (c) 2006-2024 Lukas Renggli. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta'), PackageRef('collection')]); /// platform 3.1.6 const _platform = Package( name: 'platform', description: 'A pluggable, mockable platform information abstraction for Dart.', repository: 'https://github.com/dart-lang/core/tree/main/pkgs/platform', authors: [], version: '3.1.6', license: '''Copyright 2017, the Dart project authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// plugin_platform_interface 2.1.8 const _plugin_platform_interface = Package( name: 'plugin_platform_interface', description: 'Reusable base class for platform interfaces of Flutter federated plugins, to help enforce best practices.', repository: 'https://github.com/flutter/packages/tree/main/packages/plugin_platform_interface', authors: [], version: '2.1.8', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta')]); /// pointycastle 3.9.1 const _pointycastle = Package( name: 'pointycastle', description: 'A Dart library implementing cryptographic algorithms and primitives, modeled on the BouncyCastle library.', homepage: 'https://github.com/bcgit/pc-dart', authors: [], version: '3.9.1', license: '''Copyright (c) 2000 - 2019 The Legion of the Bouncy Castle Inc. (https://www.bouncycastle.org) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('collection'), PackageRef('convert'), PackageRef('js') ]); /// pool 1.5.1 const _pool = Package( name: 'pool', description: 'Manage a finite pool of resources. Useful for controlling concurrent file system or network requests.', repository: 'https://github.com/dart-lang/pool', authors: [], version: '1.5.1', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('async'), PackageRef('stack_trace')]); /// popover 0.3.1 const _popover = Package( name: 'popover', description: 'A popover is a transient view that appears above other content onscreen when you tap a control or in an area.', homepage: 'https://github.com/minikin/popover', authors: [], version: '0.3.1', license: '''MIT License Copyright (c) 2021 - 2024 Oleksandr Prokhorenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('flutter')]); /// posix 6.0.3 const _posix = Package( name: 'posix', description: 'Exposes the POSIX api on OSx and Linux', homepage: 'https://github.com/onepub-dev/dart_posix', authors: [], version: '6.0.3', license: '''MIT License Copyright (c) 2020 Brett Sutton Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('ffi'), PackageRef('meta'), PackageRef('path')]); /// provider 6.1.5+1 const _provider = Package( name: 'provider', description: 'A wrapper around InheritedWidget to make them easier to use and more reusable.', repository: 'https://github.com/rrousselGit/provider', authors: [], version: '6.1.5+1', license: '''MIT License Copyright (c) 2019 Remi Rousselet Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('collection'), PackageRef('flutter'), PackageRef('nested') ]); /// pub_semver 2.2.0 const _pub_semver = Package( name: 'pub_semver', description: "Versions and version constraints implementing pub's versioning policy. This is very similar to vanilla semver, with a few corner cases.", repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/pub_semver', authors: [], version: '2.2.0', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('collection')]); /// pubspec_parse 1.5.0 const _pubspec_parse = Package( name: 'pubspec_parse', description: 'Simple package for parsing pubspec.yaml files with a type-safe API and rich error reporting.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/pubspec_parse', authors: [], version: '1.5.0', license: '''Copyright 2018, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('checked_yaml'), PackageRef('collection'), PackageRef('json_annotation'), PackageRef('pub_semver'), PackageRef('yaml') ]); /// pure_ftp 0.7.5 const _pure_ftp = Package( name: 'pure_ftp', description: 'Simple and powerful FTP client for Dart. Allow you to connect to FTP server and perform basic operations. now supports all native platforms(Web in progress)', homepage: 'https://github.com/crifurch/pure_ftp', authors: [], version: '0.7.5', license: '''MIT License Copyright (c) 2023 Artem Semirenko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta')]); /// rxdart 0.28.0 const _rxdart = Package( name: 'rxdart', description: '''RxDart is an implementation of the popular ReactiveX api for asynchronous programming, leveraging the native Dart Streams api. ''', repository: 'https://github.com/ReactiveX/rxdart', authors: [], version: '0.28.0', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: []); /// saf_util 0.11.0 const _saf_util = Package( name: 'saf_util', description: 'Util functions for SAF (Storage Access Framework).', homepage: 'https://github.com/flutter-cavalry/saf_util', authors: [], version: '0.11.0', license: '''BSD 3-Clause License Copyright (c) 2023, Mgenware (Liu YuanYuan) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface') ]); /// safe_local_storage 2.0.1 const _safe_local_storage = Package( name: 'safe_local_storage', description: 'A safe caching library to read/write values on local storage.', homepage: 'https://github.com/alexmercerind/safe_local_storage.git', repository: 'https://github.com/alexmercerind/safe_local_storage.git', authors: [], version: '2.0.1', license: '''MIT License Copyright (c) 2022 Hitesh Kumar Saini Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('path'), PackageRef('synchronized')]); /// screen_brightness 2.1.7 const _screen_brightness = Package( name: 'screen_brightness', description: 'A Plugin for controlling screen brightness with application life cycle reset implemented', homepage: 'https://github.com/aaassseee/screen_brightness', repository: 'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness', authors: [], version: '2.1.7', license: '''MIT License Copyright (c) 2021 Jack Liu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('screen_brightness_platform_interface'), PackageRef('screen_brightness_android'), PackageRef('screen_brightness_ios'), PackageRef('screen_brightness_macos'), PackageRef('screen_brightness_windows'), PackageRef('screen_brightness_ohos') ]); /// screen_brightness_android 2.1.3 const _screen_brightness_android = Package( name: 'screen_brightness_android', description: 'The Android federated plugin implementation of screen_brightness.', homepage: 'https://github.com/aaassseee/screen_brightness', repository: 'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness_android', authors: [], version: '2.1.3', license: '''MIT License Copyright (c) 2021 Jack Liu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('screen_brightness_platform_interface') ]); /// screen_brightness_ios 2.1.2 const _screen_brightness_ios = Package( name: 'screen_brightness_ios', description: 'The iOS federated plugin implementation of the screen_brightness.', homepage: 'https://github.com/aaassseee/screen_brightness', repository: 'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness_ios', authors: [], version: '2.1.2', license: '''MIT License Copyright (c) 2021 Jack Liu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('screen_brightness_platform_interface') ]); /// screen_brightness_macos 2.1.1 const _screen_brightness_macos = Package( name: 'screen_brightness_macos', description: 'The macOS federated plugin implementation of the screen_brightness.', homepage: 'https://github.com/aaassseee/screen_brightness', repository: 'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness_macos', authors: [], version: '2.1.1', license: '''MIT License Copyright (c) 2021 Jack Liu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('screen_brightness_platform_interface') ]); /// screen_brightness_ohos 2.1.2 const _screen_brightness_ohos = Package( name: 'screen_brightness_ohos', description: 'The ohos federated plugin implementation of screen_brightness.', homepage: 'https://github.com/aaassseee/screen_brightness', repository: 'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness_ohos', authors: [], version: '2.1.2', license: '''MIT License Copyright (c) 2025 ErBWs, Jack Liu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('screen_brightness_platform_interface') ]); /// screen_brightness_platform_interface 2.1.0 const _screen_brightness_platform_interface = Package( name: 'screen_brightness_platform_interface', description: 'A common platform interface for the screen_brightness plugin', homepage: 'https://github.com/aaassseee/screen_brightness', repository: 'https://github.com/aaassseee/screen_brightness/tree/patch-1/screen_brightness_platform_interface', authors: [], version: '2.1.0', license: '''MIT License Copyright (c) 2021 Jack Liu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface') ]); /// screen_brightness_windows 2.1.0 const _screen_brightness_windows = Package( name: 'screen_brightness_windows', description: 'The Windows federated plugin implementation of the screen_brightness.', homepage: 'https://github.com/aaassseee/screen_brightness', repository: 'https://github.com/aaassseee/screen_brightness/tree/master/screen_brightness_windows', authors: [], version: '2.1.0', license: '''MIT License Copyright (c) 2022 Jack Liu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('screen_brightness_platform_interface') ]); /// screen_retriever 0.2.0 const _screen_retriever = Package( name: 'screen_retriever', description: 'This plugin allows Flutter desktop apps to Retrieve information about screen size, displays, cursor position, etc.', homepage: 'https://github.com/leanflutter/screen_retriever', authors: [], version: '0.2.0', license: '''MIT License Copyright (c) 2022-2024 LiJianying Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('screen_retriever_linux'), PackageRef('screen_retriever_macos'), PackageRef('screen_retriever_platform_interface'), PackageRef('screen_retriever_windows') ]); /// screen_retriever_linux 0.2.0 const _screen_retriever_linux = Package( name: 'screen_retriever_linux', description: 'Linux implementation of the screen_retriever plugin.', repository: 'https://github.com/leanflutter/screen_retriever/tree/main/packages/screen_retriever_linux', authors: [], version: '0.2.0', license: '''MIT License Copyright (c) 2022-2024 LiJianying Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('screen_retriever_platform_interface') ]); /// screen_retriever_macos 0.2.0 const _screen_retriever_macos = Package( name: 'screen_retriever_macos', description: 'macOS implementation of the screen_retriever plugin.', repository: 'https://github.com/leanflutter/screen_retriever/tree/main/packages/screen_retriever_macos', authors: [], version: '0.2.0', license: '''MIT License Copyright (c) 2022-2024 LiJianying Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('screen_retriever_platform_interface') ]); /// screen_retriever_platform_interface 0.2.0 const _screen_retriever_platform_interface = Package( name: 'screen_retriever_platform_interface', description: 'A common platform interface for the screen_retriever plugin.', homepage: 'https://github.com/leanflutter/screen_retriever/blob/main/packages/screen_retriever_platform_interface', authors: [], version: '0.2.0', license: '''MIT License Copyright (c) 2022-2024 LiJianying Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('json_annotation'), PackageRef('plugin_platform_interface') ]); /// screen_retriever_windows 0.2.0 const _screen_retriever_windows = Package( name: 'screen_retriever_windows', description: 'Windows implementation of the screen_retriever plugin.', repository: 'https://github.com/leanflutter/screen_retriever/tree/main/packages/screen_retriever_windows', authors: [], version: '0.2.0', license: '''MIT License Copyright (c) 2022-2024 LiJianying Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('screen_retriever_platform_interface') ]); /// scrollable_positioned_list 0.3.8 const _scrollable_positioned_list = Package( name: 'scrollable_positioned_list', description: '''A list with helper methods to programmatically scroll to an item. ''', homepage: 'https://github.com/google/flutter.widgets/tree/master/packages/scrollable_positioned_list', authors: [], version: '0.3.8', license: '''Copyright 2018 the Dart project authors, Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('flutter'), PackageRef('collection')]); /// shelf 1.4.2 const _shelf = Package( name: 'shelf', description: '''A model for web server middleware that encourages composition and easy reuse. ''', repository: 'https://github.com/dart-lang/shelf/tree/master/pkgs/shelf', authors: [], version: '1.4.2', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('async'), PackageRef('collection'), PackageRef('http_parser'), PackageRef('path'), PackageRef('stack_trace'), PackageRef('stream_channel') ]); /// shelf_router 1.1.4 const _shelf_router = Package( name: 'shelf_router', description: '''A convenient request router for the shelf web-framework, with support for URL-parameters, nested routers and routers generated from source annotations. ''', repository: 'https://github.com/dart-lang/shelf/tree/master/pkgs/shelf_router', authors: [], version: '1.1.4', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('http_methods'), PackageRef('meta'), PackageRef('shelf') ]); /// shelf_web_socket 3.0.0 const _shelf_web_socket = Package( name: 'shelf_web_socket', description: 'A shelf handler that wires up a listener for every connection.', repository: 'https://github.com/dart-lang/shelf/tree/master/pkgs/shelf_web_socket', authors: [], version: '3.0.0', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('shelf'), PackageRef('stream_channel'), PackageRef('web_socket_channel') ]); /// smb_connect 0.0.9 const _smb_connect = Package( name: 'smb_connect', description: 'Native SMB/CIFS client library written in Dart for Dart. Extremely fast, can be used for streaming music and video. Supported dialects: SMB 1.0, CIFS, SMB 2.0, SMB 2.1.', homepage: 'https://github.com/vadia/smb_connect', repository: 'https://github.com/vadia/smb_connect', authors: [], version: '0.0.9', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2025 Vadim Babin 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('asn1lib'), PackageRef('charset'), PackageRef('crypto'), PackageRef('cryptography'), PackageRef('mutex'), PackageRef('pointycastle') ]); /// source_gen 4.0.1 const _source_gen = Package( name: 'source_gen', description: 'Source code generation builders and utilities for the Dart build system', repository: 'https://github.com/dart-lang/source_gen/tree/master/source_gen', authors: [], version: '4.0.1', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('analyzer'), PackageRef('async'), PackageRef('build'), PackageRef('dart_style'), PackageRef('glob'), PackageRef('path'), PackageRef('pub_semver'), PackageRef('source_span'), PackageRef('yaml') ]); /// source_helper 1.3.8 const _source_helper = Package( name: 'source_helper', description: 'Utilities to help with Dart source code generation. Includes utilities for properly generating String literals from any String value.', repository: 'https://github.com/google/source_helper.dart', authors: [], version: '1.3.8', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('analyzer'), PackageRef('source_gen')]); /// source_span 1.10.1 const _source_span = Package( name: 'source_span', description: 'Provides a standard representation for source code locations and spans.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/source_span', authors: [], version: '1.10.1', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('collection'), PackageRef('path'), PackageRef('term_glyph') ]); /// sprintf 7.0.0 const _sprintf = Package( name: 'sprintf', description: 'Dart implementation of sprintf. Provides simple printf like formatting such as sprintf("hello %s", ["world"]);', homepage: 'https://github.com/Naddiseo/dart-sprintf', authors: [], version: '7.0.0', license: '''Copyright (c) 2012, Richard Eames All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// stack_trace 1.12.1 const _stack_trace = Package( name: 'stack_trace', description: 'A package for manipulating stack traces and printing them readably.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/stack_trace', authors: [], version: '1.12.1', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('path')]); /// stream_channel 2.1.4 const _stream_channel = Package( name: 'stream_channel', description: 'An abstraction for two-way communication channels based on the Dart Stream class.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/stream_channel', authors: [], version: '2.1.4', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('async')]); /// stream_transform 2.1.1 const _stream_transform = Package( name: 'stream_transform', description: 'A collection of utilities to transform and manipulate streams.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/stream_transform', authors: [], version: '2.1.1', license: '''Copyright 2017, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// string_scanner 1.4.1 const _string_scanner = Package( name: 'string_scanner', description: 'A class for parsing strings using a sequence of patterns.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/string_scanner', authors: [], version: '1.4.1', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('source_span')]); /// synchronized 3.4.0 const _synchronized = Package( name: 'synchronized', description: 'Lock mechanism to prevent concurrent access to asynchronous code.', homepage: 'https://github.com/tekartik/synchronized.dart/tree/master/synchronized', authors: [], version: '3.4.0', license: '''MIT License Copyright (c) 2016, Alexandre Roux Tekartik. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: []); /// term_glyph 1.2.2 const _term_glyph = Package( name: 'term_glyph', description: 'Useful Unicode glyphs and ASCII substitutes.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/term_glyph', authors: [], version: '1.2.2', license: '''Copyright 2017, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// test_api 0.7.6 const _test_api = Package( name: 'test_api', description: 'The user facing API for structuring Dart tests and checking expectations.', repository: 'https://github.com/dart-lang/test/tree/master/pkgs/test_api', authors: [], version: '0.7.6', license: '''Copyright 2018, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('async'), PackageRef('boolean_selector'), PackageRef('collection'), PackageRef('meta'), PackageRef('source_span'), PackageRef('stack_trace'), PackageRef('stream_channel'), PackageRef('string_scanner'), PackageRef('term_glyph') ]); /// typed_data 1.4.0 const _typed_data = Package( name: 'typed_data', description: 'Utility functions and classes related to the dart:typed_data library.', repository: 'https://github.com/dart-lang/core/tree/main/pkgs/typed_data', authors: [], version: '1.4.0', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('collection')]); /// universal_platform 1.1.0 const _universal_platform = Package( name: 'universal_platform', description: 'Replacement for dart.io.Platform class which works on Web as well as Desktop and Mobile. Allows platform checks in your view/model layer easily.', homepage: 'https://github.com/gskinnerTeam/flutter-universal-platform', authors: [], version: '1.1.0', license: '''MIT License Copyright (c) 2019 gskinner.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: []); /// uri_parser 3.0.0 const _uri_parser = Package( name: 'uri_parser', description: 'A minimal & safe utility to parse URIs.', homepage: 'https://github.com/alexmercerind/uri_parser', repository: 'https://github.com/alexmercerind/uri_parser', authors: [], version: '3.0.0', license: '''MIT License Copyright (c) 2021 & onwards Hitesh Kumar Saini Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('path'), PackageRef('safe_local_storage')]); /// url_launcher 6.3.2 const _url_launcher = Package( name: 'url_launcher', description: 'Flutter plugin for launching a URL. Supports web, phone, SMS, and email schemes.', repository: 'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher', authors: [], version: '6.3.2', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('url_launcher_android'), PackageRef('url_launcher_ios'), PackageRef('url_launcher_linux'), PackageRef('url_launcher_macos'), PackageRef('url_launcher_platform_interface'), PackageRef('url_launcher_web'), PackageRef('url_launcher_windows') ]); /// url_launcher_android 6.3.21 const _url_launcher_android = Package( name: 'url_launcher_android', description: 'Android implementation of the url_launcher plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_android', authors: [], version: '6.3.21', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('url_launcher_platform_interface') ]); /// url_launcher_ios 6.3.4 const _url_launcher_ios = Package( name: 'url_launcher_ios', description: 'iOS implementation of the url_launcher plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_ios', authors: [], version: '6.3.4', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('url_launcher_platform_interface') ]); /// url_launcher_linux 3.2.1 const _url_launcher_linux = Package( name: 'url_launcher_linux', description: 'Linux implementation of the url_launcher plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_linux', authors: [], version: '3.2.1', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('url_launcher_platform_interface') ]); /// url_launcher_macos 3.2.3 const _url_launcher_macos = Package( name: 'url_launcher_macos', description: 'macOS implementation of the url_launcher plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_macos', authors: [], version: '3.2.3', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('url_launcher_platform_interface') ]); /// url_launcher_platform_interface 2.3.2 const _url_launcher_platform_interface = Package( name: 'url_launcher_platform_interface', description: 'A common platform interface for the url_launcher plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_platform_interface', authors: [], version: '2.3.2', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface') ]); /// url_launcher_web 2.4.1 const _url_launcher_web = Package( name: 'url_launcher_web', description: 'Web platform implementation of url_launcher', repository: 'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_web', authors: [], version: '2.4.1', license: '''url_launcher_web Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- platform_detect Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2017 Workiva Inc. 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_web_plugins'), PackageRef('url_launcher_platform_interface'), PackageRef('web') ]); /// url_launcher_windows 3.1.4 const _url_launcher_windows = Package( name: 'url_launcher_windows', description: 'Windows implementation of the url_launcher plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/url_launcher/url_launcher_windows', authors: [], version: '3.1.4', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('url_launcher_platform_interface') ]); /// uuid 4.5.1 const _uuid = Package( name: 'uuid', description: '''RFC4122 (v1, v4, v5, v6, v7, v8) UUID Generator and Parser for Dart ''', repository: 'https://github.com/Daegalus/dart-uuid', authors: [], version: '4.5.1', license: '''Copyright (c) 2021 Yulian Kuncheff Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('crypto'), PackageRef('sprintf'), PackageRef('meta'), PackageRef('fixnum') ]); /// vector_math 2.2.0 const _vector_math = Package( name: 'vector_math', description: 'A Vector Math library for 2D and 3D applications.', repository: 'https://github.com/google/vector_math.dart', authors: [], version: '2.2.0', license: '''Copyright 2015, Google Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Copyright (C) 2013 Andrew Magill This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution.''', isMarkdown: false, isSdk: false, dependencies: []); /// video_player 2.10.0 const _video_player = Package( name: 'video_player', description: 'Flutter plugin for displaying inline video with other Flutter widgets on Android, iOS, macOS and web.', repository: 'https://github.com/flutter/packages/tree/main/packages/video_player/video_player', authors: [], version: '2.10.0', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('html'), PackageRef('video_player_android'), PackageRef('video_player_avfoundation'), PackageRef('video_player_platform_interface'), PackageRef('video_player_web') ]); /// video_player_android 2.8.13 const _video_player_android = Package( name: 'video_player_android', description: 'Android implementation of the video_player plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_android', authors: [], version: '2.8.13', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('video_player_platform_interface') ]); /// video_player_avfoundation 2.8.4 const _video_player_avfoundation = Package( name: 'video_player_avfoundation', description: 'iOS and macOS implementation of the video_player plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_avfoundation', authors: [], version: '2.8.4', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('video_player_platform_interface') ]); /// video_player_platform_interface 6.4.0 const _video_player_platform_interface = Package( name: 'video_player_platform_interface', description: 'A common platform interface for the video_player plugin.', repository: 'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_platform_interface', authors: [], version: '6.4.0', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface') ]); /// video_player_web 2.4.0 const _video_player_web = Package( name: 'video_player_web', description: 'Web platform implementation of video_player.', repository: 'https://github.com/flutter/packages/tree/main/packages/video_player/video_player_web', authors: [], version: '2.4.0', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_web_plugins'), PackageRef('video_player_platform_interface'), PackageRef('web') ]); /// vm_service 15.0.2 const _vm_service = Package( name: 'vm_service', description: 'A library to communicate with a service implementing the Dart VM service protocol.', repository: 'https://github.com/dart-lang/sdk/tree/main/pkg/vm_service', authors: [], version: '15.0.2', license: '''Copyright 2015, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// volume_controller 3.4.0 const _volume_controller = Package( name: 'volume_controller', description: 'A Flutter volume plugin for multiple platform to control system volume.', homepage: 'https://github.com/kurenai7968/volume_controller', authors: [], version: '3.4.0', license: '''MIT License Copyright (c) 2021 kurenai7968 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('flutter')]); /// wakelock_plus 1.4.0 const _wakelock_plus = Package( name: 'wakelock_plus', description: 'Plugin that allows you to keep the device screen awake, i.e. prevent the screen from sleeping on Android, iOS, macOS, Windows, Linux, and web.', repository: 'https://github.com/fluttercommunity/wakelock_plus/tree/main/wakelock_plus', authors: [], version: '1.4.0', license: '''BSD 3-Clause License Copyright (c) 2020-2023, creativecreatorormaybenot All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('flutter_web_plugins'), PackageRef('meta'), PackageRef('wakelock_plus_platform_interface'), PackageRef('win32'), PackageRef('dbus'), PackageRef('package_info_plus'), PackageRef('web') ]); /// wakelock_plus_platform_interface 1.3.0 const _wakelock_plus_platform_interface = Package( name: 'wakelock_plus_platform_interface', description: 'A common platform interface for the wakelock_plus plugin used by the different platform implementations.', repository: 'https://github.com/fluttercommunity/wakelock_plus/tree/main/wakelock_plus_platform_interface', authors: [], version: '1.3.0', license: '''BSD 3-Clause License Copyright (c) 2020-2023, creativecreatorormaybenot All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('plugin_platform_interface'), PackageRef('meta') ]); /// watcher 1.1.3 const _watcher = Package( name: 'watcher', description: 'A file system watcher. It monitors changes to contents of directories and sends notifications when files have been added, removed, or modified.', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/watcher', authors: [], version: '1.1.3', license: '''Copyright 2014, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('async'), PackageRef('path')]); /// web 1.1.1 const _web = Package( name: 'web', description: 'Lightweight browser API bindings built around JS interop.', repository: 'https://github.com/dart-lang/web', authors: [], version: '1.1.1', license: '''Copyright 2023, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: []); /// web_socket 1.0.1 const _web_socket = Package( name: 'web_socket', description: 'Any easy-to-use library for communicating with WebSockets that has multiple implementations.', repository: 'https://github.com/dart-lang/http/tree/master/pkgs/web_socket', authors: [], version: '1.0.1', license: '''Copyright 2024, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('web')]); /// web_socket_channel 3.0.3 const _web_socket_channel = Package( name: 'web_socket_channel', description: 'StreamChannel wrappers for WebSockets. Provides a cross-platform WebSocketChannel API, a cross-platform implementation of that API that communicates over an underlying StreamChannel.', repository: 'https://github.com/dart-lang/http/tree/master/pkgs/web_socket_channel', authors: [], version: '3.0.3', license: '''Copyright 2016, the Dart project authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('async'), PackageRef('crypto'), PackageRef('stream_channel'), PackageRef('web'), PackageRef('web_socket') ]); /// webdav_client 1.2.2 const _webdav_client = Package( name: 'webdav_client', description: 'A simple WebDAV client that supports some common methods.', homepage: 'https://github.com/flymzero/webdav_client', authors: [], version: '1.2.2', license: '''BSD 3-Clause License Copyright (c) 2020, MZERO All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('dio'), PackageRef('xml'), PackageRef('convert') ]); /// win32 5.14.0 const _win32 = Package( name: 'win32', description: '''Access common Win32 APIs directly from Dart using FFI — no C required! ''', homepage: 'https://win32.pub', repository: 'https://github.com/halildurmus/win32', authors: [], version: '5.14.0', license: '''BSD 3-Clause License Copyright (c) 2024, Halil Durmus Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('ffi')]); /// win32_registry 2.1.0 const _win32_registry = Package( name: 'win32_registry', description: 'A package that provides a friendly Dart API for accessing the Windows Registry.', repository: 'https://github.com/halildurmus/win32_registry', authors: [], version: '2.1.0', license: '''BSD 3-Clause License Copyright (c) 2023, Halil Durmus Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('ffi'), PackageRef('meta'), PackageRef('win32')]); /// window_manager 0.5.1 const _window_manager = Package( name: 'window_manager', description: 'This plugin allows Flutter desktop apps to resizing and repositioning the window.', homepage: 'https://leanflutter.dev', repository: 'https://github.com/leanflutter/window_manager', authors: [], version: '0.5.1', license: '''MIT License Copyright (c) 2022-present LiJianying Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('flutter'), PackageRef('path'), PackageRef('screen_retriever') ]); /// window_size 0.1.0 const _window_size = Package( name: 'window_size', description: 'Allows resizing and repositioning the window containing Flutter.', authors: [], version: '0.1.0', license: '''Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] 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 http://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.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('flutter')]); /// xdg_directories 1.1.0 const _xdg_directories = Package( name: 'xdg_directories', description: 'A Dart package for reading XDG directory configuration information on Linux.', repository: 'https://github.com/flutter/packages/tree/main/packages/xdg_directories', authors: [], version: '1.1.0', license: '''Copyright 2013 The Flutter Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta'), PackageRef('path')]); /// xml 6.6.1 const _xml = Package( name: 'xml', description: 'A lightweight library for parsing, traversing, querying, transforming and building XML documents.', homepage: 'https://github.com/renggli/dart-xml', authors: [], version: '6.6.1', license: '''The MIT License Copyright (c) 2006-2025 Lukas Renggli. All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('collection'), PackageRef('meta'), PackageRef('petitparser') ]); /// yaml 3.1.3 const _yaml = Package( name: 'yaml', description: 'A parser for YAML, a human-friendly data serialization standard', repository: 'https://github.com/dart-lang/tools/tree/main/pkgs/yaml', authors: [], version: '3.1.3', license: '''Copyright (c) 2014, the Dart project authors. Copyright (c) 2006, Kirill Simonov. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [ PackageRef('collection'), PackageRef('source_span'), PackageRef('string_scanner') ]); /// zustand 0.0.5 const _zustand = Package( name: 'zustand', description: "Brings zustand's bear necessities for state management to Dart", homepage: 'https://github.com/josiahsrc/flutter_zustand/tree/main/packages/zustand', repository: 'https://github.com/josiahsrc/flutter_zustand/tree/main/packages/zustand', authors: [], version: '0.0.5', license: '''MIT License Copyright (c) 2024 Josiah Saunders Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.''', isMarkdown: false, isSdk: false, dependencies: [PackageRef('meta')]); ================================================ FILE: lib/pages/home/home.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/hooks/ui/use_full_screen.dart'; import 'package:iris/hooks/ui/use_orientation.dart'; import 'package:iris/hooks/ui/use_resize_window.dart'; import 'package:iris/pages/player/player_view.dart'; import 'package:iris/store/use_app_store.dart'; class Home extends HookWidget { const Home({super.key}); @override Widget build(BuildContext context) { useFullScreen(); useOrientation(); useResizeWindow(); final playerBackend = useAppStore().select(context, (state) => state.playerBackend); return Scaffold( backgroundColor: Colors.black, body: PlayerView(playerBackend: playerBackend), ); } } ================================================ FILE: lib/pages/player/audio.dart ================================================ import 'dart:io'; import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/store/use_storage_store.dart'; class _CoverImage extends StatelessWidget { final FileItem cover; final String? auth; final BoxFit fit; const _CoverImage({ required this.cover, required this.auth, required this.fit, }); @override Widget build(BuildContext context) { final isLocal = cover.storageId == localStorageId; if (isLocal) { return Image.file( File(cover.uri), fit: fit, gaplessPlayback: true, ); } else { return Image.network( cover.uri, headers: auth != null ? {'authorization': auth!} : null, fit: fit, gaplessPlayback: true, ); } } } class Audio extends HookWidget { const Audio({ super.key, required this.cover, }); final FileItem? cover; @override Widget build(BuildContext context) { final storage = useMemoized( () => cover?.storageId == null ? null : useStorageStore().findById(cover!.storageId), [cover?.storageId]); final auth = useMemoized(() => storage?.getAuth(), [storage]); return IgnorePointer( child: Stack( fit: StackFit.expand, children: [ const DecoratedBox( decoration: BoxDecoration( color: Colors.black, ), ), if (cover != null) _CoverImage(cover: cover!, auth: auth, fit: BoxFit.cover), BackdropFilter( filter: ImageFilter.blur(sigmaX: 24.0, sigmaY: 24.0), child: DecoratedBox( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Theme.of(context) .colorScheme .surface .withValues(alpha: 0.6), Theme.of(context) .colorScheme .surface .withValues(alpha: 0.2), ], ), ), ), ), LayoutBuilder( builder: (context, constraints) { const double wideLayoutThreshold = 600; final isWideScreen = constraints.maxWidth >= wideLayoutThreshold; if (cover == null) { return const SizedBox(); } if (isWideScreen) { return _buildWideLayout(context, constraints, cover!, auth); } else { return _buildNarrowLayout(context, constraints, cover!, auth); } }, ), ], ), ); } Widget _buildNarrowLayout( BuildContext context, BoxConstraints constraints, FileItem cover, String? auth, ) { return Center( child: Padding( padding: const EdgeInsets.fromLTRB(48, 56, 48, 144), child: ConstrainedBox( constraints: const BoxConstraints( maxWidth: 400.0, maxHeight: 400.0, ), child: AspectRatio( aspectRatio: 1.0, child: _buildCoverCard( cover: cover, auth: auth, shadowColor: Theme.of(context) .colorScheme .onSurface .withValues(alpha: 0.15), ), ), ), ), ); } Widget _buildWideLayout( BuildContext context, BoxConstraints constraints, FileItem cover, String? auth, ) { return Row( children: [ Expanded( flex: 5, child: Center( child: Padding( padding: EdgeInsets.fromLTRB( 48, 56, 24, constraints.maxWidth > 1024 ? 64 : constraints.maxWidth > 640 ? 96 : 144, ), child: ConstrainedBox( constraints: const BoxConstraints( maxWidth: 320.0, maxHeight: 320.0, ), child: AspectRatio( aspectRatio: 1.0, child: _buildCoverCard( cover: cover, auth: auth, shadowColor: Theme.of(context) .colorScheme .onSurface .withValues(alpha: 0.15), ), ), ), ), ), ), Expanded( flex: 5, child: Container( padding: const EdgeInsets.symmetric(horizontal: 48.0, vertical: 24.0), ), ), ], ); } Widget _buildCoverCard({ required FileItem cover, required String? auth, required Color shadowColor, }) { return Container( decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), boxShadow: [ BoxShadow( color: shadowColor, blurRadius: 32, spreadRadius: 2, offset: const Offset(0, 8), ), ], ), child: ClipRRect( borderRadius: BorderRadius.circular(8), child: _CoverImage( cover: cover, auth: auth, fit: BoxFit.cover, ), ), ); } } ================================================ FILE: lib/pages/player/control_bar/control_bar.dart ================================================ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/globals.dart' show rateMenuKey, speedStops, moreMenuKey; import 'package:iris/models/file.dart'; import 'package:iris/models/player.dart'; import 'package:iris/models/storages/local.dart'; import 'package:iris/models/store/app_state.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/widgets/dialogs/show_open_link_dialog.dart'; import 'package:iris/widgets/dialogs/show_rate_dialog.dart'; import 'package:iris/pages/player/control_bar/control_bar_slider.dart'; import 'package:iris/widgets/popups/history.dart'; import 'package:iris/widgets/bottom_sheets/show_open_link_bottom_sheet.dart'; import 'package:iris/widgets/popups/settings/settings.dart'; import 'package:iris/pages/player/control_bar/volume_control.dart'; import 'package:iris/widgets/popups/track/subtitle_and_audio_track.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/widgets/popups/play_queue.dart'; import 'package:iris/utils/platform.dart'; import 'package:iris/widgets/popup.dart'; import 'package:iris/widgets/popups/storages/storages.dart'; import 'package:provider/provider.dart'; import 'package:window_manager/window_manager.dart'; class ControlBar extends HookWidget { const ControlBar({ super.key, required this.showControl, required this.showControlForHover, this.color, this.overlayColor, }); final void Function() showControl; final Future Function(Future callback) showControlForHover; final Color? color; final WidgetStateProperty? overlayColor; @override Widget build(BuildContext context) { final width = MediaQuery.sizeOf(context).width; final t = getLocalizations(context); final isPlaying = context.select((player) => player.isPlaying); final isInitializing = context.select((player) => player.isInitializing); final rate = useAppStore().select(context, (state) => state.rate); final volume = useAppStore().select(context, (state) => state.volume); final isMuted = useAppStore().select(context, (state) => state.isMuted); final isFullScreen = usePlayerUiStore().select(context, (state) => state.isFullScreen); final int playQueueLength = usePlayQueueStore().select(context, (state) => state.playQueue.length); final bool shuffle = useAppStore().select(context, (state) => state.shuffle); final Repeat repeat = useAppStore().select(context, (state) => state.repeat); final BoxFit fit = useAppStore().select(context, (state) => state.fit); final isSeeking = usePlayerUiStore().select(context, (state) => state.isSeeking); final displayIsPlaying = useState(isPlaying); final playQueue = usePlayQueueStore().select(context, (state) => state.playQueue); final currentIndex = usePlayQueueStore().select(context, (state) => state.currentIndex); final FileItem? file = useMemoized(() { final index = playQueue.indexWhere((element) => element.index == currentIndex); return playQueue.isEmpty || index < 0 ? null : playQueue[index].file; }, [playQueue, currentIndex]); useEffect(() { if (!isSeeking) { displayIsPlaying.value = isPlaying; } return null; }, [isPlaying]); final playPauseButton = Stack( alignment: Alignment.center, children: [ if (isInitializing) SizedBox( width: 32, height: 32, child: CircularProgressIndicator( strokeWidth: 4, color: Theme.of(context).colorScheme.surface, ), ), IconButton( tooltip: '${displayIsPlaying.value ? t.pause : t.play} ( Space )', icon: Icon( displayIsPlaying.value ? Icons.pause_rounded : Icons.play_arrow_rounded, size: 32, color: color, ), onPressed: () { showControl(); if (isPlaying == true) { useAppStore().updateAutoPlay(false); context.read().pause(); } else { useAppStore().updateAutoPlay(true); context.read().play(); } }, style: ButtonStyle(overlayColor: overlayColor), ), ], ); final stopButton = IconButton( tooltip: '${t.stop} ( Ctrl + C )', icon: Icon( Icons.stop_rounded, size: 26, color: color, ), onPressed: () { showControl(); useAppStore().updateAutoPlay(false); context.read().pause(); usePlayQueueStore().updateCurrentIndex(-1); }, style: ButtonStyle(overlayColor: overlayColor), ); final prevButton = playQueueLength > 1 ? IconButton( tooltip: '${t.previous} ( Ctrl + ← )', icon: Icon( Icons.skip_previous_rounded, size: 26, color: color, ), onPressed: () { showControl(); usePlayQueueStore().previous(); }, style: ButtonStyle(overlayColor: overlayColor), ) : const SizedBox.shrink(); final nextButton = playQueueLength > 1 ? IconButton( tooltip: '${t.next} ( Ctrl + → )', icon: Icon( Icons.skip_next_rounded, size: 26, color: color, ), onPressed: () { showControl(); usePlayQueueStore().next(); }, style: ButtonStyle(overlayColor: overlayColor), ) : const SizedBox.shrink(); final shuffleButton = Builder( builder: (context) => IconButton( tooltip: '${t.shuffle}: ${shuffle ? t.on : t.off} ( Ctrl + X )', icon: Icon( Icons.shuffle_rounded, size: 20, color: !shuffle ? color?.withAlpha(153) : color, ), onPressed: () { showControl(); shuffle ? usePlayQueueStore().sort() : usePlayQueueStore().shuffle(); useAppStore().updateShuffle(!shuffle); }, style: ButtonStyle(overlayColor: overlayColor), ), ); final repeatButton = Builder( builder: (context) => IconButton( tooltip: '${repeat == Repeat.one ? t.repeat_one : repeat == Repeat.all ? t.repeat_all : t.repeat_none} ( Ctrl + R )', icon: Icon( repeat == Repeat.one ? Icons.repeat_one_rounded : Icons.repeat_rounded, size: 20, color: repeat == Repeat.none ? color?.withAlpha(153) : color, ), onPressed: () { showControl(); useAppStore().toggleRepeat(); }, style: ButtonStyle(overlayColor: overlayColor), ), ); final fitButton = IconButton( tooltip: '${t.video_zoom}: ${fit == BoxFit.contain ? t.fit : fit == BoxFit.fill ? t.stretch : fit == BoxFit.cover ? t.crop : '100%'} ( Ctrl + V )', icon: Icon( fit == BoxFit.contain ? Icons.fit_screen_rounded : fit == BoxFit.fill ? Icons.aspect_ratio_rounded : fit == BoxFit.cover ? Icons.crop_landscape_rounded : Icons.crop_free_rounded, size: 20, color: color, ), onPressed: () { showControl(); useAppStore().toggleFit(); }, style: ButtonStyle(overlayColor: overlayColor), ); final rateButton = PopupMenuButton( key: rateMenuKey, clipBehavior: Clip.hardEdge, constraints: const BoxConstraints(minWidth: 0), itemBuilder: (BuildContext context) => speedStops .map( (item) => PopupMenuItem( child: Text( '${item}X', style: TextStyle( color: item == rate ? Theme.of(context).colorScheme.primary : null, fontWeight: item == rate ? FontWeight.bold : FontWeight.w100, height: 1, ), ), onTap: () async { showControl(); useAppStore().updateRate(item); }, ), ) .toList(), child: Tooltip( message: t.playback_speed, child: TextButton( onPressed: () => rateMenuKey.currentState?.showButtonMenu(), style: ButtonStyle(overlayColor: overlayColor), child: Text( '${rate}X', style: TextStyle( fontWeight: FontWeight.bold, color: color, ), ), ), ), ); final volumeWidget = width < 768 ? Builder( builder: (context) => IconButton( tooltip: '${t.volume}: $volume', icon: Icon( isMuted || volume == 0 ? Icons.volume_off_rounded : volume < 50 ? Icons.volume_down_rounded : Icons.volume_up_rounded, size: 20, color: color, ), onPressed: () => showControlForHover( showVolumePopover(context, showControl), ), style: ButtonStyle(overlayColor: overlayColor), ), ) : SizedBox( width: 160, child: VolumeControl( showControl: showControl, showVolumeText: false, color: color, overlayColor: overlayColor, ), ); final sliderWidget = ControlBarSlider(showControl: showControl, color: color); final subtitleButton = IconButton( tooltip: '${t.subtitle_and_audio_track} ( S )', icon: Icon( Icons.subtitles_rounded, size: 20, color: color, ), onPressed: () async { showControlForHover( showPopup( context: context, child: Provider.value( value: context.read(), child: const SubtitleAndAudioTrack(), ), direction: PopupDirection.right, ), ); }, style: ButtonStyle(overlayColor: overlayColor), ); final playQueueButton = IconButton( tooltip: '${t.play_queue} ( P )', icon: Transform.translate( offset: const Offset(1, 1.5), child: Icon( Icons.playlist_play_rounded, size: 28, color: color, ), ), onPressed: () async { showControlForHover( showPopup( context: context, child: const PlayQueue(), direction: PopupDirection.right, ), ); }, style: ButtonStyle(overlayColor: overlayColor), ); final storageButton = IconButton( tooltip: '${t.storage} ( F )', icon: Icon( Icons.storage_rounded, size: 18, color: color, ), onPressed: () => showControlForHover( showPopup( context: context, child: const Storages(), direction: PopupDirection.right, ), ), style: ButtonStyle(overlayColor: overlayColor), ); final fullscreenButton = IconButton( tooltip: isFullScreen ? '${t.exit_fullscreen} ( Escape, F11, Enter )' : '${t.enter_fullscreen} ( F11, Enter )', icon: Icon( isFullScreen ? Icons.close_fullscreen_rounded : Icons.open_in_full_rounded, size: 19, color: color, ), onPressed: () async { showControl(); usePlayerUiStore().updateFullScreen(!isFullScreen); }, style: ButtonStyle(overlayColor: overlayColor), ); final moreMenuButton = PopupMenuButton( key: moreMenuKey, icon: Icon( Icons.more_vert_rounded, size: 20, color: color, ), style: ButtonStyle(overlayColor: overlayColor), clipBehavior: Clip.hardEdge, constraints: const BoxConstraints(minWidth: 200), itemBuilder: (BuildContext context) => [ PopupMenuItem( child: ListTile( mouseCursor: SystemMouseCursors.click, leading: const Icon( Icons.file_open_rounded, size: 16.5, ), title: Text(t.open_file), trailing: Text( 'Ctrl + O', style: TextStyle( fontSize: 12, color: Theme.of(context).dividerColor, ), ), ), onTap: () async { showControl(); if (Platform.isAndroid) { await pickContentFile(); } else { await pickLocalFile(); } showControl(); }, ), PopupMenuItem( child: ListTile( mouseCursor: SystemMouseCursors.click, leading: const Icon( Icons.file_present_rounded, size: 16.5, ), title: Text(t.open_link), trailing: Text( 'Ctrl + L', style: TextStyle( fontSize: 12, color: Theme.of(context).dividerColor, ), ), ), onTap: () async { isDesktop ? await showOpenLinkDialog(context) : await showOpenLinkBottomSheet(context); showControl(); }, ), if (width < 600) PopupMenuItem( child: ListTile( mouseCursor: SystemMouseCursors.click, leading: const Icon( Icons.speed_rounded, size: 20, ), title: Text('${t.playback_speed}: ${rate}X'), ), onTap: () => showControlForHover(showRateDialog(context)), ), PopupMenuItem( child: ListTile( mouseCursor: SystemMouseCursors.click, leading: const Icon( Icons.history_rounded, size: 20, ), title: Text(t.history), trailing: Text( 'Ctrl + H', style: TextStyle( fontSize: 12, color: Theme.of(context).dividerColor, ), ), ), onTap: () => showControlForHover( showPopup( context: context, child: const History(), direction: PopupDirection.right, ), ), ), PopupMenuItem( child: ListTile( mouseCursor: SystemMouseCursors.click, leading: const Icon( Icons.settings_rounded, size: 20, ), title: Text(t.settings), trailing: Text( 'Ctrl + P', style: TextStyle( fontSize: 12, color: Theme.of(context).dividerColor, ), ), ), onTap: () => showControlForHover( showPopup( context: context, child: const Settings(), direction: PopupDirection.right, ), ), ), PopupMenuItem( child: ListTile( mouseCursor: SystemMouseCursors.click, leading: const Icon( Icons.exit_to_app_rounded, size: 20, ), title: Text(t.exit), trailing: Text( 'Alt + X', style: TextStyle( fontSize: 12, color: Theme.of(context).dividerColor, ), ), ), onTap: () async { await context.read().saveProgress(); if (isDesktop) { windowManager.close(); } else { SystemNavigator.pop(); exit(0); } }, ), ], ); const double mobileBreakpoint = 640.0; const double tabletBreakpoint = 1024.0; final Widget controlLayout; if (width < mobileBreakpoint) { controlLayout = Column( mainAxisSize: MainAxisSize.min, children: [ sliderWidget, Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ shuffleButton, prevButton, playPauseButton, stopButton, nextButton, repeatButton, ], ), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, crossAxisAlignment: CrossAxisAlignment.center, children: [ if (file?.type != ContentType.audio) fitButton, volumeWidget, subtitleButton, playQueueButton, storageButton, if (isDesktop) fullscreenButton, moreMenuButton, ], ) ], ); } else if (width < tabletBreakpoint) { controlLayout = Column( mainAxisSize: MainAxisSize.min, children: [ sliderWidget, const SizedBox(height: 4), Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ playPauseButton, stopButton, prevButton, nextButton, shuffleButton, repeatButton, if (file?.type != ContentType.audio) fitButton, rateButton, volumeWidget, const Spacer(), subtitleButton, playQueueButton, storageButton, if (isDesktop) fullscreenButton, moreMenuButton, ], ), ], ); } else { controlLayout = Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ playPauseButton, stopButton, prevButton, nextButton, shuffleButton, repeatButton, if (file?.type != ContentType.audio) fitButton, rateButton, volumeWidget, Expanded(child: sliderWidget), subtitleButton, playQueueButton, storageButton, if (isDesktop) fullscreenButton, moreMenuButton, ], ); } return Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.black.withValues(alpha: 0), Colors.black.withValues(alpha: 0.25), Colors.black.withValues(alpha: 0.65), ], ), ), child: controlLayout, ); } } ================================================ FILE: lib/pages/player/control_bar/control_bar_slider.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/player.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/utils/format_duration_to_minutes.dart'; import 'package:provider/provider.dart'; class ControlBarSlider extends HookWidget { const ControlBarSlider({ super.key, this.showControl, this.disabled = false, this.color, }); final void Function()? showControl; final bool disabled; final Color? color; @override Widget build(BuildContext context) { final autoPlay = useAppStore().select(context, (state) => state.autoPlay); final progress = context.select< MediaPlayer, ({ Duration position, Duration duration, Duration buffer, })>( (player) => ( position: player.position, duration: player.duration, buffer: player.buffer, ), ); final play = context.read().play; final pause = context.read().pause; final seek = context.read().seek; final double max = progress.duration.inMilliseconds.toDouble(); final double positionValue = progress.position.inMilliseconds.toDouble().clamp(0.0, max); final double bufferValue = progress.buffer.inMilliseconds.toDouble().clamp(0.0, max); return ExcludeFocus( child: Container( padding: const EdgeInsets.fromLTRB(12, 0, 12, 0), child: Row( children: [ Visibility( visible: !disabled, child: Text( formatDurationToMinutes(progress.position), style: TextStyle(color: color, height: 2), ), ), Expanded( child: SliderTheme( data: SliderTheme.of(context).copyWith( activeTrackColor: color?.withAlpha(222) ?? Theme.of(context).colorScheme.primary, inactiveTrackColor: color?.withAlpha(70) ?? Theme.of(context) .colorScheme .onSurface .withValues(alpha: 0.25), secondaryActiveTrackColor: color?.withAlpha(120) ?? Theme.of(context) .colorScheme .onSurface .withValues(alpha: 0.4), thumbColor: color ?? Theme.of(context).colorScheme.primary, thumbShape: RoundSliderThumbShape( enabledThumbRadius: disabled ? 0 : 6, ), overlayShape: const RoundSliderOverlayShape( overlayRadius: 12, ), trackHeight: 4, trackShape: const _CustomTrackShape(), ), child: Slider( value: positionValue, secondaryTrackValue: bufferValue, min: 0, max: max > 0 ? max : 1.0, onChanged: disabled ? null : (value) { showControl?.call(); seek(Duration(milliseconds: value.toInt())); }, onChangeStart: disabled ? null : (value) { usePlayerUiStore().updateIsSeeking(true); pause(); }, onChangeEnd: disabled ? null : (value) async { if (autoPlay) { play(); } usePlayerUiStore().updateIsSeeking(false); }, ), ), ), Visibility( visible: !disabled, child: Text( formatDurationToMinutes(progress.duration), style: TextStyle(color: color, height: 2), ), ), ], ), ), ); } } class _CustomTrackShape extends RoundedRectSliderTrackShape { const _CustomTrackShape(); @override void paint( PaintingContext context, Offset offset, { required RenderBox parentBox, required SliderThemeData sliderTheme, required Animation enableAnimation, required TextDirection textDirection, required Offset thumbCenter, Offset? secondaryOffset, bool isDiscrete = false, bool isEnabled = false, double additionalActiveTrackHeight = 2, }) { if (sliderTheme.trackHeight == null || sliderTheme.trackHeight! <= 0) { return; } final Rect trackRect = getPreferredRect( parentBox: parentBox, offset: offset, sliderTheme: sliderTheme, isEnabled: isEnabled, isDiscrete: isDiscrete, ); final Radius trackRadius = Radius.circular(trackRect.height / 2); final Paint inactivePaint = Paint() ..color = sliderTheme.inactiveTrackColor!; context.canvas.drawRRect( RRect.fromRectAndRadius(trackRect, trackRadius), inactivePaint, ); if (secondaryOffset != null) { final Paint secondaryPaint = Paint() ..color = sliderTheme.secondaryActiveTrackColor!; final Rect secondaryRect = Rect.fromLTRB( trackRect.left, trackRect.top, secondaryOffset.dx, trackRect.bottom, ); context.canvas.drawRRect( RRect.fromRectAndRadius(secondaryRect, trackRadius), secondaryPaint, ); } final Paint activePaint = Paint()..color = sliderTheme.activeTrackColor!; final Rect activeRect = Rect.fromLTRB( trackRect.left, trackRect.top, thumbCenter.dx, trackRect.bottom, ); context.canvas.drawRRect( RRect.fromRectAndRadius(activeRect, trackRadius), activePaint, ); } } ================================================ FILE: lib/pages/player/control_bar/volume_control.dart ================================================ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/pages/player/control_bar/volume_slider.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:popover/popover.dart'; Future showVolumePopover( BuildContext context, void Function() showControl, ) async => showPopover( context: context, bodyBuilder: (context) => Container( padding: EdgeInsets.fromLTRB(8, 0, 16, 0), child: VolumeControl(showControl: showControl), ), direction: PopoverDirection.top, width: 240, height: 48, arrowHeight: 0, arrowWidth: 0, backgroundColor: Theme.of(context).colorScheme.surface, barrierColor: Colors.transparent, ); class VolumeControl extends HookWidget { const VolumeControl({ super.key, required this.showControl, this.showVolumeText = true, this.color, this.overlayColor, }); final void Function() showControl; final bool showVolumeText; final Color? color; final WidgetStateProperty? overlayColor; @override Widget build(BuildContext context) { final t = getLocalizations(context); final volume = useAppStore().select(context, (state) => state.volume); final isMuted = useAppStore().select(context, (state) => state.isMuted); return Listener( onPointerSignal: (PointerSignalEvent event) async { if (event is PointerScrollEvent) { if (event.scrollDelta.dy < 0) { showControl(); if (isMuted) { await useAppStore().updateVolume(0); await useAppStore().updateMute(false); } else { useAppStore().updateVolume(volume + 2); } } else { showControl(); useAppStore().updateVolume(volume - 2); } } }, child: Row( crossAxisAlignment: CrossAxisAlignment.center, textBaseline: TextBaseline.ideographic, children: [ IconButton( tooltip: '${isMuted ? t.unmute : t.mute} ( Ctrl + M )', icon: Icon( isMuted || volume == 0 ? Icons.volume_off_rounded : volume < 50 ? Icons.volume_down_rounded : Icons.volume_up_rounded, size: 20, color: color, ), onPressed: () { showControl(); if (volume == 0) { useAppStore().updateVolume(80); } else { useAppStore().toggleMute(); } }, style: ButtonStyle(overlayColor: overlayColor), ), Expanded( child: VolumeSlider( showControl: showControl, color: color, ), ), if (showVolumeText) const SizedBox(width: 8), if (showVolumeText) Text('${volume >= 100 ? '' : ' '}$volume'), ], ), ); } } ================================================ FILE: lib/pages/player/control_bar/volume_slider.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/store/use_app_store.dart'; class VolumeSlider extends HookWidget { const VolumeSlider({ super.key, required this.showControl, this.color, }); final void Function() showControl; final Color? color; @override Widget build(BuildContext context) { final volume = useAppStore().select(context, (state) => state.volume); final isMuted = useAppStore().select(context, (state) => state.isMuted); return ExcludeFocus( child: SizedBox( width: 128, child: SliderTheme( data: SliderTheme.of(context).copyWith( thumbColor: color, activeTrackColor: color?.withAlpha(222), inactiveTrackColor: color?.withAlpha(99), thumbShape: RoundSliderThumbShape( enabledThumbRadius: 5.6, ), overlayShape: const RoundSliderOverlayShape( overlayRadius: 4, ), trackHeight: 2.4, ), child: Slider( value: isMuted ? 0 : volume.toDouble(), onChanged: (value) { showControl(); useAppStore().updateMute(false); useAppStore().updateVolume((value).toInt()); }, min: 0, max: 100, ), ), ), ); } } ================================================ FILE: lib/pages/player/overlays/controls_overlay.dart ================================================ import 'dart:async'; import 'dart:ui'; import 'package:flutter/services.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/player.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/pages/player/control_bar/control_bar.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/widgets/drag_area.dart'; import 'package:iris/pages/player/title_bar.dart'; import 'package:provider/provider.dart'; class ControlsOverlay extends HookWidget { const ControlsOverlay({ super.key, required this.file, required this.title, required this.showControl, required this.showControlForHover, required this.hideControl, required this.showProgress, }); final FileItem? file; final String title; final Function() showControl; final Future Function(Future callback) showControlForHover; final Function() hideControl; final Function() showProgress; @override Widget build(BuildContext context) { final saveProgress = context.read().saveProgress; final isShowControl = usePlayerUiStore().select(context, (state) => state.isShowControl); final contentColor = useMemoized( () => Theme.of(context).brightness == Brightness.dark ? Theme.of(context).colorScheme.onSurface : Theme.of(context).colorScheme.surface, [context]); final overlayColor = useMemoized( () => WidgetStateProperty.resolveWith((Set states) { if (states.contains(WidgetState.pressed)) { return contentColor.withValues(alpha: 0.2); } else if (states.contains(WidgetState.hovered)) { return contentColor.withValues(alpha: 0.2); } return null; }), [contentColor]); void onHover(PointerHoverEvent event) { if (event.kind != PointerDeviceKind.touch) { usePlayerUiStore().updateIsHovering(true); showControl(); } } return Stack( children: [ // 标题栏 AnimatedPositioned( duration: const Duration(milliseconds: 200), curve: Curves.easeInOutCubicEmphasized, top: isShowControl || file?.type != ContentType.video ? 0 : -72, left: 0, right: 0, child: MouseRegion( onHover: onHover, child: GestureDetector( onTap: () => showControl(), child: DragArea( child: TitleBar( title: title, actions: [const SizedBox(width: 8)], color: contentColor, overlayColor: overlayColor, saveProgress: () => saveProgress(), ), ), ), ), ), // 控制栏 AnimatedPositioned( duration: const Duration(milliseconds: 200), curve: Curves.easeInOutCubicEmphasized, bottom: isShowControl || file?.type != ContentType.video ? 0 : -128, left: 0, right: 0, child: Align( alignment: Alignment.bottomCenter, child: MouseRegion( onHover: onHover, child: GestureDetector( onTap: () => showControl(), child: ControlBar( showControl: showControl, showControlForHover: showControlForHover, color: contentColor, overlayColor: overlayColor, ), ), ), ), ), ], ); } } ================================================ FILE: lib/pages/player/overlays/gesture_overlay.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/globals.dart'; import 'package:iris/hooks/use_gesture.dart'; import 'package:iris/models/player.dart'; import 'package:iris/pages/player/overlays/speed_selector.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:provider/provider.dart'; class GestureOverlay extends HookWidget { const GestureOverlay({ super.key, required this.showControl, required this.hideControl, required this.showProgress, }); final Function() showControl; final Function() hideControl; final Function() showProgress; @override Widget build(BuildContext context) { final isPlaying = context.select((player) => player.isPlaying); final isShowControl = usePlayerUiStore().select(context, (state) => state.isShowControl); final cursor = useMemoized( () => isShowControl || !isPlaying ? SystemMouseCursors.basic : SystemMouseCursors.none, [isShowControl, isPlaying]); final isSpeedSelectorVisible = useState(false); final selectedSpeed = useState(1.0); final speedSelectorPosition = useState(Offset.zero); final visualOffset = useState(0.0); final initialSpeed = useRef(1.0); void showSpeedSelectorCallback(Offset position) { isSpeedSelectorVisible.value = true; speedSelectorPosition.value = position; visualOffset.value = 0.0; initialSpeed.value = useAppStore().state.rate; } void hideSpeedSelectorCallback(double finalSpeed) { final initialIndex = speedStops.indexOf(initialSpeed.value); final finalIndex = speedStops.indexOf(finalSpeed); if (initialIndex == -1 || finalIndex == -1) return; visualOffset.value = (initialIndex - finalIndex) * speedSelectorItemWidth; Future.delayed( const Duration(milliseconds: 200), () { if (context.mounted) { isSpeedSelectorVisible.value = false; } }, ); } void updateSelectedSpeedCallback(double speed, double newVisualOffset) { selectedSpeed.value = speed; visualOffset.value = newVisualOffset; } final gesture = useGesture( showControl: showControl, hideControl: hideControl, showProgress: showProgress, showSpeedSelector: showSpeedSelectorCallback, hideSpeedSelector: hideSpeedSelectorCallback, updateSelectedSpeed: updateSelectedSpeedCallback, ); return MouseRegion( cursor: cursor, onHover: gesture.onHover, child: GestureDetector( behavior: HitTestBehavior.opaque, onTap: gesture.onTap, onTapDown: gesture.onTapDown, onDoubleTapDown: gesture.onDoubleTapDown, onLongPressStart: gesture.onLongPressStart, onLongPressMoveUpdate: gesture.onLongPressMoveUpdate, onLongPressEnd: gesture.onLongPressEnd, onLongPressCancel: gesture.onLongPressCancel, onPanStart: gesture.onPanStart, onPanUpdate: gesture.onPanUpdate, onPanEnd: gesture.onPanEnd, onPanCancel: gesture.onPanCancel, child: Stack( children: [ // 播放速度 if (isSpeedSelectorVisible.value) Positioned.fill( child: SpeedSelector( selectedSpeed: selectedSpeed.value, visualOffset: visualOffset.value, initialSpeed: initialSpeed.value, ), ), // 屏幕亮度 if (gesture.isLeftGesture && gesture.brightness != null) Positioned.fill( child: Center( child: Container( padding: const EdgeInsets.fromLTRB(12, 12, 18, 12), decoration: BoxDecoration( color: Colors.black54, borderRadius: BorderRadius.circular(8), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon( gesture.brightness == 0 ? Icons.brightness_low_rounded : gesture.brightness! < 1 ? Icons.brightness_medium_rounded : Icons.brightness_high_rounded, color: Colors.white, size: 24, ), const SizedBox(width: 12), SizedBox( width: 100, child: LinearProgressIndicator( value: gesture.brightness, borderRadius: BorderRadius.circular(4), backgroundColor: Colors.grey, valueColor: const AlwaysStoppedAnimation( Colors.white), ), ), ], ), ), ), ), // 音量 if (gesture.isRightGesture && gesture.volume != null) Positioned.fill( child: Center( child: Container( padding: const EdgeInsets.fromLTRB(12, 12, 18, 12), decoration: BoxDecoration( color: Colors.black54, borderRadius: BorderRadius.circular(8), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ Icon( gesture.volume == 0 ? Icons.volume_mute_rounded : gesture.volume! < 0.5 ? Icons.volume_down_rounded : Icons.volume_up_rounded, color: Colors.white, size: 24, ), const SizedBox(width: 12), SizedBox( width: 100, child: LinearProgressIndicator( value: gesture.volume, borderRadius: BorderRadius.circular(4), backgroundColor: Colors.grey, valueColor: const AlwaysStoppedAnimation( Colors.white), ), ), ], ), ), ), ), ], ), ), ); } } ================================================ FILE: lib/pages/player/overlays/minimal_progress_overlay.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/player.dart'; import 'package:iris/pages/player/control_bar/control_bar_slider.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/utils/format_duration_to_minutes.dart'; import 'package:provider/provider.dart'; class MinimalProgressOverlay extends StatelessWidget { const MinimalProgressOverlay({ super.key, required this.title, required this.file, }); final String title; final FileItem? file; @override Widget build(BuildContext context) { final progress = context.select( (player) => (position: player.position, duration: player.duration), ); const overlayTextStyle = TextStyle( color: Colors.white, decoration: TextDecoration.none, shadows: [ Shadow( color: Colors.black, offset: Offset(0, 0), blurRadius: 1, ), ], ); final isShowControl = usePlayerUiStore().select(context, (state) => state.isShowControl); final isShowProgress = usePlayerUiStore().select(context, (state) => state.isShowProgress); if (isShowProgress && !isShowControl && file?.type == ContentType.video) { return Stack( children: [ Positioned( left: 12, top: 12, child: Text( title, style: overlayTextStyle.copyWith(fontSize: 20, height: 1), ), ), Positioned( left: -28, right: -28, bottom: -16, height: 32, child: ControlBarSlider( disabled: true, ), ), Positioned( left: 12, bottom: 6, child: Text( '${formatDurationToMinutes(progress.position)} / ${formatDurationToMinutes(progress.duration)}', style: overlayTextStyle.copyWith(fontSize: 16, height: 2), ), ), ], ); } else { return const SizedBox.shrink(); } } } ================================================ FILE: lib/pages/player/overlays/speed_selector.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/globals.dart' show speedStops, speedSelectorItemWidth; class SpeedSelector extends HookWidget { const SpeedSelector({ super.key, required this.selectedSpeed, required this.visualOffset, required this.initialSpeed, }); final double selectedSpeed; final double visualOffset; final double initialSpeed; @override Widget build(BuildContext context) { final screenSize = MediaQuery.sizeOf(context); const double itemWidth = speedSelectorItemWidth; const double horizontalPadding = 12.0; final initialIndex = speedStops.indexOf(initialSpeed); final double initialCenterOffset = (screenSize.width / 2) - (initialIndex * itemWidth) - (itemWidth / 2) - horizontalPadding; final double targetOffset = initialCenterOffset + visualOffset; final double topPosition = screenSize.height / 2 - 30; return IgnorePointer( child: Stack( children: [ AnimatedPositioned( duration: const Duration(milliseconds: 150), curve: Curves.easeOutCubic, left: targetOffset, top: topPosition, child: Container( height: 60, decoration: BoxDecoration( color: Colors.black54, borderRadius: BorderRadius.circular(30), boxShadow: [ BoxShadow( color: Colors.black26, blurRadius: 10, spreadRadius: 2, ) ], ), child: Row( children: [ const SizedBox(width: horizontalPadding), ...speedStops.map((speed) { final bool isSelected = speed == selectedSpeed; return SizedBox( width: itemWidth, child: Center( child: AnimatedDefaultTextStyle( duration: const Duration(milliseconds: 150), style: TextStyle( fontSize: isSelected ? 20 : 16, fontWeight: isSelected ? FontWeight.bold : FontWeight.normal, color: isSelected ? Colors.white : Colors.white70, height: 1.0, ), child: Text('${speed}x'), ), ), ); }), const SizedBox(width: horizontalPadding), ], ), ), ), Positioned( left: screenSize.width / 2 - 1.5, top: topPosition - 10, child: Container( width: 3, height: 80, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(2), boxShadow: [ BoxShadow( color: Colors.white.withAlpha(100), blurRadius: 5, ) ]), ), ), ], ), ); } } ================================================ FILE: lib/pages/player/player.dart ================================================ import 'dart:async'; import 'dart:io'; import 'package:desktop_drop/desktop_drop.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/hooks/use_app_lifecycle.dart'; import 'package:iris/hooks/use_cover.dart'; import 'package:iris/hooks/use_keyboard.dart'; import 'package:iris/info.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/player.dart'; import 'package:iris/models/storages/local.dart'; import 'package:iris/pages/player/audio.dart'; import 'package:iris/pages/player/overlays/controls_overlay.dart'; import 'package:iris/pages/player/overlays/gesture_overlay.dart'; import 'package:iris/pages/player/overlays/minimal_progress_overlay.dart'; import 'package:iris/pages/player/video_view.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/utils/check_content_type.dart'; import 'package:iris/utils/logger.dart'; import 'package:iris/utils/platform.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:provider/provider.dart'; import 'package:window_manager/window_manager.dart'; class Player extends HookWidget { const Player({super.key}); @override Widget build(BuildContext context) { final width = context.select((player) => player.width); final height = context.select((player) => player.height); useAppLifecycle(); final cover = useCover(); final controlHideTimer = useRef(null); final progressHideTimer = useRef(null); final fit = useAppStore().select(context, (state) => state.fit); final playQueue = usePlayQueueStore().select(context, (state) => state.playQueue); final currentIndex = usePlayQueueStore().select(context, (state) => state.currentIndex); final int currentPlayIndex = useMemoized( () => playQueue.indexWhere((element) => element.index == currentIndex), [playQueue, currentIndex]); final FileItem? file = useMemoized( () => playQueue.isEmpty || currentPlayIndex < 0 ? null : playQueue[currentPlayIndex].file, [playQueue, currentPlayIndex]); final title = useMemoized( () => file != null ? playQueue.length > 1 ? '[${currentPlayIndex + 1}/${playQueue.length}] ${file.name}' : file.name : INFO.title, [file, currentPlayIndex, playQueue]); final focusNode = useFocusNode(); useEffect(() { focusNode.requestFocus(); return; }, []); void startControlHideTimer() { controlHideTimer.value = Timer( const Duration(seconds: 5), () { if (usePlayerUiStore().state.isShowControl && !usePlayerUiStore().state.isHovering) { usePlayerUiStore().updateIsShowControl(false); } }, ); } void startProgressHideTimer() { progressHideTimer.value = Timer( const Duration(seconds: 5), () { if (usePlayerUiStore().state.isShowProgress) { usePlayerUiStore().updateIsShowProgress(false); } }, ); } void resetControlHideTimer() { controlHideTimer.value?.cancel(); startControlHideTimer(); } void resetBottomProgressTimer() { progressHideTimer.value?.cancel(); startProgressHideTimer(); } void showControl() { usePlayerUiStore().updateIsShowControl(true); usePlayerUiStore().updateIsHovering(false); resetControlHideTimer(); } void hideControl() { usePlayerUiStore().updateIsShowControl(false); usePlayerUiStore().updateIsHovering(false); controlHideTimer.value?.cancel(); } Future showControlForHover(Future callback) async { try { context.read().saveProgress(); showControl(); usePlayerUiStore().updateIsHovering(true); await callback; showControl(); } catch (e) { logger(e.toString()); } } void showProgress() { usePlayerUiStore().updateIsShowProgress(true); resetBottomProgressTimer(); } final onKeyEvent = useKeyboard( showControl: showControl, showControlForHover: showControlForHover, showProgress: showProgress, ); useEffect(() { startControlHideTimer(); return () => controlHideTimer.value?.cancel(); }, []); useEffect(() { return () => progressHideTimer.value?.cancel(); }, []); useEffect(() { if (isDesktop) { windowManager.setTitle(title); } return; }, [title]); final Size windowSize = useMemoized( () => MediaQuery.sizeOf(context), [MediaQuery.sizeOf(context)]); final scaleFactor = useMemoized( () => View.of(context).physicalSize.width / windowSize.width, [View.of(context).physicalSize.width], ); final videoViewSize = useMemoized(() { if (fit != BoxFit.none || width == 0 || height == 0) { return windowSize; } else { return Size(width / scaleFactor, height / scaleFactor); } }, [fit, windowSize, width, height, scaleFactor]); final videoViewOffset = useMemoized( () => fit == BoxFit.none ? Offset( (windowSize.width - videoViewSize.width) / 2, (windowSize.height - videoViewSize.height) / 2, ) : Offset(0, 0), [fit, windowSize, videoViewSize]); return DropTarget( onDragDone: (details) async { final files = details.files .map((file) => checkContentType(file.path) == ContentType.video || checkContentType(file.path) == ContentType.audio ? file.path : null) .where((element) => element != null) .toList() as List; if (files.isNotEmpty) { final firstFile = files[0]; if (firstFile.isEmpty) return; final playQueue = await getLocalPlayQueue(firstFile); if (playQueue == null || playQueue.playQueue.isEmpty) return; final List filteredPlayQueue = []; for (final item in playQueue.playQueue) { final file = item.file; if (files.contains(file.uri)) { filteredPlayQueue.add(item); } } if (filteredPlayQueue.isEmpty) return; useAppStore().updateAutoPlay(true); usePlayQueueStore().update( playQueue: filteredPlayQueue, index: playQueue.currentIndex); } }, child: PopScope( canPop: false, onPopInvokedWithResult: (bool didPop, Object? result) async { if (!didPop) { await context.read().saveProgress(); if (isDesktop) { windowManager.close(); } else { SystemNavigator.pop(); exit(0); } } }, child: KeyboardListener( focusNode: focusNode, onKeyEvent: onKeyEvent, child: Stack( children: [ // Video Positioned( left: videoViewOffset.dx, top: videoViewOffset.dy, width: videoViewSize.width, height: videoViewSize.height, child: VideoView( key: ValueKey(file?.uri), fit: fit, ), ), Positioned.fill( child: MinimalProgressOverlay( title: title, file: file, ), ), // Audio if (file?.type == ContentType.audio) Positioned.fill( child: Audio(cover: cover), ), Positioned.fill( child: GestureOverlay( showControl: showControl, hideControl: hideControl, showProgress: showProgress, ), ), Positioned.fill( child: ControlsOverlay( file: file, title: title, showControl: showControl, showControlForHover: showControlForHover, hideControl: hideControl, showProgress: showProgress, ), ), ], ), ), ), ); } } ================================================ FILE: lib/pages/player/player_view.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/hooks/player/use_fvp_player.dart'; import 'package:iris/hooks/player/use_media_kit_player.dart'; import 'package:iris/models/player.dart'; import 'package:iris/models/store/app_state.dart'; import 'package:iris/pages/player/player.dart'; import 'package:provider/provider.dart'; class PlayerView extends HookWidget { const PlayerView({super.key, required this.playerBackend}); final PlayerBackend playerBackend; @override Widget build(BuildContext context) { switch (playerBackend) { case PlayerBackend.mediaKit: return const _MediaKitPlayerHost(); case PlayerBackend.fvp: return const _FvpPlayerHost(); } } } class _MediaKitPlayerHost extends HookWidget { const _MediaKitPlayerHost(); @override Widget build(BuildContext context) { final player = useMediaKitPlayer(context); return Provider.value( value: player, child: const Player(key: ValueKey('media_kit_player')), ); } } class _FvpPlayerHost extends HookWidget { const _FvpPlayerHost(); @override Widget build(BuildContext context) { final player = useFvpPlayer(context); return Provider.value( value: player, child: const Player(key: ValueKey('fvp_player')), ); } } ================================================ FILE: lib/pages/player/title_bar.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/info.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; class TitleBar extends HookWidget { const TitleBar({ super.key, this.title, this.actions, this.color, this.overlayColor, this.saveProgress, }); final String? title; final List? actions; final Color? color; final WidgetStateProperty? overlayColor; final Future Function()? saveProgress; @override Widget build(BuildContext context) { final t = getLocalizations(context); final isAlwaysOnTop = usePlayerUiStore().select(context, (state) => state.isAlwaysOnTop); final isFullScreen = usePlayerUiStore().select(context, (state) => state.isFullScreen); return Container( padding: isDesktop ? const EdgeInsets.fromLTRB(12, 4, 4, 8) : const EdgeInsets.fromLTRB(16, 8, 8, 8), decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Colors.black87.withValues(alpha: 0.6), Colors.black87.withValues(alpha: 0.25), Colors.black87.withValues(alpha: 0), ], ), ), child: ExcludeFocus( child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.asset( 'assets/images/logo_transparent.png', width: 32, height: 32, ), const SizedBox(width: 8), Expanded( child: Text( title!.isEmpty ? INFO.title : title!, maxLines: 1, textAlign: TextAlign.start, style: TextStyle( fontSize: 16, overflow: TextOverflow.ellipsis, color: color, ), ), ), Row( children: [ ...actions ?? [], if (isDesktop) ...[ FutureBuilder( future: () async { final isMaximized = isDesktop && await windowManager.isMaximized(); return isMaximized; }(), builder: ( BuildContext context, AsyncSnapshot snapshot, ) { final isMaximized = snapshot.data ?? false; return Row( children: [ Visibility( visible: !isFullScreen, child: IconButton( tooltip: isAlwaysOnTop ? '${t.always_on_top_on} ( F10 )' : '${t.always_on_top_off} ( F10 )', icon: Icon( isAlwaysOnTop ? Icons.push_pin_rounded : Icons.push_pin_outlined, size: 18, color: color, ), onPressed: usePlayerUiStore().toggleIsAlwaysOnTop, style: ButtonStyle(overlayColor: overlayColor), ), ), Visibility( visible: isFullScreen, child: IconButton( tooltip: isFullScreen ? '${t.exit_fullscreen} ( Escape, F11, Enter )' : '${t.enter_fullscreen} ( F11, Enter )', icon: Icon( isFullScreen ? Icons.close_fullscreen_rounded : Icons.open_in_full_rounded, size: 18, color: color, ), onPressed: () async { usePlayerUiStore() .updateFullScreen(!isFullScreen); }, style: ButtonStyle(overlayColor: overlayColor), ), ), Visibility( visible: !isFullScreen, child: IconButton( onPressed: () => windowManager.minimize(), icon: Icon( Icons.remove_rounded, color: color, ), style: ButtonStyle(overlayColor: overlayColor), ), ), Visibility( visible: !isFullScreen, child: IconButton( onPressed: () async { if (isMaximized) { await windowManager.unmaximize(); } else { await windowManager.maximize(); } }, icon: isMaximized ? RotatedBox( quarterTurns: 2, child: Icon( Icons.filter_none_rounded, size: 18, color: color, ), ) : Icon( Icons.crop_din_rounded, size: 20, color: color, ), style: ButtonStyle(overlayColor: overlayColor), ), ), ], ); }, ), IconButton( onPressed: () async { await saveProgress?.call(); windowManager.close(); }, icon: Icon( Icons.close_rounded, color: color, ), style: ButtonStyle( overlayColor: WidgetStateProperty.resolveWith( (Set states) { if (states.contains(WidgetState.pressed)) { return Colors.red.withValues(alpha: 0.4); } else if (states.contains(WidgetState.hovered)) { return Colors.red.withValues(alpha: 0.5); } return null; }), ), ), ], ], ), ], ), ), ); } } ================================================ FILE: lib/pages/player/video_view.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/models/player.dart'; import 'package:media_kit_video/media_kit_video.dart'; import 'package:provider/provider.dart'; import 'package:video_player/video_player.dart'; class VideoView extends HookWidget { const VideoView({ super.key, required this.fit, }); final BoxFit fit; @override Widget build(BuildContext context) { final player = context.read(); return switch (player) { MediaKitPlayer player => Video( controller: player.controller, controls: NoVideoControls, fit: fit == BoxFit.none ? BoxFit.contain : fit, ), FvpPlayer player => FittedBox( fit: fit, child: SizedBox( width: player.width, height: player.height, child: VideoPlayer(player.controller), ), ), _ => Container(), }; } } ================================================ FILE: lib/store/persistent_store.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; abstract class PersistentStore extends Store { PersistentStore(super.initialState) { _init(); } Future _init() async { final loaded = await load(); if (loaded != null) { set(loaded); } } Future load(); Future save(T state); @override @mustCallSuper Future dispose() async { await save(state); await super.dispose(); } } ================================================ FILE: lib/store/use_app_store.dart ================================================ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/store/app_state.dart'; import 'package:iris/store/persistent_store.dart'; import 'package:iris/utils/logger.dart'; class AppStore extends PersistentStore { AppStore() : super(AppState()); Future updateAutoPlay(bool autoPlay) async => set(state.copyWith(autoPlay: autoPlay)); Future updateShuffle(bool shuffle) async { set(state.copyWith(shuffle: shuffle)); await save(state); } Future updateRepeat(Repeat repeat) async { set(state.copyWith(repeat: repeat)); await save(state); } Future toggleRepeat() async { switch (state.repeat) { case Repeat.none: set(state.copyWith(repeat: Repeat.one)); break; case Repeat.one: set(state.copyWith(repeat: Repeat.all)); break; case Repeat.all: set(state.copyWith(repeat: Repeat.none)); break; } await save(state); } Future updateFit(BoxFit fit) async { set(state.copyWith(fit: fit)); await save(state); } Future toggleFit() async { switch (state.fit) { case BoxFit.contain: set(state.copyWith(fit: BoxFit.fill)); break; case BoxFit.fill: set(state.copyWith(fit: BoxFit.cover)); break; case BoxFit.cover: set(state.copyWith(fit: BoxFit.none)); break; case BoxFit.none: set(state.copyWith(fit: BoxFit.contain)); break; default: break; } await save(state); } Future updateRate(double value) async { logger('updateRate: $value'); set(state.copyWith(rate: value)); await save(state); } Future updateVolume(int volume) async { set(state.copyWith( volume: volume < 0 ? 0 : volume > 100 ? 100 : volume)); await save(state); } Future updateMute(bool isMuted) async { set(state.copyWith(isMuted: isMuted)); await save(state); } Future toggleMute() async { set(state.copyWith(isMuted: !state.isMuted)); save(state); } Future updateThemeMode(ThemeMode themeMode) async { set(state.copyWith(themeMode: themeMode)); await save(state); } Future updateLanguage(String language) async { set(state.copyWith(language: language)); await save(state); } Future toggleAutoResize() async { set(state.copyWith(autoResize: !state.autoResize)); await save(state); } Future toggleAlwaysPlayFromBeginning() async { set(state.copyWith( alwaysPlayFromBeginning: !state.alwaysPlayFromBeginning)); await save(state); } Future updatePlayerBackend(PlayerBackend backend) async { set(state.copyWith(playerBackend: backend)); await save(state); } Future updateSortBy(SortBy sortBy) async { set(state.copyWith(sortBy: sortBy)); await save(state); } Future updateSortOrder(SortOrder sortOrder) async { set(state.copyWith(sortOrder: sortOrder)); await save(state); } Future updateFolderFirst(bool folderFirst) async { set(state.copyWith(folderFirst: folderFirst)); await save(state); } Future updateOrientation(ScreenOrientation orientation) async { set(state.copyWith(orientation: orientation)); await save(state); } @override Future load() async { logger('Loading AppState'); try { AndroidOptions getAndroidOptions() => const AndroidOptions( encryptedSharedPreferences: true, ); final storage = FlutterSecureStorage(aOptions: getAndroidOptions()); String? appState = await storage.read(key: 'app_state'); if (appState != null) { return AppState.fromJson(json.decode(appState)).copyWith( autoPlay: false, ); } } catch (e) { logger('Error loading AppState: $e'); } return null; } @override Future save(AppState state) async { try { AndroidOptions getAndroidOptions() => const AndroidOptions( encryptedSharedPreferences: true, ); final storage = FlutterSecureStorage(aOptions: getAndroidOptions()); await storage.write(key: 'app_state', value: json.encode(state.toJson())); } catch (e) { logger('Error saving AppState: $e'); } } } AppStore useAppStore() => create(() => AppStore()); ================================================ FILE: lib/store/use_history_store.dart ================================================ import 'dart:convert'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/progress.dart'; import 'package:iris/models/store/history_state.dart'; import 'package:iris/store/persistent_store.dart'; import 'package:iris/utils/logger.dart'; class HistoryStore extends PersistentStore { HistoryStore() : super(HistoryState()); Progress? findById(String id) => state.history[id]; Future add(Progress progress) async { set(state.copyWith( history: { ...state.history, progress.file.getID(): progress, }, )); await save(state); } Future remove(Progress progress) async { set(state.copyWith( history: {...state.history}..remove(progress.file.getID()))); await save(state); } Future clear() async { set(state.copyWith(history: {})); await save(state); } @override Future load() async { logger('Loading HistoryState'); try { AndroidOptions getAndroidOptions() => const AndroidOptions( encryptedSharedPreferences: true, ); final storage = FlutterSecureStorage(aOptions: getAndroidOptions()); String? historyState = await storage.read(key: 'history_state'); if (historyState != null) { return HistoryState.fromJson(json.decode(historyState)); } } catch (e) { logger('Error loading HistoryState: $e'); } return null; } @override Future save(HistoryState state) async { try { AndroidOptions getAndroidOptions() => const AndroidOptions( encryptedSharedPreferences: true, ); final storage = FlutterSecureStorage(aOptions: getAndroidOptions()); await storage.write( key: 'history_state', value: json.encode(state.toJson())); } catch (e) { logger('Error saving HistoryState: $e'); } } } HistoryStore useHistoryStore() => create(() => HistoryStore()); ================================================ FILE: lib/store/use_play_queue_store.dart ================================================ import 'dart:convert'; import 'dart:io'; import 'dart:math'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/storages/local.dart'; import 'package:iris/models/store/play_queue_state.dart'; import 'package:iris/store/persistent_store.dart'; import 'package:iris/globals.dart' as globals; import 'package:iris/store/use_app_store.dart'; import 'package:iris/utils/check_content_type.dart'; import 'package:iris/utils/get_shuffle_play_queue.dart'; import 'package:iris/utils/logger.dart'; import 'package:iris/utils/platform.dart'; import 'package:saf_util/saf_util.dart'; class PlayQueueStore extends PersistentStore { PlayQueueStore() : super(PlayQueueState()); Future update({ required List playQueue, int? index, }) async { set(state.copyWith( playQueue: playQueue, currentIndex: index ?? state.currentIndex, )); if (Platform.isAndroid && state.playQueue.any((e) => e.file.uri.startsWith('content://'))) { return; } await save(state); } Future updateCurrentIndex(int index) async { set(state.copyWith(currentIndex: index)); if (Platform.isAndroid && state.playQueue.any((e) => globals.initUri == e.file.uri && e.file.uri.startsWith('content://'))) { return; } await save(state); } Future add(List files) async { final int maxIndex = state.playQueue.isEmpty ? -1 : state.playQueue.map((e) => e.index).reduce(max); final int startIndex = maxIndex + 1; final List playQueue = files .asMap() .entries .map((entry) => PlayQueueItem(file: entry.value, index: startIndex + entry.key)) .toList(); set(state.copyWith(playQueue: [...state.playQueue, ...playQueue])); if (Platform.isAndroid && state.playQueue.any((e) => globals.initUri == e.file.uri && e.file.uri.startsWith('content://'))) { return; } await save(state); } Future remove(PlayQueueItem item) async { if (state.playQueue.length <= 1) { set(state.copyWith(playQueue: [], currentIndex: 0)); } else { final index = state.playQueue.indexOf(item); if (state.playQueue[index].index == state.currentIndex) { if (index + 1 < state.playQueue.length) { set(state.copyWith( playQueue: [...state.playQueue]..remove(item), currentIndex: state.playQueue[index + 1].index, )); } else { set(state.copyWith( playQueue: [...state.playQueue]..remove(item), currentIndex: state.playQueue[index - 1].index, )); } } else { set(state.copyWith( playQueue: [...state.playQueue]..remove(item), )); } } if (Platform.isAndroid && state.playQueue.any((e) => e.file.uri.startsWith('content://'))) { return; } await save(state); } Future previous() async { final int currentPlayIndex = state.playQueue .indexWhere((element) => element.index == state.currentIndex); if (currentPlayIndex <= 0) { await updateCurrentIndex(state.playQueue.last.index); } else { await updateCurrentIndex(state.playQueue[currentPlayIndex - 1].index); } } Future next() async { final int currentPlayIndex = state.playQueue .indexWhere((element) => element.index == state.currentIndex); if (currentPlayIndex >= state.playQueue.length - 1) { await updateCurrentIndex(state.playQueue.first.index); } else { await updateCurrentIndex(state.playQueue[currentPlayIndex + 1].index); } } Future shuffle() async => update( playQueue: getShufflePlayQueue(state.playQueue, state.currentIndex), index: state.currentIndex, ); Future sort() async => update( playQueue: [...state.playQueue] ..sort((a, b) => a.index.compareTo(b.index)), index: state.currentIndex, ); @override Future load() async { logger('Loading PlayQueueState'); try { if (isDesktop && globals.arguments.isNotEmpty) { String uri = globals.arguments[0]; // 在线播放 if (RegExp(r'^(http://|https://)').hasMatch(uri)) { final state = PlayQueueState( playQueue: [ PlayQueueItem( file: FileItem( name: uri, uri: uri, ), index: 0, ) ], currentIndex: 0, ); await useAppStore().updateAutoPlay(true); save(state); return state; } // 本地播放 final filePath = uri; if (isMediaFile(filePath)) { final state = await getLocalPlayQueue(filePath); if (state != null && state.playQueue.isNotEmpty) { await useAppStore().updateAutoPlay(true); save(state); return state; } } } final uri = globals.initUri; // Android if (uri != null && Platform.isAndroid) { final file = await SafUtil().documentFileFromUri(uri, false); if (file != null) { await useAppStore().updateAutoPlay(true); return PlayQueueState( playQueue: [ PlayQueueItem( file: FileItem( name: file.name, uri: file.uri, size: file.length, ), index: 0, ), ], currentIndex: 0, ); } } AndroidOptions getAndroidOptions() => const AndroidOptions( encryptedSharedPreferences: true, ); final storage = FlutterSecureStorage(aOptions: getAndroidOptions()); String? appState = await storage.read(key: 'playQueue_state'); if (appState != null) { return PlayQueueState.fromJson(json.decode(appState)); } } catch (e) { logger('Error loading PlayQueueState: $e'); } return null; } @override Future save(PlayQueueState state) async { try { AndroidOptions getAndroidOptions() => const AndroidOptions( encryptedSharedPreferences: true, ); final storage = FlutterSecureStorage(aOptions: getAndroidOptions()); await storage.write( key: 'playQueue_state', value: json.encode(state.toJson())); } catch (e) { logger('Error saving PlayQueueState: $e'); } } } PlayQueueStore usePlayQueueStore() => create(() => PlayQueueStore()); ================================================ FILE: lib/store/use_player_ui_store.dart ================================================ import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/store/player_ui_state.dart'; import 'package:iris/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; class PlayerUiStore extends Store { PlayerUiStore() : super(const PlayerUiState()); void updateAspectRatio(double ratio) { set(state.copyWith(aspectRatio: ratio)); } Future toggleIsAlwaysOnTop() async { if (isDesktop) { windowManager.setAlwaysOnTop(!state.isAlwaysOnTop); set(state.copyWith(isAlwaysOnTop: !state.isAlwaysOnTop)); } } Future updateFullScreen(bool bool) async { if (isDesktop) { windowManager.setFullScreen(!state.isFullScreen); set(state.copyWith(isFullScreen: !state.isFullScreen)); } } void updateIsSeeking(bool bool) { set(state.copyWith(isSeeking: bool)); } void updateIsHovering(bool bool) { set(state.copyWith(isHovering: bool)); } void updateIsShowControl(bool bool) { set(state.copyWith(isShowControl: bool)); } void updateIsShowProgress(bool bool) { set(state.copyWith(isShowProgress: bool)); } } PlayerUiStore usePlayerUiStore() => create(() => PlayerUiStore()); ================================================ FILE: lib/store/use_storage_store.dart ================================================ import 'dart:convert'; import 'package:collection/collection.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/models/store/storage_state.dart'; import 'package:iris/store/persistent_store.dart'; import 'package:iris/utils/logger.dart'; class StorageStore extends PersistentStore { StorageStore() : super(StorageState()); Storage? findById(String id) => state.storages.firstWhereOrNull((storage) => storage.id == id); Future addStorage(Storage storage) async { set(state.copyWith(storages: [...state.storages, storage])); await save(state); } Future updateStorage(int index, Storage storage) async { if (index < 0 || index >= state.storages.length) { return; } set(state.copyWith( storages: [...state.storages] ..removeAt(index) ..insert(index, storage))); await save(state); } Future removeStorage(Storage storage) async { set(state.copyWith(storages: [...state.storages]..remove(storage))); await save(state); } Future addFavorite(Favorite favorite) async { set(state.copyWith(favorites: [...state.favorites, favorite])); await save(state); } Future removeFavorite(Favorite favorite) async { set(state.copyWith(favorites: [...state.favorites]..remove(favorite))); await save(state); } Future updateCurrentStorage(Storage? storage) async { set(state.copyWith(currentStorage: storage)); await save(state); } Future updateCurrentPath(List path) async { set(state.copyWith(currentPath: path)); await save(state); } @override Future load() async { logger('Loading StorageState'); try { AndroidOptions getAndroidOptions() => const AndroidOptions( encryptedSharedPreferences: true, ); final storage = FlutterSecureStorage(aOptions: getAndroidOptions()); String? storageState = await storage.read(key: 'storage_state'); if (storageState != null) { return StorageState.fromJson(json.decode(storageState)); } } catch (e) { logger('Error loading StorageState: $e'); } return null; } @override Future save(StorageState state) async { try { AndroidOptions getAndroidOptions() => const AndroidOptions( encryptedSharedPreferences: true, ); final storage = FlutterSecureStorage(aOptions: getAndroidOptions()); await storage.write( key: 'storage_state', value: json.encode(state.toJson())); } catch (e) { logger('Error saving StorageState: $e'); } } } StorageStore useStorageStore() => create(() => StorageStore()); ================================================ FILE: lib/theme.dart ================================================ import 'package:dynamic_color/dynamic_color.dart'; import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; ThemeData baseTheme(BuildContext context) { return ThemeData( popupMenuTheme: PopupMenuThemeData( menuPadding: const EdgeInsets.all(0), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), shadowColor: null, elevation: 0, ), listTileTheme: ListTileThemeData( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), ), ), ); } ColorScheme customColorScheme = ColorScheme.fromSeed(seedColor: const Color(0xFFB3BCDF)); ColorScheme customDarkColorScheme = ColorScheme.fromSeed( seedColor: const Color(0xFFB3BCDF), brightness: Brightness.dark); class CustomTheme { final ThemeData light; final ThemeData dark; CustomTheme({required this.light, required this.dark}); } CustomTheme getTheme({ required BuildContext context, required ColorScheme? lightDynamic, required ColorScheme? darkDynamic, }) { ColorScheme colorScheme = lightDynamic != null ? lightDynamic.harmonized() : customColorScheme; ColorScheme darkColorScheme = darkDynamic != null ? darkDynamic.harmonized() : customDarkColorScheme; final base = baseTheme(context); final lightTheme = ThemeData( colorScheme: colorScheme, useMaterial3: true, textTheme: GoogleFonts.notoSansScTextTheme(), popupMenuTheme: base.popupMenuTheme, dropdownMenuTheme: base.dropdownMenuTheme, listTileTheme: base.listTileTheme, ); final darkTheme = ThemeData.dark(useMaterial3: true).copyWith( colorScheme: darkColorScheme, textTheme: GoogleFonts.notoSansScTextTheme( ThemeData.dark(useMaterial3: true) .copyWith(colorScheme: darkColorScheme) .textTheme, ), popupMenuTheme: base.popupMenuTheme, dropdownMenuTheme: base.dropdownMenuTheme, listTileTheme: base.listTileTheme, ); return CustomTheme(light: lightTheme, dark: darkTheme); } ================================================ FILE: lib/utils/check_content_type.dart ================================================ import 'package:iris/models/file.dart'; class Formats { static const List audio = [ 'aac', 'aiff', 'alac', 'amr', 'ape', 'caf', 'cda', 'dsd', 'dts', 'flac', 'm4a', 'midi', 'mp3', 'mpc', 'oga', 'ogg', 'opus', 'raw', 'spx', 'tak', 'tta', 'wav', 'wma', 'wv', ]; static const List video = [ '3gp', 'amv', 'asf', 'avi', 'divx', 'dpx', 'drc', 'dv', 'f4v', 'flv', 'h264', 'h265', 'hevc', 'm2ts', 'm4p', 'm4v', 'mkv', 'mng', 'mov', 'mp2', 'mp4', 'mpe', 'mpeg', 'mpg', 'mpv', 'mts', 'mxf', 'nsv', 'ogv', 'qt', 'rm', 'rmvb', 'ts', 'vob', 'webm', 'wmv', 'yuv', ]; static const List image = [ 'avif', 'bmp', 'exif', 'gif', 'heif', 'ico', 'jpeg', 'jpg', 'pbm', 'pgm', 'png', 'ppm', 'raw', 'svg', 'tiff', 'webp', ]; } ContentType checkContentType(String name) { final fileTypeMap = { ContentType.audio: Formats.audio, ContentType.video: Formats.video, ContentType.image: Formats.image, }; for (var entry in fileTypeMap.entries) { if (entry.value.any((format) => name.toLowerCase().endsWith('.$format'))) { return entry.key; } } return ContentType.other; } bool isMediaFile(String name) => checkContentType(name) == ContentType.video || checkContentType(name) == ContentType.audio; bool isVideoFile(String name) => checkContentType(name) == ContentType.video; bool isAudioFile(String name) => checkContentType(name) == ContentType.audio; bool isImageFile(String name) => checkContentType(name) == ContentType.image; ================================================ FILE: lib/utils/check_data_source_type.dart ================================================ import 'dart:io'; import 'package:iris/models/file.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:video_player/video_player.dart'; DataSourceType checkDataSourceType(FileItem file) { if (Platform.isAndroid && file.uri.startsWith('content://')) { return DataSourceType.contentUri; } switch (file.storageType) { case StorageType.internal: case StorageType.network: case StorageType.sdcard: case StorageType.usb: return DataSourceType.file; case StorageType.webdav: case StorageType.ftp: case StorageType.none: return DataSourceType.network; } } ================================================ FILE: lib/utils/data_migration.dart ================================================ import 'dart:io'; import 'package:iris/utils/logger.dart'; import 'package:path_provider/path_provider.dart'; import 'package:path/path.dart' as p; Future dataMigration() async { try { if (Platform.isWindows) { final String newDataPath = (await getApplicationSupportDirectory()).path; final String oldDataPath = p.normalize('$newDataPath/../../nini22p.iris/iris'); logger('newDataPath: $newDataPath'); logger('oldDataPath: $oldDataPath'); final bool newDataExist = await File('$newDataPath/flutter_secure_storage.dat').exists(); final bool oldDataExist = await File('$oldDataPath/flutter_secure_storage.dat').exists(); if (!newDataExist && oldDataExist) { logger('Find old data in $oldDataPath'); final Directory oldDir = Directory(oldDataPath); final Directory newDir = Directory(newDataPath); if (await oldDir.exists()) { if (!await newDir.exists()) { await newDir.create(recursive: true); } await for (var entity in oldDir.list()) { if (entity is File) { final String newFilePath = p.join(newDir.path, p.basename(entity.path)); await entity.copy(newFilePath); logger('Copied ${entity.path} to $newFilePath'); } } logger('Data migration completed'); return true; } } } } catch (e) { return false; } return false; } ================================================ FILE: lib/utils/file_size_convert.dart ================================================ String fileSizeConvert(int fileSize) => (fileSize / 1024 / 1024).toStringAsFixed(2); ================================================ FILE: lib/utils/files_sort.dart ================================================ import 'package:iris/models/file.dart'; import 'package:iris/models/store/app_state.dart'; List filesSort({ required List files, SortBy sortBy = SortBy.name, SortOrder sortOrder = SortOrder.asc, bool folderFirst = true, }) { final sortedFiles = files.toList(); sortedFiles.sort((a, b) { if (folderFirst) { if (a.isDir && !b.isDir) return -1; if (!a.isDir && b.isDir) return 1; } int result; switch (sortBy) { case SortBy.name: result = a.name.toLowerCase().compareTo(b.name.toLowerCase()); break; case SortBy.size: result = a.size.compareTo(b.size); break; case SortBy.lastModified: result = (a.lastModified ?? DateTime(0)) .compareTo(b.lastModified ?? DateTime(0)); break; } return sortOrder == SortOrder.asc ? result : -result; }); return sortedFiles; } ================================================ FILE: lib/utils/format_duration_to_minutes.dart ================================================ String formatDurationToMinutes(Duration duration) { int totalMinutes = duration.inHours * 60 + duration.inMinutes.remainder(60); String twoDigits(int n) => n.toString().padLeft(2, '0'); String twoDigitMinutes = twoDigits(totalMinutes); String twoDigitSeconds = twoDigits(duration.inSeconds.remainder(60)); return "$twoDigitMinutes:$twoDigitSeconds"; } ================================================ FILE: lib/utils/get_latest_release.dart ================================================ import 'dart:convert'; import 'dart:io'; import 'package:http/http.dart' as http; import 'package:iris/utils/logger.dart'; import 'package:package_info_plus/package_info_plus.dart'; class Release { final String version; final String url; final String downloadUrl; final int size; final String changeLog; Release({ required this.version, required this.url, required this.downloadUrl, required this.size, required this.changeLog, }); } Future getLatestRelease() async { String platform = ''; if (Platform.isWindows) { platform = 'windows'; } else if (Platform.isAndroid) { platform = 'android'; } else { logger('Unsupported platform'); return null; } PackageInfo packageInfo = await PackageInfo.fromPlatform(); if (packageInfo.version.isNotEmpty) { const api = 'https://api.github.com/repos/nini22P/iris/releases/latest'; try { final response = await http.get(Uri.parse(api)); if (response.statusCode == 200) { final data = json.decode(response.body); final List assets = data['assets']; final String version = data['tag_name'] ?? 'Unknown version'; final String url = data['html_url'] ?? 'https://github.com/nini22P/iris/releases/'; final filtteredAssets = assets.where((assets) => assets['name'].toString().toLowerCase().contains(platform)); final downloadUrl = filtteredAssets.first['browser_download_url']; final size = filtteredAssets.first['size']; final String changeLog = data['body']; final bool isUpdate = isVersionUpdated(packageInfo.version, version); if (isUpdate) { return Release( version: version, url: url, downloadUrl: downloadUrl, size: size, changeLog: changeLog, ); } else { return null; } } else { logger('Failed to load latest release: ${response.statusCode}'); return null; } } catch (e) { logger('Error fetching latest release: $e'); return null; } } else { return null; } } bool isVersionUpdated(String currentVersion, String latestVersion) { List currentVersionParts = currentVersion.replaceAll('v', '').split('.').map(int.parse).toList(); List latestVersionParts = latestVersion.replaceAll('v', '').split('.').map(int.parse).toList(); for (int i = 0; i < currentVersionParts.length; i++) { if (i >= latestVersionParts.length || currentVersionParts[i] < latestVersionParts[i]) { return true; } else if (currentVersionParts[i] > latestVersionParts[i]) { return false; } } return false; } ================================================ FILE: lib/utils/get_localizations.dart ================================================ import 'package:flutter/material.dart'; import 'package:iris/l10n/app_localizations.dart'; AppLocalizations getLocalizations(BuildContext context) { return AppLocalizations.of(context)!; } ================================================ FILE: lib/utils/get_shuffle_play_queue.dart ================================================ import 'dart:math'; import 'package:iris/models/file.dart'; List getShufflePlayQueue( List playQueue, int index) { if (playQueue.isEmpty) return []; final int seed = DateTime.now().millisecondsSinceEpoch; final Random random = Random(seed); final List shuffledList = [...playQueue]; final int currentItemIndex = shuffledList.indexWhere((element) => element.index == index); if (currentItemIndex == -1) { return shuffledList; } final PlayQueueItem currentItem = shuffledList.removeAt(currentItemIndex); for (int i = shuffledList.length - 1; i > 0; i--) { final int j = random.nextInt(i + 1); final temp = shuffledList[i]; shuffledList[i] = shuffledList[j]; shuffledList[j] = temp; } shuffledList.insert(0, currentItem); return shuffledList; } ================================================ FILE: lib/utils/get_subtitle_map.dart ================================================ import 'package:iris/models/file.dart'; import 'package:path/path.dart' as path; Map> getSubtitleMap({ required List files, required String Function(T) getName, required String Function(T) getUri, }) { final subtitleExtensions = {'ass', 'srt', 'vtt', 'sub'}; final Map> subtitleMap = {}; for (final file in files) { final fileName = getName(file); final fileExt = path.extension(fileName).replaceFirst('.', '').toLowerCase(); if (subtitleExtensions.contains(fileExt)) { final mediaBaseName = path.basenameWithoutExtension(fileName).split('.').first; final subBaseName = path.basenameWithoutExtension(fileName); final regex = RegExp(r'^' + RegExp.escape(mediaBaseName) + r'\.(.+?)$', caseSensitive: false); final match = regex.firstMatch(subBaseName); final subTitleName = match?.group(1) ?? subBaseName; final subtitle = Subtitle( name: subTitleName, uri: getUri(file), ); subtitleMap.putIfAbsent(mediaBaseName, () => []).add(subtitle); } } return subtitleMap; } ================================================ FILE: lib/utils/logger.dart ================================================ import 'dart:developer'; import 'package:flutter/foundation.dart'; void logger(String message) { if (kDebugMode) { log(message); } } ================================================ FILE: lib/utils/path.dart ================================================ import 'dart:io'; import 'package:path/path.dart' as p; import 'package:path_provider/path_provider.dart'; Future getExecutableDirPath() async { String resolvedExecutablePath = Platform.resolvedExecutable; return p.dirname(resolvedExecutablePath); } Future getTempPath() async { final directory = await getTemporaryDirectory(); final String tempPath = p.join(directory.path, 'IRIS'); if (!Directory(tempPath).existsSync()) { Directory(tempPath).createSync(recursive: true); } return tempPath; } ================================================ FILE: lib/utils/path_conv.dart ================================================ import 'package:iris/utils/logger.dart'; import 'package:path/path.dart' as p; List pathConv(String path) { try { String normalizedPath = p.normalize(path.trim()); if (normalizedPath.isEmpty || normalizedPath == '.') { return []; } if (normalizedPath == '/' || normalizedPath == '\\') { return ['/']; } final List result = normalizedPath .replaceAll('\\', '/') .split('/') .where((element) => element.isNotEmpty) .toList(); if (path.startsWith('\\\\')) { return ['\\\\${result[0]}', ...result.sublist(1)]; } if (path.startsWith('/')) { return ['/', ...result]; } return result; } on FormatException catch (e) { logger("Error decoding: $e"); return []; } } ================================================ FILE: lib/utils/platform.dart ================================================ import 'dart:io'; final bool isDesktop = Platform.isWindows || Platform.isLinux || Platform.isMacOS; final bool isWindows = Platform.isWindows; final bool isLinux = Platform.isLinux; final bool isMacOS = Platform.isMacOS; final bool isAndroid = Platform.isAndroid; final bool isIOS = Platform.isIOS; ================================================ FILE: lib/utils/request_storage_permission.dart ================================================ import 'dart:io'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:iris/globals.dart' as globals; import 'package:permission_handler/permission_handler.dart'; Future requestStoragePermission() async { if (!Platform.isAndroid) { return; } if (globals.storagePermissionStatus != PermissionStatus.granted) { if (await isAndroid11OrHigher()) { globals.storagePermissionStatus = await Permission.manageExternalStorage.request(); } else { globals.storagePermissionStatus = await Permission.storage.request(); if (globals.storagePermissionStatus != PermissionStatus.granted) { return await requestStoragePermission(); } else { return; } } } } Future isAndroid11OrHigher() async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; return androidInfo.version.sdkInt >= 30; } ================================================ FILE: lib/utils/url.dart ================================================ import 'package:url_launcher/url_launcher.dart'; Future launchURL(String url) async { if (!await launchUrl(Uri.parse(url))) { throw Exception('Could not launch $url'); } } ================================================ FILE: lib/widgets/bottom_sheets/show_open_link_bottom_sheet.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/models/file.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/utils/get_localizations.dart'; Future showOpenLinkBottomSheet(BuildContext context) async => await showModalBottomSheet( context: context, isScrollControlled: true, builder: (context) => SingleChildScrollView( child: Padding( padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), child: const OpenLinkBottomSheet(), ), ), ); class OpenLinkBottomSheet extends HookWidget { const OpenLinkBottomSheet({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final url = useState(''); void play() { if (url.value.isNotEmpty && RegExp(r'^(http://|https://)').hasMatch(url.value)) { useAppStore().updateAutoPlay(true); usePlayQueueStore().update( playQueue: [ PlayQueueItem( file: FileItem( name: url.value, uri: url.value, type: ContentType.video, ), index: 0, ) ], index: 0, ); Navigator.pop(context, 'OK'); } } return Padding( padding: const EdgeInsets.all(16.0), child: Column( mainAxisSize: MainAxisSize.min, children: [ Text( t.open_link, style: TextStyle(color: Theme.of(context).colorScheme.onSurface), textAlign: TextAlign.center, ), const SizedBox(height: 16), TextFormField( autofocus: true, initialValue: '', onChanged: (value) => url.value = value, keyboardType: TextInputType.url, style: TextStyle( color: Theme.of(context) .colorScheme .onSurfaceVariant .withValues(alpha: 0.87)), decoration: InputDecoration( hintText: 'https://example.com/xxx.mp4', hintStyle: TextStyle(color: Theme.of(context).disabledColor), border: OutlineInputBorder(), ), onFieldSubmitted: (value) { if (value.isNotEmpty && RegExp(r'^(http://|https://)').hasMatch(value)) { play(); } }, ), const SizedBox(height: 16), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ TextButton( onPressed: () => Navigator.pop(context, 'Cancel'), child: Text(t.cancel), ), TextButton( onPressed: url.value.isNotEmpty && RegExp(r'^(http://|https://)').hasMatch(url.value) ? play : null, child: Text(t.play), ), ], ), ], ), ); } } ================================================ FILE: lib/widgets/card.dart ================================================ import 'dart:ui'; import 'package:flutter/material.dart'; class Card extends StatelessWidget { const Card({ super.key, required this.child, this.padding, this.borderRadius, this.color, this.border, }); final Widget child; final EdgeInsetsGeometry? padding; final BorderRadius? borderRadius; final Color? color; final Border? border; @override Widget build(BuildContext context) { final effectiveBorderRadius = borderRadius ?? BorderRadius.circular(16); final effectiveBorder = border ?? Border.all( color: Theme.of(context) .colorScheme .onSurfaceVariant .withValues(alpha: 0.125), width: 1, ); return Stack( children: [ ClipRRect( borderRadius: effectiveBorderRadius, child: BackdropFilter( filter: ImageFilter.blur(sigmaX: 10, sigmaY: 10), child: Container( padding: padding ?? const EdgeInsets.all(0), decoration: BoxDecoration( borderRadius: effectiveBorderRadius, color: color ?? Theme.of(context) .colorScheme .surfaceContainer .withValues(alpha: 0.75), ), child: child, ), ), ), Positioned.fill( child: IgnorePointer( child: Container( decoration: BoxDecoration( color: Colors.transparent, borderRadius: effectiveBorderRadius, border: effectiveBorder, ), ), ), ), ], ); } } ================================================ FILE: lib/widgets/chip.dart ================================================ import 'package:flutter/material.dart'; class Chip extends StatelessWidget { final String text; final bool primary; const Chip({super.key, required this.text, this.primary = false}); @override Widget build(BuildContext context) { return Container( height: 20, decoration: BoxDecoration( color: primary ? Theme.of(context).colorScheme.inversePrimary : Theme.of(context).colorScheme.surfaceContainerHighest, borderRadius: BorderRadius.circular(8), ), padding: const EdgeInsets.fromLTRB(8, 0, 8, 0), child: Center( child: Text( text, textAlign: TextAlign.center, style: const TextStyle( fontSize: 12, fontWeight: FontWeight.bold, ), ), ), ); } } ================================================ FILE: lib/widgets/dialogs/show_folder_dialog.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/store/use_storage_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/path_conv.dart'; import 'package:iris/utils/platform.dart'; import 'package:path/path.dart' as p; Future showFolderDialog(BuildContext context, {LocalStorage? storage}) async => await showDialog( context: context, builder: (BuildContext context) => LocalDialog(storage: storage)); class LocalDialog extends HookWidget { const LocalDialog({ super.key, this.storage, }); final LocalStorage? storage; @override Widget build(BuildContext context) { final t = getLocalizations(context); final bool isEdit = storage != null && (useStorageStore().state.storages.contains(storage!)); final type = useState(storage?.type ?? StorageType.internal); final name = useState(storage?.name ?? ''); final basePath = useState(storage?.basePath ?? []); final isTested = useState(true); void add() { useStorageStore().addStorage( LocalStorage( type: type.value, name: name.value, basePath: basePath.value, ), ); } void update() { useStorageStore().updateStorage( useStorageStore().state.storages.indexOf(storage! as Storage), LocalStorage( type: type.value, name: name.value, basePath: basePath.value, ), ); } return AlertDialog( title: Text(isEdit ? t.edit_folder : t.add_folder), content: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(8.0), child: Form( child: Column( mainAxisSize: MainAxisSize.min, children: [ TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.name, ), initialValue: name.value, onChanged: (value) => name.value = value.trim(), ), const SizedBox(height: 16.0), TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.path, ), initialValue: p.normalize(basePath.value.join('/')), onChanged: (value) => basePath.value = pathConv(value), readOnly: isAndroid && basePath.value[0].startsWith('content://'), ), const SizedBox(height: 16.0), ], ), ), ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context, 'Cancel'), child: Text(t.cancel), ), TextButton( onPressed: isTested.value ? () { Navigator.pop(context, 'OK'); isEdit ? update() : add(); } : null, child: Text(isEdit ? t.save : t.add), ), ], ); } } ================================================ FILE: lib/widgets/dialogs/show_ftp_dialog.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/models/storages/ftp.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/store/use_storage_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:uuid/uuid.dart'; Future showFTPDialog(BuildContext context, {FTPStorage? storage}) async => await showDialog( context: context, builder: (BuildContext context) { return FTPDialog(storage: storage); }, ); class FTPDialog extends HookWidget { const FTPDialog({ super.key, this.storage, }); final FTPStorage? storage; @override Widget build(BuildContext context) { final t = getLocalizations(context); final bool isEdit = storage != null && (useStorageStore().state.storages.contains(storage)); final id = useMemoized(() => storage?.id ?? const Uuid().v4()); final name = useState(storage?.name ?? ''); final host = useState(storage?.host ?? ''); final basePath = useState(storage?.basePath ?? ['/']); final username = useState(storage?.username ?? ''); final password = useState(storage?.password ?? ''); final isTested = useState(false); final TextEditingController portController = useTextEditingController(text: storage?.port ?? '21'); void add() { useStorageStore().addStorage( FTPStorage( id: id, name: name.value, host: host.value, basePath: basePath.value, port: portController.text, username: username.value, password: password.value, ), ); } void update() { useStorageStore().updateStorage( useStorageStore().state.storages.indexOf(storage as Storage), FTPStorage( id: id, name: name.value, host: host.value, basePath: basePath.value, port: portController.text, username: username.value, password: password.value, ), ); } void testConnection() async { final bool isConnected = await testFTP(FTPStorage( id: id, name: name.value, host: host.value, basePath: basePath.value, port: portController.text, username: username.value, password: password.value, )); isTested.value = isConnected; } return AlertDialog( title: Text(isEdit ? t.edit_ftp_storage : t.add_ftp_storage), content: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(8.0), child: Form( child: Column( mainAxisSize: MainAxisSize.min, children: [ TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.name, ), initialValue: name.value, onChanged: (value) { name.value = value.trim(); isTested.value = false; }, ), const SizedBox(height: 16.0), TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.host, ), initialValue: host.value, onChanged: (value) { host.value = value.trim().split('//').last; isTested.value = false; }, ), const SizedBox(height: 16.0), TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.path, ), initialValue: basePath.value.join('/'), onChanged: (value) { final trimmedValue = value.trim().replaceAll(RegExp(r'^\/+|\/+$'), ''); final finalPath = '/$trimmedValue'; basePath.value = [finalPath]; isTested.value = false; }), const SizedBox(height: 16.0), TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.port, ), controller: portController, keyboardType: TextInputType.number, inputFormatters: [ FilteringTextInputFormatter.digitsOnly, ], onChanged: (value) { isTested.value = false; }, ), const SizedBox(height: 16.0), TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.username, ), initialValue: username.value, onChanged: (value) { username.value = value.trim(); isTested.value = false; }, ), const SizedBox(height: 16.0), TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.password, ), initialValue: password.value, obscureText: true, onChanged: (value) { password.value = value.trim(); isTested.value = false; }, ), const SizedBox(height: 16.0), ], ), ), ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context, 'Cancel'), child: Text(t.cancel), ), TextButton( onPressed: testConnection, child: Text(t.test_connection), ), TextButton( onPressed: isTested.value ? () { Navigator.pop(context, 'OK'); isEdit ? update() : add(); } : null, child: Text(isEdit ? t.save : t.add), ), ], ); } } ================================================ FILE: lib/widgets/dialogs/show_language_dialog.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/l10n/languages.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/utils/get_localizations.dart'; Future showLanguageDialog(BuildContext context) async => await showDialog( context: context, builder: (context) => const LanguageDialog(), ); class LanguageDialog extends HookWidget { const LanguageDialog({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final String language = useAppStore().select(context, (state) => state.language); void updateLanguage(String? newLanguage) { if (newLanguage == null) return; useAppStore().updateLanguage(newLanguage); Navigator.pop(context); } final Map languageOptions = { 'system': t.system, ...languages, }; return AlertDialog( title: Text(t.select_language), content: SingleChildScrollView( child: RadioGroup( groupValue: language, onChanged: updateLanguage, child: Column( mainAxisSize: MainAxisSize.min, children: languageOptions.entries.map((entry) { final String langCode = entry.key; final String langName = entry.value; return ListTile( title: Text(langName), leading: Radio( value: langCode, ), onTap: () => updateLanguage(langCode), contentPadding: const EdgeInsets.only(left: 8), ); }).toList(), ), ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: Text(t.cancel), ), ], ); } } ================================================ FILE: lib/widgets/dialogs/show_open_link_dialog.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/models/file.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/utils/get_localizations.dart'; Future showOpenLinkDialog(BuildContext context) async => await showDialog( context: context, builder: (context) => const OpenLinkDialog(), ); class OpenLinkDialog extends HookWidget { const OpenLinkDialog({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final url = useState(''); void play() { if (url.value.isNotEmpty && RegExp(r'^(http://|https://)').hasMatch(url.value)) { useAppStore().updateAutoPlay(true); usePlayQueueStore().update( playQueue: [ PlayQueueItem( file: FileItem( name: url.value, uri: url.value, type: ContentType.video, ), index: 0, ) ], index: 0, ); Navigator.pop(context, 'OK'); } } return AlertDialog( // actionsPadding: const EdgeInsets.symmetric(horizontal: 16), title: Text(t.open_link, style: TextStyle(color: Theme.of(context).colorScheme.onSurface)), content: ConstrainedBox( constraints: BoxConstraints( maxWidth: 600, ), child: SingleChildScrollView( child: TextFormField( autofocus: true, initialValue: '', onChanged: (value) => url.value = value, keyboardType: TextInputType.url, style: TextStyle( color: Theme.of(context) .colorScheme .onSurfaceVariant .withValues(alpha: 0.87)), decoration: InputDecoration( hintText: 'https://example.com/xxx.mp4', hintStyle: TextStyle(color: Theme.of(context).disabledColor), ), onFieldSubmitted: (value) { if (value.isNotEmpty && RegExp(r'^(http://|https://)').hasMatch(value)) { play(); } }, ), ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context, 'Cancel'), child: Text(t.cancel), ), TextButton( onPressed: url.value.isNotEmpty && RegExp(r'^(http://|https://)').hasMatch(url.value) ? play : null, child: Text(t.play), ), ], ); } } ================================================ FILE: lib/widgets/dialogs/show_orientation_dialog.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/store/app_state.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/utils/get_localizations.dart'; Future showOrientationDialog(BuildContext context) async => await showDialog( context: context, builder: (context) => const OrientationDialog(), ); class OrientationDialog extends HookWidget { const OrientationDialog({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final orientation = useAppStore().select(context, (state) => state.orientation); void updateOrientation(ScreenOrientation? newOrientation) { if (newOrientation == null) return; useAppStore().updateOrientation(newOrientation); Navigator.pop(context); } final orientationMap = { ScreenOrientation.device: t.device, ScreenOrientation.landscape: t.landscape, ScreenOrientation.portrait: t.portrait, }; return AlertDialog( title: Text(t.screen_orientation), content: SingleChildScrollView( child: RadioGroup( groupValue: orientation, onChanged: updateOrientation, child: Column( mainAxisSize: MainAxisSize.min, children: ScreenOrientation.values.map((e) { return ListTile( title: Text(orientationMap[e] ?? e.name), leading: Radio( value: e, ), onTap: () => updateOrientation(e), ); }).toList(), ), ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: Text(t.cancel), ), ], ); } } ================================================ FILE: lib/widgets/dialogs/show_rate_dialog.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/globals.dart' show speedStops; import 'package:iris/store/use_app_store.dart'; import 'package:iris/utils/get_localizations.dart'; Future showRateDialog(BuildContext context) async => await showDialog( context: context, builder: (context) => const RateDialog(), ); class RateDialog extends HookWidget { const RateDialog({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final rate = useAppStore().select(context, (state) => state.rate); void updateRate(double? newRate) { if (newRate == null) return; useAppStore().updateRate(newRate); Navigator.pop(context); } return AlertDialog( title: Text(t.playback_speed), content: SingleChildScrollView( child: RadioGroup( groupValue: rate, onChanged: updateRate, child: Column( mainAxisSize: MainAxisSize.min, children: speedStops.map((item) { return ListTile( title: Text('${item}X'), leading: Radio( value: item, ), onTap: () => updateRate(item), ); }).toList(), ), ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: Text(t.cancel), ), ], ); } } ================================================ FILE: lib/widgets/dialogs/show_release_dialog.dart ================================================ import 'dart:async'; import 'dart:io'; import 'package:iris/utils/file_size_convert.dart'; import 'package:iris/utils/platform.dart'; import 'package:path/path.dart' as p; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:iris/utils/get_latest_release.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/url.dart'; bool isPortable() { String resolvedExecutablePath = Platform.resolvedExecutable; String path = p.dirname(resolvedExecutablePath); String batFilePath = p.join(path, 'iris-updater.bat'); return File(batFilePath).existsSync(); } Future showReleaseDialog(BuildContext context, {required Release release}) async => await showDialog( context: context, builder: (context) => ReleaseDialog( release: release, ), ); class ReleaseDialog extends HookWidget { const ReleaseDialog({super.key, required this.release}); final Release release; @override Widget build(BuildContext context) { final t = getLocalizations(context); final updateScriptIsExists = useState(false); useEffect(() { if (isWindows) { updateScriptIsExists.value = isPortable(); } return null; }, []); void update() async { if (isWindows) { String resolvedExecutablePath = Platform.resolvedExecutable; String path = p.dirname(resolvedExecutablePath); String batFilePath = p.join(path, 'iris-updater.bat'); // 执行 bat 文件 await Process.start( 'cmd.exe', ['/c', batFilePath], mode: ProcessStartMode.detached, runInShell: true, ); // 退出应用 exit(0); } } Future cancel() async { if (context.mounted) { Navigator.pop(context, 'Cancel'); } } return AlertDialog( title: Text('${t.checked_new_version}: ${release.version}'), content: ConstrainedBox( constraints: BoxConstraints( maxWidth: 600, ), child: SingleChildScrollView( child: MarkdownBody(data: release.changeLog, shrinkWrap: true), ), ), actions: [ TextButton( onPressed: cancel, child: Text(t.cancel), ), TextButton( onPressed: () => launchURL(release.url), child: Text(t.releasePage), ), // Visibility( // visible: !isDesktop, // child: TextButton( // onPressed: () { // launchURL(release.url); // Navigator.pop(context, 'OK'); // }, // child: Text(t.download), // ), // ), Visibility( visible: isDesktop && updateScriptIsExists.value, child: TextButton( onPressed: update, child: Text( '${t.download_and_update} (${fileSizeConvert(release.size)} MB)'), ), ), ], ); } } ================================================ FILE: lib/widgets/dialogs/show_theme_mode_dialog.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/utils/get_localizations.dart'; Future showThemeModeDialog(BuildContext context) async => await showDialog( context: context, builder: (context) => const ThemeModeDialog(), ); class ThemeModeDialog extends HookWidget { const ThemeModeDialog({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final themeMode = useAppStore().select(context, (state) => state.themeMode); void updateThemeMode(ThemeMode? newThemeMode) { if (newThemeMode == null) return; useAppStore().updateThemeMode(newThemeMode); Navigator.pop(context); } final Map themeOptions = { t.system: ThemeMode.system, t.light: ThemeMode.light, t.dark: ThemeMode.dark, }; return AlertDialog( title: Text(t.theme_mode), content: SingleChildScrollView( child: RadioGroup( groupValue: themeMode, onChanged: updateThemeMode, child: Column( mainAxisSize: MainAxisSize.min, children: themeOptions.entries.map((entry) { final String label = entry.key; final ThemeMode value = entry.value; return ListTile( title: Text(label), leading: Radio( value: value, ), onTap: () => updateThemeMode(value), contentPadding: const EdgeInsets.only(left: 8), ); }).toList(), ), ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: Text(t.cancel), ), ], ); } } ================================================ FILE: lib/widgets/dialogs/show_webdav_dialog.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/models/storages/webdav.dart'; import 'package:iris/store/use_storage_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:uuid/uuid.dart'; Future showWebDAVDialog(BuildContext context, {WebDAVStorage? storage}) async => await showDialog( context: context, builder: (BuildContext context) { return WebDAVDialog(storage: storage); }, ); class WebDAVDialog extends HookWidget { const WebDAVDialog({ super.key, this.storage, }); final WebDAVStorage? storage; @override Widget build(BuildContext context) { final t = getLocalizations(context); final bool isEdit = storage != null && (useStorageStore().state.storages.contains(storage)); final id = useMemoized(() => storage?.id ?? const Uuid().v4()); final name = useState(storage?.name ?? ''); final host = useState(storage?.host ?? ''); final basePath = useState(storage?.basePath ?? ['/']); final username = useState(storage?.username ?? ''); final password = useState(storage?.password ?? ''); final https = useState(storage?.https ?? false); final isTested = useState(false); final TextEditingController portController = useTextEditingController(text: storage?.port ?? ''); void add() { useStorageStore().addStorage( WebDAVStorage( id: id, name: name.value, host: host.value, basePath: basePath.value, port: portController.text, username: username.value, password: password.value, https: https.value, ), ); } void update() { useStorageStore().updateStorage( useStorageStore().state.storages.indexOf(storage as Storage), WebDAVStorage( id: id, name: name.value, host: host.value, basePath: basePath.value, port: portController.text, username: username.value, password: password.value, https: https.value, ), ); } void testConnection() async { final bool isConnected = await testWebDAV(WebDAVStorage( id: id, name: name.value, host: host.value, basePath: basePath.value, port: portController.text, username: username.value, password: password.value, https: https.value, )); isTested.value = isConnected; } return AlertDialog( title: Text(isEdit ? t.edit_webdav_storage : t.add_webdav_storage), content: SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(8.0), child: Form( child: Column( mainAxisSize: MainAxisSize.min, children: [ TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.name, ), initialValue: name.value, onChanged: (value) { name.value = value.trim(); isTested.value = false; }, ), const SizedBox(height: 16.0), TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.host, ), initialValue: host.value, onChanged: (value) { host.value = value.trim().split('//').last; isTested.value = false; }, ), const SizedBox(height: 16.0), TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.path, ), initialValue: basePath.value.join('/'), onChanged: (value) { final trimmedValue = value.trim().replaceAll(RegExp(r'^\/+|\/+$'), ''); final finalPath = '/$trimmedValue'; basePath.value = [finalPath]; isTested.value = false; }), const SizedBox(height: 16.0), Row( children: [ Expanded( child: TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.port, ), controller: portController, keyboardType: TextInputType.number, inputFormatters: [ FilteringTextInputFormatter.digitsOnly, ], onChanged: (value) { isTested.value = false; if (value == '443') { https.value = true; } }, ), ), const SizedBox(width: 4), SizedBox( width: 96, child: ListTile( contentPadding: const EdgeInsets.fromLTRB(0, 0, 0, 0), visualDensity: const VisualDensity(horizontal: -4, vertical: 0), title: Row( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: [ const Text('https'), Focus( descendantsAreFocusable: false, canRequestFocus: false, child: Checkbox( value: https.value, onChanged: (_) { isTested.value = false; if (portController.text == '80' && https.value == false) { portController.text = '443'; } else if (portController.text == '443' && https.value == true) { portController.text = '80'; } https.value = !https.value; }, ), ), ]), onTap: () { isTested.value = false; if (!https.value) { portController.text = '443'; } else { portController.text = '80'; } https.value = !https.value; }, ), ), ], ), const SizedBox(height: 16.0), TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.username, ), initialValue: username.value, onChanged: (value) { username.value = value.trim(); isTested.value = false; }, ), const SizedBox(height: 16.0), TextFormField( decoration: InputDecoration( border: const OutlineInputBorder(), labelText: t.password, ), initialValue: password.value, obscureText: true, onChanged: (value) { password.value = value.trim(); isTested.value = false; }, ), const SizedBox(height: 16.0), ], ), ), ), ), actions: [ TextButton( onPressed: () => Navigator.pop(context, 'Cancel'), child: Text(t.cancel), ), TextButton( onPressed: testConnection, child: Text(t.test_connection), ), TextButton( onPressed: isTested.value ? () { Navigator.pop(context, 'OK'); isEdit ? update() : add(); } : null, child: Text(isEdit ? t.save : t.add), ), ], ); } } ================================================ FILE: lib/widgets/drag_area.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/store/use_player_ui_store.dart'; import 'package:iris/utils/platform.dart'; import 'package:window_manager/window_manager.dart'; class DragArea extends StatelessWidget { const DragArea({ super.key, required this.child, }); final Widget child; @override Widget build(BuildContext context) { final isFullScreen = usePlayerUiStore().select(context, (state) => state.isFullScreen); return GestureDetector( onDoubleTap: () async { if (!isDesktop) return; if (isFullScreen) { await usePlayerUiStore().updateFullScreen(false); } else { if (await windowManager.isMaximized()) { await windowManager.unmaximize(); } else { await windowManager.maximize(); } } }, onPanStart: (details) async { if (isDesktop) { windowManager.startDragging(); } }, child: child, ); } } ================================================ FILE: lib/widgets/popup.dart ================================================ import 'dart:io'; import 'package:flutter/material.dart' hide Card; import 'package:flutter/services.dart'; import 'package:iris/utils/platform.dart'; import 'package:iris/widgets/card.dart'; import 'package:window_manager/window_manager.dart'; enum PopupDirection { left, right } Future showPopup({ required BuildContext context, required Widget child, required PopupDirection direction, }) async => await Navigator.of(context).push(Popup(child: child, direction: direction)); Future replacePopup({ required BuildContext context, required Widget child, required PopupDirection direction, }) async => await Navigator.of(context) .pushReplacement(Popup(child: child, direction: direction)); class Popup extends PopupRoute { Popup({ required this.child, required this.direction, }) { _focusNode = FocusNode(); } final Widget child; final PopupDirection direction; late final FocusNode _focusNode; bool _isPopping = false; void _popOnce(BuildContext context) { if (_isPopping) return; _isPopping = true; Navigator.of(context).pop(); } @override Color? get barrierColor => Colors.transparent; @override bool get barrierDismissible => false; @override String? get barrierLabel => 'Dismiss'; @override Duration get transitionDuration => const Duration(milliseconds: 250); @override void dispose() { _focusNode.dispose(); super.dispose(); } @override Widget buildPage(BuildContext context, Animation animation, Animation secondaryAnimation) { return KeyboardListener( focusNode: _focusNode, autofocus: true, onKeyEvent: (event) { if (event.logicalKey == LogicalKeyboardKey.escape) { _popOnce(context); } }, child: Stack( children: [ Positioned.fill( child: GestureDetector( onPanStart: (details) { if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) { windowManager.startDragging(); } }, onTap: () => _popOnce(context), ), ), Align( alignment: direction == PopupDirection.left ? Alignment.bottomLeft : Alignment.bottomRight, child: AnimatedBuilder( animation: animation, builder: (context, child) { return SlideTransition( position: Tween( begin: direction == PopupDirection.left ? const Offset(-1.0, 0.0) : const Offset(1.0, 0.0), end: Offset.zero, ).animate( CurvedAnimation( parent: animation, curve: Curves.easeInOutCubicEmphasized, ), ), child: child, ); }, child: Dismissible( key: UniqueKey(), direction: direction == PopupDirection.left ? DismissDirection.endToStart : DismissDirection.startToEnd, onUpdate: (details) { if (details.previousReached) { _popOnce(context); } }, child: LayoutBuilder( builder: (context, constraints) { final screenWidth = constraints.maxWidth; final screenHeight = constraints.maxHeight; final int size = screenWidth > 1200 ? 3 : screenWidth > 720 ? 2 : 1; return Padding( padding: EdgeInsets.only( bottom: 8, left: direction == PopupDirection.left ? 8 : 0, right: direction == PopupDirection.right ? 8 : 0, ), child: UnconstrainedBox( child: LimitedBox( maxWidth: screenWidth / size - 16, maxHeight: isDesktop ? screenHeight - 56 : screenHeight - 16, child: Card( child: Material( color: Colors.transparent, child: Column( mainAxisSize: MainAxisSize.min, children: [ Expanded(child: child), ], ), ), ), ), ), ); }, ), ), ), ), ], ), ); } } ================================================ FILE: lib/widgets/popups/history.dart ================================================ import 'dart:math'; import 'package:flutter/material.dart' hide Chip; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/progress.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_history_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/utils/file_size_convert.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/widgets/chip.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; class History extends HookWidget { const History({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final Map history = useHistoryStore().select(context, (state) => state.history); final List> historyList = useMemoized(() { final entries = history.entries.toList(); entries.sort((a, b) => b.value.dateTime.compareTo(a.value.dateTime)); return entries.sublist(0, min(entries.length, 100)); }, [history]); Future play(int index) async { await useAppStore().updateAutoPlay(true); final playQueue = historyList .asMap() .map((index, entry) => MapEntry( index, PlayQueueItem(file: entry.value.file, index: index))) .values .toList(); usePlayQueueStore().update(playQueue: playQueue, index: index); } return Column( children: [ Expanded( child: Card( color: Colors.transparent, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: ScrollablePositionedList.builder( itemCount: historyList.length, itemBuilder: (context, index) => ListTile( contentPadding: const EdgeInsets.fromLTRB(12, 0, 8, 0), visualDensity: const VisualDensity(horizontal: -4, vertical: -4), leading: Text( (index + 1).toString(), style: const TextStyle( fontSize: 14, ), textAlign: TextAlign.center, ), minLeadingWidth: 14, title: Text( historyList[index].value.file.name, maxLines: 3, overflow: TextOverflow.ellipsis, ), subtitle: Row( children: [ if (historyList[index].value.file.size > 0) Text( "${fileSizeConvert(historyList[index].value.file.size)} MB"), const Spacer(), () { final Progress? progress = useHistoryStore() .findById(historyList[index].value.file.getID()); if (progress != null && progress.file.type == ContentType.video) { if ((progress.duration.inMilliseconds - progress.position.inMilliseconds) <= 5000) { return Chip(text: '100%'); } final String progressString = (progress.position.inMilliseconds / progress.duration.inMilliseconds * 100) .toStringAsFixed(0); return Chip(text: '$progressString %'); } else { return const SizedBox(); } }(), ...historyList[index] .value .file .subtitles .map((subtitle) => subtitle.uri.split('.').last.toUpperCase()) .toSet() .toList() .map( (subtitleType) => Row( mainAxisSize: MainAxisSize.min, children: [ const SizedBox(width: 4), Chip( text: subtitleType, primary: true, ), ], ), ), ], ), trailing: PopupMenuButton( clipBehavior: Clip.hardEdge, constraints: const BoxConstraints(minWidth: 200), onSelected: (value) async { switch (value) { case FileOptions.addToPlayQueue: usePlayQueueStore() .add([historyList[index].value.file]); break; case FileOptions.remove: useHistoryStore().remove(historyList[index].value); break; case FileOptions.openInFolder: await openInFolder( context, historyList[index].value.file); break; } }, itemBuilder: (context) => [ PopupMenuItem( value: FileOptions.addToPlayQueue, child: Text(t.add_to_play_queue), ), PopupMenuItem( value: FileOptions.remove, child: Text(t.remove), ), if (historyList[index].value.file.path.isNotEmpty) PopupMenuItem( value: FileOptions.openInFolder, child: Text(t.open_in_folder), ), ], ), onTap: () { play(index); Navigator.of(context).pop(); }, ), ), ), ), Divider( color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.25), height: 0, ), Container( padding: const EdgeInsets.fromLTRB(16, 4, 4, 4), child: Row( children: [ Text( t.history, style: const TextStyle(fontWeight: FontWeight.w500), ), const Spacer(), IconButton( tooltip: '${t.close} ( Escape )', icon: const Icon(Icons.close_rounded), onPressed: () => Navigator.of(context).pop(), ), ], ), ), ], ); } } ================================================ FILE: lib/widgets/popups/play_queue.dart ================================================ import 'package:flutter/material.dart' hide Chip; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/progress.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_history_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/utils/file_size_convert.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/widgets/chip.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; class PlayQueue extends HookWidget { const PlayQueue({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final playQueue = usePlayQueueStore().select(context, (state) => state.playQueue); final currentIndex = usePlayQueueStore().select(context, (state) => state.currentIndex); final int currentPlayIndex = useMemoized( () => playQueue.indexWhere((element) => element.index == currentIndex), [playQueue, currentIndex]); final itemScrollController = useMemoized(() => ItemScrollController(), []); final scrollOffsetController = useMemoized(() => ScrollOffsetController(), []); final itemPositionsListener = useMemoized(() => ItemPositionsListener.create(), []); final scrollOffsetListener = useMemoized(() => ScrollOffsetListener.create(), []); useEffect(() { WidgetsBinding.instance.addPostFrameCallback((_) { if (itemScrollController.isAttached && playQueue.isNotEmpty) { itemScrollController.jumpTo( index: currentPlayIndex - 3 < 0 ? 0 : currentPlayIndex - 1); } }); return; }, []); return Column( children: [ Expanded( child: Card( color: Colors.transparent, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: ScrollablePositionedList.builder( itemCount: playQueue.length, itemBuilder: (context, index) => ListTile( autofocus: currentPlayIndex == index, tileColor: currentPlayIndex == index ? Theme.of(context).hoverColor : null, contentPadding: const EdgeInsets.fromLTRB(12, 0, 8, 0), visualDensity: const VisualDensity(horizontal: -4, vertical: -4), leading: Text( (index + 1).toString(), style: const TextStyle( fontSize: 14, ), textAlign: TextAlign.center, ), minLeadingWidth: 14, title: Text( playQueue[index].file.name, maxLines: 3, overflow: TextOverflow.ellipsis, style: currentPlayIndex == index ? TextStyle( fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary, ) : null, ), subtitle: Row( children: [ if (playQueue[index].file.size > 0) Text("${fileSizeConvert(playQueue[index].file.size)} MB", style: TextStyle( fontSize: 13, color: currentPlayIndex == index ? Theme.of(context).colorScheme.primary : null)), const Spacer(), () { final Progress? progress = useHistoryStore() .findById(playQueue[index].file.getID()); if (progress != null && progress.file.type == ContentType.video) { if ((progress.duration.inMilliseconds - progress.position.inMilliseconds) <= 5000) { return Chip(text: '100%'); } final String progressString = (progress.position.inMilliseconds / progress.duration.inMilliseconds * 100) .toStringAsFixed(0); return Chip(text: '$progressString %'); } else { return const SizedBox(); } }(), ...playQueue[index] .file .subtitles .map((subtitle) => subtitle.uri.split('.').last.toUpperCase()) .toSet() .toList() .map( (subtitleType) => Row( mainAxisSize: MainAxisSize.min, children: [ const SizedBox(width: 4), Chip( text: subtitleType, primary: true, ), ], ), ), ], ), trailing: PopupMenuButton( clipBehavior: Clip.hardEdge, constraints: const BoxConstraints(minWidth: 200), onSelected: (value) async { switch (value) { case FileOptions.remove: usePlayQueueStore().remove(playQueue[index]); break; case FileOptions.openInFolder: await openInFolder(context, playQueue[index].file); break; default: break; } }, itemBuilder: (context) => [ PopupMenuItem( value: FileOptions.remove, child: Text(t.remove), ), if (playQueue[index].file.path.isNotEmpty) PopupMenuItem( value: FileOptions.openInFolder, child: Text(t.open_in_folder), ), ], ), onTap: () async { await useAppStore().updateAutoPlay(true); usePlayQueueStore() .updateCurrentIndex(playQueue[index].index); if (context.mounted) { Navigator.of(context).pop(); } }, ), itemScrollController: itemScrollController, scrollOffsetController: scrollOffsetController, itemPositionsListener: itemPositionsListener, scrollOffsetListener: scrollOffsetListener, ), ), ), Divider( color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.25), height: 0, ), Container( padding: const EdgeInsets.fromLTRB(16, 4, 4, 4), child: Row( children: [ Text( t.play_queue, style: const TextStyle(fontWeight: FontWeight.w500), ), const Spacer(), IconButton( tooltip: '${t.close} ( Escape )', icon: const Icon(Icons.close_rounded), onPressed: () => Navigator.of(context).pop(), ), ], ), ), ], ); } } ================================================ FILE: lib/widgets/popups/settings/about.dart ================================================ import 'dart:io'; import 'package:iris/utils/platform.dart'; import 'package:path/path.dart' as p; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/info.dart'; import 'package:iris/widgets/dialogs/show_release_dialog.dart'; import 'package:iris/utils/get_latest_release.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/url.dart'; import 'package:package_info_plus/package_info_plus.dart'; bool isMsix() { if (!isWindows) { return false; } String resolvedExecutablePath = Platform.resolvedExecutable; String path = p.dirname(resolvedExecutablePath); String manifestPath = p.join(path, 'AppxManifest.xml'); return File(manifestPath).existsSync(); } class About extends HookWidget { const About({super.key}); static const title = 'About'; @override Widget build(BuildContext context) { final t = getLocalizations(context); final packageInfo = useState(null); final noNewVersion = useState(false); useEffect(() { void getPackageInfo() async => packageInfo.value = await PackageInfo.fromPlatform(); getPackageInfo(); return null; }, []); return SingleChildScrollView( child: Column( children: [ ListTile( leading: Image.asset('assets/images/logo.png', width: 24, height: 24), title: const Text(INFO.title), subtitle: Text(t.app_description), ), ListTile( leading: const Icon(Icons.info_rounded), title: Text(t.version), subtitle: Text( packageInfo.value != null ? packageInfo.value!.version : ''), onTap: () => launchURL( '${INFO.githubUrl}/releases/tag/v${packageInfo.value?.version}'), ), ListTile( leading: const Icon(Icons.update_rounded), title: Text(t.check_update), subtitle: noNewVersion.value ? Text(t.no_new_version) : null, onTap: () async { if (isMsix()) { launchURL( 'ms-windows-store://pdp/?ProductId=${INFO.msStoreId}'); return; } noNewVersion.value = false; final release = await getLatestRelease(); if (release != null && context.mounted) { showReleaseDialog(context, release: release); } else { noNewVersion.value = true; } }), ListTile( leading: const Icon(Icons.code_rounded), title: Text(t.source_code), subtitle: const Text(INFO.githubUrl), onTap: () => launchURL(INFO.githubUrl), ), ListTile( leading: const Icon(Icons.person_rounded), title: Text(t.author), subtitle: const Text(INFO.author), onTap: () => launchURL(INFO.authorUrl), ), ], ), ); } } ================================================ FILE: lib/widgets/popups/settings/dependencies.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/oss_licenses.dart'; import 'package:iris/utils/url.dart'; class Dependencies extends HookWidget { const Dependencies({super.key}); static const title = 'Libraries'; final dependencies = allDependencies; @override Widget build(BuildContext context) { return ListView.builder( padding: EdgeInsets.zero, itemCount: dependencies.length, itemBuilder: (context, index) => ListTile( leading: const Icon(Icons.code_rounded), title: Text(dependencies[index].name), subtitle: Text( dependencies[index].license ?? '', maxLines: 1, overflow: TextOverflow.ellipsis, ), onTap: () => showModalBottomSheet( context: context, // isScrollControlled: true, enableDrag: true, builder: (BuildContext context) { return SingleChildScrollView( child: Padding( padding: const EdgeInsets.all(16), child: Column(children: [ Text( dependencies[index].name, style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary, ), ), const SizedBox(height: 16), TextButton( onPressed: () => launchURL( dependencies[index].homepage != null ? '${dependencies[index].homepage}' : '${dependencies[index].repository}', ), child: Text( dependencies[index].homepage != null ? '${dependencies[index].homepage}' : '${dependencies[index].repository}', style: TextStyle( color: Theme.of(context).colorScheme.primary, decoration: TextDecoration.underline, ), ), ), const SizedBox(height: 16), Text(dependencies[index].license ?? ''), ]), ), ); }, ), ), ); } } ================================================ FILE: lib/widgets/popups/settings/general.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/l10n/languages.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/widgets/dialogs/show_language_dialog.dart'; import 'package:iris/widgets/dialogs/show_theme_mode_dialog.dart'; class General extends HookWidget { const General({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final language = useAppStore().select(context, (state) => state.language); final themeMode = useAppStore().select(context, (state) => state.themeMode); return SingleChildScrollView( child: Column( children: [ ListTile( leading: const Icon(Icons.translate_rounded), title: Text(t.language), subtitle: Text(language == 'system' ? t.system : languages[language] ?? language), onTap: () => showLanguageDialog(context), ), ListTile( leading: Icon(themeMode == ThemeMode.light ? Icons.light_mode_rounded : themeMode == ThemeMode.dark ? Icons.dark_mode_rounded : Icons.contrast_rounded), title: Text(t.theme_mode), subtitle: Text(() { switch (themeMode) { case ThemeMode.system: return t.system; case ThemeMode.light: return t.light; case ThemeMode.dark: return t.dark; } }()), onTap: () => showThemeModeDialog(context), ), ], ), ); } } ================================================ FILE: lib/widgets/popups/settings/play.dart ================================================ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/store/app_state.dart'; import 'package:iris/widgets/dialogs/show_orientation_dialog.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/platform.dart'; class Play extends HookWidget { const Play({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final autoResize = useAppStore().select(context, (state) => state.autoResize); final bool alwaysPlayFromBeginning = useAppStore().select(context, (state) => state.alwaysPlayFromBeginning); final playerBackend = useAppStore().select(context, (state) => state.playerBackend); final orientation = useAppStore().select(context, (state) => state.orientation); final orientationMap = { ScreenOrientation.device: t.device, ScreenOrientation.landscape: t.landscape, ScreenOrientation.portrait: t.portrait, }; return SingleChildScrollView( child: Column( children: [ ListTile( leading: const Icon(Icons.settings_input_component_rounded), title: Text(t.player_backend), trailing: DropdownButton( borderRadius: BorderRadius.circular(12), padding: const EdgeInsets.symmetric(horizontal: 8), value: playerBackend, onChanged: (value) { if (value != null) useAppStore().updatePlayerBackend(value); }, items: [ DropdownMenuItem( value: PlayerBackend.mediaKit, child: Text('Media Kit')), DropdownMenuItem( value: PlayerBackend.fvp, child: Text('FVP')), ], )), Visibility( visible: isDesktop, child: ListTile( leading: const Icon(Icons.aspect_ratio_rounded), title: Text(t.auto_resize), onTap: () => useAppStore().toggleAutoResize(), trailing: Checkbox( value: autoResize, onChanged: (_) => useAppStore().toggleAutoResize(), ), ), ), ListTile( leading: const Icon(Icons.restart_alt_rounded), title: Text(t.always_play_from_beginning), subtitle: Text(t.always_play_from_beginning_description), onTap: () => useAppStore().toggleAlwaysPlayFromBeginning(), trailing: Checkbox( value: alwaysPlayFromBeginning, onChanged: (_) => useAppStore().toggleAlwaysPlayFromBeginning(), ), ), if (Platform.isAndroid || Platform.isIOS) ListTile( leading: const Icon(Icons.screen_rotation_rounded), title: Text(t.screen_orientation), subtitle: Text(orientationMap[orientation] ?? orientation.name), onTap: () => showOrientationDialog(context), ) ], ), ); } } ================================================ FILE: lib/widgets/popups/settings/settings.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/widgets/popups/settings/about.dart'; import 'package:iris/widgets/popups/settings/general.dart'; import 'package:iris/widgets/popups/settings/dependencies.dart'; import 'package:iris/widgets/popups/settings/play.dart'; import 'package:iris/utils/get_localizations.dart'; class ITab { final String title; final Widget child; const ITab({ required this.title, required this.child, }); } class Settings extends HookWidget { const Settings({super.key}); static const title = 'Settings'; @override Widget build(BuildContext context) { final t = getLocalizations(context); List tabs = [ ITab(title: t.general, child: const General()), ITab(title: t.play, child: const Play()), ITab(title: t.about, child: const About()), ITab(title: t.dependencies, child: const Dependencies()), ]; final tabController = useTabController(initialLength: tabs.length); return Column( children: [ Expanded( child: TabBarView( controller: tabController, children: tabs .map((e) => Card( color: Colors.transparent, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: e.child, )) .toList(), ), ), Divider( color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.25), height: 0, ), Container( padding: EdgeInsets.zero, child: Container( padding: const EdgeInsets.fromLTRB(0, 0, 4, 0), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ TabBar( controller: tabController, isScrollable: true, tabAlignment: TabAlignment.start, dividerColor: Colors.transparent, tabs: tabs.map((e) => Tab(text: e.title)).toList()), const Spacer(), IconButton( tooltip: '${t.close} ( Escape )', icon: const Icon(Icons.close_rounded), onPressed: () => Navigator.of(context).pop(), ), ], ), ), ), ], ); } } ================================================ FILE: lib/widgets/popups/storages/favorites.dart ================================================ import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/storages/local.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/store/use_storage_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:path/path.dart' as p; class Favorites extends HookWidget { const Favorites({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final favorites = useStorageStore().select(context, (state) => state.favorites); final localStoragesFuture = useMemoized(() async => await getLocalStorages(context), []); final localStorages = useFuture(localStoragesFuture).data ?? []; return ListView.builder( padding: EdgeInsets.zero, itemCount: favorites.length, itemBuilder: (context, index) => ListTile( contentPadding: const EdgeInsets.fromLTRB(16, 0, 12, 0), title: Text(favorites[index].path.last), subtitle: () { Storage? storage = useStorageStore().findById(favorites[index].storageId); if (storage == null && favorites[index].storageId == localStorageId) { storage = localStorages.firstWhereOrNull( (element) => element.basePath[0] == favorites[index].path[0]); } if (storage == null) return null; if (storage is LocalStorage) { final subtitle = p.normalize(favorites[index].path.join('/')); if (favorites[index].path.last == subtitle) { return null; } return Text( subtitle, maxLines: 1, style: const TextStyle(overflow: TextOverflow.ellipsis), ); } else if (storage is WebDAVStorage) { return Text( 'http${storage.https ? 's' : ''}://${storage.host}${storage.port.isNotEmpty && storage.port != '80' && storage.port != '443' ? ':${storage.port}' : ''}${favorites[index].path.join('/')}'); } else if (storage is FTPStorage) { return Text( 'ftp://${storage.username.isNotEmpty ? '${storage.username}@' : ''}${storage.host}:${storage.port}${favorites[index].path.join('/').replaceFirst('//', '/')}'); } else { return null; } }(), onTap: () { Storage? storage = useStorageStore().findById(favorites[index].storageId); if (storage == null && favorites[index].storageId == localStorageId) { storage = localStorages.firstWhereOrNull( (element) => element.basePath[0] == favorites[index].path[0]); } if (storage == null) return; useStorageStore().updateCurrentPath(favorites[index].path); useStorageStore().updateCurrentStorage(storage); }, trailing: PopupMenuButton( tooltip: t.menu, clipBehavior: Clip.hardEdge, color: Theme.of(context).colorScheme.surface.withAlpha(250), onSelected: (value) { switch (value) { case StorageOptions.remove: useStorageStore().removeFavorite(favorites[index]); break; default: break; } }, itemBuilder: (BuildContext context) { return [ // PopupMenuItem( // value: StorageOptions.edit, // child: Text(t.edit), // ), PopupMenuItem( value: StorageOptions.remove, child: Text(t.remove), ), ]; }, ), ), ); } } ================================================ FILE: lib/widgets/popups/storages/files.dart ================================================ import 'dart:io'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart' hide Chip; import 'package:flutter_breadcrumb/flutter_breadcrumb.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/globals.dart' as globals; import 'package:iris/models/file.dart'; import 'package:iris/models/progress.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/models/store/app_state.dart'; import 'package:iris/models/store/storage_state.dart'; import 'package:iris/store/use_app_store.dart'; import 'package:iris/store/use_history_store.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/store/use_storage_store.dart'; import 'package:iris/utils/file_size_convert.dart'; import 'package:iris/utils/files_sort.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/request_storage_permission.dart'; import 'package:iris/widgets/chip.dart'; import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; import 'package:permission_handler/permission_handler.dart'; class Files extends HookWidget { const Files({super.key, required this.storage}); final Storage storage; @override Widget build(BuildContext context) { final t = getLocalizations(context); final refreshState = useState(false); void refresh() => refreshState.value = !refreshState.value; final sortBy = useAppStore().select(context, (state) => state.sortBy); final sortOrder = useAppStore().select(context, (state) => state.sortOrder); final folderFirst = useAppStore().select(context, (state) => state.folderFirst); final favorites = useStorageStore().select(context, (state) => state.favorites); final currentPath = useStorageStore().select(context, (state) => state.currentPath); final currentFavorite = useMemoized( () => favorites.firstWhereOrNull((favorite) => favorite.storageId == storage.id && favorite.path == currentPath), [favorites, currentPath]); useEffect(() { if (currentPath.isEmpty) { useStorageStore().updateCurrentPath(storage.basePath); } return null; }, []); final getFiles = useMemoized( () async => await storage.getFiles(currentPath), [currentPath, refreshState.value]); final result = useFuture(getFiles); final isLoading = useMemoized( () => result.connectionState == ConnectionState.waiting, [result.connectionState]); final isError = result.error != null; final filteredFiles = useMemoized( () => (result.data ?? []) .where((file) => [ContentType.video, ContentType.audio].contains(file.type) || file.isDir) .toList(), [result.data]); final files = useMemoized( () => filesSort( files: filteredFiles, sortBy: sortBy, sortOrder: sortOrder, folderFirst: folderFirst, ), [filteredFiles, sortBy, sortOrder, folderFirst]); final itemScrollController = useMemoized(() => ItemScrollController(), []); final scrollOffsetController = useMemoized(() => ScrollOffsetController(), []); final itemPositionsListener = useMemoized(() => ItemPositionsListener.create(), []); final scrollOffsetListener = useMemoized(() => ScrollOffsetListener.create(), []); void play(List files, int index) async { final clickedFile = files[index]; final List filteredFiles = files .where((file) => [ContentType.video, ContentType.audio].contains(file.type)) .toList(); final List playQueue = filteredFiles .asMap() .entries .map((entry) => PlayQueueItem(file: entry.value, index: entry.key)) .toList(); final newIndex = filteredFiles.indexOf(clickedFile); await useAppStore().updateAutoPlay(true); await useAppStore().updateShuffle(false); await usePlayQueueStore().update(playQueue: playQueue, index: newIndex); } void back() { if (currentPath.length > storage.basePath.length) { useStorageStore() .updateCurrentPath(currentPath.sublist(0, currentPath.length - 1)); } else { useStorageStore().updateCurrentStorage(null); useStorageStore().updateCurrentPath([]); } } return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( child: Platform.isAndroid && globals.storagePermissionStatus != PermissionStatus.granted && storage is LocalStorage ? Center( child: ElevatedButton( onPressed: () async { await requestStoragePermission(); refresh(); }, child: Text(t.grant_storage_permission)), ) : isLoading ? const Center(child: CircularProgressIndicator()) : isError ? Center(child: Text(t.unable_to_fetch_files)) : files.isEmpty ? const Center() : Card( color: Colors.transparent, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: ScrollablePositionedList.builder( itemScrollController: itemScrollController, scrollOffsetController: scrollOffsetController, itemPositionsListener: itemPositionsListener, scrollOffsetListener: scrollOffsetListener, itemCount: files.length, itemBuilder: (context, index) => ListTile( contentPadding: const EdgeInsets.fromLTRB(16, 0, 8, 0), visualDensity: const VisualDensity( horizontal: 0, vertical: -4), leading: () { if (files[index].isDir == true && files[index].name.isNotEmpty) { return const Icon(Icons.folder_rounded); } switch (files[index].type) { case ContentType.video: return const Icon(Icons.movie_rounded); case ContentType.audio: return const Icon( Icons.audiotrack_rounded); case ContentType.image: return const Icon(Icons.image_rounded); case ContentType.other: return const Icon( Icons.file_copy_rounded); } }(), title: Text( files[index].name, maxLines: 3, overflow: TextOverflow.ellipsis, ), subtitle: Row( mainAxisSize: MainAxisSize.min, textBaseline: TextBaseline.ideographic, children: [ if (files[index].size != 0) Text( "${fileSizeConvert(files[index].size)} MB", style: const TextStyle( fontSize: 13, ), ), if (files[index].size != 0) const SizedBox(width: 8), if (files[index].lastModified != null) Expanded( child: Text( files[index] .lastModified .toString() .split('.')[0], style: TextStyle( fontSize: 13, color: Theme.of(context) .colorScheme .onSurfaceVariant .withValues(alpha: 0.8), fontWeight: FontWeight.w400, overflow: TextOverflow.ellipsis, ), ), ), if (files[index].size != 0) const SizedBox(width: 8), () { final Progress? progress = useHistoryStore() .findById(files[index].getID()); if (progress != null && progress.file.type == ContentType.video) { if ((progress .duration.inMilliseconds - progress.position .inMilliseconds) <= 5000) { return Chip(text: '100%'); } final String progressString = (progress.position .inMilliseconds / progress.duration .inMilliseconds * 100) .toStringAsFixed(0); return Chip( text: '$progressString %'); } else { return const SizedBox(); } }(), ...files[index] .subtitles .map((subtitle) => subtitle.uri .split('.') .last .toUpperCase()) .toSet() .toList() .map( (subtitleType) => Row( mainAxisSize: MainAxisSize.min, children: [ const SizedBox(width: 4), Chip( text: subtitleType, primary: true, ), ], ), ), ], ), trailing: files[index].type == ContentType.video || files[index].type == ContentType.audio ? PopupMenuButton( clipBehavior: Clip.hardEdge, constraints: const BoxConstraints( minWidth: 200), onSelected: (value) async { switch (value) { case FileOptions.addToPlayQueue: usePlayQueueStore() .add([files[index]]); break; default: break; } }, itemBuilder: (context) => [ PopupMenuItem( value: FileOptions.addToPlayQueue, child: Text(t.add_to_play_queue), ), ], ) : null, onTap: () { if (files[index].isDir == true && files[index].name.isNotEmpty) { useStorageStore().updateCurrentPath( [...currentPath, files[index].name]); } else { if (files[index].type == ContentType.video || files[index].type == ContentType.audio) { play(files, index); Navigator.pop(context); } } }, ), ), ), ), Container( padding: const EdgeInsets.fromLTRB(8, 4, 8, 4), child: BreadCrumb.builder( itemCount: currentPath.length, overflow: Platform.isAndroid || Platform.isIOS ? ScrollableOverflow(reverse: true) : const WrapOverflow(), builder: (index) { return BreadCrumbItem( content: TextButton( child: Text([ storage.basePath.length > 1 ? currentPath.first : storage.name, ...currentPath.sublist(1), ][index]), onPressed: () { useStorageStore() .updateCurrentPath(currentPath.sublist(0, index + 1)); }, ), ); }, divider: Icon( Icons.chevron_right_rounded, color: Theme.of(context).colorScheme.onSurfaceVariant.withAlpha(222), ), ), ), Divider( color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.25), height: 0, ), Container( padding: const EdgeInsets.fromLTRB(4, 4, 4, 4), child: Row( children: [ IconButton( tooltip: t.back, icon: const Icon(Icons.arrow_back_rounded), onPressed: back, ), IconButton( tooltip: t.home, icon: const Icon(Icons.home_rounded), onPressed: () { useStorageStore().updateCurrentStorage(null); useStorageStore().updateCurrentPath([]); }, ), IconButton( tooltip: t.refresh, icon: const Icon(Icons.refresh), onPressed: refresh, ), PopupMenuButton( tooltip: t.sort, icon: const Icon(Icons.sort_rounded), clipBehavior: Clip.hardEdge, constraints: const BoxConstraints(minWidth: 200), itemBuilder: (context) => [ PopupMenuItem( child: ListTile( mouseCursor: SystemMouseCursors.click, title: Text(t.name), trailing: sortBy == SortBy.name ? Icon(sortOrder == SortOrder.asc ? Icons.arrow_upward_rounded : Icons.arrow_downward_rounded) : null, ), onTap: () { useAppStore().updateSortBy(SortBy.name); useAppStore().updateSortOrder( sortOrder == SortOrder.desc || sortBy != SortBy.name ? SortOrder.asc : SortOrder.desc); }, ), PopupMenuItem( child: ListTile( mouseCursor: SystemMouseCursors.click, title: Text(t.size), trailing: sortBy == SortBy.size ? Icon(sortOrder == SortOrder.asc ? Icons.arrow_upward_rounded : Icons.arrow_downward_rounded) : null, ), onTap: () { useAppStore().updateSortBy(SortBy.size); useAppStore().updateSortOrder( sortOrder == SortOrder.asc || sortBy != SortBy.size ? SortOrder.desc : SortOrder.asc); }, ), PopupMenuItem( child: ListTile( mouseCursor: SystemMouseCursors.click, title: Text(t.last_modified), trailing: sortBy == SortBy.lastModified ? Icon(sortOrder == SortOrder.asc ? Icons.arrow_upward_rounded : Icons.arrow_downward_rounded) : null, ), onTap: () { useAppStore().updateSortBy(SortBy.lastModified); useAppStore().updateSortOrder( sortOrder == SortOrder.asc || sortBy != SortBy.lastModified ? SortOrder.desc : SortOrder.asc); }, ), PopupMenuItem( child: ListTile( mouseCursor: SystemMouseCursors.click, title: Text(t.folder_first), trailing: Checkbox( value: folderFirst, onChanged: (_) { useAppStore().updateFolderFirst(!folderFirst); Navigator.pop(context); }), ), onTap: () => useAppStore().updateFolderFirst(!folderFirst), ), ], ), IconButton( tooltip: currentFavorite != null ? t.remove_favorite : t.add_favorite, icon: Icon(currentFavorite != null ? Icons.star_rounded : Icons.star_outline_rounded), onPressed: () { if (currentFavorite != null) { useStorageStore().removeFavorite(currentFavorite); } else { useStorageStore().addFavorite( Favorite(storageId: storage.id, path: currentPath), ); } }, ), const SizedBox(width: 8), Expanded( child: Text( currentPath.length > 1 ? currentPath.last : storage.basePath.length > 1 ? currentPath.first : storage.name, maxLines: 1, style: const TextStyle( fontWeight: FontWeight.w500, overflow: TextOverflow.ellipsis, ), ), ), const SizedBox(width: 4), IconButton( tooltip: '${t.close} ( Escape )', icon: const Icon(Icons.close_rounded), onPressed: () => Navigator.of(context).pop(), ), ], ), ), ], ); } } ================================================ FILE: lib/widgets/popups/storages/storages.dart ================================================ import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/widgets/popups/storages/favorites.dart'; import 'package:iris/widgets/popups/storages/files.dart'; import 'package:iris/store/use_storage_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/path_conv.dart'; import 'package:iris/widgets/dialogs/show_folder_dialog.dart'; import 'package:iris/widgets/dialogs/show_ftp_dialog.dart'; import 'package:iris/widgets/dialogs/show_webdav_dialog.dart'; import 'package:iris/widgets/popups/storages/storages_list.dart'; import 'package:iris/utils/platform.dart'; import 'package:saf_util/saf_util.dart'; class ITab { final String title; final Widget child; const ITab({ required this.title, required this.child, }); } class Storages extends HookWidget { const Storages({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final currentStorage = useStorageStore().select(context, (state) => state.currentStorage); List tabs = [ ITab(title: t.storage, child: const StoragesList()), ITab(title: t.favorites, child: const Favorites()), ]; final tabController = useTabController(initialLength: tabs.length); return currentStorage != null ? Files(storage: currentStorage) : Column( children: [ Expanded( child: TabBarView( controller: tabController, children: tabs .map((tab) => Card( color: Colors.transparent, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: tab.child)) .toList(), ), ), Divider( color: Theme.of(context) .colorScheme .primary .withValues(alpha: 0.25), height: 0, ), Container( padding: const EdgeInsets.fromLTRB(0, 0, 4, 0), child: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ Expanded( child: TabBar( controller: tabController, isScrollable: true, tabAlignment: TabAlignment.start, dividerColor: Colors.transparent, tabs: tabs.map((tab) => Tab(text: tab.title)).toList(), ), ), PopupMenuButton( tooltip: t.add_storage, icon: const Icon(Icons.add_rounded), iconColor: Theme.of(context).colorScheme.onSurfaceVariant, clipBehavior: Clip.hardEdge, color: Theme.of(context).colorScheme.surface.withAlpha(250), onSelected: (StorageType value) { switch (value) { case StorageType.internal: case StorageType.network: case StorageType.usb: case StorageType.sdcard: () async { if (isAndroid) { final dir = await SafUtil().pickDirectory( persistablePermission: true, ); if (dir != null && context.mounted) { showFolderDialog( context, storage: LocalStorage( type: value, name: dir.name, basePath: [dir.uri], ), ); } } else { String? selectedDirectory = await FilePicker .platform .getDirectoryPath(); if (selectedDirectory != null && context.mounted) { showFolderDialog( context, storage: LocalStorage( type: value, name: pathConv(selectedDirectory).last, basePath: pathConv(selectedDirectory), ), ); } } }(); break; case StorageType.webdav: showWebDAVDialog(context); break; case StorageType.ftp: showFTPDialog(context); break; case StorageType.none: break; } }, itemBuilder: (BuildContext context) { return [ PopupMenuItem( value: StorageType.internal, child: Text(t.folder), ), const PopupMenuItem( value: StorageType.webdav, child: Text('WebDAV'), ), PopupMenuItem( value: StorageType.ftp, child: Text('FTP'), ), ]; }, ), IconButton( tooltip: '${t.close} ( Escape )', icon: const Icon(Icons.close_rounded), onPressed: () => Navigator.of(context).pop(), ), ], ), ), ], ); } } ================================================ FILE: lib/widgets/popups/storages/storages_list.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:iris/models/storages/local.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/widgets/dialogs/show_folder_dialog.dart'; import 'package:iris/store/use_storage_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/widgets/dialogs/show_ftp_dialog.dart'; import 'package:iris/widgets/dialogs/show_webdav_dialog.dart'; import 'package:path/path.dart' as p; class StoragesList extends HookWidget { const StoragesList({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final localStoragesFuture = useMemoized(() async => await getLocalStorages(context), []); final localStorages = useFuture(localStoragesFuture).data ?? []; final storages = useStorageStore().select(context, (state) => state.storages); final allStorages = useMemoized( () => [ ...localStorages, ...storages, ], [localStorages, storages]); return ListView.builder( padding: EdgeInsets.zero, itemCount: allStorages.length, itemBuilder: (context, index) => ListTile( contentPadding: const EdgeInsets.fromLTRB(16, 0, 12, 0), title: Text(allStorages[index].name), subtitle: allStorages[index].name.contains(allStorages[index].basePath[0]) ? null : () { String? subtitle; switch (allStorages[index].type) { case StorageType.internal: case StorageType.network: case StorageType.usb: case StorageType.sdcard: subtitle = p.normalize(allStorages[index].basePath.join('/')); break; case StorageType.webdav: final storage = allStorages[index] as WebDAVStorage; subtitle = 'http${storage.https ? 's' : ''}://${storage.host}${storage.port.isNotEmpty && storage.port != '80' && storage.port != '443' ? ':${storage.port}' : ''}${storage.basePath.join('/')}'; break; case StorageType.ftp: final storage = allStorages[index] as FTPStorage; subtitle = 'ftp://${storage.username.isNotEmpty ? '${storage.username}@' : ''}${storage.host}:${storage.port}${storage.basePath.join('/')}'; break; case StorageType.none: break; } return subtitle == null ? null : Text( subtitle, overflow: TextOverflow.ellipsis, ); }(), onTap: () { useStorageStore().updateCurrentPath(allStorages[index].basePath); useStorageStore().updateCurrentStorage(allStorages[index]); }, trailing: localStorages.contains(allStorages[index]) ? null : PopupMenuButton( tooltip: t.menu, clipBehavior: Clip.hardEdge, color: Theme.of(context).colorScheme.surface.withAlpha(250), onSelected: (value) { switch (value) { case StorageOptions.edit: switch (allStorages[index].type) { case StorageType.internal: case StorageType.network: case StorageType.usb: case StorageType.sdcard: showFolderDialog(context, storage: allStorages[index] as LocalStorage); break; case StorageType.webdav: showWebDAVDialog(context, storage: allStorages[index] as WebDAVStorage); break; case StorageType.ftp: showFTPDialog(context, storage: allStorages[index] as FTPStorage); break; case StorageType.none: break; } break; case StorageOptions.remove: useStorageStore().removeStorage(allStorages[index]); break; } }, itemBuilder: (BuildContext context) { return [ PopupMenuItem( value: StorageOptions.edit, child: Text(t.edit), ), PopupMenuItem( value: StorageOptions.remove, child: Text(t.remove), ), ]; }, ), ), ); } } ================================================ FILE: lib/widgets/popups/track/audio_track_list.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:fvp/fvp.dart'; import 'package:iris/models/player.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/logger.dart'; import 'package:media_kit/media_kit.dart'; import 'package:provider/provider.dart'; class AudioTrackList extends HookWidget { const AudioTrackList({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final player = context.read(); final focusNode = useFocusNode(); useEffect(() { focusNode.requestFocus(); return () => focusNode.unfocus(); }, []); if (player is MediaKitPlayer) { return ListView( children: [ ...player.audios.map( (audio) => ListTile( focusNode: player.audio == audio ? focusNode : null, title: Text( audio == AudioTrack.auto() ? t.auto : audio == AudioTrack.no() ? t.off : audio.title ?? audio.language ?? audio.id, style: player.audio == audio ? TextStyle( fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary, ) : TextStyle( color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), tileColor: player.audio == audio ? Theme.of(context).hoverColor : null, onTap: () { logger( 'Set audio track: ${audio.title ?? audio.language ?? audio.id}'); player.player.setAudioTrack(audio); Navigator.of(context).pop(); }, ), ), ], ); } if (player is FvpPlayer) { final audios = player.controller.getMediaInfo()?.audio ?? []; final activeAudioTracks = player.controller.getActiveAudioTracks() ?? []; return ListView( children: [ ListTile( focusNode: activeAudioTracks.isEmpty ? focusNode : null, title: Text( t.off, style: activeAudioTracks.isEmpty ? TextStyle( fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary, ) : TextStyle( color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), tileColor: activeAudioTracks.isEmpty ? Theme.of(context).hoverColor : null, onTap: () { logger('Set audio track: ${t.off}'); player.controller.setAudioTracks([]); Navigator.of(context).pop(); }, ), ...audios.map( (audio) => ListTile( focusNode: activeAudioTracks.contains(audios.indexOf(audio)) ? focusNode : null, title: Text( audio.metadata['title'] ?? audio.metadata['language'] ?? audios.indexOf(audio).toString(), style: activeAudioTracks.contains(audios.indexOf(audio)) ? TextStyle( fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary, ) : TextStyle( color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), tileColor: activeAudioTracks.contains(audios.indexOf(audio)) ? Theme.of(context).hoverColor : null, onTap: () { logger( 'Set audio track: ${audio.metadata['title'] ?? audio.metadata['language'] ?? audios.indexOf(audio).toString()}'); player.controller.setAudioTracks([audios.indexOf(audio)]); Navigator.of(context).pop(); }, ), ), ], ); } return Container(); } } ================================================ FILE: lib/widgets/popups/track/subtitle_and_audio_track.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:iris/widgets/popups/track/audio_track_list.dart'; import 'package:iris/widgets/popups/track/subtitle_list.dart'; import 'package:iris/utils/get_localizations.dart'; class ITab { final String title; final Widget child; const ITab({ required this.title, required this.child, }); } class SubtitleAndAudioTrack extends HookWidget { const SubtitleAndAudioTrack({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); List tabs = [ ITab(title: t.subtitle, child: SubtitleList()), ITab(title: t.audio_track, child: AudioTrackList()), ]; final tabController = useTabController(initialLength: tabs.length); return Column( mainAxisSize: MainAxisSize.min, children: [ Expanded( child: TabBarView( controller: tabController, children: tabs .map((e) => Card( color: Colors.transparent, elevation: 0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: e.child, )) .toList(), ), ), Divider( color: Theme.of(context).colorScheme.primary.withValues(alpha: 0.25), height: 0, ), Container( padding: EdgeInsets.zero, child: Container( padding: const EdgeInsets.fromLTRB(0, 0, 4, 0), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ TabBar( controller: tabController, isScrollable: true, tabAlignment: TabAlignment.start, dividerColor: Colors.transparent, tabs: tabs.map((tab) => Tab(text: tab.title)).toList()), const Spacer(), IconButton( tooltip: '${t.close} ( Escape )', icon: const Icon(Icons.close_rounded), onPressed: () => Navigator.of(context).pop(), ), ], ), ), ), ], ); } } ================================================ FILE: lib/widgets/popups/track/subtitle_list.dart ================================================ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_zustand/flutter_zustand.dart'; import 'package:fvp/fvp.dart'; import 'package:iris/models/file.dart'; import 'package:iris/models/player.dart'; import 'package:iris/models/storages/storage.dart'; import 'package:iris/store/use_play_queue_store.dart'; import 'package:iris/utils/get_localizations.dart'; import 'package:iris/utils/logger.dart'; import 'package:media_kit/media_kit.dart'; import 'package:media_stream/media_stream.dart'; import 'package:provider/provider.dart'; class SubtitleList extends HookWidget { const SubtitleList({super.key}); @override Widget build(BuildContext context) { final t = getLocalizations(context); final focusNode = useFocusNode(); final player = context.watch(); final playQueue = usePlayQueueStore().select(context, (state) => state.playQueue); final currentIndex = usePlayQueueStore().select(context, (state) => state.currentIndex); final int currentPlayIndex = useMemoized( () => playQueue.indexWhere((element) => element.index == currentIndex), [playQueue, currentIndex]); final file = useMemoized( () => playQueue.isEmpty || currentPlayIndex < 0 ? null : playQueue[currentPlayIndex].file, [playQueue, currentPlayIndex]); useEffect(() { focusNode.requestFocus(); return focusNode.unfocus; }, []); if (player is MediaKitPlayer) { final activeSubtitle = context.select( (p) => p is MediaKitPlayer ? p.subtitle : SubtitleTrack.no()); final subtitles = context.select>( (p) => p is MediaKitPlayer ? p.subtitles : []); final externalSubtitles = context.select>( (p) => p is MediaKitPlayer ? p.externalSubtitles : []); return ListView( children: [ ...subtitles.map((subtitle) { final bool isActive = activeSubtitle == subtitle; return ListTile( focusNode: isActive ? focusNode : null, title: Text( subtitle == SubtitleTrack.no() ? t.off : subtitle.title ?? subtitle.language ?? subtitle.id, style: isActive ? TextStyle( fontWeight: FontWeight.bold, color: Theme.of(context).colorScheme.primary) : TextStyle( color: Theme.of(context).colorScheme.onSurfaceVariant), ), tileColor: isActive ? Theme.of(context).hoverColor : null, onTap: () { logger('Set subtitle: ${subtitle.id}'); player.player.setSubtitleTrack(subtitle); Navigator.of(context).pop(); }, ); }), ...externalSubtitles.map((subtitle) { return ListTile( title: Text(subtitle.name, style: TextStyle( color: Theme.of(context).colorScheme.onSurfaceVariant)), onTap: () { logger('Set external subtitle: $subtitle'); final mediaStream = MediaStream(); final uri = file?.storageType == StorageType.ftp ? '${mediaStream.url}/${subtitle.uri}' : subtitle.uri; player.player.setSubtitleTrack( SubtitleTrack.uri(uri, title: subtitle.name)); Navigator.of(context).pop(); }, ); }), ], ); } if (player is FvpPlayer) { final activeSubtitles = useListenableSelector(player.controller, () => player.controller.getActiveSubtitleTracks() ?? []); final externalSubtitleIndex = useValueListenable(player.externalSubtitle); final subtitles = player.controller.getMediaInfo()?.subtitle ?? []; final externalSubtitles = player.externalSubtitles; return ListView( children: [ ListTile( selected: externalSubtitleIndex == null && activeSubtitles.isEmpty, focusNode: externalSubtitleIndex == null && activeSubtitles.isEmpty ? focusNode : null, title: Text(t.off), onTap: () { logger('Set subtitle: ${t.off}'); player.externalSubtitle.value = null; player.controller.setSubtitleTracks([]); Navigator.of(context).pop(); }, ), ...subtitles.map((subtitle) { final int index = subtitles.indexOf(subtitle); final bool isActive = externalSubtitleIndex == null && activeSubtitles.contains(index); return ListTile( selected: isActive, focusNode: isActive ? focusNode : null, title: Text(subtitle.metadata['title'] ?? subtitle.metadata['language'] ?? subtitle.index.toString()), onTap: () { player.externalSubtitle.value = null; player.controller.setSubtitleTracks([index]); Navigator.of(context).pop(); }, ); }), ...externalSubtitles.map((subtitle) { final int index = externalSubtitles.indexOf(subtitle); final bool isActive = externalSubtitleIndex == index; return ListTile( selected: isActive, focusNode: isActive ? focusNode : null, title: Text(subtitle.name), onTap: () { player.externalSubtitle.value = index; Navigator.of(context).pop(); }, ); }), ], ); } return Container(); } } ================================================ FILE: linux/.gitignore ================================================ flutter/ephemeral ================================================ FILE: linux/CMakeLists.txt ================================================ # Project-level configuration. cmake_minimum_required(VERSION 3.10) project(runner LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. set(BINARY_NAME "iris") # The unique GTK application identifier for this application. See: # https://wiki.gnome.org/HowDoI/ChooseApplicationID set(APPLICATION_ID "nini22p.iris") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. cmake_policy(SET CMP0063 NEW) # Load bundled libraries from the lib/ directory relative to the binary. set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") # Root filesystem for cross-building. if(FLUTTER_TARGET_PLATFORM_SYSROOT) set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) endif() # Define build configuration options. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Flutter build mode" FORCE) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Profile" "Release") endif() # Compilation settings that should be applied to most targets. # # Be cautious about adding new options here, as plugins use this function by # default. In most cases, you should add new options to specific targets instead # of modifying this function. function(APPLY_STANDARD_SETTINGS TARGET) target_compile_features(${TARGET} PUBLIC cxx_std_14) target_compile_options(${TARGET} PRIVATE -Wall -Werror) target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") endfunction() # Flutter library and tool build rules. set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") add_subdirectory(${FLUTTER_MANAGED_DIR}) # System-level dependencies. find_package(PkgConfig REQUIRED) pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") # Define the application target. To change its name, change BINARY_NAME above, # not the value here, or `flutter run` will no longer work. # # Any new source files that you add to the application should be added here. add_executable(${BINARY_NAME} "main.cc" "my_application.cc" "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" ) # Apply the standard set of build settings. This can be removed for applications # that need different build settings. apply_standard_settings(${BINARY_NAME}) # Add dependency libraries. Add any application-specific dependencies here. target_link_libraries(${BINARY_NAME} PRIVATE flutter) target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) # Run the Flutter tool portions of the build. This must not be removed. add_dependencies(${BINARY_NAME} flutter_assemble) # Only the install-generated bundle's copy of the executable will launch # correctly, since the resources must in the right relative locations. To avoid # people trying to run the unbundled copy, put it in a subdirectory instead of # the default top-level location. set_target_properties(${BINARY_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" ) # Generated plugin build rules, which manage building the plugins and adding # them to the application. include(flutter/generated_plugins.cmake) # === Installation === # By default, "installing" just makes a relocatable bundle in the build # directory. set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) endif() # Start with a clean build bundle directory every time. install(CODE " file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") " COMPONENT Runtime) set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" COMPONENT Runtime) install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) install(FILES "${bundled_library}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) endforeach(bundled_library) # Copy the native assets provided by the build.dart from all packages. set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") install(DIRECTORY "${NATIVE_ASSETS_DIR}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) # Fully re-copy the assets directory on each build to avoid having stale files # from a previous install. set(FLUTTER_ASSET_DIR_NAME "flutter_assets") install(CODE " file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") " COMPONENT Runtime) install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) # Install the AOT library on non-Debug builds only. if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) endif() ================================================ FILE: linux/flutter/CMakeLists.txt ================================================ # This file controls Flutter-level build steps. It should not be edited. cmake_minimum_required(VERSION 3.10) set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") # Configuration provided via flutter tool. include(${EPHEMERAL_DIR}/generated_config.cmake) # TODO: Move the rest of this into files in ephemeral. See # https://github.com/flutter/flutter/issues/57146. # Serves the same purpose as list(TRANSFORM ... PREPEND ...), # which isn't available in 3.10. function(list_prepend LIST_NAME PREFIX) set(NEW_LIST "") foreach(element ${${LIST_NAME}}) list(APPEND NEW_LIST "${PREFIX}${element}") endforeach(element) set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) endfunction() # === Flutter Library === # System-level dependencies. find_package(PkgConfig REQUIRED) pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") # Published to parent scope for install step. set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) list(APPEND FLUTTER_LIBRARY_HEADERS "fl_basic_message_channel.h" "fl_binary_codec.h" "fl_binary_messenger.h" "fl_dart_project.h" "fl_engine.h" "fl_json_message_codec.h" "fl_json_method_codec.h" "fl_message_codec.h" "fl_method_call.h" "fl_method_channel.h" "fl_method_codec.h" "fl_method_response.h" "fl_plugin_registrar.h" "fl_plugin_registry.h" "fl_standard_message_codec.h" "fl_standard_method_codec.h" "fl_string_codec.h" "fl_value.h" "fl_view.h" "flutter_linux.h" ) list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") add_library(flutter INTERFACE) target_include_directories(flutter INTERFACE "${EPHEMERAL_DIR}" ) target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") target_link_libraries(flutter INTERFACE PkgConfig::GTK PkgConfig::GLIB PkgConfig::GIO ) add_dependencies(flutter flutter_assemble) # === Flutter tool backend === # _phony_ is a non-existent file to force this command to run every time, # since currently there's no way to get a full input/output list from the # flutter tool. add_custom_command( OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} ${CMAKE_CURRENT_BINARY_DIR}/_phony_ COMMAND ${CMAKE_COMMAND} -E env ${FLUTTER_TOOL_ENVIRONMENT} "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} VERBATIM ) add_custom_target(flutter_assemble DEPENDS "${FLUTTER_LIBRARY}" ${FLUTTER_LIBRARY_HEADERS} ) ================================================ FILE: linux/flutter/generated_plugin_registrant.cc ================================================ // // Generated file. Do not edit. // // clang-format off #include "generated_plugin_registrant.h" #include #include #include #include #include #include #include #include #include #include #include #include #include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) desktop_drop_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DesktopDropPlugin"); desktop_drop_plugin_register_with_registrar(desktop_drop_registrar); g_autoptr(FlPluginRegistrar) dynamic_color_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); g_autoptr(FlPluginRegistrar) flutter_volume_controller_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterVolumeControllerPlugin"); flutter_volume_controller_plugin_register_with_registrar(flutter_volume_controller_registrar); g_autoptr(FlPluginRegistrar) fvp_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "FvpPlugin"); fvp_plugin_register_with_registrar(fvp_registrar); g_autoptr(FlPluginRegistrar) gtk_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "GtkPlugin"); gtk_plugin_register_with_registrar(gtk_registrar); g_autoptr(FlPluginRegistrar) media_kit_libs_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitLibsLinuxPlugin"); media_kit_libs_linux_plugin_register_with_registrar(media_kit_libs_linux_registrar); g_autoptr(FlPluginRegistrar) media_kit_video_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "MediaKitVideoPlugin"); media_kit_video_plugin_register_with_registrar(media_kit_video_registrar); g_autoptr(FlPluginRegistrar) screen_retriever_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "ScreenRetrieverLinuxPlugin"); screen_retriever_linux_plugin_register_with_registrar(screen_retriever_linux_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); g_autoptr(FlPluginRegistrar) volume_controller_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "VolumeControllerPlugin"); volume_controller_plugin_register_with_registrar(volume_controller_registrar); g_autoptr(FlPluginRegistrar) window_manager_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "WindowManagerPlugin"); window_manager_plugin_register_with_registrar(window_manager_registrar); g_autoptr(FlPluginRegistrar) window_size_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "WindowSizePlugin"); window_size_plugin_register_with_registrar(window_size_registrar); } ================================================ FILE: linux/flutter/generated_plugin_registrant.h ================================================ // // Generated file. Do not edit. // // clang-format off #ifndef GENERATED_PLUGIN_REGISTRANT_ #define GENERATED_PLUGIN_REGISTRANT_ #include // Registers Flutter plugins. void fl_register_plugins(FlPluginRegistry* registry); #endif // GENERATED_PLUGIN_REGISTRANT_ ================================================ FILE: linux/flutter/generated_plugins.cmake ================================================ # # Generated file, do not edit. # list(APPEND FLUTTER_PLUGIN_LIST desktop_drop dynamic_color flutter_secure_storage_linux flutter_volume_controller fvp gtk media_kit_libs_linux media_kit_video screen_retriever_linux url_launcher_linux volume_controller window_manager window_size ) list(APPEND FLUTTER_FFI_PLUGIN_LIST ) set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) list(APPEND PLUGIN_BUNDLED_LIBRARIES $) list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) endforeach(plugin) foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) endforeach(ffi_plugin) ================================================ FILE: linux/main.cc ================================================ #include "my_application.h" int main(int argc, char** argv) { g_autoptr(MyApplication) app = my_application_new(); return g_application_run(G_APPLICATION(app), argc, argv); } ================================================ FILE: linux/my_application.cc ================================================ #include "my_application.h" #include #ifdef GDK_WINDOWING_X11 #include #endif #include "flutter/generated_plugin_registrant.h" struct _MyApplication { GtkApplication parent_instance; char** dart_entrypoint_arguments; }; G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) // Implements GApplication::activate. static void my_application_activate(GApplication* application) { MyApplication* self = MY_APPLICATION(application); GtkWindow* window = GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); // Use a header bar when running in GNOME as this is the common style used // by applications and is the setup most users will be using (e.g. Ubuntu // desktop). // If running on X and not using GNOME then just use a traditional title bar // in case the window manager does more exotic layout, e.g. tiling. // If running on Wayland assume the header bar will work (may need changing // if future cases occur). gboolean use_header_bar = TRUE; #ifdef GDK_WINDOWING_X11 GdkScreen* screen = gtk_window_get_screen(window); if (GDK_IS_X11_SCREEN(screen)) { const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); if (g_strcmp0(wm_name, "GNOME Shell") != 0) { use_header_bar = FALSE; } } #endif if (use_header_bar) { GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); gtk_widget_show(GTK_WIDGET(header_bar)); gtk_header_bar_set_title(header_bar, "IRIS"); gtk_header_bar_set_show_close_button(header_bar, TRUE); gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); } else { gtk_window_set_title(window, "IRIS"); } gtk_window_set_default_size(window, 1280, 720); gtk_widget_show(GTK_WIDGET(window)); g_autoptr(FlDartProject) project = fl_dart_project_new(); fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); FlView* view = fl_view_new(project); gtk_widget_show(GTK_WIDGET(view)); gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); fl_register_plugins(FL_PLUGIN_REGISTRY(view)); gtk_widget_grab_focus(GTK_WIDGET(view)); } // Implements GApplication::local_command_line. static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { MyApplication* self = MY_APPLICATION(application); // Strip out the first argument as it is the binary name. self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); g_autoptr(GError) error = nullptr; if (!g_application_register(application, nullptr, &error)) { g_warning("Failed to register: %s", error->message); *exit_status = 1; return TRUE; } g_application_activate(application); *exit_status = 0; return TRUE; } // Implements GApplication::startup. static void my_application_startup(GApplication* application) { //MyApplication* self = MY_APPLICATION(object); // Perform any actions required at application startup. G_APPLICATION_CLASS(my_application_parent_class)->startup(application); } // Implements GApplication::shutdown. static void my_application_shutdown(GApplication* application) { //MyApplication* self = MY_APPLICATION(object); // Perform any actions required at application shutdown. G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); } // Implements GObject::dispose. static void my_application_dispose(GObject* object) { MyApplication* self = MY_APPLICATION(object); g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); G_OBJECT_CLASS(my_application_parent_class)->dispose(object); } static void my_application_class_init(MyApplicationClass* klass) { G_APPLICATION_CLASS(klass)->activate = my_application_activate; G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; G_APPLICATION_CLASS(klass)->startup = my_application_startup; G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; G_OBJECT_CLASS(klass)->dispose = my_application_dispose; } static void my_application_init(MyApplication* self) {} MyApplication* my_application_new() { return MY_APPLICATION(g_object_new(my_application_get_type(), "application-id", APPLICATION_ID, "flags", G_APPLICATION_NON_UNIQUE, nullptr)); } ================================================ FILE: linux/my_application.h ================================================ #ifndef FLUTTER_MY_APPLICATION_H_ #define FLUTTER_MY_APPLICATION_H_ #include G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, GtkApplication) /** * my_application_new: * * Creates a new Flutter-based application. * * Returns: a new #MyApplication. */ MyApplication* my_application_new(); #endif // FLUTTER_MY_APPLICATION_H_ ================================================ FILE: macos/.gitignore ================================================ # Flutter-related **/Flutter/ephemeral/ **/Pods/ # Xcode-related **/dgph **/xcuserdata/ ================================================ FILE: macos/Flutter/Flutter-Debug.xcconfig ================================================ #include "ephemeral/Flutter-Generated.xcconfig" ================================================ FILE: macos/Flutter/Flutter-Release.xcconfig ================================================ #include "ephemeral/Flutter-Generated.xcconfig" ================================================ FILE: macos/Flutter/GeneratedPluginRegistrant.swift ================================================ // // Generated file. Do not edit. // import FlutterMacOS import Foundation import app_links import desktop_drop import device_info_plus import disks_desktop import dynamic_color import file_picker import flutter_secure_storage_macos import flutter_volume_controller import fvp import media_kit_libs_macos_video import media_kit_video import package_info_plus import path_provider_foundation import screen_brightness_macos import screen_retriever_macos import url_launcher_macos import video_player_avfoundation import volume_controller import wakelock_plus import window_manager import window_size func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AppLinksMacosPlugin.register(with: registry.registrar(forPlugin: "AppLinksMacosPlugin")) DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DisksDesktopPlugin.register(with: registry.registrar(forPlugin: "DisksDesktopPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) FlutterVolumeControllerPlugin.register(with: registry.registrar(forPlugin: "FlutterVolumeControllerPlugin")) FvpPlugin.register(with: registry.registrar(forPlugin: "FvpPlugin")) MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosVideoPlugin")) MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitVideoPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenBrightnessMacosPlugin")) ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) VolumeControllerPlugin.register(with: registry.registrar(forPlugin: "VolumeControllerPlugin")) WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) WindowSizePlugin.register(with: registry.registrar(forPlugin: "WindowSizePlugin")) } ================================================ FILE: macos/Runner/AppDelegate.swift ================================================ import Cocoa import FlutterMacOS @main class AppDelegate: FlutterAppDelegate { override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } } ================================================ FILE: macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "size" : "16x16", "idiom" : "mac", "filename" : "app_icon_16.png", "scale" : "1x" }, { "size" : "16x16", "idiom" : "mac", "filename" : "app_icon_32.png", "scale" : "2x" }, { "size" : "32x32", "idiom" : "mac", "filename" : "app_icon_32.png", "scale" : "1x" }, { "size" : "32x32", "idiom" : "mac", "filename" : "app_icon_64.png", "scale" : "2x" }, { "size" : "128x128", "idiom" : "mac", "filename" : "app_icon_128.png", "scale" : "1x" }, { "size" : "128x128", "idiom" : "mac", "filename" : "app_icon_256.png", "scale" : "2x" }, { "size" : "256x256", "idiom" : "mac", "filename" : "app_icon_256.png", "scale" : "1x" }, { "size" : "256x256", "idiom" : "mac", "filename" : "app_icon_512.png", "scale" : "2x" }, { "size" : "512x512", "idiom" : "mac", "filename" : "app_icon_512.png", "scale" : "1x" }, { "size" : "512x512", "idiom" : "mac", "filename" : "app_icon_1024.png", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: macos/Runner/Base.lproj/MainMenu.xib ================================================ ================================================ FILE: macos/Runner/Configs/AppInfo.xcconfig ================================================ // Application-level settings for the Runner target. // // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the // future. If not, the values below would default to using the project name when this becomes a // 'flutter create' template. // The application's name. By default this is also the title of the Flutter window. PRODUCT_NAME = iris // The application's bundle identifier PRODUCT_BUNDLE_IDENTIFIER = nini22p.iris // The copyright displayed in application information PRODUCT_COPYRIGHT = Copyright © 2024 nini22P. All rights reserved. ================================================ FILE: macos/Runner/Configs/Debug.xcconfig ================================================ #include "../../Flutter/Flutter-Debug.xcconfig" #include "Warnings.xcconfig" ================================================ FILE: macos/Runner/Configs/Release.xcconfig ================================================ #include "../../Flutter/Flutter-Release.xcconfig" #include "Warnings.xcconfig" ================================================ FILE: macos/Runner/Configs/Warnings.xcconfig ================================================ WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings GCC_WARN_UNDECLARED_SELECTOR = YES CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE CLANG_WARN__DUPLICATE_METHOD_MATCH = YES CLANG_WARN_PRAGMA_PACK = YES CLANG_WARN_STRICT_PROTOTYPES = YES CLANG_WARN_COMMA = YES GCC_WARN_STRICT_SELECTOR_MATCH = YES CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES GCC_WARN_SHADOW = YES CLANG_WARN_UNREACHABLE_CODE = YES ================================================ FILE: macos/Runner/DebugProfile.entitlements ================================================ com.apple.security.app-sandbox com.apple.security.cs.allow-jit com.apple.security.network.server ================================================ FILE: macos/Runner/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIconFile CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString $(FLUTTER_BUILD_NAME) CFBundleVersion $(FLUTTER_BUILD_NUMBER) LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright $(PRODUCT_COPYRIGHT) NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: macos/Runner/MainFlutterWindow.swift ================================================ import Cocoa import FlutterMacOS class MainFlutterWindow: NSWindow { override func awakeFromNib() { let flutterViewController = FlutterViewController() let windowFrame = self.frame self.contentViewController = flutterViewController self.setFrame(windowFrame, display: true) RegisterGeneratedPlugins(registry: flutterViewController) super.awakeFromNib() } } ================================================ FILE: macos/Runner/Release.entitlements ================================================ com.apple.security.app-sandbox ================================================ FILE: macos/Runner.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 54; objects = { /* Begin PBXAggregateTarget section */ 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { isa = PBXAggregateTarget; buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; buildPhases = ( 33CC111E2044C6BF0003C045 /* ShellScript */, ); dependencies = ( ); name = "Flutter Assemble"; productName = FLX; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 33CC10E52044A3C60003C045 /* Project object */; proxyType = 1; remoteGlobalIDString = 33CC10EC2044A3C60003C045; remoteInfo = Runner; }; 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 33CC10E52044A3C60003C045 /* Project object */; proxyType = 1; remoteGlobalIDString = 33CC111A2044C6BA0003C045; remoteInfo = FLX; }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ 33CC110E2044A8840003C045 /* Bundle Framework */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( ); name = "Bundle Framework"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; 33CC10ED2044A3C60003C045 /* iris.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iris.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 331C80D2294CF70F00263BE5 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 33CC10EA2044A3C60003C045 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 331C80D6294CF71000263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( 331C80D7294CF71000263BE5 /* RunnerTests.swift */, ); path = RunnerTests; sourceTree = ""; }; 33BA886A226E78AF003329D5 /* Configs */ = { isa = PBXGroup; children = ( 33E5194F232828860026EE4D /* AppInfo.xcconfig */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, ); path = Configs; sourceTree = ""; }; 33CC10E42044A3C60003C045 = { isa = PBXGroup; children = ( 33FAB671232836740065AC1E /* Runner */, 33CEB47122A05771004F2AC0 /* Flutter */, 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, ); sourceTree = ""; }; 33CC10EE2044A3C60003C045 /* Products */ = { isa = PBXGroup; children = ( 33CC10ED2044A3C60003C045 /* iris.app */, 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, ); name = Products; sourceTree = ""; }; 33CC11242044D66E0003C045 /* Resources */ = { isa = PBXGroup; children = ( 33CC10F22044A3C60003C045 /* Assets.xcassets */, 33CC10F42044A3C60003C045 /* MainMenu.xib */, 33CC10F72044A3C60003C045 /* Info.plist */, ); name = Resources; path = ..; sourceTree = ""; }; 33CEB47122A05771004F2AC0 /* Flutter */ = { isa = PBXGroup; children = ( 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, ); path = Flutter; sourceTree = ""; }; 33FAB671232836740065AC1E /* Runner */ = { isa = PBXGroup; children = ( 33CC10F02044A3C60003C045 /* AppDelegate.swift */, 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, 33E51913231747F40026EE4D /* DebugProfile.entitlements */, 33E51914231749380026EE4D /* Release.entitlements */, 33CC11242044D66E0003C045 /* Resources */, 33BA886A226E78AF003329D5 /* Configs */, ); path = Runner; sourceTree = ""; }; D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 331C80D4294CF70F00263BE5 /* RunnerTests */ = { isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, ); buildRules = ( ); dependencies = ( 331C80DA294CF71000263BE5 /* PBXTargetDependency */, ); name = RunnerTests; productName = RunnerTests; productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; 33CC10EC2044A3C60003C045 /* Runner */ = { isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, ); buildRules = ( ); dependencies = ( 33CC11202044C79F0003C045 /* PBXTargetDependency */, ); name = Runner; productName = Runner; productReference = 33CC10ED2044A3C60003C045 /* iris.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 33CC10E52044A3C60003C045 /* Project object */ = { isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0920; LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80D4294CF70F00263BE5 = { CreatedOnToolsVersion = 14.0; TestTargetID = 33CC10EC2044A3C60003C045; }; 33CC10EC2044A3C60003C045 = { CreatedOnToolsVersion = 9.2; LastSwiftMigration = 1100; ProvisioningStyle = Automatic; SystemCapabilities = { com.apple.Sandbox = { enabled = 1; }; }; }; 33CC111A2044C6BA0003C045 = { CreatedOnToolsVersion = 9.2; ProvisioningStyle = Manual; }; }; }; buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 33CC10E42044A3C60003C045; productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 33CC10EC2044A3C60003C045 /* Runner */, 331C80D4294CF70F00263BE5 /* RunnerTests */, 33CC111A2044C6BA0003C045 /* Flutter Assemble */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 331C80D3294CF70F00263BE5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 33CC10EB2044A3C60003C045 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 3399D490228B24CF009A79C7 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( ); inputPaths = ( ); outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; }; 33CC111E2044C6BF0003C045 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( Flutter/ephemeral/FlutterInputs.xcfilelist, ); inputPaths = ( Flutter/ephemeral/tripwire, ); outputFileListPaths = ( Flutter/ephemeral/FlutterOutputs.xcfilelist, ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 331C80D1294CF70F00263BE5 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 33CC10E92044A3C60003C045 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 33CC10EC2044A3C60003C045 /* Runner */; targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; }; 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( 33CC10F52044A3C60003C045 /* Base */, ); name = MainMenu.xib; path = Runner; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iris.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/iris"; }; name = Debug; }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iris.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/iris"; }; name = Release; }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; PRODUCT_BUNDLE_IDENTIFIER = nini22p.iris.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iris.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/iris"; }; name = Profile; }; 338D0CE9231458BD00FA5F75 /* Profile */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 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_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; 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_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Profile; }; 338D0CEA231458BD00FA5F75 /* Profile */ = { isa = XCBuildConfiguration; baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; name = Profile; }; 338D0CEB231458BD00FA5F75 /* Profile */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Manual; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Profile; }; 33CC10F92044A3C60003C045 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 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_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; 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_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; 33CC10FA2044A3C60003C045 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; 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_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_SUSPICIOUS_MOVE = YES; CODE_SIGN_IDENTITY = "-"; COPY_PHASE_STRIP = NO; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_USER_SCRIPT_SANDBOXING = NO; 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_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Release; }; 33CC10FC2044A3C60003C045 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; }; name = Debug; }; 33CC10FD2044A3C60003C045 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 5.0; }; name = Release; }; 33CC111C2044C6BA0003C045 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Manual; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; 33CC111D2044C6BA0003C045 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { CODE_SIGN_STYLE = Automatic; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { isa = XCConfigurationList; buildConfigurations = ( 331C80DB294CF71000263BE5 /* Debug */, 331C80DC294CF71000263BE5 /* Release */, 331C80DD294CF71000263BE5 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( 33CC10F92044A3C60003C045 /* Debug */, 33CC10FA2044A3C60003C045 /* Release */, 338D0CE9231458BD00FA5F75 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( 33CC10FC2044A3C60003C045 /* Debug */, 33CC10FD2044A3C60003C045 /* Release */, 338D0CEA231458BD00FA5F75 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { isa = XCConfigurationList; buildConfigurations = ( 33CC111C2044C6BA0003C045 /* Debug */, 33CC111D2044C6BA0003C045 /* Release */, 338D0CEB231458BD00FA5F75 /* Profile */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 33CC10E52044A3C60003C045 /* Project object */; } ================================================ FILE: macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme ================================================ ================================================ FILE: macos/Runner.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: macos/RunnerTests/RunnerTests.swift ================================================ import Cocoa import FlutterMacOS import XCTest class RunnerTests: XCTestCase { func testExample() { // If you add code to the Runner application, consider adding tests here. // See https://developer.apple.com/documentation/xctest for more information about using XCTest. } } ================================================ FILE: pubspec.yaml ================================================ name: iris description: A lightweight video player publish_to: none version: 1.5.2+3 environment: sdk: ^3.5.4 dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.8 flutter_localizations: sdk: flutter intl: any file_picker: ^10.3.3 flutter_breadcrumb: ^1.0.1 flutter_hooks: ^0.21.3+1 flutter_secure_storage: ^8.1.0 flutter_zustand: ^0.0.5 media_kit: ^1.2.0 media_kit_video: ^1.3.0 media_kit_libs_video: ^1.0.6 path: ^1.9.1 path_provider: ^2.1.5 package_info_plus: ^9.0.0 provider: ^6.1.5 webdav_client: ^1.2.2 window_manager: ^0.5.1 url_launcher: ^6.3.2 scrollable_positioned_list: ^0.3.8 google_fonts: ^6.3.1 dynamic_color: ^1.8.1 window_size: ^0.1.0 uuid: ^4.5.1 flutter_markdown: ^0.7.7+1 http: ^1.5.0 collection: ^1.19.1 json_annotation: ^4.9.0 freezed_annotation: ^3.1.0 disks_desktop: ^1.0.1 android_x_storage: ^1.0.2 permission_handler: ^12.0.1 desktop_drop: ^0.6.1 app_links: ^6.4.1 device_info_plus: ^12.1.0 saf_util: ^0.11.0 screen_brightness: ^2.1.7 flutter_volume_controller: ^1.3.3 fvp: ^0.34.0 video_player: ^2.10.0 wakelock_plus: ^1.4.0 popover: ^0.3.1 pure_ftp: ^0.7.5 drives_windows: git: url: https://github.com/nini22P/drives_windows ref: main media_stream: git: url: https://github.com/nini22P/media_stream ref: main dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^6.0.0 dart_pubspec_licenses: ^3.0.9 build_runner: ^2.8.0 freezed: ^3.2.3 json_serializable: ^6.11.1 msix: ^3.16.12 # flutter_hooks_lint: ^1.4.0 # custom_lint: ^0.8.1 flutter: generate: true uses-material-design: true assets: - assets/images/ msix_config: display_name: IRIS player identity_name: 22P.IRISplayer publisher_display_name: 22P publisher: CN=9740B6B2-E777-4F52-8ECD-C4A577A73010 msix_version: 1.5.2.0 logo_path: assets/images/logo.png trim_logo: false languages: en-us, zh-cn execution_alias: iris file_extension: .aac, .aiff, .alac, .amr, .ape, .caf, .cda, .dsd, .dts, .flac, .m4a, .midi, .mp3, .mpc, .oga, .ogg, .opus, .raw, .spx, .tak, .tta, .wav, .wma, .wv, .3gp, .amv, .asf, .avi, .divx, .dpx, .drc, .dv, .f4v, .flv, .h264, .h265, .hevc, .m2ts, .m4p, .m4v, .mkv, .mng, .mov, .mp2, .mp4, .mpe, .mpeg, .mpg, .mpv, .mts, .mxf, .nsv, .ogv, .qt, .rm, .rmvb, .ts, .vob, .webm, .wmv, .yuv ================================================ FILE: test/widget_test.dart ================================================ // This is a basic Flutter widget test. // // To perform an interaction with a widget in your test, use the WidgetTester // utility in the flutter_test package. For example, you can send tap and scroll // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:iris/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { // Build our app and trigger a frame. await tester.pumpWidget(const MyApp()); // Verify that our counter starts at 0. expect(find.text('0'), findsOneWidget); expect(find.text('1'), findsNothing); // Tap the '+' icon and trigger a frame. await tester.tap(find.byIcon(Icons.add_rounded)); await tester.pump(); // Verify that our counter has incremented. expect(find.text('0'), findsNothing); expect(find.text('1'), findsOneWidget); }); } ================================================ FILE: windows/.gitignore ================================================ flutter/ephemeral/ # Visual Studio user-specific files. *.suo *.user *.userosscache *.sln.docstates # Visual Studio build-related files. x64/ x86/ # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache !*.[Cc]ache/ ================================================ FILE: windows/CMakeLists.txt ================================================ # Project-level configuration. cmake_minimum_required(VERSION 3.14) project(iris LANGUAGES CXX) # The name of the executable created for the application. Change this to change # the on-disk name of your application. set(BINARY_NAME "iris") # Explicitly opt in to modern CMake behaviors to avoid warnings with recent # versions of CMake. cmake_policy(VERSION 3.14...3.25) # Define build configuration option. get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(IS_MULTICONFIG) set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" CACHE STRING "" FORCE) else() if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Flutter build mode" FORCE) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Profile" "Release") endif() endif() # Define settings for the Profile build mode. set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") # Use Unicode for all projects. add_definitions(-DUNICODE -D_UNICODE) # Compilation settings that should be applied to most targets. # # Be cautious about adding new options here, as plugins use this function by # default. In most cases, you should add new options to specific targets instead # of modifying this function. function(APPLY_STANDARD_SETTINGS TARGET) target_compile_features(${TARGET} PUBLIC cxx_std_17) target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") target_compile_options(${TARGET} PRIVATE /EHsc) target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") endfunction() # Flutter library and tool build rules. set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") add_subdirectory(${FLUTTER_MANAGED_DIR}) # Application build; see runner/CMakeLists.txt. add_subdirectory("runner") # Generated plugin build rules, which manage building the plugins and adding # them to the application. include(flutter/generated_plugins.cmake) # === Installation === # Support files are copied into place next to the executable, so that it can # run in place. This is done instead of making a separate bundle (as on Linux) # so that building and running from within Visual Studio will work. set(BUILD_BUNDLE_DIR "$") # Make the "install" step default, as it's required to run. set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) endif() set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" COMPONENT Runtime) install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) if(PLUGIN_BUNDLED_LIBRARIES) install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) endif() # Copy the native assets provided by the build.dart from all packages. set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") install(DIRECTORY "${NATIVE_ASSETS_DIR}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) # Fully re-copy the assets directory on each build to avoid having stale files # from a previous install. set(FLUTTER_ASSET_DIR_NAME "flutter_assets") install(CODE " file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") " COMPONENT Runtime) install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) # Install the AOT library on non-Debug builds only. install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" CONFIGURATIONS Profile;Release COMPONENT Runtime) # Install iris-updater.bat install(FILES "${CMAKE_SOURCE_DIR}/iris-updater.bat" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) ================================================ FILE: windows/flutter/CMakeLists.txt ================================================ # This file controls Flutter-level build steps. It should not be edited. cmake_minimum_required(VERSION 3.14) set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") # Configuration provided via flutter tool. include(${EPHEMERAL_DIR}/generated_config.cmake) # TODO: Move the rest of this into files in ephemeral. See # https://github.com/flutter/flutter/issues/57146. set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") # Set fallback configurations for older versions of the flutter tool. if (NOT DEFINED FLUTTER_TARGET_PLATFORM) set(FLUTTER_TARGET_PLATFORM "windows-x64") endif() # === Flutter Library === set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") # Published to parent scope for install step. set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) list(APPEND FLUTTER_LIBRARY_HEADERS "flutter_export.h" "flutter_windows.h" "flutter_messenger.h" "flutter_plugin_registrar.h" "flutter_texture_registrar.h" ) list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") add_library(flutter INTERFACE) target_include_directories(flutter INTERFACE "${EPHEMERAL_DIR}" ) target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") add_dependencies(flutter flutter_assemble) # === Wrapper === list(APPEND CPP_WRAPPER_SOURCES_CORE "core_implementations.cc" "standard_codec.cc" ) list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") list(APPEND CPP_WRAPPER_SOURCES_PLUGIN "plugin_registrar.cc" ) list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") list(APPEND CPP_WRAPPER_SOURCES_APP "flutter_engine.cc" "flutter_view_controller.cc" ) list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") # Wrapper sources needed for a plugin. add_library(flutter_wrapper_plugin STATIC ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} ) apply_standard_settings(flutter_wrapper_plugin) set_target_properties(flutter_wrapper_plugin PROPERTIES POSITION_INDEPENDENT_CODE ON) set_target_properties(flutter_wrapper_plugin PROPERTIES CXX_VISIBILITY_PRESET hidden) target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) target_include_directories(flutter_wrapper_plugin PUBLIC "${WRAPPER_ROOT}/include" ) add_dependencies(flutter_wrapper_plugin flutter_assemble) # Wrapper sources needed for the runner. add_library(flutter_wrapper_app STATIC ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_APP} ) apply_standard_settings(flutter_wrapper_app) target_link_libraries(flutter_wrapper_app PUBLIC flutter) target_include_directories(flutter_wrapper_app PUBLIC "${WRAPPER_ROOT}/include" ) add_dependencies(flutter_wrapper_app flutter_assemble) # === Flutter tool backend === # _phony_ is a non-existent file to force this command to run every time, # since currently there's no way to get a full input/output list from the # flutter tool. set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) add_custom_command( OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} ${CPP_WRAPPER_SOURCES_APP} ${PHONY_OUTPUT} COMMAND ${CMAKE_COMMAND} -E env ${FLUTTER_TOOL_ENVIRONMENT} "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" ${FLUTTER_TARGET_PLATFORM} $ VERBATIM ) add_custom_target(flutter_assemble DEPENDS "${FLUTTER_LIBRARY}" ${FLUTTER_LIBRARY_HEADERS} ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} ${CPP_WRAPPER_SOURCES_APP} ) ================================================ FILE: windows/flutter/generated_plugin_registrant.cc ================================================ // // Generated file. Do not edit. // // clang-format off #include "generated_plugin_registrant.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { AppLinksPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("AppLinksPluginCApi")); DesktopDropPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("DesktopDropPlugin")); DisksDesktopPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("DisksDesktopPlugin")); DynamicColorPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); FlutterSecureStorageWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); FlutterVolumeControllerPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FlutterVolumeControllerPluginCApi")); FvpPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FvpPluginCApi")); MediaKitLibsWindowsVideoPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("MediaKitLibsWindowsVideoPluginCApi")); MediaKitVideoPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("MediaKitVideoPluginCApi")); PermissionHandlerWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); ScreenBrightnessWindowsPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("ScreenBrightnessWindowsPlugin")); ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( registry->GetRegistrarForPlugin("UrlLauncherWindows")); VolumeControllerPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("VolumeControllerPluginCApi")); WindowManagerPluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("WindowManagerPlugin")); WindowSizePluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("WindowSizePlugin")); } ================================================ FILE: windows/flutter/generated_plugin_registrant.h ================================================ // // Generated file. Do not edit. // // clang-format off #ifndef GENERATED_PLUGIN_REGISTRANT_ #define GENERATED_PLUGIN_REGISTRANT_ #include // Registers Flutter plugins. void RegisterPlugins(flutter::PluginRegistry* registry); #endif // GENERATED_PLUGIN_REGISTRANT_ ================================================ FILE: windows/flutter/generated_plugins.cmake ================================================ # # Generated file, do not edit. # list(APPEND FLUTTER_PLUGIN_LIST app_links desktop_drop disks_desktop dynamic_color flutter_secure_storage_windows flutter_volume_controller fvp media_kit_libs_windows_video media_kit_video permission_handler_windows screen_brightness_windows screen_retriever_windows url_launcher_windows volume_controller window_manager window_size ) list(APPEND FLUTTER_FFI_PLUGIN_LIST ) set(PLUGIN_BUNDLED_LIBRARIES) foreach(plugin ${FLUTTER_PLUGIN_LIST}) add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) list(APPEND PLUGIN_BUNDLED_LIBRARIES $) list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) endforeach(plugin) foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) endforeach(ffi_plugin) ================================================ FILE: windows/inno-languages/ChineseSimplified.isl ================================================ ; *** Inno Setup version 6.4.0+ Chinese Simplified messages *** ; ; To download user-contributed translations of this file, go to: ; https://jrsoftware.org/files/istrans/ ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in ; two periods being displayed). ; ; Maintained by Zhenghan Yang ; Email: 847320916@QQ.com ; Translation based on network resource ; The latest Translation is on https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation ; [LangOptions] ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. LanguageName=简体中文 ; If Language Name display incorrect, uncomment next line ; LanguageName=<7B80><4F53><4E2D><6587> ; About LanguageID, to reference link: ; https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c LanguageID=$0804 ; About CodePage, to reference link: ; https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers LanguageCodePage=936 ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. ;DialogFontName= ;DialogFontSize=8 ;WelcomeFontName=Verdana ;WelcomeFontSize=12 ;TitleFontName=Arial ;TitleFontSize=29 ;CopyrightFontName=Arial ;CopyrightFontSize=8 [Messages] ; *** 应用程序标题 SetupAppTitle=安装 SetupWindowTitle=安装 - %1 UninstallAppTitle=卸载 UninstallAppFullTitle=%1 卸载 ; *** Misc. common InformationTitle=信息 ConfirmTitle=确认 ErrorTitle=错误 ; *** SetupLdr messages SetupLdrStartupMessage=现在将安装 %1。您想要继续吗? LdrCannotCreateTemp=无法创建临时文件。安装程序已中止 LdrCannotExecTemp=无法执行临时目录中的文件。安装程序已中止 HelpTextNote= ; *** 启动错误消息 LastErrorMessage=%1。%n%n错误 %2: %3 SetupFileMissing=安装目录中缺少文件 %1。请修正这个问题或者获取程序的新副本。 SetupFileCorrupt=安装文件已损坏。请获取程序的新副本。 SetupFileCorruptOrWrongVer=安装文件已损坏,或是与这个安装程序的版本不兼容。请修正这个问题或获取新的程序副本。 InvalidParameter=无效的命令行参数:%n%n%1 SetupAlreadyRunning=安装程序正在运行。 WindowsVersionNotSupported=此程序不支持当前计算机运行的 Windows 版本。 WindowsServicePackRequired=此程序需要 %1 服务包 %2 或更高版本。 NotOnThisPlatform=此程序不能在 %1 上运行。 OnlyOnThisPlatform=此程序只能在 %1 上运行。 OnlyOnTheseArchitectures=此程序只能安装到为下列处理器架构设计的 Windows 版本中:%n%n%1 WinVersionTooLowError=此程序需要 %1 版本 %2 或更高。 WinVersionTooHighError=此程序不能安装于 %1 版本 %2 或更高。 AdminPrivilegesRequired=在安装此程序时您必须以管理员身份登录。 PowerUserPrivilegesRequired=在安装此程序时您必须以管理员身份或有权限的用户组身份登录。 SetupAppRunningError=安装程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。 UninstallAppRunningError=卸载程序发现 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。 ; *** 启动问题 PrivilegesRequiredOverrideTitle=选择安装程序模式 PrivilegesRequiredOverrideInstruction=选择安装模式 PrivilegesRequiredOverrideText1=%1 可以为所有用户安装(需要管理员权限),或仅为您安装。 PrivilegesRequiredOverrideText2=%1 只能为您安装,或为所有用户安装(需要管理员权限)。 PrivilegesRequiredOverrideAllUsers=为所有用户安装(&A) PrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(&A) (建议选项) PrivilegesRequiredOverrideCurrentUser=只为我安装(&M) PrivilegesRequiredOverrideCurrentUserRecommended=只为我安装(&M) (建议选项) ; *** 其他错误 ErrorCreatingDir=安装程序无法创建目录“%1” ErrorTooManyFilesInDir=无法在目录“%1”中创建文件,因为里面包含太多文件 ; *** 安装程序公共消息 ExitSetupTitle=退出安装程序 ExitSetupMessage=安装程序尚未完成。如果现在退出,将不会安装该程序。%n%n您之后可以再次运行安装程序完成安装。%n%n现在退出安装程序吗? AboutSetupMenuItem=关于安装程序(&A)... AboutSetupTitle=关于安装程序 AboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页:%n%4 AboutSetupNote= TranslatorNote=简体中文翻译由Kira(847320916@qq.com)维护。项目地址:https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation ; *** 按钮 ButtonBack=< 上一步(&B) ButtonNext=下一步(&N) > ButtonInstall=安装(&I) ButtonOK=确定 ButtonCancel=取消 ButtonYes=是(&Y) ButtonYesToAll=全是(&A) ButtonNo=否(&N) ButtonNoToAll=全否(&O) ButtonFinish=完成(&F) ButtonBrowse=浏览(&B)... ButtonWizardBrowse=浏览(&R)... ButtonNewFolder=新建文件夹(&M) ; *** “选择语言”对话框消息 SelectLanguageTitle=选择安装语言 SelectLanguageLabel=选择安装时使用的语言。 ; *** 公共向导文字 ClickNext=点击“下一步”继续,或点击“取消”退出安装程序。 BeveledLabel= BrowseDialogTitle=浏览文件夹 BrowseDialogLabel=在下面的列表中选择一个文件夹,然后点击“确定”。 NewFolderName=新建文件夹 ; *** “欢迎”向导页 WelcomeLabel1=欢迎使用 [name] 安装向导 WelcomeLabel2=现在将安装 [name/ver] 到您的电脑中。%n%n建议您在继续安装前关闭所有其他应用程序。 ; *** “密码”向导页 WizardPassword=密码 PasswordLabel1=这个安装程序有密码保护。 PasswordLabel3=请输入密码,然后点击“下一步”继续。密码区分大小写。 PasswordEditLabel=密码(&P): IncorrectPassword=您输入的密码不正确,请重新输入。 ; *** “许可协议”向导页 WizardLicense=许可协议 LicenseLabel=请在继续安装前阅读以下重要信息。 LicenseLabel3=请仔细阅读下列许可协议。在继续安装前您必须同意这些协议条款。 LicenseAccepted=我同意此协议(&A) LicenseNotAccepted=我不同意此协议(&D) ; *** “信息”向导页 WizardInfoBefore=信息 InfoBeforeLabel=请在继续安装前阅读以下重要信息。 InfoBeforeClickLabel=准备好继续安装后,点击“下一步”。 WizardInfoAfter=信息 InfoAfterLabel=请在继续安装前阅读以下重要信息。 InfoAfterClickLabel=准备好继续安装后,点击“下一步”。 ; *** “用户信息”向导页 WizardUserInfo=用户信息 UserInfoDesc=请输入您的信息。 UserInfoName=用户名(&U): UserInfoOrg=组织(&O): UserInfoSerial=序列号(&S): UserInfoNameRequired=您必须输入用户名。 ; *** “选择目标目录”向导页 WizardSelectDir=选择目标位置 SelectDirDesc=您想将 [name] 安装在哪里? SelectDirLabel3=安装程序将安装 [name] 到下面的文件夹中。 SelectDirBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。 DiskSpaceGBLabel=至少需要有 [gb] GB 的可用磁盘空间。 DiskSpaceMBLabel=至少需要有 [mb] MB 的可用磁盘空间。 CannotInstallToNetworkDrive=安装程序无法安装到一个网络驱动器。 CannotInstallToUNCPath=安装程序无法安装到一个 UNC 路径。 InvalidPath=您必须输入一个带驱动器卷标的完整路径,例如:%n%nC:\APP%n%n或UNC路径:%n%n\\server\share InvalidDrive=您选定的驱动器或 UNC 共享不存在或不能访问。请选择其他位置。 DiskSpaceWarningTitle=磁盘空间不足 DiskSpaceWarning=安装程序至少需要 %1 KB 的可用空间才能安装,但选定驱动器只有 %2 KB 的可用空间。%n%n您一定要继续吗? DirNameTooLong=文件夹名称或路径太长。 InvalidDirName=文件夹名称无效。 BadDirName32=文件夹名称不能包含下列任何字符:%n%n%1 DirExistsTitle=文件夹已存在 DirExists=文件夹:%n%n%1%n%n已经存在。您一定要安装到这个文件夹中吗? DirDoesntExistTitle=文件夹不存在 DirDoesntExist=文件夹:%n%n%1%n%n不存在。您想要创建此文件夹吗? ; *** “选择组件”向导页 WizardSelectComponents=选择组件 SelectComponentsDesc=您想安装哪些程序组件? SelectComponentsLabel2=选中您想安装的组件;取消您不想安装的组件。然后点击“下一步”继续。 FullInstallation=完全安装 ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=简洁安装 CustomInstallation=自定义安装 NoUninstallWarningTitle=组件已存在 NoUninstallWarning=安装程序检测到下列组件已安装在您的电脑中:%n%n%1%n%n取消选中这些组件不会卸载它们。%n%n确定要继续吗? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceGBLabel=当前选择的组件需要至少 [gb] GB 的磁盘空间。 ComponentsDiskSpaceMBLabel=当前选择的组件需要至少 [mb] MB 的磁盘空间。 ; *** “选择附加任务”向导页 WizardSelectTasks=选择附加任务 SelectTasksDesc=您想要安装程序执行哪些附加任务? SelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务,然后点击“下一步”。 ; *** “选择开始菜单文件夹”向导页 WizardSelectProgramGroup=选择开始菜单文件夹 SelectStartMenuFolderDesc=安装程序应该在哪里放置程序的快捷方式? SelectStartMenuFolderLabel3=安装程序将在下列“开始”菜单文件夹中创建程序的快捷方式。 SelectStartMenuFolderBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。 MustEnterGroupName=您必须输入一个文件夹名。 GroupNameTooLong=文件夹名或路径太长。 InvalidGroupName=无效的文件夹名字。 BadGroupName=文件夹名不能包含下列任何字符:%n%n%1 NoProgramGroupCheck2=不创建开始菜单文件夹(&D) ; *** “准备安装”向导页 WizardReady=准备安装 ReadyLabel1=安装程序准备就绪,现在可以开始安装 [name] 到您的电脑。 ReadyLabel2a=点击“安装”继续此安装程序。如果您想重新考虑或修改任何设置,点击“上一步”。 ReadyLabel2b=点击“安装”继续此安装程序。 ReadyMemoUserInfo=用户信息: ReadyMemoDir=目标位置: ReadyMemoType=安装类型: ReadyMemoComponents=已选择组件: ReadyMemoGroup=开始菜单文件夹: ReadyMemoTasks=附加任务: ; *** TExtractionWizardPage wizard page and Extract7ZipArchive ExtractionLabel=正在提取附加文件... ButtonStopExtraction=停止提取(&S) StopExtraction=您确定要停止提取吗? ErrorExtractionAborted=提取已中止 ErrorExtractionFailed=提取失败:%1 ; *** TDownloadWizardPage wizard page and DownloadTemporaryFile DownloadingLabel=正在下载附加文件... ButtonStopDownload=停止下载(&S) StopDownload=您确定要停止下载吗? ErrorDownloadAborted=下载已中止 ErrorDownloadFailed=下载失败:%1 %2 ErrorDownloadSizeFailed=获取下载大小失败:%1 %2 ErrorFileHash1=校验文件哈希失败:%1 ErrorFileHash2=无效的文件哈希:预期 %1,实际 %2 ErrorProgress=无效的进度:%1 / %2 ErrorFileSize=文件大小错误:预期 %1,实际 %2 ; *** “正在准备安装”向导页 WizardPreparing=正在准备安装 PreparingDesc=安装程序正在准备安装 [name] 到您的电脑。 PreviousInstallNotCompleted=先前的程序安装或卸载未完成,您需要重启您的电脑以完成。%n%n在重启电脑后,再次运行安装程序以完成 [name] 的安装。 CannotContinue=安装程序不能继续。请点击“取消”退出。 ApplicationsFound=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。 ApplicationsFound2=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。安装完成后,安装程序将尝试重新启动这些应用程序。 CloseApplications=自动关闭应用程序(&A) DontCloseApplications=不要关闭应用程序(&D) ErrorCloseApplications=安装程序无法自动关闭所有应用程序。建议您在继续之前,关闭所有在使用需要由安装程序更新的文件的应用程序。 PrepareToInstallNeedsRestart=安装程序必须重启您的计算机。计算机重启后,请再次运行安装程序以完成 [name] 的安装。%n%n是否立即重新启动? ; *** “正在安装”向导页 WizardInstalling=正在安装 InstallingLabel=安装程序正在安装 [name] 到您的电脑,请稍候。 ; *** “安装完成”向导页 FinishedHeadingLabel=[name] 安装完成 FinishedLabelNoIcons=安装程序已在您的电脑中安装了 [name]。 FinishedLabel=安装程序已在您的电脑中安装了 [name]。您可以通过已安装的快捷方式运行此应用程序。 ClickFinish=点击“完成”退出安装程序。 FinishedRestartLabel=为完成 [name] 的安装,安装程序必须重新启动您的电脑。要立即重启吗? FinishedRestartMessage=为完成 [name] 的安装,安装程序必须重新启动您的电脑。%n%n要立即重启吗? ShowReadmeCheck=是,我想查阅自述文件 YesRadio=是,立即重启电脑(&Y) NoRadio=否,稍后重启电脑(&N) ; used for example as 'Run MyProg.exe' RunEntryExec=运行 %1 ; used for example as 'View Readme.txt' RunEntryShellExec=查阅 %1 ; *** “安装程序需要下一张磁盘”提示 ChangeDiskTitle=安装程序需要下一张磁盘 SelectDiskLabel2=请插入磁盘 %1 并点击“确定”。%n%n如果这个磁盘中的文件可以在下列文件夹之外的文件夹中找到,请输入正确的路径或点击“浏览”。 PathLabel=路径(&P): FileNotInDir2=“%2”中找不到文件“%1”。请插入正确的磁盘或选择其他文件夹。 SelectDirectoryLabel=请指定下一张磁盘的位置。 ; *** 安装状态消息 SetupAborted=安装程序未完成安装。%n%n请修正这个问题并重新运行安装程序。 AbortRetryIgnoreSelectAction=选择操作 AbortRetryIgnoreRetry=重试(&T) AbortRetryIgnoreIgnore=忽略错误并继续(&I) AbortRetryIgnoreCancel=关闭安装程序 ; *** 安装状态消息 StatusClosingApplications=正在关闭应用程序... StatusCreateDirs=正在创建目录... StatusExtractFiles=正在解压缩文件... StatusCreateIcons=正在创建快捷方式... StatusCreateIniEntries=正在创建 INI 条目... StatusCreateRegistryEntries=正在创建注册表条目... StatusRegisterFiles=正在注册文件... StatusSavingUninstall=正在保存卸载信息... StatusRunProgram=正在完成安装... StatusRestartingApplications=正在重启应用程序... StatusRollback=正在撤销更改... ; *** 其他错误 ErrorInternal2=内部错误:%1 ErrorFunctionFailedNoCode=%1 失败 ErrorFunctionFailed=%1 失败;错误代码 %2 ErrorFunctionFailedWithMessage=%1 失败;错误代码 %2.%n%3 ErrorExecutingProgram=无法执行文件:%n%1 ; *** 注册表错误 ErrorRegOpenKey=打开注册表项时出错:%n%1\%2 ErrorRegCreateKey=创建注册表项时出错:%n%1\%2 ErrorRegWriteKey=写入注册表项时出错:%n%1\%2 ; *** INI 错误 ErrorIniEntry=在文件“%1”中创建 INI 条目时出错。 ; *** 文件复制错误 FileAbortRetryIgnoreSkipNotRecommended=跳过此文件(&S) (不推荐) FileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续(&I) (不推荐) SourceIsCorrupted=源文件已损坏 SourceDoesntExist=源文件“%1”不存在 ExistingFileReadOnly2=无法替换现有文件,它是只读的。 ExistingFileReadOnlyRetry=移除只读属性并重试(&R) ExistingFileReadOnlyKeepExisting=保留现有文件(&K) ErrorReadingExistingDest=尝试读取现有文件时出错: FileExistsSelectAction=选择操作 FileExists2=文件已经存在。 FileExistsOverwriteExisting=覆盖已存在的文件(&O) FileExistsKeepExisting=保留现有的文件(&K) FileExistsOverwriteOrKeepAll=为所有冲突文件执行此操作(&D) ExistingFileNewerSelectAction=选择操作 ExistingFileNewer2=现有的文件比安装程序将要安装的文件还要新。 ExistingFileNewerOverwriteExisting=覆盖已存在的文件(&O) ExistingFileNewerKeepExisting=保留现有的文件(&K) (推荐) ExistingFileNewerOverwriteOrKeepAll=为所有冲突文件执行此操作(&D) ErrorChangingAttr=尝试更改下列现有文件的属性时出错: ErrorCreatingTemp=尝试在目标目录创建文件时出错: ErrorReadingSource=尝试读取下列源文件时出错: ErrorCopying=尝试复制下列文件时出错: ErrorReplacingExistingFile=尝试替换现有文件时出错: ErrorRestartReplace=重启并替换失败: ErrorRenamingTemp=尝试重命名下列目标目录中的一个文件时出错: ErrorRegisterServer=无法注册 DLL/OCX:%1 ErrorRegSvr32Failed=RegSvr32 失败;退出代码 %1 ErrorRegisterTypeLib=无法注册类库:%1 ; *** 卸载显示名字标记 ; used for example as 'My Program (32-bit)' UninstallDisplayNameMark=%1 (%2) ; used for example as 'My Program (32-bit, All users)' UninstallDisplayNameMarks=%1 (%2, %3) UninstallDisplayNameMark32Bit=32 位 UninstallDisplayNameMark64Bit=64 位 UninstallDisplayNameMarkAllUsers=所有用户 UninstallDisplayNameMarkCurrentUser=当前用户 ; *** 安装后错误 ErrorOpeningReadme=尝试打开自述文件时出错。 ErrorRestartingComputer=安装程序无法重启电脑,请手动重启。 ; *** 卸载消息 UninstallNotFound=文件“%1”不存在。无法卸载。 UninstallOpenError=文件“%1”不能被打开。无法卸载。 UninstallUnsupportedVer=此版本的卸载程序无法识别卸载日志文件“%1”的格式。无法卸载 UninstallUnknownEntry=卸载日志中遇到一个未知条目 (%1) ConfirmUninstall=您确认要完全移除 %1 及其所有组件吗? UninstallOnlyOnWin64=仅允许在 64 位 Windows 中卸载此程序。 OnlyAdminCanUninstall=仅使用管理员权限的用户能完成此卸载。 UninstallStatusLabel=正在从您的电脑中移除 %1,请稍候。 UninstalledAll=已顺利从您的电脑中移除 %1。 UninstalledMost=%1 卸载完成。%n%n有部分内容未能被删除,但您可以手动删除它们。 UninstalledAndNeedsRestart=为完成 %1 的卸载,需要重启您的电脑。%n%n立即重启电脑吗? UninstallDataCorrupted=文件“%1”已损坏。无法卸载 ; *** 卸载状态消息 ConfirmDeleteSharedFileTitle=删除共享的文件吗? ConfirmDeleteSharedFile2=系统表示下列共享的文件已不有其他程序使用。您希望卸载程序删除这些共享的文件吗?%n%n如果删除这些文件,但仍有程序在使用这些文件,则这些程序可能出现异常。如果您不能确定,请选择“否”,在系统中保留这些文件以免引发问题。 SharedFileNameLabel=文件名: SharedFileLocationLabel=位置: WizardUninstalling=卸载状态 StatusUninstalling=正在卸载 %1... ; *** Shutdown block reasons ShutdownBlockReasonInstallingApp=正在安装 %1。 ShutdownBlockReasonUninstallingApp=正在卸载 %1。 ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. [CustomMessages] NameAndVersion=%1 版本 %2 AdditionalIcons=附加快捷方式: CreateDesktopIcon=创建桌面快捷方式(&D) CreateQuickLaunchIcon=创建快速启动栏快捷方式(&Q) ProgramOnTheWeb=%1 网站 UninstallProgram=卸载 %1 LaunchProgram=运行 %1 AssocFileExtension=将 %2 文件扩展名与 %1 建立关联(&A) AssocingFileExtension=正在将 %2 文件扩展名与 %1 建立关联... AutoStartProgramGroupDescription=启动: AutoStartProgram=自动启动 %1 AddonHostProgramNotFound=您选择的文件夹中无法找到 %1。%n%n您要继续吗? CloseRunningAppToContinueUninstall=%1 当前正在运行。需要先将其关闭才能继续卸载。是否立即关闭? ================================================ FILE: windows/inno-languages/English.isl ================================================ ; *** Inno Setup version 6.4.0+ English messages *** ; ; To download user-contributed translations of this file, go to: ; https://jrsoftware.org/files/istrans/ ; ; Note: When translating this text, do not add periods (.) to the end of ; messages that didn't have them already, because on those messages Inno ; Setup adds the periods automatically (appending a period would result in ; two periods being displayed). [LangOptions] ; The following three entries are very important. Be sure to read and ; understand the '[LangOptions] section' topic in the help file. LanguageName=English LanguageID=$0409 LanguageCodePage=0 ; If the language you are translating to requires special font faces or ; sizes, uncomment any of the following entries and change them accordingly. ;DialogFontName= ;DialogFontSize=8 ;WelcomeFontName=Verdana ;WelcomeFontSize=12 ;TitleFontName=Arial ;TitleFontSize=29 ;CopyrightFontName=Arial ;CopyrightFontSize=8 [Messages] ; *** Application titles SetupAppTitle=Setup SetupWindowTitle=Setup - %1 UninstallAppTitle=Uninstall UninstallAppFullTitle=%1 Uninstall ; *** Misc. common InformationTitle=Information ConfirmTitle=Confirm ErrorTitle=Error ; *** SetupLdr messages SetupLdrStartupMessage=This will install %1. Do you wish to continue? LdrCannotCreateTemp=Unable to create a temporary file. Setup aborted LdrCannotExecTemp=Unable to execute file in the temporary directory. Setup aborted HelpTextNote= ; *** Startup error messages LastErrorMessage=%1.%n%nError %2: %3 SetupFileMissing=The file %1 is missing from the installation directory. Please correct the problem or obtain a new copy of the program. SetupFileCorrupt=The setup files are corrupted. Please obtain a new copy of the program. SetupFileCorruptOrWrongVer=The setup files are corrupted, or are incompatible with this version of Setup. Please correct the problem or obtain a new copy of the program. InvalidParameter=An invalid parameter was passed on the command line:%n%n%1 SetupAlreadyRunning=Setup is already running. WindowsVersionNotSupported=This program does not support the version of Windows your computer is running. WindowsServicePackRequired=This program requires %1 Service Pack %2 or later. NotOnThisPlatform=This program will not run on %1. OnlyOnThisPlatform=This program must be run on %1. OnlyOnTheseArchitectures=This program can only be installed on versions of Windows designed for the following processor architectures:%n%n%1 WinVersionTooLowError=This program requires %1 version %2 or later. WinVersionTooHighError=This program cannot be installed on %1 version %2 or later. AdminPrivilegesRequired=You must be logged in as an administrator when installing this program. PowerUserPrivilegesRequired=You must be logged in as an administrator or as a member of the Power Users group when installing this program. SetupAppRunningError=Setup has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. UninstallAppRunningError=Uninstall has detected that %1 is currently running.%n%nPlease close all instances of it now, then click OK to continue, or Cancel to exit. ; *** Startup questions PrivilegesRequiredOverrideTitle=Select Setup Install Mode PrivilegesRequiredOverrideInstruction=Select install mode PrivilegesRequiredOverrideText1=%1 can be installed for all users (requires administrative privileges), or for you only. PrivilegesRequiredOverrideText2=%1 can be installed for you only, or for all users (requires administrative privileges). PrivilegesRequiredOverrideAllUsers=Install for &all users PrivilegesRequiredOverrideAllUsersRecommended=Install for &all users (recommended) PrivilegesRequiredOverrideCurrentUser=Install for &me only PrivilegesRequiredOverrideCurrentUserRecommended=Install for &me only (recommended) ; *** Misc. errors ErrorCreatingDir=Setup was unable to create the directory "%1" ErrorTooManyFilesInDir=Unable to create a file in the directory "%1" because it contains too many files ; *** Setup common messages ExitSetupTitle=Exit Setup ExitSetupMessage=Setup is not complete. If you exit now, the program will not be installed.%n%nYou may run Setup again at another time to complete the installation.%n%nExit Setup? AboutSetupMenuItem=&About Setup... AboutSetupTitle=About Setup AboutSetupMessage=%1 version %2%n%3%n%n%1 home page:%n%4 AboutSetupNote= TranslatorNote= ; *** Buttons ButtonBack=< &Back ButtonNext=&Next > ButtonInstall=&Install ButtonOK=OK ButtonCancel=Cancel ButtonYes=&Yes ButtonYesToAll=Yes to &All ButtonNo=&No ButtonNoToAll=N&o to All ButtonFinish=&Finish ButtonBrowse=&Browse... ButtonWizardBrowse=B&rowse... ButtonNewFolder=&Make New Folder ; *** "Select Language" dialog messages SelectLanguageTitle=Select Setup Language SelectLanguageLabel=Select the language to use during the installation. ; *** Common wizard text ClickNext=Click Next to continue, or Cancel to exit Setup. BeveledLabel= BrowseDialogTitle=Browse For Folder BrowseDialogLabel=Select a folder in the list below, then click OK. NewFolderName=New Folder ; *** "Welcome" wizard page WelcomeLabel1=Welcome to the [name] Setup Wizard WelcomeLabel2=This will install [name/ver] on your computer.%n%nIt is recommended that you close all other applications before continuing. ; *** "Password" wizard page WizardPassword=Password PasswordLabel1=This installation is password protected. PasswordLabel3=Please provide the password, then click Next to continue. Passwords are case-sensitive. PasswordEditLabel=&Password: IncorrectPassword=The password you entered is not correct. Please try again. ; *** "License Agreement" wizard page WizardLicense=License Agreement LicenseLabel=Please read the following important information before continuing. LicenseLabel3=Please read the following License Agreement. You must accept the terms of this agreement before continuing with the installation. LicenseAccepted=I &accept the agreement LicenseNotAccepted=I &do not accept the agreement ; *** "Information" wizard pages WizardInfoBefore=Information InfoBeforeLabel=Please read the following important information before continuing. InfoBeforeClickLabel=When you are ready to continue with Setup, click Next. WizardInfoAfter=Information InfoAfterLabel=Please read the following important information before continuing. InfoAfterClickLabel=When you are ready to continue with Setup, click Next. ; *** "User Information" wizard page WizardUserInfo=User Information UserInfoDesc=Please enter your information. UserInfoName=&User Name: UserInfoOrg=&Organization: UserInfoSerial=&Serial Number: UserInfoNameRequired=You must enter a name. ; *** "Select Destination Location" wizard page WizardSelectDir=Select Destination Location SelectDirDesc=Where should [name] be installed? SelectDirLabel3=Setup will install [name] into the following folder. SelectDirBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. DiskSpaceGBLabel=At least [gb] GB of free disk space is required. DiskSpaceMBLabel=At least [mb] MB of free disk space is required. CannotInstallToNetworkDrive=Setup cannot install to a network drive. CannotInstallToUNCPath=Setup cannot install to a UNC path. InvalidPath=You must enter a full path with drive letter; for example:%n%nC:\APP%n%nor a UNC path in the form:%n%n\\server\share InvalidDrive=The drive or UNC share you selected does not exist or is not accessible. Please select another. DiskSpaceWarningTitle=Not Enough Disk Space DiskSpaceWarning=Setup requires at least %1 KB of free space to install, but the selected drive only has %2 KB available.%n%nDo you want to continue anyway? DirNameTooLong=The folder name or path is too long. InvalidDirName=The folder name is not valid. BadDirName32=Folder names cannot include any of the following characters:%n%n%1 DirExistsTitle=Folder Exists DirExists=The folder:%n%n%1%n%nalready exists. Would you like to install to that folder anyway? DirDoesntExistTitle=Folder Does Not Exist DirDoesntExist=The folder:%n%n%1%n%ndoes not exist. Would you like the folder to be created? ; *** "Select Components" wizard page WizardSelectComponents=Select Components SelectComponentsDesc=Which components should be installed? SelectComponentsLabel2=Select the components you want to install; clear the components you do not want to install. Click Next when you are ready to continue. FullInstallation=Full installation ; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) CompactInstallation=Compact installation CustomInstallation=Custom installation NoUninstallWarningTitle=Components Exist NoUninstallWarning=Setup has detected that the following components are already installed on your computer:%n%n%1%n%nDeselecting these components will not uninstall them.%n%nWould you like to continue anyway? ComponentSize1=%1 KB ComponentSize2=%1 MB ComponentsDiskSpaceGBLabel=Current selection requires at least [gb] GB of disk space. ComponentsDiskSpaceMBLabel=Current selection requires at least [mb] MB of disk space. ; *** "Select Additional Tasks" wizard page WizardSelectTasks=Select Additional Tasks SelectTasksDesc=Which additional tasks should be performed? SelectTasksLabel2=Select the additional tasks you would like Setup to perform while installing [name], then click Next. ; *** "Select Start Menu Folder" wizard page WizardSelectProgramGroup=Select Start Menu Folder SelectStartMenuFolderDesc=Where should Setup place the program's shortcuts? SelectStartMenuFolderLabel3=Setup will create the program's shortcuts in the following Start Menu folder. SelectStartMenuFolderBrowseLabel=To continue, click Next. If you would like to select a different folder, click Browse. MustEnterGroupName=You must enter a folder name. GroupNameTooLong=The folder name or path is too long. InvalidGroupName=The folder name is not valid. BadGroupName=The folder name cannot include any of the following characters:%n%n%1 NoProgramGroupCheck2=&Don't create a Start Menu folder ; *** "Ready to Install" wizard page WizardReady=Ready to Install ReadyLabel1=Setup is now ready to begin installing [name] on your computer. ReadyLabel2a=Click Install to continue with the installation, or click Back if you want to review or change any settings. ReadyLabel2b=Click Install to continue with the installation. ReadyMemoUserInfo=User information: ReadyMemoDir=Destination location: ReadyMemoType=Setup type: ReadyMemoComponents=Selected components: ReadyMemoGroup=Start Menu folder: ReadyMemoTasks=Additional tasks: ; *** TDownloadWizardPage wizard page and DownloadTemporaryFile DownloadingLabel=Downloading additional files... ButtonStopDownload=&Stop download StopDownload=Are you sure you want to stop the download? ErrorDownloadAborted=Download aborted ErrorDownloadFailed=Download failed: %1 %2 ErrorDownloadSizeFailed=Getting size failed: %1 %2 ErrorFileHash1=File hash failed: %1 ErrorFileHash2=Invalid file hash: expected %1, found %2 ErrorProgress=Invalid progress: %1 of %2 ErrorFileSize=Invalid file size: expected %1, found %2 ; *** TExtractionWizardPage wizard page and Extract7ZipArchive ExtractionLabel=Extracting additional files... ButtonStopExtraction=&Stop extraction StopExtraction=Are you sure you want to stop the extraction? ErrorExtractionAborted=Extraction aborted ErrorExtractionFailed=Extraction failed: %1 ; *** "Preparing to Install" wizard page WizardPreparing=Preparing to Install PreparingDesc=Setup is preparing to install [name] on your computer. PreviousInstallNotCompleted=The installation/removal of a previous program was not completed. You will need to restart your computer to complete that installation.%n%nAfter restarting your computer, run Setup again to complete the installation of [name]. CannotContinue=Setup cannot continue. Please click Cancel to exit. ApplicationsFound=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications. ApplicationsFound2=The following applications are using files that need to be updated by Setup. It is recommended that you allow Setup to automatically close these applications. After the installation has completed, Setup will attempt to restart the applications. CloseApplications=&Automatically close the applications DontCloseApplications=&Do not close the applications ErrorCloseApplications=Setup was unable to automatically close all applications. It is recommended that you close all applications using files that need to be updated by Setup before continuing. PrepareToInstallNeedsRestart=Setup must restart your computer. After restarting your computer, run Setup again to complete the installation of [name].%n%nWould you like to restart now? ; *** "Installing" wizard page WizardInstalling=Installing InstallingLabel=Please wait while Setup installs [name] on your computer. ; *** "Setup Completed" wizard page FinishedHeadingLabel=Completing the [name] Setup Wizard FinishedLabelNoIcons=Setup has finished installing [name] on your computer. FinishedLabel=Setup has finished installing [name] on your computer. The application may be launched by selecting the installed shortcuts. ClickFinish=Click Finish to exit Setup. FinishedRestartLabel=To complete the installation of [name], Setup must restart your computer. Would you like to restart now? FinishedRestartMessage=To complete the installation of [name], Setup must restart your computer.%n%nWould you like to restart now? ShowReadmeCheck=Yes, I would like to view the README file YesRadio=&Yes, restart the computer now NoRadio=&No, I will restart the computer later ; used for example as 'Run MyProg.exe' RunEntryExec=Run %1 ; used for example as 'View Readme.txt' RunEntryShellExec=View %1 ; *** "Setup Needs the Next Disk" stuff ChangeDiskTitle=Setup Needs the Next Disk SelectDiskLabel2=Please insert Disk %1 and click OK.%n%nIf the files on this disk can be found in a folder other than the one displayed below, enter the correct path or click Browse. PathLabel=&Path: FileNotInDir2=The file "%1" could not be located in "%2". Please insert the correct disk or select another folder. SelectDirectoryLabel=Please specify the location of the next disk. ; *** Installation phase messages SetupAborted=Setup was not completed.%n%nPlease correct the problem and run Setup again. AbortRetryIgnoreSelectAction=Select action AbortRetryIgnoreRetry=&Try again AbortRetryIgnoreIgnore=&Ignore the error and continue AbortRetryIgnoreCancel=Cancel installation ; *** Installation status messages StatusClosingApplications=Closing applications... StatusCreateDirs=Creating directories... StatusExtractFiles=Extracting files... StatusCreateIcons=Creating shortcuts... StatusCreateIniEntries=Creating INI entries... StatusCreateRegistryEntries=Creating registry entries... StatusRegisterFiles=Registering files... StatusSavingUninstall=Saving uninstall information... StatusRunProgram=Finishing installation... StatusRestartingApplications=Restarting applications... StatusRollback=Rolling back changes... ; *** Misc. errors ErrorInternal2=Internal error: %1 ErrorFunctionFailedNoCode=%1 failed ErrorFunctionFailed=%1 failed; code %2 ErrorFunctionFailedWithMessage=%1 failed; code %2.%n%3 ErrorExecutingProgram=Unable to execute file:%n%1 ; *** Registry errors ErrorRegOpenKey=Error opening registry key:%n%1\%2 ErrorRegCreateKey=Error creating registry key:%n%1\%2 ErrorRegWriteKey=Error writing to registry key:%n%1\%2 ; *** INI errors ErrorIniEntry=Error creating INI entry in file "%1". ; *** File copying errors FileAbortRetryIgnoreSkipNotRecommended=&Skip this file (not recommended) FileAbortRetryIgnoreIgnoreNotRecommended=&Ignore the error and continue (not recommended) SourceIsCorrupted=The source file is corrupted SourceDoesntExist=The source file "%1" does not exist ExistingFileReadOnly2=The existing file could not be replaced because it is marked read-only. ExistingFileReadOnlyRetry=&Remove the read-only attribute and try again ExistingFileReadOnlyKeepExisting=&Keep the existing file ErrorReadingExistingDest=An error occurred while trying to read the existing file: FileExistsSelectAction=Select action FileExists2=The file already exists. FileExistsOverwriteExisting=&Overwrite the existing file FileExistsKeepExisting=&Keep the existing file FileExistsOverwriteOrKeepAll=&Do this for the next conflicts ExistingFileNewerSelectAction=Select action ExistingFileNewer2=The existing file is newer than the one Setup is trying to install. ExistingFileNewerOverwriteExisting=&Overwrite the existing file ExistingFileNewerKeepExisting=&Keep the existing file (recommended) ExistingFileNewerOverwriteOrKeepAll=&Do this for the next conflicts ErrorChangingAttr=An error occurred while trying to change the attributes of the existing file: ErrorCreatingTemp=An error occurred while trying to create a file in the destination directory: ErrorReadingSource=An error occurred while trying to read the source file: ErrorCopying=An error occurred while trying to copy a file: ErrorReplacingExistingFile=An error occurred while trying to replace the existing file: ErrorRestartReplace=RestartReplace failed: ErrorRenamingTemp=An error occurred while trying to rename a file in the destination directory: ErrorRegisterServer=Unable to register the DLL/OCX: %1 ErrorRegSvr32Failed=RegSvr32 failed with exit code %1 ErrorRegisterTypeLib=Unable to register the type library: %1 ; *** Uninstall display name markings ; used for example as 'My Program (32-bit)' UninstallDisplayNameMark=%1 (%2) ; used for example as 'My Program (32-bit, All users)' UninstallDisplayNameMarks=%1 (%2, %3) UninstallDisplayNameMark32Bit=32-bit UninstallDisplayNameMark64Bit=64-bit UninstallDisplayNameMarkAllUsers=All users UninstallDisplayNameMarkCurrentUser=Current user ; *** Post-installation errors ErrorOpeningReadme=An error occurred while trying to open the README file. ErrorRestartingComputer=Setup was unable to restart the computer. Please do this manually. ; *** Uninstaller messages UninstallNotFound=File "%1" does not exist. Cannot uninstall. UninstallOpenError=File "%1" could not be opened. Cannot uninstall UninstallUnsupportedVer=The uninstall log file "%1" is in a format not recognized by this version of the uninstaller. Cannot uninstall UninstallUnknownEntry=An unknown entry (%1) was encountered in the uninstall log ConfirmUninstall=Are you sure you want to completely remove %1 and all of its components? UninstallOnlyOnWin64=This installation can only be uninstalled on 64-bit Windows. OnlyAdminCanUninstall=This installation can only be uninstalled by a user with administrative privileges. UninstallStatusLabel=Please wait while %1 is removed from your computer. UninstalledAll=%1 was successfully removed from your computer. UninstalledMost=%1 uninstall complete.%n%nSome elements could not be removed. These can be removed manually. UninstalledAndNeedsRestart=To complete the uninstallation of %1, your computer must be restarted.%n%nWould you like to restart now? UninstallDataCorrupted="%1" file is corrupted. Cannot uninstall ; *** Uninstallation phase messages ConfirmDeleteSharedFileTitle=Remove Shared File? ConfirmDeleteSharedFile2=The system indicates that the following shared file is no longer in use by any programs. Would you like for Uninstall to remove this shared file?%n%nIf any programs are still using this file and it is removed, those programs may not function properly. If you are unsure, choose No. Leaving the file on your system will not cause any harm. SharedFileNameLabel=File name: SharedFileLocationLabel=Location: WizardUninstalling=Uninstall Status StatusUninstalling=Uninstalling %1... ; *** Shutdown block reasons ShutdownBlockReasonInstallingApp=Installing %1. ShutdownBlockReasonUninstallingApp=Uninstalling %1. ; The custom messages below aren't used by Setup itself, but if you make ; use of them in your scripts, you'll want to translate them. [CustomMessages] NameAndVersion=%1 version %2 AdditionalIcons=Additional shortcuts: CreateDesktopIcon=Create a &desktop shortcut CreateQuickLaunchIcon=Create a &Quick Launch shortcut ProgramOnTheWeb=%1 on the Web UninstallProgram=Uninstall %1 LaunchProgram=Launch %1 AssocFileExtension=&Associate %1 with the %2 file extension AssocingFileExtension=Associating %1 with the %2 file extension... AutoStartProgramGroupDescription=Startup: AutoStartProgram=Automatically start %1 AddonHostProgramNotFound=%1 could not be located in the folder you selected.%n%nDo you want to continue anyway? CloseRunningAppToContinueUninstall=%1 is currently running. It needs to be closed before the uninstallation can continue. Do you want to close now? ================================================ FILE: windows/iris-updater.bat ================================================ @echo off title IRIS Updater setlocal enabledelayedexpansion set "api_url=https://api.github.com/repos/nini22P/iris/releases/latest" set "download_folder=%~dp0temps" :: Try to delete the download folder if it exists if exist "%download_folder%" ( rd /s /q "%download_folder%" ) :: Create download folder mkdir "%download_folder%" echo Fetching latest release from GitHub... :: Fetch JSON data using curl powershell -Command "try { Invoke-WebRequest -Uri '%api_url%' -UseBasicParsing | Select-Object -ExpandProperty Content | Out-File -Encoding UTF8 '%download_folder%\release.json' } catch { Write-Host 'Error fetching release info: ' $_.Exception.Message; exit 1 }" if not exist "%download_folder%\release.json" ( echo Error: Could not fetch release data. Please check your internet connection. goto :end ) for /f "delims=" %%a in ('powershell -command "try { Get-Content '%download_folder%\release.json' | ConvertFrom-Json | Select-Object -ExpandProperty tag_name } catch { Write-Host 'Error parsing JSON: ' $_.Exception.Message; exit 1 }"') do ( set "version_tag=%%a" if defined version_tag ( goto :version_found ) ) echo Error: Could not extract version tag from release info. goto :end :version_found set "download_url=https://github.com/nini22P/iris/releases/latest/download/IRIS-windows.zip" set "zip_file=%download_folder%\IRIS-windows.zip" set "extract_folder=%download_folder%" title Download IRIS !version_tag! where curl >nul 2>nul if %errorlevel% equ 0 ( echo Download IRIS !version_tag! curl -L -o "%zip_file%" "%download_url%" if %errorlevel% neq 0 ( echo Error downloading file with curl. exit /b 1 ) ) else ( echo Download IRIS !version_tag! powershell -Command "try { Invoke-WebRequest -Uri '%download_url%' -OutFile '%zip_file%' } catch { Write-Host 'Error downloading file: ' $_.Exception.Message; exit 1 }" ) if not exist "%zip_file%" ( echo Error: Failed to download IRIS-windows.zip. goto :end ) echo Extracting IRIS-windows.zip... powershell -Command "try { Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::ExtractToDirectory('%zip_file%', '%extract_folder%'); } catch { Write-Host 'Error extracting zip: ' $_.Exception.Message; exit 1 }" :: Check if IRIS folder exists before moving if not exist "%extract_folder%\IRIS" ( echo Error: "IRIS" folder not found within the extracted files. goto :cleanup ) echo Starting file move and cleanup... :: Start a new cmd window to perform move and cleanup, then current bat will close start cmd /c "timeout /t 2 /nobreak && xcopy temps\IRIS\* .\ /E /I /Y && rd /s /q temps && start iris" :cleanup exit :end endlocal ================================================ FILE: windows/runner/CMakeLists.txt ================================================ cmake_minimum_required(VERSION 3.14) project(runner LANGUAGES CXX) # Define the application target. To change its name, change BINARY_NAME in the # top-level CMakeLists.txt, not the value here, or `flutter run` will no longer # work. # # Any new source files that you add to the application should be added here. add_executable(${BINARY_NAME} WIN32 "flutter_window.cpp" "main.cpp" "utils.cpp" "win32_window.cpp" "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" "Runner.rc" "runner.exe.manifest" ) # Apply the standard set of build settings. This can be removed for applications # that need different build settings. apply_standard_settings(${BINARY_NAME}) # Add preprocessor definitions for the build version. target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") # Disable Windows macros that collide with C++ standard library functions. target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") # Add dependency libraries and include directories. Add any application-specific # dependencies here. target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") # Run the Flutter tool portions of the build. This must not be removed. add_dependencies(${BINARY_NAME} flutter_assemble) ================================================ FILE: windows/runner/Runner.rc ================================================ // Microsoft Visual C++ generated resource script. // #pragma code_page(65001) #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "winres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (United States) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""winres.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_APP_ICON ICON "resources\\app_icon.ico" ///////////////////////////////////////////////////////////////////////////// // // Version // #if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) #define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD #else #define VERSION_AS_NUMBER 1,0,0,0 #endif #if defined(FLUTTER_VERSION) #define VERSION_AS_STRING FLUTTER_VERSION #else #define VERSION_AS_STRING "1.0.0" #endif VS_VERSION_INFO VERSIONINFO FILEVERSION VERSION_AS_NUMBER PRODUCTVERSION VERSION_AS_NUMBER FILEFLAGSMASK VS_FFI_FILEFLAGSMASK #ifdef _DEBUG FILEFLAGS VS_FF_DEBUG #else FILEFLAGS 0x0L #endif FILEOS VOS__WINDOWS32 FILETYPE VFT_APP FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904e4" BEGIN VALUE "CompanyName", "nini22P" "\0" VALUE "FileDescription", "iris" "\0" VALUE "FileVersion", VERSION_AS_STRING "\0" VALUE "InternalName", "iris" "\0" VALUE "LegalCopyright", "Copyright (C) 2024 nini22P. All rights reserved." "\0" VALUE "OriginalFilename", "iris.exe" "\0" VALUE "ProductName", "iris" "\0" VALUE "ProductVersion", VERSION_AS_STRING "\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1252 END END #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED ================================================ FILE: windows/runner/flutter_window.cpp ================================================ #include "flutter_window.h" #include #include "flutter/generated_plugin_registrant.h" FlutterWindow::FlutterWindow(const flutter::DartProject& project) : project_(project) {} FlutterWindow::~FlutterWindow() {} bool FlutterWindow::OnCreate() { if (!Win32Window::OnCreate()) { return false; } RECT frame = GetClientArea(); // The size here must match the window dimensions to avoid unnecessary surface // creation / destruction in the startup path. flutter_controller_ = std::make_unique( frame.right - frame.left, frame.bottom - frame.top, project_); // Ensure that basic setup of the controller was successful. if (!flutter_controller_->engine() || !flutter_controller_->view()) { return false; } RegisterPlugins(flutter_controller_->engine()); SetChildContent(flutter_controller_->view()->GetNativeWindow()); flutter_controller_->engine()->SetNextFrameCallback([&]() { this->Show(); }); // Flutter can complete the first frame before the "show window" callback is // registered. The following call ensures a frame is pending to ensure the // window is shown. It is a no-op if the first frame hasn't completed yet. flutter_controller_->ForceRedraw(); return true; } void FlutterWindow::OnDestroy() { if (flutter_controller_) { flutter_controller_ = nullptr; } Win32Window::OnDestroy(); } LRESULT FlutterWindow::MessageHandler(HWND hwnd, UINT const message, WPARAM const wparam, LPARAM const lparam) noexcept { // Give Flutter, including plugins, an opportunity to handle window messages. if (flutter_controller_) { std::optional result = flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, lparam); if (result) { return *result; } } switch (message) { case WM_FONTCHANGE: flutter_controller_->engine()->ReloadSystemFonts(); break; } return Win32Window::MessageHandler(hwnd, message, wparam, lparam); } ================================================ FILE: windows/runner/flutter_window.h ================================================ #ifndef RUNNER_FLUTTER_WINDOW_H_ #define RUNNER_FLUTTER_WINDOW_H_ #include #include #include #include "win32_window.h" // A window that does nothing but host a Flutter view. class FlutterWindow : public Win32Window { public: // Creates a new FlutterWindow hosting a Flutter view running |project|. explicit FlutterWindow(const flutter::DartProject& project); virtual ~FlutterWindow(); protected: // Win32Window: bool OnCreate() override; void OnDestroy() override; LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, LPARAM const lparam) noexcept override; private: // The project to run. flutter::DartProject project_; // The Flutter instance hosted by this window. std::unique_ptr flutter_controller_; }; #endif // RUNNER_FLUTTER_WINDOW_H_ ================================================ FILE: windows/runner/main.cpp ================================================ #include #include #include #include "flutter_window.h" #include "utils.h" int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, _In_ wchar_t *command_line, _In_ int show_command) { // Attach to console when present (e.g., 'flutter run') or create a // new console when running with a debugger. if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { CreateAndAttachConsole(); } // Initialize COM, so that it is available for use in the library and/or // plugins. ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); flutter::DartProject project(L"data"); std::vector command_line_arguments = GetCommandLineArguments(); project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); FlutterWindow window(project); Win32Window::Point origin(10, 10); Win32Window::Size size(1280, 720); if (!window.Create(L"IRIS", origin, size)) { return EXIT_FAILURE; } window.SetQuitOnClose(true); ::MSG msg; while (::GetMessage(&msg, nullptr, 0, 0)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } ::CoUninitialize(); return EXIT_SUCCESS; } ================================================ FILE: windows/runner/resource.h ================================================ //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by Runner.rc // #define IDI_APP_ICON 101 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 102 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1001 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif ================================================ FILE: windows/runner/runner.exe.manifest ================================================ PerMonitorV2 ================================================ FILE: windows/runner/utils.cpp ================================================ #include "utils.h" #include #include #include #include #include void CreateAndAttachConsole() { if (::AllocConsole()) { FILE *unused; if (freopen_s(&unused, "CONOUT$", "w", stdout)) { _dup2(_fileno(stdout), 1); } if (freopen_s(&unused, "CONOUT$", "w", stderr)) { _dup2(_fileno(stdout), 2); } std::ios::sync_with_stdio(); FlutterDesktopResyncOutputStreams(); } } std::vector GetCommandLineArguments() { // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. int argc; wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); if (argv == nullptr) { return std::vector(); } std::vector command_line_arguments; // Skip the first argument as it's the binary name. for (int i = 1; i < argc; i++) { command_line_arguments.push_back(Utf8FromUtf16(argv[i])); } ::LocalFree(argv); return command_line_arguments; } std::string Utf8FromUtf16(const wchar_t* utf16_string) { if (utf16_string == nullptr) { return std::string(); } unsigned int target_length = ::WideCharToMultiByte( CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, nullptr, 0, nullptr, nullptr) -1; // remove the trailing null character int input_length = (int)wcslen(utf16_string); std::string utf8_string; if (target_length == 0 || target_length > utf8_string.max_size()) { return utf8_string; } utf8_string.resize(target_length); int converted_length = ::WideCharToMultiByte( CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, input_length, utf8_string.data(), target_length, nullptr, nullptr); if (converted_length == 0) { return std::string(); } return utf8_string; } ================================================ FILE: windows/runner/utils.h ================================================ #ifndef RUNNER_UTILS_H_ #define RUNNER_UTILS_H_ #include #include // Creates a console for the process, and redirects stdout and stderr to // it for both the runner and the Flutter library. void CreateAndAttachConsole(); // Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string // encoded in UTF-8. Returns an empty std::string on failure. std::string Utf8FromUtf16(const wchar_t* utf16_string); // Gets the command line arguments passed in as a std::vector, // encoded in UTF-8. Returns an empty std::vector on failure. std::vector GetCommandLineArguments(); #endif // RUNNER_UTILS_H_ ================================================ FILE: windows/runner/win32_window.cpp ================================================ #include "win32_window.h" #include #include #include "resource.h" namespace { /// Window attribute that enables dark mode window decorations. /// /// Redefined in case the developer's machine has a Windows SDK older than /// version 10.0.22000.0. /// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute #ifndef DWMWA_USE_IMMERSIVE_DARK_MODE #define DWMWA_USE_IMMERSIVE_DARK_MODE 20 #endif constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; /// Registry key for app theme preference. /// /// A value of 0 indicates apps should use dark mode. A non-zero or missing /// value indicates apps should use light mode. constexpr const wchar_t kGetPreferredBrightnessRegKey[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; // The number of Win32Window objects that currently exist. static int g_active_window_count = 0; using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); // Scale helper to convert logical scaler values to physical using passed in // scale factor int Scale(int source, double scale_factor) { return static_cast(source * scale_factor); } // Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. // This API is only needed for PerMonitor V1 awareness mode. void EnableFullDpiSupportIfAvailable(HWND hwnd) { HMODULE user32_module = LoadLibraryA("User32.dll"); if (!user32_module) { return; } auto enable_non_client_dpi_scaling = reinterpret_cast( GetProcAddress(user32_module, "EnableNonClientDpiScaling")); if (enable_non_client_dpi_scaling != nullptr) { enable_non_client_dpi_scaling(hwnd); } FreeLibrary(user32_module); } } // namespace // Manages the Win32Window's window class registration. class WindowClassRegistrar { public: ~WindowClassRegistrar() = default; // Returns the singleton registrar instance. static WindowClassRegistrar* GetInstance() { if (!instance_) { instance_ = new WindowClassRegistrar(); } return instance_; } // Returns the name of the window class, registering the class if it hasn't // previously been registered. const wchar_t* GetWindowClass(); // Unregisters the window class. Should only be called if there are no // instances of the window. void UnregisterWindowClass(); private: WindowClassRegistrar() = default; static WindowClassRegistrar* instance_; bool class_registered_ = false; }; WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; const wchar_t* WindowClassRegistrar::GetWindowClass() { if (!class_registered_) { WNDCLASS window_class{}; window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); window_class.lpszClassName = kWindowClassName; window_class.style = CS_HREDRAW | CS_VREDRAW; window_class.cbClsExtra = 0; window_class.cbWndExtra = 0; window_class.hInstance = GetModuleHandle(nullptr); window_class.hIcon = LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); window_class.hbrBackground = 0; window_class.lpszMenuName = nullptr; window_class.lpfnWndProc = Win32Window::WndProc; RegisterClass(&window_class); class_registered_ = true; } return kWindowClassName; } void WindowClassRegistrar::UnregisterWindowClass() { UnregisterClass(kWindowClassName, nullptr); class_registered_ = false; } Win32Window::Win32Window() { ++g_active_window_count; } Win32Window::~Win32Window() { --g_active_window_count; Destroy(); } bool Win32Window::Create(const std::wstring& title, const Point& origin, const Size& size) { Destroy(); const wchar_t* window_class = WindowClassRegistrar::GetInstance()->GetWindowClass(); const POINT target_point = {static_cast(origin.x), static_cast(origin.y)}; HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); double scale_factor = dpi / 96.0; HWND window = CreateWindow( window_class, title.c_str(), WS_OVERLAPPEDWINDOW, Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), Scale(size.width, scale_factor), Scale(size.height, scale_factor), nullptr, nullptr, GetModuleHandle(nullptr), this); if (!window) { return false; } UpdateTheme(window); return OnCreate(); } bool Win32Window::Show() { return ShowWindow(window_handle_, SW_SHOWNORMAL); } // static LRESULT CALLBACK Win32Window::WndProc(HWND const window, UINT const message, WPARAM const wparam, LPARAM const lparam) noexcept { if (message == WM_NCCREATE) { auto window_struct = reinterpret_cast(lparam); SetWindowLongPtr(window, GWLP_USERDATA, reinterpret_cast(window_struct->lpCreateParams)); auto that = static_cast(window_struct->lpCreateParams); EnableFullDpiSupportIfAvailable(window); that->window_handle_ = window; } else if (Win32Window* that = GetThisFromHandle(window)) { return that->MessageHandler(window, message, wparam, lparam); } return DefWindowProc(window, message, wparam, lparam); } LRESULT Win32Window::MessageHandler(HWND hwnd, UINT const message, WPARAM const wparam, LPARAM const lparam) noexcept { switch (message) { case WM_DESTROY: window_handle_ = nullptr; Destroy(); if (quit_on_close_) { PostQuitMessage(0); } return 0; case WM_DPICHANGED: { auto newRectSize = reinterpret_cast(lparam); LONG newWidth = newRectSize->right - newRectSize->left; LONG newHeight = newRectSize->bottom - newRectSize->top; SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, newHeight, SWP_NOZORDER | SWP_NOACTIVATE); return 0; } case WM_SIZE: { RECT rect = GetClientArea(); if (child_content_ != nullptr) { // Size and position the child window. MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, TRUE); } return 0; } case WM_ACTIVATE: if (child_content_ != nullptr) { SetFocus(child_content_); } return 0; case WM_DWMCOLORIZATIONCOLORCHANGED: UpdateTheme(hwnd); return 0; } return DefWindowProc(window_handle_, message, wparam, lparam); } void Win32Window::Destroy() { OnDestroy(); if (window_handle_) { DestroyWindow(window_handle_); window_handle_ = nullptr; } if (g_active_window_count == 0) { WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); } } Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { return reinterpret_cast( GetWindowLongPtr(window, GWLP_USERDATA)); } void Win32Window::SetChildContent(HWND content) { child_content_ = content; SetParent(content, window_handle_); RECT frame = GetClientArea(); MoveWindow(content, frame.left, frame.top, frame.right - frame.left, frame.bottom - frame.top, true); SetFocus(child_content_); } RECT Win32Window::GetClientArea() { RECT frame; GetClientRect(window_handle_, &frame); return frame; } HWND Win32Window::GetHandle() { return window_handle_; } void Win32Window::SetQuitOnClose(bool quit_on_close) { quit_on_close_ = quit_on_close; } bool Win32Window::OnCreate() { // No-op; provided for subclasses. return true; } void Win32Window::OnDestroy() { // No-op; provided for subclasses. } void Win32Window::UpdateTheme(HWND const window) { DWORD light_mode; DWORD light_mode_size = sizeof(light_mode); LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, kGetPreferredBrightnessRegValue, RRF_RT_REG_DWORD, nullptr, &light_mode, &light_mode_size); if (result == ERROR_SUCCESS) { BOOL enable_dark_mode = light_mode == 0; DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, &enable_dark_mode, sizeof(enable_dark_mode)); } } ================================================ FILE: windows/runner/win32_window.h ================================================ #ifndef RUNNER_WIN32_WINDOW_H_ #define RUNNER_WIN32_WINDOW_H_ #include #include #include #include // A class abstraction for a high DPI-aware Win32 Window. Intended to be // inherited from by classes that wish to specialize with custom // rendering and input handling class Win32Window { public: struct Point { unsigned int x; unsigned int y; Point(unsigned int x, unsigned int y) : x(x), y(y) {} }; struct Size { unsigned int width; unsigned int height; Size(unsigned int width, unsigned int height) : width(width), height(height) {} }; Win32Window(); virtual ~Win32Window(); // Creates a win32 window with |title| that is positioned and sized using // |origin| and |size|. New windows are created on the default monitor. Window // sizes are specified to the OS in physical pixels, hence to ensure a // consistent size this function will scale the inputted width and height as // as appropriate for the default monitor. The window is invisible until // |Show| is called. Returns true if the window was created successfully. bool Create(const std::wstring& title, const Point& origin, const Size& size); // Show the current window. Returns true if the window was successfully shown. bool Show(); // Release OS resources associated with window. void Destroy(); // Inserts |content| into the window tree. void SetChildContent(HWND content); // Returns the backing Window handle to enable clients to set icon and other // window properties. Returns nullptr if the window has been destroyed. HWND GetHandle(); // If true, closing this window will quit the application. void SetQuitOnClose(bool quit_on_close); // Return a RECT representing the bounds of the current client area. RECT GetClientArea(); protected: // Processes and route salient window messages for mouse handling, // size change and DPI. Delegates handling of these to member overloads that // inheriting classes can handle. virtual LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, LPARAM const lparam) noexcept; // Called when CreateAndShow is called, allowing subclass window-related // setup. Subclasses should return false if setup fails. virtual bool OnCreate(); // Called when Destroy is called. virtual void OnDestroy(); private: friend class WindowClassRegistrar; // OS callback called by message pump. Handles the WM_NCCREATE message which // is passed when the non-client area is being created and enables automatic // non-client DPI scaling so that the non-client area automatically // responds to changes in DPI. All other messages are handled by // MessageHandler. static LRESULT CALLBACK WndProc(HWND const window, UINT const message, WPARAM const wparam, LPARAM const lparam) noexcept; // Retrieves a class instance pointer for |window| static Win32Window* GetThisFromHandle(HWND const window) noexcept; // Update the window frame's theme to match the system theme. static void UpdateTheme(HWND const window); bool quit_on_close_ = false; // window handle for top level window. HWND window_handle_ = nullptr; // window handle for hosted content. HWND child_content_ = nullptr; }; #endif // RUNNER_WIN32_WINDOW_H_