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
literal 0
KcmV+b0RR6000031
diff --git a/apps/audiobookshelf/2.3.3/data.yml b/apps/audiobookshelf/2.3.3/data.yml
new file mode 100644
index 000000000..18535d14b
--- /dev/null
+++ b/apps/audiobookshelf/2.3.3/data.yml
@@ -0,0 +1,38 @@
+additionalProperties:
+ formFields:
+ - default: 40096
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
+ - default: ./data/config
+ edit: true
+ envKey: DATA_PATH
+ labelEn: Data folder path
+ labelZh: 数据文件夹路径
+ required: true
+ type: text
+ - default: ./data/audiobooks
+ edit: true
+ envKey: DATA_PATH1
+ labelEn: audiobooks folder path
+ labelZh: audiobooks 文件夹路径
+ required: true
+ type: text
+ - default: ./data/podcasts
+ edit: true
+ envKey: DATA_PATH2
+ labelEn: podcasts folder path
+ labelZh: podcasts 文件夹路径
+ required: true
+ type: text
+ - default: ./data/metadata
+ edit: true
+ envKey: DATA_PATH3
+ labelEn: metadata folder path
+ labelZh: metadata 文件夹路径
+ required: true
+ type: text
diff --git a/apps/audiobookshelf/2.3.3/docker-compose.yml b/apps/audiobookshelf/2.3.3/docker-compose.yml
new file mode 100644
index 000000000..347c2408a
--- /dev/null
+++ b/apps/audiobookshelf/2.3.3/docker-compose.yml
@@ -0,0 +1,21 @@
+version: '3'
+services:
+ audiobookshelf:
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:80"
+ volumes:
+ - "${DATA_PATH1}:/audiobooks"
+ - "${DATA_PATH2}:/podcasts"
+ - "${DATA_PATH}:/config"
+ - "${DATA_PATH3}:/metadata"
+ image: advplyr/audiobookshelf:2.3.3
+ labels:
+ createdBy: "Apps"
+
+networks:
+ 1panel-network:
+ external: true
diff --git a/apps/audiobookshelf/README.md b/apps/audiobookshelf/README.md
new file mode 100644
index 000000000..87fdfec72
--- /dev/null
+++ b/apps/audiobookshelf/README.md
@@ -0,0 +1,308 @@
+
+
+
+# About
+
+Audiobookshelf is a self-hosted audiobook and podcast server.
+
+### Features
+
+* Fully **open-source**, including the [android & iOS app](https://github.com/advplyr/audiobookshelf-app) *(in beta)*
+* Stream all audio formats on the fly
+* Search and add podcasts to download episodes w/ auto-download
+* Multi-user support w/ custom permissions
+* Keeps progress per user and syncs across devices
+* Auto-detects library updates, no need to re-scan
+* Upload books and podcasts w/ bulk upload drag and drop folders
+* Backup your metadata + automated daily backups
+* Progressive Web App (PWA)
+* Chromecast support on the web app and android app
+* Fetch metadata and cover art from several sources
+* Chapter editor and chapter lookup (using [Audnexus API](https://audnex.us/))
+* Merge your audio files into a single m4b
+* Embed metadata and cover image into your audio files (using [Tone](https://github.com/sandreas/tone))
+* Basic ebook support and ereader
+ * Epub, pdf, cbr, cbz
+ * Send ebook to device (i.e. Kindle)
+* Open RSS feeds for podcasts and audiobooks
+
+Is there a feature you are looking for? [Suggest it](https://github.com/advplyr/audiobookshelf/issues/new/choose)
+
+Join us on [Discord](https://discord.gg/pJsjuNCKRq) or [Matrix](https://matrix.to/#/#audiobookshelf:matrix.org)
+
+### Android App (beta)
+Try it out on the [Google Play Store](https://play.google.com/store/apps/details?id=com.audiobookshelf.app)
+
+### iOS App (beta)
+Available using Test Flight: https://testflight.apple.com/join/wiic7QIW - [Join the discussion](https://github.com/advplyr/audiobookshelf-app/discussions/60)
+
+### Build your own tools & clients
+Check out the [API documentation](https://api.audiobookshelf.org/)
+
+
+
+
+
+
+
+# Organizing your audiobooks
+
+#### Directory structure and folder names are important to Audiobookshelf!
+
+ See [documentation](https://audiobookshelf.org/docs#book-directory-structure) for supported directory structure, folder naming conventions, and audio file metadata usage.
+
+
+
+# Installation
+
+See [install docs](https://www.audiobookshelf.org/docs)
+
+
+
+# Reverse Proxy Set Up
+
+#### Important! Audiobookshelf requires a websocket connection.
+
+#### Note: Subfolder paths (e.g. /audiobooks) are not supported yet. See [issue](https://github.com/advplyr/audiobookshelf/issues/385)
+
+### NGINX Proxy Manager
+
+Toggle websockets support.
+
+
+
+### NGINX Reverse Proxy
+
+Add this to the site config file on your nginx server after you have changed the relevant parts in the <> brackets, and inserted your certificate paths.
+
+
+```bash
+server
+{
+ listen 443 ssl;
+ server_name ..;
+
+ access_log /var/log/nginx/audiobookshelf.access.log;
+ error_log /var/log/nginx/audiobookshelf.error.log;
+
+ ssl_certificate /path/to/certificate;
+ ssl_certificate_key /path/to/key;
+
+ location / {
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header Host $host;
+ proxy_set_header Upgrade $http_upgrade;
+ proxy_set_header Connection "upgrade";
+
+ proxy_http_version 1.1;
+
+ proxy_pass http://;
+ proxy_redirect http:// https://;
+ }
+}
+```
+
+### Apache Reverse Proxy
+
+Add this to the site config file on your Apache server after you have changed the relevant parts in the <> brackets, and inserted your certificate paths.
+
+For this to work you must enable at least the following mods using `a2enmod`:
+ - `ssl`
+ - `proxy`
+ - `proxy_http`
+ - `proxy_balancer`
+ - `proxy_wstunnel`
+ - `rewrite`
+
+```bash
+
+
+ ServerName ..
+
+ ErrorLog ${APACHE_LOG_DIR}/error.log
+ CustomLog ${APACHE_LOG_DIR}/access.log combined
+
+ ProxyPreserveHost On
+ ProxyPass / http://localhost:/
+ RewriteEngine on
+ RewriteCond %{HTTP:Upgrade} websocket [NC]
+ RewriteCond %{HTTP:Connection} upgrade [NC]
+ RewriteRule ^/?(.*) "ws://localhost:/$1" [P,L]
+
+ # unless you're doing something special this should be generated by a
+ # tool like certbot by let's encrypt
+ SSLCertificateFile /path/to/cert/file
+ SSLCertificateKeyFile /path/to/key/file
+
+
+```
+
+Some SSL certificates like those signed by Let's Encrypt require ACME validation. To allow Let's Encrypt to write and confirm
+the ACME challenge, edit your VirtualHost definition to prevent proxying traffic that queries `/.well-known` and instead
+serve that directly:
+```bash
+
+ # ...
+
+ # create the directory structure /.well-known/acme-challenges
+ # within DocumentRoot and give the HTTP user recursive write
+ # access to it.
+ DocumentRoot /path/to/local/directory
+
+ ProxyPreserveHost On
+ ProxyPass /.well-known !
+ ProxyPass / http://localhost:/
+
+ # ...
+
+```
+
+
+### SWAG Reverse Proxy
+
+[See LinuxServer.io config sample](https://github.com/linuxserver/reverse-proxy-confs/blob/master/audiobookshelf.subdomain.conf.sample)
+
+### Synology Reverse Proxy
+
+1. Open Control Panel > Application Portal
+2. Change to the Reverse Proxy tab
+3. Select the proxy rule for which you want to enable Websockets and click on Edit
+4. Change to the "Custom Header" tab
+5. Click Create > WebSocket
+6. Click Save
+
+[from @silentArtifact](https://github.com/advplyr/audiobookshelf/issues/241#issuecomment-1036732329)
+
+### [Traefik Reverse Proxy](https://doc.traefik.io/traefik/)
+
+Middleware relating to CORS will cause the app to report Unknown Error when logging in. To prevent this don't apply any of the following headers to the router for this site:
+
+
+ - accessControlAllowMethods
+ - accessControlAllowOriginList
+ - accessControlMaxAge
+
+
+From [@Dondochaka](https://discord.com/channels/942908292873723984/942914154254176257/945074590374318170) and [@BeastleeUK](https://discord.com/channels/942908292873723984/942914154254176257/970366039294611506)
+
+
+### Example Caddyfile - [Caddy Reverse Proxy](https://caddyserver.com/docs/caddyfile/directives/reverse_proxy)
+
+```
+subdomain.domain.com {
+ encode gzip zstd
+ reverse_proxy :
+}
+```
+
+
+# Run from source
+
+# Contributing
+
+This application is built using [NodeJs](https://nodejs.org/).
+
+### Dev Container Setup
+The easiest way to begin developing this project is to use a dev container. An introduction to dev containers in VSCode can be found [here](https://code.visualstudio.com/docs/devcontainers/containers).
+
+Required Software:
+* [Docker Desktop](https://www.docker.com/products/docker-desktop/)
+* [VSCode](https://code.visualstudio.com/download)
+
+*Note, it is possible to use other container software than Docker and IDEs other than VSCode. However, this setup is more complicated and not covered here.*
+
+
+
+Install the required software on Windows with winget
+
+
+Note: This requires a PowerShell prompt with winget installed. You should be able to copy and paste the code block to install. If you use an elevated PowerShell prompt, UAC will not pop up during the installs.
+
+```PowerShell
+winget install -e --id Docker.DockerDesktop; `
+winget install -e --id Microsoft.VisualStudioCode
+```
+
+
+
+
+
+
+
+Install the required software on MacOS with homebrew
+
+
+
+```sh
+brew install --cask docker visual-studio-code
+```
+
+
+
+
+
+
+
+Install the required software on Linux with snap
+
+
+
+```sh
+sudo snap install docker; \
+sudo snap install code --classic
+```
+
+
+
+
+
+After installing these packages, you can now install the [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) extension for VSCode. After installing this extension open the command pallet (`ctrl+shift+p` or `cmd+shift+p`) and select the command `>Dev Containers: Rebuild and Reopen in Container`. This will cause the development environment container to be built and launched.
+
+You are now ready to start development!
+
+### Manual Environment Setup
+
+If you don't want to use the dev container, you can still develop this project. First, you will need to install [NodeJs](https://nodejs.org/) (version 16) and [FFmpeg](https://ffmpeg.org/).
+
+Next you will need to create a `dev.js` file in the project's root directory. This contains configuration information and paths unique to your development environment. You can find an example of this file in `.devcontainer/dev.js`.
+
+You are now ready to build the client:
+
+```sh
+npm ci
+cd client
+npm ci
+npm run generate
+cd ..
+```
+
+### Development Commands
+
+After setting up your development environment, either using the dev container or using your own custom environment, the following commands will help you run the server and client.
+
+To run the server, you can use the command `npm run dev`. This will use the client that was built when you ran `npm run generate` in the client directory or when you started the dev container. If you make changes to the server, you will need to restart the server. If you make changes to the client, you will need to run the command `(cd client; npm run generate)` and then restart the server. By default the client runs at `localhost:3333`, though the port can be configured in `dev.js`.
+
+You can also build a version of the client that supports live reloading. To do this, start the server, then run the command `(cd client; npm run dev)`. This will run a separate instance of the client at `localhost:3000` that will be automatically updated as you make changes to the client.
+
+If you are using VSCode, this project includes a couple of pre-defined targets to speed up this process. First, if you build the project (`ctrl+shift+b` or `cmd+shift+b`) it will automatically generate the client. Next, there are debug commands for running the server and client. You can view these targets using the debug panel (bring it up with (`ctrl+shift+d` or `cmd+shift+d`):
+
+* `Debug server`—Run the server.
+* `Debug client (nuxt)`—Run the client with live reload.
+* `Debug server and client (nuxt)`—Runs both the preceding two debug targets.
+
+
+# How to Support
+
+[See the incomplete "How to Support" page](https://www.audiobookshelf.org/support)
\ No newline at end of file
diff --git a/apps/audiobookshelf/data.yml b/apps/audiobookshelf/data.yml
new file mode 100644
index 000000000..e10194ec4
--- /dev/null
+++ b/apps/audiobookshelf/data.yml
@@ -0,0 +1,20 @@
+name: Audiobookshelf
+tags:
+ - 工具
+title: 一个自托管有声读物和播客服务器
+type: 工具
+description: 一个自托管有声读物和播客服务器
+additionalProperties:
+ key: audiobookshelf
+ name: Audiobookshelf
+ tags:
+ - Tool
+ shortDescZh: 一个自托管有声读物和播客服务器
+ shortDescEn: A Self-hosted audiobook and podcast server
+ type: tool
+ crossVersionUpdate: true
+ limit: 0
+ recommend: 0
+ website: https://www.audiobookshelf.org/
+ github: https://github.com/advplyr/audiobookshelf
+ document: https://www.audiobookshelf.org/docs
diff --git a/apps/audiobookshelf/logo.png b/apps/audiobookshelf/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8b52c2cd20aa7b7d1ddc9f801eac9bea235c989
GIT binary patch
literal 16254
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
+Table of Contents (click to expand)
+
+- [使用说明](#使用说明)
+- [原始相关](#原始相关)
+- [Calibre-Web](#calibre-web)
+ - [Features](#features)
+ - [Installation](#installation)
+ - [Installation via pip (recommended)](#installation-via-pip-recommended)
+ - [Quick Start](#quick-start)
+ - [Default Admin Login:](#default-admin-login)
+ - [Requirements](#requirements)
+ - [Docker Images](#docker-images)
+ - [**LinuxServer - x64, aarch64**](#linuxserver---x64-aarch64)
+ - [Contributor Recognition](#contributor-recognition)
+ - [Contact](#contact)
+ - [Contributing to Calibre-Web](#contributing-to-calibre-web)
+
+
+
+
+*This software is a fork of [library](https://github.com/mutschler/calibreserver) and licensed under the GPL v3 License.*
+
+
+
+## Features
+
+- Modern and responsive Bootstrap 3 HTML5 interface
+- Full graphical setup
+- Comprehensive user management with fine-grained per-user permissions
+- Admin interface
+- Multilingual user interface supporting 20+ languages ([supported languages](https://github.com/janeczku/calibre-web/wiki/Translation-Status))
+- OPDS feed for eBook reader apps
+- Advanced search and filtering options
+- Custom book collection (shelves) creation
+- eBook metadata editing and deletion support
+- Metadata download from various sources (extensible via plugins)
+- eBook conversion through Calibre binaries
+- eBook download restriction to logged-in users
+- Public user registration support
+- Send eBooks to E-Readers with a single click
+- Sync Kobo devices with your Calibre library
+- In-browser eBook reading support for multiple formats
+- Upload new books in various formats, including audio formats
+- Calibre Custom Columns support
+- Content hiding based on categories and Custom Column content per user
+- Self-update capability
+- "Magic Link" login for easy access on eReaders
+- LDAP, Google/GitHub OAuth, and proxy authentication support
+
+## Installation
+
+#### Installation via pip (recommended)
+1. Create a virtual environment for Calibre-Web to avoid conflicts with existing Python dependencies
+2. Install Calibre-Web via pip: `pip install calibreweb` (or `pip3` depending on your OS/distro)
+3. Install optional features via pip as needed, see [this page](https://github.com/janeczku/calibre-web/wiki/Dependencies-in-Calibre-Web-Linux-and-Windows) for details
+4. Start Calibre-Web by typing `cps`
+
+*Note: Raspberry Pi OS users may encounter issues during installation. If so, please update pip (`./venv/bin/python3 -m pip install --upgrade pip`) and/or install cargo (`sudo apt install cargo`) before retrying the installation.*
+
+Refer to the Wiki for additional installation examples: [manual installation](https://github.com/janeczku/calibre-web/wiki/Manual-installation), [Linux Mint](https://github.com/janeczku/calibre-web/wiki/How-To:Install-Calibre-Web-in-Linux-Mint-19-or-20), [Cloud Provider](https://github.com/janeczku/calibre-web/wiki/How-To:-Install-Calibre-Web-on-a-Cloud-Provider).
+
+## Quick Start
+
+1. Open your browser and navigate to `http://localhost:8083` or `http://localhost:8083/opds` for the OPDS catalog
+2. Log in with the default admin credentials
+3. If you don't have a Calibre database, you can use [this database](https://github.com/janeczku/calibre-web/raw/master/library/metadata.db) (move it out of the Calibre-Web folder to prevent overwriting during updates)
+4. Set `Location of Calibre database` to the path of the folder containing your Calibre library (metadata.db) and click "Save"
+5. Optionally, use Google Drive to host your Calibre library by following the [Google Drive integration guide](https://github.com/janeczku/calibre-web/wiki/G-Drive-Setup#using-google-drive-integration)
+6. Configure your Calibre-Web instance via the admin page, referring to the [Basic Configuration](https://github.com/janeczku/calibre-web/wiki/Configuration#basic-configuration) and [UI Configuration](https://github.com/janeczku/calibre-web/wiki/Configuration#ui-configuration) guides
+
+#### Default Admin Login:
+- **Username:** admin
+- **Password:** admin123
+
+## Requirements
+
+- Python 3.5+
+- [Imagemagick](https://imagemagick.org/script/download.php) for cover extraction from EPUBs (Windows users may need to install [Ghostscript](https://ghostscript.com/releases/gsdnld.html) for PDF cover extraction)
+- Optional: [Calibre desktop program](https://calibre-ebook.com/download) for on-the-fly conversion and metadata editing (set "calibre's converter tool" path on the setup page)
+- Optional: [Kepubify tool](https://github.com/pgaskin/kepubify/releases/latest) for Kobo device support (place the binary in `/opt/kepubify` on Linux or `C:\Program Files\kepubify` on Windows)
+
+## Docker Images
+
+Pre-built Docker images are available in the following Docker Hub repositories (maintained by the LinuxServer team):
+
+#### **LinuxServer - x64, aarch64**
+- [Docker Hub](https://hub.docker.com/r/linuxserver/calibre-web)
+- [GitHub](https://github.com/linuxserver/docker-calibre-web)
+- [GitHub - Optional Calibre layer](https://github.com/linuxserver/docker-mods/tree/universal-calibre)
+
+ Include the environment variable `DOCKER_MODS=linuxserver/mods:universal-calibre` in your Docker run/compose file to add the Calibre `ebook-convert` binary (x64 only). Omit this variable for a lightweight image.
+
+ Both the Calibre-Web and Calibre-Mod images are automatically rebuilt on new releases and updates.
+
+ - Set "path to convertertool" to `/usr/bin/ebook-convert`
+ - Set "path to unrar" to `/usr/bin/unrar`
+
+## Contributor Recognition
+
+We would like to thank all the [contributors](https://github.com/janeczku/calibre-web/graphs/contributors) and maintainers of Calibre-Web for their valuable input and dedication to the project. Your contributions are greatly appreciated.
+
+## Contact
+
+Join us on [Discord](https://discord.gg/h2VsJ2NEfB)
+
+For more information, How To's, and FAQs, please visit the [Wiki](https://github.com/janeczku/calibre-web/wiki)
+
+## Contributing to Calibre-Web
+
+Check out our [Contributing Guidelines](https://github.com/janeczku/calibre-web/blob/master/CONTRIBUTING.md)
diff --git a/apps/calibre-web/data.yml b/apps/calibre-web/data.yml
new file mode 100644
index 000000000..ff1c69266
--- /dev/null
+++ b/apps/calibre-web/data.yml
@@ -0,0 +1,20 @@
+name: Calibre-Web
+tags:
+ - 工具
+title: 用于浏览、阅读和下载存储在 Calibre 数据库中的电子书的 Web 应用程序
+type: 工具
+description: 用于浏览、阅读和下载存储在 Calibre 数据库中的电子书的 Web 应用程序
+additionalProperties:
+ key: calibre-web
+ name: Calibre-Web
+ tags:
+ - Tool
+ shortDescZh: 用于浏览、阅读和下载存储在 Calibre 数据库中的电子书的 Web 应用程序
+ shortDescEn: Web app for browsing, reading and downloading eBooks stored in a Calibre database
+ type: tool
+ crossVersionUpdate: true
+ limit: 0
+ recommend: 0
+ website: https://calibre-ebook.com
+ github: https://github.com/janeczku/calibre-web
+ document: https://calibre-ebook.com/help
\ No newline at end of file
diff --git a/apps/calibre-web/logo.png b/apps/calibre-web/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9e98cc134ab88b26dd2a594dd734b9d2fc2fdc8
GIT binary patch
literal 8719
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
literal 0
KcmV+b0RR6000031
diff --git a/apps/changedetectionio/0.44/data.yml b/apps/changedetectionio/0.44/data.yml
new file mode 100644
index 000000000..68a3cbf37
--- /dev/null
+++ b/apps/changedetectionio/0.44/data.yml
@@ -0,0 +1,10 @@
+additionalProperties:
+ formFields:
+ - default: 40097
+ edit: true
+ envKey: PANEL_APP_PORT_HTTP
+ labelEn: Port
+ labelZh: 端口
+ required: true
+ rule: paramPort
+ type: number
diff --git a/apps/changedetectionio/0.44/docker-compose.yml b/apps/changedetectionio/0.44/docker-compose.yml
new file mode 100644
index 000000000..757d262ad
--- /dev/null
+++ b/apps/changedetectionio/0.44/docker-compose.yml
@@ -0,0 +1,18 @@
+version: '3'
+services:
+ changedetection:
+ container_name: ${CONTAINER_NAME}
+ restart: always
+ networks:
+ - 1panel-network
+ ports:
+ - "${PANEL_APP_PORT_HTTP}:5000"
+ volumes:
+ - "./data:/datastore"
+ image: dgtlmoon/changedetection.io:0.44
+ labels:
+ createdBy: "Apps"
+
+networks:
+ 1panel-network:
+ external: true
diff --git a/apps/changedetectionio/README.md b/apps/changedetectionio/README.md
new file mode 100644
index 000000000..ea93e7424
--- /dev/null
+++ b/apps/changedetectionio/README.md
@@ -0,0 +1,260 @@
+## Web Site Change Detection, Restock monitoring and notifications.
+
+**_Detect website content changes and perform meaningful actions - trigger notifications via Discord, Email, Slack, Telegram, API calls and many more._**
+
+_Live your data-life pro-actively._
+
+
+[
](https://changedetection.io?src=github)
+
+[![Release Version][release-shield]][release-link] [![Docker Pulls][docker-pulls]][docker-link] [![License][license-shield]](https://github.com/dgtlmoon/changedetection.io/blob/master/LICENSE.md)
+
+
+
+[**Don't have time? Let us host it for you! try our $8.99/month subscription - use our proxies and support!**](https://changedetection.io) , _half the price of other website change monitoring services!_
+
+- Chrome browser included.
+- Super fast, no registration needed setup.
+- Get started watching and receiving website change notifications straight away.
+
+
+### Target specific parts of the webpage using the Visual Selector tool.
+
+Available when connected to a playwright content fetcher (included as part of our subscription service)
+
+[
](https://changedetection.io?src=github)
+
+### Easily see what changed, examine by word, line, or individual character.
+
+[
](https://changedetection.io?src=github)
+
+
+### Perform interactive browser steps
+
+Fill in text boxes, click buttons and more, setup your changedetection scenario.
+
+Using the **Browser Steps** configuration, add basic steps before performing change detection, such as logging into websites, adding a product to a cart, accept cookie logins, entering dates and refining searches.
+
+[
](https://changedetection.io?src=github)
+
+After **Browser Steps** have been run, then visit the **Visual Selector** tab to refine the content you're interested in.
+Requires Playwright to be enabled.
+
+
+### Example use cases
+
+- Products and services have a change in pricing
+- _Out of stock notification_ and _Back In stock notification_
+- Monitor and track PDF file changes, know when a PDF file has text changes.
+- Governmental department updates (changes are often only on their websites)
+- New software releases, security advisories when you're not on their mailing list.
+- Festivals with changes
+- Discogs restock alerts and monitoring
+- Realestate listing changes
+- Know when your favourite whiskey is on sale, or other special deals are announced before anyone else
+- COVID related news from government websites
+- University/organisation news from their website
+- Detect and monitor changes in JSON API responses
+- JSON API monitoring and alerting
+- Changes in legal and other documents
+- Trigger API calls via notifications when text appears on a website
+- Glue together APIs using the JSON filter and JSON notifications
+- Create RSS feeds based on changes in web content
+- Monitor HTML source code for unexpected changes, strengthen your PCI compliance
+- You have a very sensitive list of URLs to watch and you do _not_ want to use the paid alternatives. (Remember, _you_ are the product)
+- Get notified when certain keywords appear in Twitter search results
+- Proactively search for jobs, get notified when companies update their careers page, search job portals for keywords.
+- Get alerts when new job positions are open on Bamboo HR and other job platforms
+- Website defacement monitoring
+- Pokémon Card Restock Tracker / Pokémon TCG Tracker
+
+_Need an actual Chrome runner with Javascript support? We support fetching via WebDriver and Playwright!_
+
+#### Key Features
+
+- Lots of trigger filters, such as "Trigger on text", "Remove text by selector", "Ignore text", "Extract text", also using regular-expressions!
+- Target elements with xPath and CSS Selectors, Easily monitor complex JSON with JSONPath or jq
+- Switch between fast non-JS and Chrome JS based "fetchers"
+- Track changes in PDF files (Monitor text changed in the PDF, Also monitor PDF filesize and checksums)
+- Easily specify how often a site should be checked
+- Execute JS before extracting text (Good for logging in, see examples in the UI!)
+- Override Request Headers, Specify `POST` or `GET` and other methods
+- Use the "Visual Selector" to help target specific elements
+- Configurable [proxy per watch](https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration)
+- Send a screenshot with the notification when a change is detected in the web page
+
+We [recommend and use Bright Data](https://brightdata.grsm.io/n0r16zf7eivq) global proxy services, Bright Data will match any first deposit up to $100 using our signup link.
+
+Please :star: star :star: this project and help it grow! https://github.com/dgtlmoon/changedetection.io/
+
+## Installation
+
+### Docker
+
+With Docker composer, just clone this repository and..
+
+```bash
+$ docker-compose up -d
+```
+
+Docker standalone
+```bash
+$ docker run -d --restart always -p "127.0.0.1:5000:5000" -v datastore-volume:/datastore --name changedetection.io dgtlmoon/changedetection.io
+```
+
+`:latest` tag is our latest stable release, `:dev` tag is our bleeding edge `master` branch.
+
+Alternative docker repository over at ghcr - [ghcr.io/dgtlmoon/changedetection.io](https://ghcr.io/dgtlmoon/changedetection.io)
+
+### Windows
+
+See the install instructions at the wiki https://github.com/dgtlmoon/changedetection.io/wiki/Microsoft-Windows
+
+### Python Pip
+
+Check out our pypi page https://pypi.org/project/changedetection.io/
+
+```bash
+$ pip3 install changedetection.io
+$ changedetection.io -d /path/to/empty/data/dir -p 5000
+```
+
+Then visit http://127.0.0.1:5000 , You should now be able to access the UI.
+
+_Now with per-site configurable support for using a fast built in HTTP fetcher or use a Chrome based fetcher for monitoring of JavaScript websites!_
+
+## Updating changedetection.io
+
+### Docker
+```
+docker pull dgtlmoon/changedetection.io
+docker kill $(docker ps -a -f name=changedetection.io -q)
+docker rm $(docker ps -a -f name=changedetection.io -q)
+docker run -d --restart always -p "127.0.0.1:5000:5000" -v datastore-volume:/datastore --name changedetection.io dgtlmoon/changedetection.io
+```
+
+### docker-compose
+
+```bash
+docker-compose pull && docker-compose up -d
+```
+
+See the wiki for more information https://github.com/dgtlmoon/changedetection.io/wiki
+
+
+## Filters
+
+XPath, JSONPath, jq, and CSS support comes baked in! You can be as specific as you need, use XPath exported from various XPath element query creation tools.
+(We support LXML `re:test`, `re:match` and `re:replace`.)
+
+## Notifications
+
+ChangeDetection.io supports a massive amount of notifications (including email, office365, custom APIs, etc) when a web-page has a change detected thanks to the apprise library.
+Simply set one or more notification URL's in the _[edit]_ tab of that watch.
+
+Just some examples
+
+ discord://webhook_id/webhook_token
+ flock://app_token/g:channel_id
+ gitter://token/room
+ gchat://workspace/key/token
+ msteams://TokenA/TokenB/TokenC/
+ o365://TenantID:AccountEmail/ClientID/ClientSecret/TargetEmail
+ rocket://user:password@hostname/#Channel
+ mailto://user:pass@example.com?to=receivingAddress@example.com
+ json://someserver.com/custom-api
+ syslog://
+
+And everything else in this list!
+
+
+
+Now you can also customise your notification content and use Jinja2 templating for their title and body!
+
+## JSON API Monitoring
+
+Detect changes and monitor data in JSON API's by using either JSONPath or jq to filter, parse, and restructure JSON as needed.
+
+
+
+This will re-parse the JSON and apply formatting to the text, making it super easy to monitor and detect changes in JSON API results
+
+
+
+### JSONPath or jq?
+
+For more complex parsing, filtering, and modifying of JSON data, jq is recommended due to the built-in operators and functions. Refer to the [documentation](https://stedolan.github.io/jq/manual/) for more specifc information on jq.
+
+One big advantage of `jq` is that you can use logic in your JSON filter, such as filters to only show items that have a value greater than/less than etc.
+
+See the wiki https://github.com/dgtlmoon/changedetection.io/wiki/JSON-Selector-Filter-help for more information and examples
+
+### Parse JSON embedded in HTML!
+
+When you enable a `json:` or `jq:` filter, you can even automatically extract and parse embedded JSON inside a HTML page! Amazingly handy for sites that build content based on JSON, such as many e-commerce websites.
+
+```
+
+...
+
+```
+
+`json:$..price` or `jq:..price` would give `3949.99`, or you can extract the whole structure (use a JSONpath test website to validate with)
+
+The application also supports notifying you that it can follow this information automatically
+
+
+## Proxy Configuration
+
+See the wiki https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration , we also support using [BrightData proxy services where possible]( https://github.com/dgtlmoon/changedetection.io/wiki/Proxy-configuration#brightdata-proxy-support)
+
+## Raspberry Pi support?
+
+Raspberry Pi and linux/arm/v6 linux/arm/v7 arm64 devices are supported! See the wiki for [details](https://github.com/dgtlmoon/changedetection.io/wiki/Fetching-pages-with-WebDriver)
+
+## API Support
+
+Supports managing the website watch list [via our API](https://changedetection.io/docs/api_v1/index.html)
+
+## Support us
+
+Do you use changedetection.io to make money? does it save you time or money? Does it make your life easier? less stressful? Remember, we write this software when we should be doing actual paid work, we have to buy food and pay rent just like you.
+
+
+Firstly, consider taking out a [change detection monthly subscription - unlimited checks and watches](https://changedetection.io?src=github) , even if you don't use it, you still get the warm fuzzy feeling of helping out the project. (And who knows, you might just use it!)
+
+Or directly donate an amount PayPal [](https://www.paypal.com/donate/?hosted_button_id=7CP6HR9ZCNDYJ)
+
+Or BTC `1PLFN327GyUarpJd7nVe7Reqg9qHx5frNn`
+
+
+
+## Commercial Support
+
+I offer commercial support, this software is depended on by network security, aerospace , data-science and data-journalist professionals just to name a few, please reach out at dgtlmoon@gmail.com for any enquiries, I am more than glad to work with your organisation to further the possibilities of what can be done with changedetection.io
+
+
+[release-shield]: https://img.shields.io:/github/v/release/dgtlmoon/changedetection.io?style=for-the-badge
+[docker-pulls]: https://img.shields.io/docker/pulls/dgtlmoon/changedetection.io?style=for-the-badge
+[test-shield]: https://github.com/dgtlmoon/changedetection.io/actions/workflows/test-only.yml/badge.svg?branch=master
+
+[license-shield]: https://img.shields.io/github/license/dgtlmoon/changedetection.io.svg?style=for-the-badge
+[release-link]: https://github.com/dgtlmoon/changedetection.io/releases
+[docker-link]: https://hub.docker.com/r/dgtlmoon/changedetection.io
\ No newline at end of file
diff --git a/apps/changedetectionio/data.yml b/apps/changedetectionio/data.yml
new file mode 100644
index 000000000..c0e74ac28
--- /dev/null
+++ b/apps/changedetectionio/data.yml
@@ -0,0 +1,20 @@
+name: Changedetection.io
+tags:
+ - 工具
+title: 网站更改检测、补货监控和通知。
+type: 工具
+description: 网站更改检测、补货监控和通知。
+additionalProperties:
+ key: changedetectionio
+ name: Changedetection.io
+ tags:
+ - Tool
+ shortDescZh: 网站更改检测、补货监控和通知。
+ shortDescEn: Web Site Change Detection, Restock monitoring and notifications
+ type: tool
+ crossVersionUpdate: true
+ limit: 0
+ recommend: 0
+ website: https://changedetection.io/
+ github: https://github.com/dgtlmoon/changedetection.io
+ document: https://github.com/dgtlmoon/changedetection.io/wiki
diff --git a/apps/changedetectionio/logo.png b/apps/changedetectionio/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..80290161e6c1de3e4ebbf5817d793594e3872ea3
GIT binary patch
literal 22507
zcmV
JNRCt{2y?1;Z)xG!sp4p}@*_Lcs?zUWTH#WxDrWX?+xfgP2
zNeJQQNg$AfCnOLEPZB5ma`PkQNp47mdx6ji3H?F<8!*+q;vyHxvLqK-y=>n(&mX(9
zJLSymu8^tz`en`R>E&}i=X>fXr`+5c$ybDKka^dw5F%}Da+k78{}dT>bGWH6
zM9PgW*7z-H5tca8;Tp~Lhb3Lk?#$`R#BaVeTiq+E
zcLh@{`7{=@nd~ixbYua))t~}UzvrIEOWEnMuZ5x4^?HxRv_
z0i5-3z6_ULXP29qW6rFV{DjL2ploYVv11|S)`=Mt{f
zT>okDBW&)Bjmg5=*4~BOLE&tdTgBSV20C*hXSad)&A$N+42Uv+`Gt}Es{&cs%%*}^
z0c8M(4fleKnE_}SciEZJ#Kgj4W{k=S=+>@45}vIwx%3SAsTb~Gb`Mw9L*yrlYud8=
z&BZKZ=iU(9!?2gPISk=qmwES^=5-}Ht$iBLI{HtUTDx4%~Sr`gS-qq*VUFXlt`NrwQlDWre_L*Ot`KvT`yKH%urOn=elCvDfN_PXZ
zbr6_lOFL+E_hwd=Fr^I4Y0yd3gdE&ujO>hSa-Vjhr$xrf@BM|Qpcxu)ZjH%mm&|kSBw%E1qc5**70<@5`ctANkc|NiDRP=ou&MyI
zcnwc$LvaXK+7M;oS>rdzV06!V4B6&j2hPN9VG76_Aa=h_?v0|FOb6PSbiYoq
z4lCe
zyJDkFzG{xmM37l&%qiV^y}5V)@~~w6(ZK!YnrEwD)motz0=6(9HqfU7Pno5`Y+_Wi
zUt_THoENQXNnmDcaVNg|^z>JH?E!`MP=GU#el~-Ca(fO%4r2Hh~Ra_D$w-T-Z
zbQgO$x%oBQS-bOW?w#W`F|@7X9TqPH7CQ-3V)o+7lsWedY46qsBLlOwfy&ufKG&QZ
z!wxnx=b}R*F|#sV+Dw>1oeN9K!_6a3mvmcuzJZmIIbN%s*H+mUol?eniVSE{c9Z~J
z7yxOC02^?f!!_E=!D$Z9%*L`tVyu?jz$0_xssK2KW%Qdrle=`+E?}1BH$Q-xQ#zPn
zc29@9D&{qH^;Vry1}2Pv5ScFB=1x}%EZx5aT>4Ws?IxX`!^Is2_cGub{YyP&VI;>vi$7=<}^x;>~D5&gqaqt_vq7R?V_-V%N`I28K>*j!o?Ip+=DdOV~_v2Z%7a
z$e$gB%|&iu*!^V-!|d1WDjTrf{JOa{mxwvdvN*lgiqE`D7%=70Y~#S#1^}76d2=Gn
zge@{=PCY@Ut3W}q0A1o#n7zqbeDdA73mhm@x!Vl{{Q0N#{rJr{-S&8dH11sEO1{Z^
z5+r6xl>_9=iZcVty7M$U8qGm6J!Vh|G>tT@g+qLnI5I&ic6S!PsZ>ds*
zXoa#(=((r{rUY7SjNw~dn^`$qN}b}D$D6w(QzG-Jr_mUXJ>B`9TruV~6Pi;P-c02f
zvT86h>!TL8#L1C*u3L9=jU*lcX4r&}QdJ|RFe&H|BXV2Z&E
z6w^XSx&bKyMFB-o3X4`cRT|n`T{;q{>Dg5XWK(I=aHNcZAvB(#P)RegY)$h&c88
zyIH@r4YUM>J{3)GA&P>k$kT0nn$4W`*X&^ov}bt#yZ7>Ccdu=ynGuXKw$sJtP8dKc
zVP^f^5RPpxg;URv_9|m$L%24-X1iQ;w^&RgAz;L?0^-8Uv($dW{uNAWNIa~b7N#A%{$bp878ejyEJD`(5HM>iL(ioWzYKaPD4cm6Z5mvt$kJf_KG(j{j
zm^{9m(PM{l)djUonJ|pXp#`XUs1dPPf}Y+mef?3|IwQ38#^~#h5$p{U4n~MXV#MQd
zgr<>5h~!{UQBhSDpWjO$;HS7aKyhgSWyL;*l=&D^?x&U(lZ$1Nc*=o1Tqzc5F`X7gu>K`!#H>GSk7HMn%eP0@OZN8poxSa7>;xJNDmE-
z9cl3#3&Ykh6bt~fx)Ye;>71TyU`{ghbx(^lAoTD}`mvcQ<@&W;4UjRj
z6VPRiBn@Co!^&lVsDmgT*C;CTF?Q?_uDWOni{{oavZ}~+P$z_-zduUD!9E(By4bS)
zFt2TDLkmYB7N@-@Mk1l%_avv)bg(Fj9)0fHPK|TfLL}KX78exwRVvE-D5{szvI3Tz
zRK?UOBN#iToKYi-C@Ao|?spbK(AE}W^OnOr^XzV#4s;O=#_)R8G>~M+rrf}pPP6H^
zya#Z4H$SucbvAS8c@|vvl)wTSJ76Wr8ZR^W%D*elrNVVz
zB2_*LNfr)A1jDNeSul4vV@3~Q(ZXuRjU7TkffqOF>x=OAJI$jiQn8?$aMBtT;TVq
zj2KzYH!hvdX(x@QYG@Ho5{blVKGM&-8=HCl^#gRa_p<*`KLx6S&ugyg{Pjd<{m|WS
zCN5RU>{n4!*^I|D6h&cFO$n95N;vndvCNq>lIjt~_r6vVhHI<{YkB?J)W^m>cY*y@thI
zJRulcQ_8=bQ_JNSOl8=RLR*)qOE47W%}s|{v#yC3-)trvjF5wBKe{3;8+{*=fDvd0Bu-
z6Dzs!f{84cUqeZWT-O!?_UvinA5ZLL&FU6nu>>A9mol&e*gb!_fj>K#b8K)%K+D+K
z2FAPqnJ<_f;&*CHLXgm4?1Z6w=gOI!ws0&(4*FzASBTfvH1qg#yV={&K{yhpz^8(e
ze`UF;2>CV$DVw{5VK%c@G9tO!Sy;)Ef5_Op{Y`Q#eP%jI+Hp-`MPs}Jz_qdPg!
z*oDWFtKL7*bPsgV$AOV8{*(n@d(uF*5-?hTmfKvj(F`+4^PcuIhMS2$o)8okc=(sI
zCUW)XXE9+^88Qil*S-MGJtC;zd7x8FEGBqC#L_jzh*9wdJARWI@_XJx_Ho)og_
zIq5*m#Euy|T}?3-WJV=0s527X+^*&%|JaxrKxl~6CZu6iC4B3PbGTsXIEsq=SS1$I
z*uJNY-#oO9ojVTG+ZUzKucn3%)`H2ez-6o>^P3&u`E|hq?HOWGjnYy-GiFxvg)661
zJ9!vBpMCzlzdy=rD;oIw<2&f=3?^4JZQ-WpUq
z!lYnxhG77+A`qH9TrK7H^!X$C*46Vlp|%p49BS?3!RP9D?xo#y^+b|e
zH5EzsoT?Nz7Lq;XcKKD7%5?
zfxuy!a&V{U23l6ucTdfUmoEq8%q-P;!RX$mW~A*b>V(mcwUHS7$Qp?d0-*`KJ`ex)
znW@}#%>pKjslY0+Sb`O+oB7Ef*6`}vjl`k})YQUSEh!X;oD*Crq!TuQx_>Q%`bEUoofI
znkMIbn$zoAwu(G2xt5gzcxvWdzC42|3-FBZ766;n1OTB()r|Dh3CuE<$LwBcf}v#r
z{`Xhr^YzPTQBh_e;Itg+zx{Q(%v)Wc#R=}Kj)f5%_*}J=)SWHWQxF}y{Hu@SEtINwu
z=FY&-Mi$mVCt+5Z&TDmNkjz}Mk#Wtx)68s$L-(s`FnV|~-@9f$mn@rt*TN>6CU|d8
zJ3qc_H7~DfK#M2vsH!cq*;;;XEMt6Hl@+sl_pqG(W{Vp`YIALPipgj4pQhZ3gVF4uI+R4Unju=a9hW_AlhH%l?J
z@m#hrcs7LY%G#I#nX;3f9C6U4W$rXhFm-$dw|?y;&RR0wwmBylj`PT~yZFEVy`H*#
z?f5)uxkB#M#L>2el3*yt?;hODJ&$drw=aT6RdXmTy}+F8as@~}
z6=a6+z`&f3d!v~=Uh8jFRp{@J@!pmrgu`*BO|LR7p(~2Q*l`t9k1S4tx;x@917ZYa
zzWKDLdLWI~GjiT#%K@97D_`iq40;(w3yZl$wJ^owV5cPnb5E$^wrdx1;>>ESa^PSO
zzrBAWe}7>&$x(Q&-S7JWvz%?LGXS{)EBAEB8&GaxxDUdN@A@h2y>;!hw}luzrkt{J
z^JcD*HKo*yF6F@fF1k9x>2e<&P@4OoeDkUQ^^BZ**>dZQf_wmn0n9GjIvto<24>le
zMncn=J++eCzp;qf)2gt_hWCze=U>+H`s$`MnB6n$4zj^yO#M9@IP>)@?-_)|ELXpB
zclv&l#{FIFscWaYrj!xYB^kGhLiNZ}MvX0{VQ&ZBU13wtnG3LG?%uCI<9iCwDG`RC
zgwYI(u4||ot2?7e28n44iCrQgIAP)tZvFZ~=AJOzX8*>z7XIT;YuLG`J+<2B%s}S<
z#(`9RQ)Ph3ubX=(R=38fNZiZ8?52k*E@2tt%&m;lW=hguM|+UE?QIMnQNpOv=2h6?
zBT5)CvV?}c?R0lVl67H-*Zh{PjI8;zt1B{p<}fmGdPdH@bh&BTF3ZdVSeCB!hh#xT
zSpCX$?$o=c2_}y%!&?LKY{jP6b`n@eX%1jC0EaPwCeu=J#{w$NT%-NgU*
zht(Wy52i0(ac=GUyM(3k0JGJvn|mj=abrf~yU}$vzjlB2{HA*Y2X(;gSLQRr){$_W
z9q%2bdSof1$7YyXQDEe#GRn#W?AY2$ERwK|W!#xLlV58&JC(Q0uc>|%1<%Mimo0a^
zUO=|L!=^XO2YOBmCnk0mNoH1kUjFyhC-T{|CfQ~)R;_8~jz6rXwJn(5Fk{VVcC$h8>YG*m?)6pFE9Yb(_?rHmS5RzF6Mtsvm{
zvVHSWG);5Wsbz8NF=wv}+0&9YVf@BQGB0+?q9ZF-Q(^XF3(7JGj0w2xqG?>ZY_bi^
zn|8GFi@VoyQX4mvwH99n)(V779*-MyV1G5IuBQ7$ZPjaAl=+|%t4rwe0d%&g38
zPq#-^=m@-qN)n#URcX{7fnumU&lSYMi;VP0f~EA-P*vM`lCv3_Y}gS
zf+X*lNY7%VSzKT~LX|PkuzNCar;SV(ojQhZUOK}xnGaBZpo`z$w}Ar(dont+gV^na
z+|E%&GP)Cn|M^PNpDe9z>CgCe5XCtRomFN2?M#@v=%J;-q$(V3?dRe9Hq)@L!{pZM
zQ~8%Grm^tUQ7AIMj-lr+nXugJ#=y`*Uil8o+V<a&Dil3XmR`3w9N0hseN|4Ov;?xr@r-_(r0yc
z)+u&EG(`9Qwj-zgyJA0mF`Y#f9*0h?_Eq8Ae
zn|s9`r&In+UtmB%QQ*~o?&F!i?I0f0O!3TLJc`d=HpOuNhc(^yGLpwFEH>u)vGyRk
zq!riHu@%$43a1T68HUyw+oFOPH}#v?To8^Wm^OJhmwslNZ6EHsZHIW|*`0`lX1bP3
z4kDvj_Cc7Q4{PPg24VTdX$NA~bmZXIIUO=s+ub|GD}+FcD};K;^tO(18DlauztocA
zivQWemJJ6@@vExBS)Zw8%GBY+BATs!tl>MwX*{+pBLZVsMsu%m{AL-inP1H0YZsf2
zZ8y_2s2p0vO;^okWTpAEMAM;O?znpchmZE-GXOm|)^WCTGPByd*~#5yG*Y*8$R#(w
za=WBoci=h!MKEei8JB-?7S+{d9BAy|q5s}WdwUSSU$uqd8kVBa+Y{yS`?fKnx`ff=
zE7I=EhZOSpFHfiSNDm!t!Sp`r{PO8+CKKJAr+W6K%T1#>AqTVLw@!>owy>C6{6rFh
z3ztph%NI>GP0@wIG46U`Bk!zh!t2RxK;{I%eCCd2eg_5=W6ZgySF!!gm^-J@`gATU
zYX73`MzOr|m&QvP7h__KE3xd72gXU|?~&MJo!nA3KOinSA#
z#cB1MNN5ZlQo;!{%zI?!om|Z=KVHJz1tU>YxRWN^8vGhK5ds`Sv%ue2LxbZVAH@+nBUW+oqR9wd%1MkG)7gI
znu2R=>E_RmY#|?7{n;xzkp>r$n5nG?i0`Av7l
zszNvt1M*|_jGdfebBR;NJh_JiYM8gE2BFE*Y7~1P>0HLL
zbU=ERL)bSQ>8&KAgBZ*evkGEzVrTT?B0t}_d^*L&=7X5;Y-r)txAvR7WM@g|jJkuu
z2!8ij2DzEN+f}fpMiz!~wC>&rjNp;S>E3|sVVLJ|w1nV=XZNsfbqg{nuPEfwFV5nE
zf1Q#%u_COYx|O%W+Eq=gd#l+LrqA!;{EMejF{Dr$r#Y31CB^1At^UkmBz>#;>6Eli
z3~9YtGct2pM>a2ar>%9?HmDi`K_VeodeSHs%rc)mY448khbMNVj!&60AWL}0PVa`?
zmzeFqlKacG<=gyP`(?*;2wRA<@U3Z0`_-o!^)B1ebvuV;RudFJQ55?7B0O~OCf?h6
zMCz-!B*4X2%;dsLrsDCcnfP7Po78*b35}PY+)c;Ppvldci4`n4XB_dU=1|Ut{F>h7
zamh#{`Cs6vp80RfO}=cpvDuqB9>p+kZHPt(wI(Pm@^j>B6IuGFF?&W?>10u;u89QSthQGPy(-LQT&uc37tjEoq2XK(wJ=fP8
zrG9S*W5$(JHKGKo`28Mgrwl`A8vAy4q9sJ~UJpqgOlejWx;ny?mid`Fb9mZ;sw$LK
z6i~PAC_P;f)7~7#976hUw%*97hGat)|#5ESq
zAH|ZnBTWT%xV4W5pQ!_hE+-Q+!&+F$qU*^spYCe%U}U>rH}`To_kklgT~3oB
z_)-*wriO0*`;Y6{`Ch9ul)@q(pSx^27hW<2pJAZr+%sf)z&HNcKvQFv$#(3-3g(?W
zD!rdw?l(Kh*zL^aq*`Y*tT!hm@orEj((Vl5nB1j)Yl8C90G~g15`N1i+)u5jr?IIE
zug6(eaw|Bi8(Bu>W_H_Lft~BXGqw=;IX
z1BuhAThEB9C^R;7anD`r*tXfc&smq^5NbpMWO?YUeUY)s%oWs}9iA&}Fh6
zQB%gEv&Pu+l}UB>vXYla=FL+*{qxIBlM}iMf|+scpf?WyF@&KY2*ng`{n~t{*A6o!
z?D>^@dGh6b1iZ4!vSd`(WJK};NBzDIO-o)6rfK%y!eo|QZcjeVZj7HTwl^F*KxB4K
zW=4N@GnqTtQwG3Hxd15oU|f(YAHx7$B=c#^v(O9|VWz520eZS4?AzVWs4-=X7%9=I
z175~Y8bU{VKP~%vKye0^Lb6;#eKCqkeN3M-B2&()LZHCQhBuo?#5GemvOEujsJzL7
zu^ezUdbey|k-NhL^tdKiICD62E!Plqc87WJ`MnrF%<7crL;?x}Dy79f`~e>xj|Y!e
zO@Fj9?cQ|q+YCHw_~|_bnnrtDAKg8X^!EVW*w|7c()8LHF(1FVfj=HgBC)X0gWs>>
z^LmoyqN=DKC3P{SimIf(&ZR1;l|_N7DtNpq9#z5XOU_GsyeeLA(yhmE}(P+Hh)o{N$m`Up$&OUTVPSw_n+o
zYdJaDd%*(IG&^VBGlM{bV<*-I!g0aOStA)`8A1Q^t^KsM_GJCQrK%{LvT!74oic`+
z;l)%`6j5B{qo~k_*XzOK$$U^U`Arlnj4h(K#FUd*EWx^s2YLC`de&?>NGKFHT!L!m-Qan0$xqa@ga(D?}x^_N){?%$4>N;G%@u;ZDs}R<{et^$?X=d8o
z=l3vm_6Rn--Ap7B&*_`#<{C-}Jk>g(fH{@G@)82tNC{Db!9GMro=0r|I60xsB-^G(DxwyrcGxIuv*}%re?WM-$
zZ`-cC)a%IVGG&{#Ebg*fAD}HbGFSiaY^E1?8Woa;_tTe!qMPpcS;z(XywV!`H
zvx~j;oer0y<7nn)mn;8R-3d)lJ+he3Upk$$&z*$V>&XdlAB0SqK8&GNh4l4A(q=NS
zdA%z8cXzUTYa5m4WB^@M5@6>1Y7QOfHtgGQ6Qhpnt`cUBV5R(}dtK{{hh_hUOpR7Z
zUcq|R1+}J69wZVPYd1C1*%P%*(3_bm`8O8R(o;LfS`-Be0$wgSua+Nve<>%<8DY*p
zZp>g@#&CA8NZu9GKeL^d5KKFvif`Vyi1W^$jL-Mc0kftF-hF*PN1FQ_uVFK?s-_7x
zt!^d~&K%cL6j*TD7!*`Pc^Lf~!&4l~3d_5K(>!#Vr7gD~>7!^PgIkt>Rlkp^lg#Yg
z))i*O+szbs<+Y;d2}q&nNLz^KR_x>8k-lsz%!4Z9$5wFbO-nd+$r#&U(I}Y$Or}}J
zAMXCZP=F>knkJZc;z(|~c`5
z-;l~8#!Vh#Isxb$nzIXQ8oat6$Jq;61QK@&3W$HB;m
z;lm*)N5JpJ%?y4u5%
zYu0eC|E4>b+l~g=vhffvy|9;HUzEPyD8XQiXe5D_urKXrh{72lT0$^?(J0eZU$%IU
z^z+c4H?e<@eRe~ZBjd_sG@PJr(^1a;Y@C9^3^vNj3h*fMK{$wXE#?Ylh4i4%NNXa^
z7@*idZGG1R)HIknww$?B%<9I$!@cZl>_ig+kE0GGXDyFMaakT$(%^7sisXAJ6ekpn
zA%MI7vW}NuZQ$xFXK>2G(bDOs;Z?=laNPp>`lD=nuhozad0O4#H=Eh>qiKSvQ-^Wg
z4JR>bbg9H=>eCxrj_~kbx3F(dCt7M*IXPpg;Pa^{KBsgz>$;jIn76owuYUU^hE>VG
ziQe5A=D|O0Wc%jBjZ%4b0>~dKVmc?zl
zIZ5bSN%cP6uwrOCQ)me|p3oRQvXq&%Lrsa;v9E)sgFSdXs!JtjPp~e+^p;(}G^#Rc
zYR+0wpl){?zxv%89{fzc>^pLHR&D$|GO)z?N
z8DIJ8JjSQgE31TpF`jy22fzFEYIg5zM~LJ?Npj&tR`uzqq-oM6kr2#XP{TDhEN}#K
zPgj`xf4`nht6OZ_e6yYQ(ce9)Li^z$E%iO7u!mL^QCu8ABCa__R8-8s2YBw?tkLT6`~zdo{!2Oil*
zB$AMZHGW(P3=)2w+1y_x2gC(C{X0aaCnTz$CUtE(f#{l8z&hPRv3gHxHJl}mbrfPHmG
ziG(vJS`GdcMb^CFZkp-_xR9@xUmFYF~AOE})~=U!I!vQNYXC(InqH8;$s
za)g|jdwU{0^p}lnct-+eB^LrR+ju+*2ljRn>@y$HT6oSFipzYqU5B!~x#u$(K$4;L
zI+E$h4ue2z!lMa=F*W8vMQ3l6t$VtpCsH!NaI2C7&)>O;c$v0mvjIi!0+>L`4uxc=iFN9)LgJX#-k5z<&_ur
zrPLk!e6=;MTnIvFf{C?5xcd4N8R?*}cXft%;E(HB`$m&IHxls4Fkwos0&UGfdO9K)
zrLwvh71iV`+uXht0Y*%yx)zvOA=GCPEh~f;&*m*bFubw|zdtjA1!!#Urn@g{0h94W
zgM$hB=?R)B1up`_xvsr4vRXoXN};CSI(rYG=QcF*L1k$Gm#Kn
zaM4sQ`rNeSF(-?}VhNsmdKa&}xQ|3!%lc6yYrKwm7BIB3kjt)_#kfgBqPAKJ#-
z?=+eUUKhXL!xfj$g?~6KK
zB`nKl#?DSa09sryYHT^Do-Ok{QwYt#75)M*
z(@q?oZWuCgIyb7vYXr9G_EE)HfwqMcYd4yq`u?~eD$HGHB$}YPEu7p??&3E)3mCgH
z_byN#hPgX*0)=j_stRpKgWUJmt-QDWsKhk{0v^8dmARaC<^&t)W$9K(7U%Stm0W$z
z94f2ivkJR*v~ka$Hqg-?L{&5Ql-Tp+R0hubLqITOXd%NSakn1oU~!MS#s)*ivhopUAUegM-5>Zax%{`lt&H0O97d8zK#_v7w7U{&o$A5B8G!RJl8ANzF24WwT4&LwD4$r$S3;
zY+l#GAO7QAHm_-M+yLdq(&jkrG5aR9f~gw|7Peg%fF(aa%HW
zm&}S_F3fDUv#%!R+CwOSqAG0Nc9=i>aUC~)`(%a=weQg$KYj?;{QDgKaMwBx9qdg_
z!DZt0dA(fy?{hf$l+n`MMZ$6Z@%VN&t~(?>F_T|ex#v$y2sXak!mcfCsER^=e&)I8WM_AUL{uZ(Zw7Sv&;lxJN=)Ms>nf)V6GqWZq{l~c>uyq#
zS|qS;@aYZ4iN@U*Ae`g0cVD@OVa~8Bac^%xGFYelD@owJ{7M7=^FO<#7aamDSu&O{
zd|@_zzc*bms-n=*5#pXdZDQkk^G)|cz^kt`@Wi9r5kfQVhLeFqmiKJEo>Teh`#{|I
z*6LT5x?JNlx)VUKFJ>C16_xlYs|c7^3vJVe_C_nir0F_cqvzaJ1YsLP#^V~jyg
ztl2>gXH`0~hb2j;0^v}c#~$6ziWU2%Zd6ra*=Htk>18ue6;FDMyD2fLVD2kmRtk89;3%3TLn`A4GyvrzGyVQk|(MX(vqRc?h
zw7@rjH0tkOrwvEeEZI#`coX&th(zNAgOQYemTThl7z~3zVRtV}hq*z@TeEWo31=6U
ze0e+`dVBl$?QdVAsCWtU=1sMEDJt@D^)*X5(EK_tzx)y+GZ9Z$<1W7Uy&crl)UaX0
zdI}2)C^oGp&w!${-Kl>PNuYI0zOX(=*%r$O3$YUltUulUfC^967ITWt(mpo3H0IW5$dj7BlYwR#oFrRY|KG
z!Dthmy_;!idyc&a@1?ozpY#OxplJ~lMNPXmraM;x%2pokDug*sr?A}1S$|cC$2By~
z0%%Q<&a%lV%PzW|YEG;(up9#ucJ9#cQFDqk8#~I}%L_}MUYYxBc1AW3B2KWsfwrSB
za`528balN(EY^k)Q540K0=wYZXP@O4zxW0H{qlvE*|TSJ>#es^R#rwlE|?vzSL?A!OE(3U^xTEUO%$`NW*X^M|&wI#p6{_RAaiG
z!cRSIhkld)yt%H#+0C-8+uOrX(%uY%gdF3{h|3@@OBmKewaIjq1OnWD|NT@|RdN0G*BjJ{jGKS?mw%zNvy;2-x{F{inA3f3<}f^H
zT9}^DUi!lODKDBvW$8T13Mb-GeaNOOomL#B;oD4vWok0PP
zp=rG&**N=kW$ADfg@S?t9)0vtX3m_+8E2efbK~)NxZ;W{Xl-rf!3Q5Ck&vH?$r4jC
z%|fHIe;a+F2Fi=4GNSwxiv7b;6fdCJ>c{w=y}a#pn@?CyjBIo#guv@jZA;v;BUrg$
z!fJ2cB4_a=x69s)JRTLFU!Qt1hM4rLFAwJur`4~M4|y2E^2~H;v1mJeeecoRvxY<>
zlyc+F$fl5mFfnawYb(F`&2Olvs9^5gxi