From c34d1bb49eb34d04886eac99fbad63340bef03e0 Mon Sep 17 00:00:00 2001 From: DimaDemchenko Date: Mon, 27 Jan 2025 16:56:58 +0200 Subject: [PATCH 01/14] Build: update dependencies --- package-lock.json | 1760 +++++++++++++------------ package.json | 12 +- src/pages/p2p-media-loader/demo.astro | 2 +- 3 files changed, 958 insertions(+), 816 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6790265..d53543f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,19 +9,19 @@ "version": "0.0.1", "dependencies": { "@astrojs/check": "^0.9.4", - "@astrojs/react": "^3.6.3", + "@astrojs/react": "^4.2.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", - "astro": "^4.16.14", - "p2p-media-loader-demo": "^2.1.0", + "astro": "^5.1.10", + "p2p-media-loader-demo": "^2.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "typescript": "^5.6.3" + "typescript": "^5.7.3" }, "devDependencies": { - "prettier": "^3.3.3", + "prettier": "^3.4.2", "prettier-plugin-astro": "^0.14.1", - "vite-plugin-node-polyfills": "^0.22.0" + "vite-plugin-node-polyfills": "^0.23.0" } }, "node_modules/@ampproject/remapping": { @@ -59,9 +59,9 @@ "integrity": "sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==" }, "node_modules/@astrojs/internal-helpers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.1.tgz", - "integrity": "sha512-bMf9jFihO8YP940uD70SI/RDzIhUHJAolWVcO1v5PUivxGKvfLZTLTVVxEYzGYyPsA3ivdLNqMnL5VgmQySa+g==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.2.tgz", + "integrity": "sha512-EdDWkC3JJVcpGpqJAU/5hSk2LKXyG3mNGkzGoAuyK+xoPHbaVdSuIWoN1QTnmK3N/gGfaaAfM8gO2KDCAW7S3w==" }, "node_modules/@astrojs/language-server": { "version": "2.15.4", @@ -104,15 +104,16 @@ } }, "node_modules/@astrojs/markdown-remark": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-5.3.0.tgz", - "integrity": "sha512-r0Ikqr0e6ozPb5bvhup1qdWnSPUvQu6tub4ZLYaKyG50BXZ0ej6FhGz3GpChKpH7kglRFPObJd/bDyf2VM9pkg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.0.2.tgz", + "integrity": "sha512-aAoHGVRK3rebCYbaLjyyR+3VeAuTz4q49syUxJP29Oo5yZHdy4cCAXRqLBdr9mJVlxCUUjZiF0Dau6YBf65SGg==", "dependencies": { - "@astrojs/prism": "3.1.0", + "@astrojs/prism": "3.2.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.1.0", + "js-yaml": "^4.1.0", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", @@ -120,7 +121,7 @@ "remark-parse": "^11.0.0", "remark-rehype": "^11.1.1", "remark-smartypants": "^3.0.2", - "shiki": "^1.22.0", + "shiki": "^1.26.2", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", @@ -129,50 +130,50 @@ } }, "node_modules/@astrojs/prism": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.1.0.tgz", - "integrity": "sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.2.0.tgz", + "integrity": "sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==", "dependencies": { "prismjs": "^1.29.0" }, "engines": { - "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + "node": "^18.17.1 || ^20.3.0 || >=22.0.0" } }, "node_modules/@astrojs/react": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-3.6.3.tgz", - "integrity": "sha512-5ihLQDH5Runddug5AZYlnp/Q5T81QxhwnWJXA9rchBAdh11c6UhBbv9Kdk7b2PkXoEU70CGWBP9hSh0VCR58eA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-4.2.0.tgz", + "integrity": "sha512-2OccnYFK+mLuy9GpJqPM3BQGvvemnXNeww+nBVYFuiH04L7YIdfg4Gq0LT7v/BraiuADV5uTl9VhTDL/ZQPAhw==", "dependencies": { - "@vitejs/plugin-react": "^4.3.3", + "@vitejs/plugin-react": "^4.3.4", "ultrahtml": "^1.5.3", - "vite": "^5.4.10" + "vite": "^6.0.9" }, "engines": { - "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + "node": "^18.17.1 || ^20.3.0 || >=22.0.0" }, "peerDependencies": { - "@types/react": "^17.0.50 || ^18.0.21", - "@types/react-dom": "^17.0.17 || ^18.0.6", - "react": "^17.0.2 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0-beta" + "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", + "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" } }, "node_modules/@astrojs/telemetry": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.1.0.tgz", - "integrity": "sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.2.0.tgz", + "integrity": "sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ==", "dependencies": { - "ci-info": "^4.0.0", - "debug": "^4.3.4", + "ci-info": "^4.1.0", + "debug": "^4.3.7", "dlv": "^1.1.3", - "dset": "^3.1.3", + "dset": "^3.1.4", "is-docker": "^3.0.0", - "is-wsl": "^3.0.0", + "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" }, "engines": { - "node": "^18.17.1 || ^20.3.0 || >=21.0.0" + "node": "^18.17.1 || ^20.3.0 || >=22.0.0" } }, "node_modules/@astrojs/yaml2ts": { @@ -197,28 +198,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", - "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.7.tgz", + "integrity": "sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", + "@babel/helpers": "^7.26.7", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/traverse": "^7.26.7", + "@babel/types": "^7.26.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -242,12 +243,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -256,23 +257,12 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -319,9 +309,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "engines": { "node": ">=6.9.0" } @@ -351,23 +341,23 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.7.tgz", + "integrity": "sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==", "dependencies": { "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.7.tgz", + "integrity": "sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==", "dependencies": { - "@babel/types": "^7.26.0" + "@babel/types": "^7.26.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -376,38 +366,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", @@ -450,15 +408,15 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.7.tgz", + "integrity": "sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.7", "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", + "@babel/types": "^7.26.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -467,9 +425,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.7.tgz", + "integrity": "sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -536,9 +494,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -547,13 +505,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -562,13 +520,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -577,13 +535,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -592,13 +550,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -607,13 +565,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -622,13 +580,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -637,13 +595,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -652,13 +610,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -667,13 +625,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -682,13 +640,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -697,13 +655,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -712,13 +670,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -727,13 +685,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -742,13 +700,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -757,13 +715,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -772,13 +730,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -787,13 +745,28 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -802,13 +775,28 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -817,13 +805,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -832,13 +820,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -847,13 +835,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -862,13 +850,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -877,7 +865,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@floating-ui/core": { @@ -1334,9 +1322,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1442,9 +1430,9 @@ "dev": true }, "node_modules/@rollup/pluginutils": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", - "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -1479,9 +1467,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.32.0.tgz", + "integrity": "sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==", "cpu": [ "arm" ], @@ -1491,9 +1479,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.32.0.tgz", + "integrity": "sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==", "cpu": [ "arm64" ], @@ -1503,9 +1491,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.32.0.tgz", + "integrity": "sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==", "cpu": [ "arm64" ], @@ -1515,9 +1503,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.32.0.tgz", + "integrity": "sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==", "cpu": [ "x64" ], @@ -1526,10 +1514,34 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.32.0.tgz", + "integrity": "sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.32.0.tgz", + "integrity": "sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.32.0.tgz", + "integrity": "sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==", "cpu": [ "arm" ], @@ -1539,9 +1551,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.32.0.tgz", + "integrity": "sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==", "cpu": [ "arm" ], @@ -1551,9 +1563,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.32.0.tgz", + "integrity": "sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==", "cpu": [ "arm64" ], @@ -1563,9 +1575,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.32.0.tgz", + "integrity": "sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==", "cpu": [ "arm64" ], @@ -1574,10 +1586,22 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.32.0.tgz", + "integrity": "sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.32.0.tgz", + "integrity": "sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==", "cpu": [ "ppc64" ], @@ -1587,9 +1611,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.32.0.tgz", + "integrity": "sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==", "cpu": [ "riscv64" ], @@ -1599,9 +1623,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.32.0.tgz", + "integrity": "sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==", "cpu": [ "s390x" ], @@ -1611,9 +1635,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.32.0.tgz", + "integrity": "sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==", "cpu": [ "x64" ], @@ -1623,9 +1647,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.32.0.tgz", + "integrity": "sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==", "cpu": [ "x64" ], @@ -1635,9 +1659,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.32.0.tgz", + "integrity": "sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==", "cpu": [ "arm64" ], @@ -1647,9 +1671,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.32.0.tgz", + "integrity": "sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==", "cpu": [ "ia32" ], @@ -1659,9 +1683,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.32.0.tgz", + "integrity": "sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==", "cpu": [ "x64" ], @@ -1671,50 +1695,66 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.23.1.tgz", - "integrity": "sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==", - "dependencies": { - "@shikijs/engine-javascript": "1.23.1", - "@shikijs/engine-oniguruma": "1.23.1", - "@shikijs/types": "1.23.1", - "@shikijs/vscode-textmate": "^9.3.0", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.1.tgz", + "integrity": "sha512-Mo1gGGkuOYjDu5H8YwzmOuly9vNr8KDVkqj9xiKhhhFS8jisAtDSEWB9hzqRHLVQgFdA310e8XRJcW4tYhRB2A==", + "dependencies": { + "@shikijs/engine-javascript": "1.29.1", + "@shikijs/engine-oniguruma": "1.29.1", + "@shikijs/types": "1.29.1", + "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.3" + "hast-util-to-html": "^9.0.4" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.23.1.tgz", - "integrity": "sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.1.tgz", + "integrity": "sha512-Hpi8k9x77rCQ7F/7zxIOUruNkNidMyBnP5qAGbLFqg4kRrg1HZhkB8btib5EXbQWTtLb5gBHOdBwshk20njD7Q==", "dependencies": { - "@shikijs/types": "1.23.1", - "@shikijs/vscode-textmate": "^9.3.0", - "oniguruma-to-es": "0.4.1" + "@shikijs/types": "1.29.1", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.23.1.tgz", - "integrity": "sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.1.tgz", + "integrity": "sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw==", + "dependencies": { + "@shikijs/types": "1.29.1", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.1.tgz", + "integrity": "sha512-iERn4HlyuT044/FgrvLOaZgKVKf3PozjKjyV/RZ5GnlyYEAZFcgwHGkYboeBv2IybQG1KVS/e7VGgiAU4JY2Gw==", + "dependencies": { + "@shikijs/types": "1.29.1" + } + }, + "node_modules/@shikijs/themes": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.1.tgz", + "integrity": "sha512-lb11zf72Vc9uxkl+aec2oW1HVTHJ2LtgZgumb4Rr6By3y/96VmlU44bkxEb8WBWH3RUtbqAJEN0jljD9cF7H7g==", "dependencies": { - "@shikijs/types": "1.23.1", - "@shikijs/vscode-textmate": "^9.3.0" + "@shikijs/types": "1.29.1" } }, "node_modules/@shikijs/types": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.23.1.tgz", - "integrity": "sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g==", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.1.tgz", + "integrity": "sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA==", "dependencies": { - "@shikijs/vscode-textmate": "^9.3.0", + "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "node_modules/@shikijs/vscode-textmate": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz", - "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", + "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==" }, "node_modules/@thaunknown/simple-peer": { "version": "10.0.11", @@ -1791,9 +1831,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/hast": { "version": "3.0.4", @@ -1812,9 +1852,9 @@ } }, "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" }, "node_modules/@types/nlcst": { "version": "2.0.3", @@ -1873,13 +1913,13 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.3.tgz", - "integrity": "sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", + "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/core": "^7.26.0", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.2" }, @@ -1887,7 +1927,7 @@ "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@volar/kit": { @@ -2084,6 +2124,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2137,81 +2189,82 @@ } }, "node_modules/astro": { - "version": "4.16.14", - "resolved": "https://registry.npmjs.org/astro/-/astro-4.16.14.tgz", - "integrity": "sha512-2IuLkIp4idyspugq+F52rHZyNqHHi2AdQzuKp3SGytg/YAm50dNeWhP/7l+enjgWZLloLq5xsH5gVQpoDFoyFg==", + "version": "5.1.10", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.1.10.tgz", + "integrity": "sha512-qFu4jC7BRlhwHgk9Pa1sTQWw60zYWlriNTt6bMGMKkPxCd4Dd84fGn+NjbrJ/JeKwF7YXX0gY1saDF/RS6TMVA==", "dependencies": { "@astrojs/compiler": "^2.10.3", - "@astrojs/internal-helpers": "0.4.1", - "@astrojs/markdown-remark": "5.3.0", - "@astrojs/telemetry": "3.1.0", - "@babel/core": "^7.26.0", - "@babel/plugin-transform-react-jsx": "^7.25.9", - "@babel/types": "^7.26.0", + "@astrojs/internal-helpers": "0.4.2", + "@astrojs/markdown-remark": "6.0.2", + "@astrojs/telemetry": "3.2.0", "@oslojs/encoding": "^1.1.0", - "@rollup/pluginutils": "^5.1.3", - "@types/babel__core": "^7.20.5", + "@rollup/pluginutils": "^5.1.4", "@types/cookie": "^0.6.0", "acorn": "^8.14.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", - "ci-info": "^4.0.0", + "ci-info": "^4.1.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^0.7.2", "cssesc": "^3.0.0", - "debug": "^4.3.7", + "debug": "^4.4.0", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", - "es-module-lexer": "^1.5.4", - "esbuild": "^0.21.5", + "es-module-lexer": "^1.6.0", + "esbuild": "^0.24.2", "estree-walker": "^3.0.3", - "fast-glob": "^3.3.2", + "fast-glob": "^3.3.3", "flattie": "^1.1.1", "github-slugger": "^2.0.0", - "gray-matter": "^4.0.3", "html-escaper": "^3.0.3", "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", - "magic-string": "^0.30.12", + "magic-string": "^0.30.17", "magicast": "^0.3.5", "micromatch": "^4.0.8", "mrmime": "^2.0.0", "neotraverse": "^0.6.18", - "ora": "^8.1.1", - "p-limit": "^6.1.0", + "p-limit": "^6.2.0", "p-queue": "^8.0.1", "preferred-pm": "^4.0.0", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.6.3", - "shiki": "^1.22.2", - "tinyexec": "^0.3.1", + "shiki": "^1.29.1", + "tinyexec": "^0.3.2", "tsconfck": "^3.1.4", + "ultrahtml": "^1.5.3", "unist-util-visit": "^5.0.0", + "unstorage": "^1.14.4", "vfile": "^6.0.3", - "vite": "^5.4.10", - "vitefu": "^1.0.3", + "vite": "^6.0.9", + "vitefu": "^1.0.5", "which-pm": "^3.0.0", - "xxhash-wasm": "^1.0.2", + "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.23.5", + "yocto-spinner": "^0.1.2", + "zod": "^3.24.1", + "zod-to-json-schema": "^3.24.1", "zod-to-ts": "^1.2.0" }, "bin": { "astro": "astro.js" }, "engines": { - "node": "^18.17.1 || ^20.3.0 || >=21.0.0", + "node": "^18.17.1 || ^20.3.0 || >=22.0.0", "npm": ">=9.6.5", "pnpm": ">=7.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, "optionalDependencies": { "sharp": "^0.33.3" } @@ -2273,6 +2326,11 @@ "node": ">= 0.4" } }, + "node_modules/b4a": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -2288,9 +2346,9 @@ "integrity": "sha512-urXwkHgwp6GsXVF+it01485Z2Cj4pnW02ICnM0TemOlkKmCNnDLmyy+ZZiRXBpwldUXO+aRNr7Hdia4CBvXJ5A==" }, "node_modules/bare-events": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz", - "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", + "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", "optional": true }, "node_modules/base-64": { @@ -2336,6 +2394,17 @@ "node": ">=12.20.0" } }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bittorrent-peerid": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/bittorrent-peerid/-/bittorrent-peerid-1.3.6.tgz", @@ -2356,9 +2425,9 @@ ] }, "node_modules/bittorrent-tracker": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/bittorrent-tracker/-/bittorrent-tracker-11.1.2.tgz", - "integrity": "sha512-mzINNIJ3FjNBcqQPKPQoxpNzzqEVfbBohwdVxblaOKGQVxagMzipCWwbxiAt+J35WC3xs1wFeCDUXpzQ3TBA+A==", + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/bittorrent-tracker/-/bittorrent-tracker-11.2.1.tgz", + "integrity": "sha512-SffBgHzNrhn+HBwdRD2st+TYJOs2LhF3ljJFPCYGv592LpGtPxw41UZHTUeY5muWnQl+wopcU8qXM9UEk2WKrA==", "funding": [ { "type": "github", @@ -2584,9 +2653,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "funding": [ { "type": "opencollective", @@ -2602,9 +2671,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { @@ -2644,9 +2713,9 @@ "dev": true }, "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", + "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", "hasInstallScript": true, "optional": true, "dependencies": { @@ -2693,9 +2762,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001683", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz", - "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==", + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", "funding": [ { "type": "opencollective", @@ -2801,9 +2870,9 @@ } }, "node_modules/ci-info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", "funding": [ { "type": "github", @@ -2835,31 +2904,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3052,6 +3096,14 @@ "ipaddr.js": ">= 0.1.5" } }, + "node_modules/consola": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", + "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -3077,6 +3129,11 @@ "node": ">= 0.6" } }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" + }, "node_modules/core-js": { "version": "3.38.1", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", @@ -3168,6 +3225,14 @@ "url": "https://opencollective.com/node-fetch" } }, + "node_modules/crossws": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.3.tgz", + "integrity": "sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw==", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, "node_modules/crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -3590,9 +3655,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { "ms": "^2.1.3" }, @@ -3673,6 +3738,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" + }, "node_modules/delaunator": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", @@ -3707,6 +3777,11 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==" + }, "node_modules/detect-libc": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", @@ -3809,9 +3884,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.64", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz", - "integrity": "sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==" + "version": "1.5.88", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.88.tgz", + "integrity": "sha512-K3C2qf1o+bGzbilTDCTBhTQcMS9KW60yTAaTeeXsfvQuTDDwlokLam/AdqlqcSy9u4UainDgsHV23ksXAOgamw==" }, "node_modules/elliptic": { "version": "6.5.5", @@ -3835,9 +3910,9 @@ "dev": true }, "node_modules/eme-encryption-scheme-polyfill": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/eme-encryption-scheme-polyfill/-/eme-encryption-scheme-polyfill-2.1.6.tgz", - "integrity": "sha512-SmQ8UxDkH/8hrjLo6ASo452hIe4dSJzqKmJyrNsvUciEJNxf4z9hewIwF1k/c7A5uRk4GApavPZ6dgqXqfvegw==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eme-encryption-scheme-polyfill/-/eme-encryption-scheme-polyfill-2.2.0.tgz", + "integrity": "sha512-wfgRcR2cGAX0WKbPahhI13dr2mzFQ/rMnoDibRIdScQlv9S0rtnXd25XF17IUdNJw/voJoFpYQp33C3xkFnyEw==" }, "node_modules/emmet": { "version": "2.4.11", @@ -3910,45 +3985,47 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { @@ -4035,17 +4112,6 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4057,15 +4123,15 @@ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -4341,45 +4407,23 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/gray-matter": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", - "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", - "dependencies": { - "js-yaml": "^3.13.1", - "kind-of": "^6.0.2", - "section-matter": "^1.0.0", - "strip-bom-string": "^1.0.0" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/h3": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.14.0.tgz", + "integrity": "sha512-ao22eiONdgelqcnknw0iD645qW0s9NnrJHr5OBz4WOMdBdycfSas1EQf1wXRsm+PcB2Yoj43pjBPwqIpJQTeWg==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "cookie-es": "^1.2.2", + "crossws": "^0.3.2", + "defu": "^6.1.4", + "destr": "^2.0.3", + "iron-webcrypto": "^1.2.1", + "ohash": "^1.1.4", + "radix3": "^1.1.2", + "ufo": "^1.5.4", + "uncrypto": "^0.1.3", + "unenv": "^1.10.0" } }, - "node_modules/gray-matter/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -4571,9 +4615,9 @@ } }, "node_modules/hast-util-to-html": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.3.tgz", - "integrity": "sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.4.tgz", + "integrity": "sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -4654,9 +4698,9 @@ } }, "node_modules/hls.js": { - "version": "1.5.17", - "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.17.tgz", - "integrity": "sha512-wA66nnYFvQa1o4DO/BFgLNRKnBTVXpNeldGRBJ2Y0SvFtdwvFKCbqa9zhHoZLoxHhZ+jYsj3aIBkWQQCPNOhMw==" + "version": "1.5.20", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.5.20.tgz", + "integrity": "sha512-uu0VXUK52JhihhnN/MVVo1lvqNNuhoxkonqgO3IpjvQiGpJBdIXMGkofjQb/j9zvV7a1SW8U9g1FslWx/1HOiQ==" }, "node_modules/hmac-drbg": { "version": "1.0.1", @@ -4798,8 +4842,16 @@ "node": ">= 10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, @@ -4820,6 +4872,17 @@ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "optional": true }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -4861,14 +4924,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4928,17 +4983,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -4989,17 +5033,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", @@ -5051,9 +5084,9 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" }, "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "bin": { "jsesc": "bin/jsesc" }, @@ -5082,14 +5115,6 @@ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==" }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -5162,32 +5187,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -5228,9 +5227,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.13", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz", - "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -5280,9 +5279,9 @@ } }, "node_modules/mdast-util-find-and-replace": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", - "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -5486,9 +5485,9 @@ } }, "node_modules/mediaelement": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/mediaelement/-/mediaelement-7.0.5.tgz", - "integrity": "sha512-KFtaLZa7FzK3yuES/G+pL/W1OxGjaklSxdbmLgVs/Ls2JY45XPTZ4U8iOGwVr+nrytrRT0fJw73epPF6xCVvyQ==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/mediaelement/-/mediaelement-7.0.7.tgz", + "integrity": "sha512-NstTSj21B5ow+ZmINIFkpzXrgpwLf5SMHD0bIihIfPIQZ8U4z4YsAlreJMqfukU9TmdusIGki1M7V9ILlZkYEA==", "dependencies": { "global": "^4.3.1", "svg4everybody": "^2.1.9" @@ -5640,9 +5639,9 @@ } }, "node_modules/micromark-extension-gfm-table": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", - "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -5987,9 +5986,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz", - "integrity": "sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.4.tgz", + "integrity": "sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==", "funding": [ { "type": "GitHub Sponsors", @@ -6068,6 +6067,17 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -6087,17 +6097,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -6166,9 +6165,9 @@ "integrity": "sha512-1VAOX0EiuwAdCMGpnglxp9r6ylm+gXwQi+UPAnc/Oj1tLLJ8D1I8rLZeiO4MWsUAqH8tuBAHweT1LYSrDfJlPg==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", @@ -6183,9 +6182,9 @@ } }, "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" }, "node_modules/neo-async": { "version": "2.6.2", @@ -6213,9 +6212,9 @@ } }, "node_modules/node-abi": { - "version": "3.71.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.71.0.tgz", - "integrity": "sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==", + "version": "3.73.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.73.0.tgz", + "integrity": "sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==", "dependencies": { "semver": "^7.3.5" }, @@ -6291,6 +6290,11 @@ } } }, + "node_modules/node-fetch-native": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", + "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==" + }, "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", @@ -6303,9 +6307,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, "node_modules/node-stdlib-browser": { "version": "1.2.0", @@ -6357,6 +6361,14 @@ "node": ">=10" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", @@ -6412,6 +6424,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ofetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", + "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", + "dependencies": { + "destr": "^2.0.3", + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" + } + }, + "node_modules/ohash": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.4.tgz", + "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6420,28 +6447,14 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/oniguruma-to-es": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.4.1.tgz", - "integrity": "sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", + "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", "dependencies": { "emoji-regex-xs": "^1.0.0", - "regex": "^5.0.0", - "regex-recursion": "^4.2.1" + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" } }, "node_modules/openplayerjs": { @@ -6456,28 +6469,6 @@ "node": ">=20.0.0" } }, - "node_modules/ora": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.1.tgz", - "integrity": "sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -6485,9 +6476,9 @@ "dev": true }, "node_modules/p-limit": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.1.0.tgz", - "integrity": "sha512-H0jc0q1vOzlEk0TqAKXKZxdl7kX3OFUzCnNVUnq5Pc3DGo0kpeaMuPqxQn235HibwBEb0/pm9dgKTjXy66fBkg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", "dependencies": { "yocto-queue": "^1.1.1" }, @@ -6575,32 +6566,32 @@ } }, "node_modules/p2p-media-loader-core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p2p-media-loader-core/-/p2p-media-loader-core-2.1.0.tgz", - "integrity": "sha512-HF48C/e5S14sf+OXuMObES5iUs1qD2Xq3eJW0VoAFzk2dNTT+lEKX0ubAqAwW/ShUF+EFUxAmPHE0eg7pjqJgQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p2p-media-loader-core/-/p2p-media-loader-core-2.1.1.tgz", + "integrity": "sha512-sqQGeAuZejIC0e0gCj1kDqEuGqIewqhtDC2zIkesmJfBCW3gspg2NW8a5zl3H56vFBf3GleyYwgjAV01N2hBvQ==", "dependencies": { "@types/debug": "^4.1.12", - "bittorrent-tracker": "^11.1.2", - "debug": "^4.3.7", + "bittorrent-tracker": "^11.2.1", + "debug": "^4.4.0", "nano-md5": "^1.0.5" } }, "node_modules/p2p-media-loader-demo": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p2p-media-loader-demo/-/p2p-media-loader-demo-2.1.0.tgz", - "integrity": "sha512-zlsGv33/dUpmaYb/vwd1JR4gxrqaow5xmTdkQoNJz22ADZ9qTSb0ybg6XdYyvydwR+fOP7Ctm1RU8/SNK1N9lw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p2p-media-loader-demo/-/p2p-media-loader-demo-2.1.1.tgz", + "integrity": "sha512-0OYsUMCVTxkuZnWA+N1bSV70Kmjx48GxggIhaehruqSXAKr1HNCdZGysAzMG20mV5k506nQxFu1gfKx93CmWHg==", "dependencies": { "@vidstack/react": "^1.12.12", "d3": "^7.9.0", "dplayer": "^1.27.1", - "hls.js": "^1.5.17", - "mediaelement": "^7.0.5", + "hls.js": "^1.5.19", + "mediaelement": "^7.0.7", "openplayerjs": "^2.14.7", - "p2p-media-loader-core": "2.1.0", - "p2p-media-loader-hlsjs": "2.1.0", - "p2p-media-loader-shaka": "2.1.0", + "p2p-media-loader-core": "2.1.1", + "p2p-media-loader-hlsjs": "2.1.1", + "p2p-media-loader-shaka": "2.1.1", "plyr": "^3.7.8", - "shaka-player": "^4.12.2" + "shaka-player": "^4.12.8" }, "peerDependencies": { "react": ">=16", @@ -6608,19 +6599,19 @@ } }, "node_modules/p2p-media-loader-hlsjs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-2.1.0.tgz", - "integrity": "sha512-PyKdzYvJ6HNrcSyjkH/rlGJslHJ/Sjob/qjh8UA1QiIuw2ujbIMYv4F2wtihi/SFXIyVvuYIYbwVMVleVu3MoA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-2.1.1.tgz", + "integrity": "sha512-72/5bchePCaHin7/OB58mseCx598ysdHKOsKJow0yygX0YQ/t3oMTF/Cg1RyxpAgSmDvf32cGIAmYsIXGZRSXQ==", "dependencies": { - "p2p-media-loader-core": "2.1.0" + "p2p-media-loader-core": "2.1.1" } }, "node_modules/p2p-media-loader-shaka": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p2p-media-loader-shaka/-/p2p-media-loader-shaka-2.1.0.tgz", - "integrity": "sha512-lDP7djNisbGD3eXlg7VlVTu45BcPW1xjAMvp2EBHMv85XdxYVjTv/vlp9J3Vu/QnLbKUyj1euPbCMfiWMSZKLA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p2p-media-loader-shaka/-/p2p-media-loader-shaka-2.1.1.tgz", + "integrity": "sha512-3ViABRLZOIvwDdxFUu0G2KY7uzA5DBo1F834/TpwYhVv5XGTz9ta67HQVi0JJbZxEnWiLhJ0fse328kBe4mBvg==", "dependencies": { - "p2p-media-loader-core": "2.1.0" + "p2p-media-loader-core": "2.1.1" } }, "node_modules/pako": { @@ -6704,6 +6695,11 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" + }, "node_modules/pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", @@ -6721,9 +6717,9 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -6825,9 +6821,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", "funding": [ { "type": "opencollective", @@ -6843,8 +6839,8 @@ } ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -6852,16 +6848,16 @@ } }, "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", + "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", @@ -6890,9 +6886,9 @@ } }, "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "devOptional": true, "bin": { "prettier": "bin/prettier.cjs" @@ -7062,6 +7058,11 @@ "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" + }, "node_modules/random-iterate": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/random-iterate/-/random-iterate-1.0.1.tgz", @@ -7162,18 +7163,19 @@ } }, "node_modules/regex": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/regex/-/regex-5.0.2.tgz", - "integrity": "sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", + "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", "dependencies": { "regex-utilities": "^2.3.0" } }, "node_modules/regex-recursion": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-4.2.1.tgz", - "integrity": "sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", + "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", "dependencies": { + "regex": "^5.1.1", "regex-utilities": "^2.3.0" } }, @@ -7361,21 +7363,6 @@ "node": ">=8" } }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/retext": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", @@ -7458,11 +7445,11 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.32.0.tgz", + "integrity": "sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -7472,22 +7459,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", + "@rollup/rollup-android-arm-eabi": "4.32.0", + "@rollup/rollup-android-arm64": "4.32.0", + "@rollup/rollup-darwin-arm64": "4.32.0", + "@rollup/rollup-darwin-x64": "4.32.0", + "@rollup/rollup-freebsd-arm64": "4.32.0", + "@rollup/rollup-freebsd-x64": "4.32.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.32.0", + "@rollup/rollup-linux-arm-musleabihf": "4.32.0", + "@rollup/rollup-linux-arm64-gnu": "4.32.0", + "@rollup/rollup-linux-arm64-musl": "4.32.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.32.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.32.0", + "@rollup/rollup-linux-riscv64-gnu": "4.32.0", + "@rollup/rollup-linux-s390x-gnu": "4.32.0", + "@rollup/rollup-linux-x64-gnu": "4.32.0", + "@rollup/rollup-linux-x64-musl": "4.32.0", + "@rollup/rollup-win32-arm64-msvc": "4.32.0", + "@rollup/rollup-win32-ia32-msvc": "4.32.0", + "@rollup/rollup-win32-x64-msvc": "4.32.0", "fsevents": "~2.3.2" } }, @@ -7584,18 +7574,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/section-matter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", - "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", - "dependencies": { - "extend-shallow": "^2.0.1", - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -7644,14 +7622,14 @@ } }, "node_modules/shaka-player": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-4.12.2.tgz", - "integrity": "sha512-WtOmrYtOSSKr1eZrKzvyE0JMBVKJeEOAnT/pjkYAqAO/lfAyu+YF/Y0GLsXKLu1JFlDSesKS8P78zdXCIkPk/Q==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-4.13.0.tgz", + "integrity": "sha512-FZToyYl7IXvt1oMEWVbU0tjWJpJ+oSYpUibNMxSqVQx2pLfSBDfEuodGJV+pRgiydYQ58+VFLftAylDx/Qvfdw==", "dependencies": { - "eme-encryption-scheme-polyfill": "^2.1.5" + "eme-encryption-scheme-polyfill": "^2.2.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/sharp": { @@ -7695,15 +7673,17 @@ } }, "node_modules/shiki": { - "version": "1.23.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.23.1.tgz", - "integrity": "sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig==", - "dependencies": { - "@shikijs/core": "1.23.1", - "@shikijs/engine-javascript": "1.23.1", - "@shikijs/engine-oniguruma": "1.23.1", - "@shikijs/types": "1.23.1", - "@shikijs/vscode-textmate": "^9.3.0", + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.1.tgz", + "integrity": "sha512-TghWKV9pJTd/N+IgAIVJtr0qZkB7FfFCUrrEJc0aRmZupo3D1OCVRknQWVRVA7AX/M0Ld7QfoAruPzr3CnUJuw==", + "dependencies": { + "@shikijs/core": "1.29.1", + "@shikijs/engine-javascript": "1.29.1", + "@shikijs/engine-oniguruma": "1.29.1", + "@shikijs/langs": "1.29.1", + "@shikijs/themes": "1.29.1", + "@shikijs/types": "1.29.1", + "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, @@ -7725,17 +7705,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -7845,17 +7814,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -7879,9 +7837,9 @@ } }, "node_modules/streamx": { - "version": "2.20.2", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.2.tgz", - "integrity": "sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA==", + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", + "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", @@ -7962,14 +7920,6 @@ "node": ">=4" } }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -8008,9 +7958,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", + "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -8034,9 +7984,12 @@ } }, "node_modules/text-decoder": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", - "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", + "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "dependencies": { + "b4a": "^1.6.4" + } }, "node_modules/timers-browserify": { "version": "2.0.12", @@ -8051,9 +8004,9 @@ } }, "node_modules/tinyexec": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -8148,9 +8101,9 @@ "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==" }, "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8167,6 +8120,11 @@ "semver": "^7.3.8" } }, + "node_modules/ufo": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==" + }, "node_modules/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", @@ -8192,6 +8150,23 @@ "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==" }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" + }, + "node_modules/unenv": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz", + "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==", + "dependencies": { + "consola": "^3.2.3", + "defu": "^6.1.4", + "mime": "^3.0.0", + "node-fetch-native": "^1.6.4", + "pathe": "^1.1.2" + } + }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -8329,10 +8304,140 @@ "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", "integrity": "sha512-45YsfD6svkgaCBNyvD+dFHm4qFX9g3wRSIVgWVPtm2OCnphvPxzJoe20ATsiNpNJrmzHifnxm+BN5F7gFT/4gw==" }, + "node_modules/unstorage": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.14.4.tgz", + "integrity": "sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg==", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^3.6.0", + "destr": "^2.0.3", + "h3": "^1.13.0", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.4", + "ofetch": "^1.4.1", + "ufo": "^1.5.4" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.5.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6.0.3", + "@deno/kv": ">=0.8.4", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.0", + "@vercel/kv": "^1.0.1", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.1" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/unstorage/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "funding": [ { "type": "opencollective", @@ -8349,7 +8454,7 @@ ], "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -8444,19 +8549,19 @@ } }, "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -8465,19 +8570,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -8498,13 +8609,19 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, "node_modules/vite-plugin-node-polyfills": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.22.0.tgz", - "integrity": "sha512-F+G3LjiGbG8QpbH9bZ//GSBr9i1InSTkaulfUHFa9jkLqVGORFBoqc2A/Yu5Mmh1kNAbiAeKeK+6aaQUf3x0JA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz", + "integrity": "sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w==", "dev": true, "dependencies": { "@rollup/plugin-inject": "^5.0.5", @@ -8514,19 +8631,19 @@ "url": "https://github.com/sponsors/davidmyersdev" }, "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/vitefu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.3.tgz", - "integrity": "sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.5.tgz", + "integrity": "sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==", "workspaces": [ "tests/deps/*", "tests/projects/*" ], "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { "vite": { @@ -8910,9 +9027,9 @@ } }, "node_modules/xxhash-wasm": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.0.2.tgz", - "integrity": "sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==" }, "node_modules/y18n": { "version": "5.0.8", @@ -9095,20 +9212,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yocto-spinner": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.1.2.tgz", + "integrity": "sha512-VfmLIh/ZSZOJnVRQZc/dvpPP90lWL4G0bmxQMP0+U/2vKBA8GSpcBuWv17y7F+CZItRuO97HN1wdbb4p10uhOg==", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", + "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.23.5", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.23.5.tgz", - "integrity": "sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz", + "integrity": "sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==", "peerDependencies": { - "zod": "^3.23.3" + "zod": "^3.24.1" } }, "node_modules/zod-to-ts": { diff --git a/package.json b/package.json index e19e1ae..721ab9c 100644 --- a/package.json +++ b/package.json @@ -12,18 +12,18 @@ }, "dependencies": { "@astrojs/check": "^0.9.4", - "@astrojs/react": "^3.6.3", + "@astrojs/react": "^4.2.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", - "astro": "^4.16.14", - "p2p-media-loader-demo": "^2.1.0", + "astro": "^5.1.10", + "p2p-media-loader-demo": "^2.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "typescript": "^5.6.3" + "typescript": "^5.7.3" }, "devDependencies": { - "prettier": "^3.3.3", + "prettier": "^3.4.2", "prettier-plugin-astro": "^0.14.1", - "vite-plugin-node-polyfills": "^0.22.0" + "vite-plugin-node-polyfills": "^0.23.0" } } diff --git a/src/pages/p2p-media-loader/demo.astro b/src/pages/p2p-media-loader/demo.astro index 58663f6..9c21907 100644 --- a/src/pages/p2p-media-loader/demo.astro +++ b/src/pages/p2p-media-loader/demo.astro @@ -8,7 +8,7 @@ import { P2PVideoDemo } from "p2p-media-loader-demo"; Date: Wed, 29 Jan 2025 16:45:27 +0200 Subject: [PATCH 02/14] Feat: make a new article in blog --- public/images/flutter_demo_example.jpg | Bin 0 -> 56047 bytes ...P2P-Media-Loader-in-mobile-app-for-free.md | 27 ++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 public/images/flutter_demo_example.jpg create mode 100644 src/content/blog/Integrate-P2P-Media-Loader-in-mobile-app-for-free.md diff --git a/public/images/flutter_demo_example.jpg b/public/images/flutter_demo_example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ed15aa9928dae0b90ce9a44b628956c0ecf145af GIT binary patch literal 56047 zcmeFZ1#}&~k|2CdF~{u09JAwVcFfESFGdpHxW@g76vz@*9zW2Vj zGqZ2@yq%qM{ypbc>qw*Q;;Ifeuk+c2F?pHSe4GsnXDFX#T0)Rw=fI@@#)eFD_ z3keDJTim}K1SAwR%o|v6CN9L^++TTsKQn(V1CXG=jHpnk;QRbZdaWJ(50d{G0!?XJ z6IJcHwOqQTwRg(tNMwf1Ts$xQ)5q zt-d?A$5ie34gUMJo?@8^&GI%L008CPt|x5fQybLOp8~_qc4*w_ynV{ubq17_6*Z>Z zw6s$uq-%G!W?Han67f~W_8e5bWDsVu#SVL_J2iH&c@c1FMuD#ME6%GMGbfzAw4KGM zz-`dGvFe!NU0(OeH6uXt2k+rqB>>=xm;Pjf^|7s4=+NP}$N=cLpE_J8USjeWH&7VV z)l6R_onKObhGvRcvj-cFpngmJF<2DEDSMuD_I5%?m-92&k*hx#e+NLl?t{k#kNdkS zvz_(tU+$_1c}`)Y+#&v!P^q8P55oOBwJ6P$CNE#r^iQWF6v_{O$Nq;H0v!M-2wWrn z`e#m`+UE+(0$f`J{Cj4(Xf8=9!P+#+Ajy^`oT5`Ai$zjLkQ88_|HMGEm z-`--@s;M}BWTRgx(OEivvR7K`mtI)7oc6to&bhd}X ze!k9fTUvUs3lB=0Rlj~|vv-67e#}6dwLjMer(!YS`$R`t@=A7jy|(M*Vpnax3a&ei zF}2lX19F>)MIus4Y7>0VH{7TAA!SvC#%^sYx~#g{VpNRWh1Wt1BDf z@e<(SdCprXy=D)=YNHpLzE74DIw&RmHnWfS#Hn^O#!fb2i6aq=fe)W3kDCFKUMYcQHev0bM5w2rz=mPU2PVv%OCMwWF zfT^fQSC5?gCH6|Y^)($3W^=}RY6S!yru*e>l` zs*H+-`%r82tJK7q>>u%Gp!ZT4`#p?ECIzpQ?L;l!<8i@qxzx7Ux9~tK%!ek&6y~=V zm~Afg75jYosF{3-d~9(uE;$E4*C-xdi4Z+Y(4gR8(m{?Wd&Jq9Sm^vdw)*2CvaBWL ziIdfhH!3>(WY&(&Q89Ds;Kt|%bHZ}nD@jAlL8jW3#o!Z&W029IrLCK3g|(oSvwB^h zE|^wBM8((>)1i?SjgdM8(gOQUL*i??+4fS8aqA}#jmCQm+-|m;S{%og)tcf#gS1>s zONqwp>O_v21l9d%6*_j-3%xQ6tL?5--|FDCNr_G?tKgYadsgFi|I5Z&r)C~6-s}9? z9m@gd)Njlco~-p{_HJpVtju~7#lmC4+WD3k7|l3t_pDj)!jq8V$-WFG{bt+Cd*4n< zwPae3<(Dh6mWRf&=jWzE*UTbHbirLV2mKvgcrZjYWGroV=FDL1;LvhAJWfC>!bXUW z&cr4t!e*w0_vqp-{dCcON#A^-?~VC(wbhxIVy6|J==0$o ztI1ozL3DV3j362zIp?>aPA6^aj5tt})2Ues*7A4Vg?#ku@K(_DO3jD>JbajfP1;<; zy7ny5mAI1eWa(- zzawNmDjaSfh2y|wY%Cz{_sgXvvfIfaUAJ}K9f|S@tQXPxrz+`Eq-(YRtZ=jrn z9EarOp;W91>XxZ8WW9A|kNny814Y@JgeOuC$6@XvFx>iuZ&yd0TWp3`=0>P@MjJ({ zb70)jL~wuCLL!A>zH)SDd{ml0!DJqBSLn*?j+S|uP$h53}S`RZ6= z9O;s^Lm-mnwS@a;@WeZZ&{e;joa{O*eGa7 ze#V+si%Q0~^=iBkZgD)FoU)u}R58IRudEM0Xec$#Gb~n1jV~_|*+y!d$BQdAT241( zHPM!S{J9`3;saf-uHHb6N}iltDr2aF&T6L&D#^=Yb*jZv=V~!AFi_O5#M;=pxk;_f zXgj`XaUs-qX0%AR-x*pt&~6AWTQA@ORX18`Fzc7Hqa5%dW@t(D`f|XJo zxuJd}OIRB1L;0~X1Ar{wUj8dTg#`;s3zMtW8jINO(Kg{$t~M2d9ahiGacYmQYfD$f6v1d#;Z9}W__ zTe7zcAWc2&4~Onc0sUQE0s1?=Kqe-zG*g3VU)TQ5M4t}C7!z!y7YD@r_C6#bP=#hw z)VRTC-Y&?PgTWbJZ^TQS!zf&*xmG%$FT?(*iqs;78;pf5E(ottaPD}>YI%FCbEok%F|z~P4Rdgu}L z;U{k}uLGY55l?1TRK~=lKCgGwVeY{)pPb*`18)-L=;aH)M?!uf(zB;^3O_&3G za`_6t? zcSOz%KRpJ_tNJXhXXKLIv=5?g5qDq2{BO)AjxMiK)!G*LJMdjebMeb_`Ah;%%6A{m z6~D_Sr5qm-Mn%bT%$^=uiMT%DE6&<+K9?NocZG7gt)yVhoqp*w{i}KeO-7^lHnuPz ztZ(mY0y&!U3^AMZ+WTp;Bdr<7`t-Mx-gJCd*p7)7u?9vlC~Sv?(gAh_=aI=;A-Nqhf6=Hb94V0MbfJL;Cu zv8SFC+ii9zRSK;=Z=RKrRZe90MFnZsP3G<8?p>`l{uqkTAn@4M1cLvMdfw%K2N(>6 zM{^ez?K#?e+7Oi(;`a!zf0EgUlLmaapa0bek{^Ju{Po`n_*W7;WfAa(J9!9<5DS&Fyw06sw|8D$ zw>!)YQk>*Im)@{v8Q**EP@I}cJ(w_eC7sh5IU^W=;#jo1N@t@KzERx2BrLiTD~|%U zxMVoQy9YsaK>n?=zc=i`!;*VL`@5v%o1IW@o7(v6N5Ur8GnX2CTsO4c^JB5-l^efd z9@VSob9?Uj%<5R~g?vKKL)gs9972nCC4@RC<=gnDuaSG)6UDgNE(=2=Tkh`}jWGXq z3xDs5FUL=8Dv=9!)Nd&=Hdr{_QZ<>&k&HdsR*iqUE{#36orV5QtiSPrBgE-V0OM}I zH~;|4mBV;!6XE%_FUrtdbaP?xA4GqHAlx*;?UX<)-~==KPG0L@jwEPp|3jJoGXh59 z|DbFC(1jGl9Dabp{qG(GI|y_*GHCD}0m#0>fB22~!(o{JmLA;8TMKqw=ki8`-jnw? z>-DaMHahBo8;WB#c#97l(#<~~OiHiaQ%q{F33JD=*5~7RwbUPm;Uznf!Ae@Yyt1D49MaJcV{b$ry995@BD^w3pV(?m06R? zCNOK3d_!v4&x*f-1=_lU_hZijk6?cY_ebz|Wr_MQ;0h39E*_Q5M5!(?Og+VKxFr>R zVo=GhtoplR{lx`&^QUe33-RxO-!frUb&tKF_#6_iZ}k3~=zk3`1egD>n#&x100ajA zzZ2}QB%+MvAJ*q906-|iW1txC1`By$*SEs9S{`RNv_sfF;#abJz_u#EC5d(~QX~D*y`Ro6R;7>hJ z3iv;JOu*0882|uDCMf(b`QHlv|GWSDE$|^Rc-=H&|DOhtLZ<(r(z#{A&&LDtZq<8) zWv*hS|4BlTvhXi%BJhGVGb#WA8WI2l1qBTO{l}{H@6~H)G;|nL3{0#K#Ec9~{3Of* z@}zG*vFMW7ekIQWuT;Zg|`r_!*3nSzzG9M54U+bdpu&2oL> z?5d)0YTEkp_i5=F&0NEzM%A_Tr?0V-lI#9G(gZh+`dJ%ZZmS81Y9vBq+-zYPt%bOJ zK3>ag(PP|mDs`_(aT)Rp5V%<;kU&r-Kp_8qAvxcoqm;7I>4uimS=k%47DI;&E3f$% z!0%Jiai8_hH=tzU3{0eTA`D^#|oIvSB{+}VvIRb^Kdv?&%47qU*( z--=a6dbdBzBER-b#iWJrnvhcWT6@S9gP;UcbK(KeC7?u!VTz=h)a#sbxEWwzzHA2efn=b*Xy>TMjA^xfvbkZu;jr2IDpC4QursU5QWY@_ z!cLcN&peGa7$Tb;7FM9VaRqC?f3(?9qZMYW}UH>t%feum0*Y4b72RFOHYpi;vS|#68$T*Ufl;=z* zaxCM)7VDQZj9mjB8wb@%A>YJNh88XcNi9;`Ux35a&Hgw_j6_yeRxhGcJ6=*^BNezT z#pR@ag!sG z3Vd~}W->ioh;7_Pi%}@0ZcxPoo+?|8pQ?Q;X^{9(vY0^~xOmF%fu#l=7$(#z-eZ6!E9G~wMQsTpyCwAG zpIxcLhLrxFKnC041~C7uU#g{-2+Ql6)<0r&%+;b=kYt&T_~(E=Bco|wE+|5fl`ifb zn6LLX;sQI{96K8s(=xciU#c;}QD5tgNg+G|w(iYL%2+DC>QR5o=ZbKPtiCDz!)iy> z7HKVtKX?oNtTVYqMvI~%?wtr&h^aqo{w>dp{!z7KE_MD8Rgu_zRaI3a<@>`txw)btLRe|WafHr6+P&^O6@ZY4gWaB`y)%SES|Av&Flst(=@A0)NBNNr4=wzqSWa|P?&(%z`4ccrWHJ>aM* zf2>+y)vahXC1+;nqi?CbTX@N^w(fcMVN4dOSPlP522pkw6EH|i&=5&gb#{My6L+4F zkPy!ybL&k`6mWeE`-Vdk%QgA7Ijg?BCk97Lg++Ml!$JngD+=zRoZEJBn;roVZM^KD z=}!A3Nc4Uy14oUPJ!3dd_*SYI^oB_1)+-R?3AGULwW_Lmyz6$au?7~AgS#ee&6RCY zl*BeFrx%Vp_(k?1|0$q&R3usbYJlp|G%gM8F#D5jE)R*8ajqY&l77O9REE4(?E9=_ zUL5-N*tEE_vX`H~04B47-QC>-G&G*b?JumndjVe~88$Kn1m5X3jQSv2Q8(mA-CCmm zRO~Q)J&s#TR|!yik>95UVFU{8)6%%-xpdACgB!%<-dTe-aRdm|ZvZ;AtXbFWJtiG% zAD&{L7-}|hsHqOq+7g~QX8*u*-=(Sc$`EjO(>Tq2ARvP=!msKlGV%w-3uo}03@+vw zg6E$k#hF(LCEl%mwiLmb^Vn$#u?-qDj|g`MXI1qe-g~DbuYkvQhx}D^Sz7#!h_+$L zAOj82M*ZVDx+*Q*mMy356KG?^l6OjUEhiPtS}L?dvM*8vdow`c4|W6$EmDO6F(YeU z`H1TK5_o=fK#?qUXcBWPzWXy%vjAp$hTLnOqXlnCrSoPe)T=~ zN1oS!$~G?~+xBBlA2Imv6?0SJBmg?OdO%26RQ$`Ru{MLQ2vT zpJC_C#}wOb=x|clM3C#J%IL!pO<85;vI?*6g*AX#LR4V2MareF<%kZsB41gQmEz7@ zQEb0b(ECowTQ#*klXC;6HG~%djEpZpg?gZZAHtMrZh4KBm7=aGZ_gZwy-U_3uC3gO z-h1BYEbq1-KOub-h33s*^2;0pInP5hpT3eM=Rwqp&tYZMT6y*<5mhSt+v49b>-pA; zEg6BG`qSdH#tg8a-u(N`E`0)l{oV`$`_D&uSrH=Dhk#+{N5+XQhO+@S*l7&OY7C># zW=Mgi@x5^vemdOcUzA=?`0SKb_lJfT)^y85izz^bmUX!Sr|k)y9rPTn`-v_zTV%Ok>0Gxoffj!DdLI?qg=YBvg`gId-Y?DfX$BalpbI4~L4B2;~HO zWJ%Z1$4ce0q(Iq$RGBsPy?3L$TVpVsBw_YWppJWQD?^${*S+vEO7Dnp+{Po+U}0KN zsdCN~cD-I0vKpLtKPgbEWvXJA?yzECWFf)HNTc1btl6;AOLZ?wDEAmHMQZPDI91%M zB5}+x+@rqSs?Ru0{V)s4A_qrS4%WnK(Cs{rlUiN4KRj>ZyB01=ONdO$qMxnv<2uDg zBji|7-4Jk-x-z%ST{VZpX#*^xX}%$;Y`BFl7oH7Xn35>92~i=DYQ!ViFCA(+Kv3m$ z&0I}69m;1*-fZ6cVJGMK<8j%LE%V>n-rdbRIM@g*@`0TT`0Yw8rQ|uH;&9AU$qFbv z0;Ul<-lyLQ@>^Bbo2<8wVcOTog1koen;*auV!vxFU=H%Fsqvfqq6T~1TyD>@7-4v5 z1Q$*jJ$V{iJr-+ZSyNNfpz%R#L^+)1ni`uVj$Efz%0Q7-uEy2w=daFYJ4 zxnhBUH}v3Ji+_LBg7UGNG5Csl1S*-A!!Tgh4Pz9O&S5OGG5MB@RYWU4GWyl;8s*2< z8xGSw-><_ni1O9Lt?j|)bEu!yG-$3?E2`nt;N)-w#`r{qN;%lJHfWx-?x?Fp?^{ii ztov5#oquSxzO%t~#Eo3n-A`i!QngOXVudvOQzDk*p1|Ps#Qy^5TN;fN1n;Ry+!Cd1 z)P8NB*9-wFv@f*WX&0B_PaNT{*;{Z>q~&n2Xf?-HZ8;SLCDg?4 zbC(r7bM0kXyzWWewyW&{<>Xb`Y*@mc{bgH-jXg5A*mhCrhXS76cJoc$RB{fD0j zHt2<=`FAF0#ijXpPMDzg{VvjiJ@2$if1A`SjesUC{+0;%tA1fc$B}YM+3i40Egbxs z&PeG%F&}l|`*71Mvs=n^Lw>Yh0EXA)E>$2LGcd0X5mfN(+acC%w$CrhT`0UOfZqT# zsuEK^tv+$-EG{Lt1oc@qXq3MJbFi2K4HE^bq1j!DxDUxykD*}XGr6yAPg@ndxS$&4)Cr1`HIHB z_3p`@h%hjB(8Hnf`k4>MkAQxVVVgfKS(9$nOl->bt^ zVDo`K-w8Bv(fAGG(;Q5@>Ve;+uzka&^1!|hs6s0V9&2Z51!uv=0Bm6p1*;D&f;F01 zUeDYoDwo)BxPw^h`JEj)Huh_S#DHt=mEJ0yH1QLL@=wh{^gC1u@mhxf62ak#$?xg` zMZY~vmik-pQq%x_rd-YKkj#S!ia!8iz)0oHrR$;m2?*pK9%mmpnm z-VA7<+h&>9(|BugxRVI-6wU$3-|anm5{>`~3!bkKmx9w0v=-evP{zC$2h|XDYv!sn zV5+qE!-j2I?)RBK13eWb&AlgDh@}XJrkdQC8mYJ|a#m>*RcdZ`!YS;laIt=nfA2ZN`!nC2a)ms!;CBc-I{u{^cQ9%W61?Y~=TO1LdZ} z_J~q89jiL9K_lE%_38=PG9#aX@ZW}R$ypYm$lmp1?CUcJEFcyqWQszv@2;z=-spLF z8r(dF)QDyX*cWy`rQCh^Q6|>qV%#F>g))i)NtdNI920?AR9#uETpq(yZp52(pZ_x9 z6pwHxY=mMQElF&m+!jy)^L|xD#PPd~J~5#;P`(Nqn*&9gk4Ad{MU(fygknX!Gnvl} zb4izFE0M~whf>x;AtcXnZr3p7%!{8KB1(c?ZMc7w-JFThNxfwYCnmvUh1>`dlJ^%N zB2&VQNC6i)HBbs~+Z%bSKn1OA1Z=k3hmrY&sM?6D)vqQfV{XnBt z*o!8|d=S$Hno)l{p)*QUKY@sdf7PA{0(rjeMiw#xG9Gn-n?^m0kBBdDBSZdmgQl#k zJQ3uTC^=D^wp|AltQUfdZbU4?9^q{(EBgfyiN~aT7CM*-h{}zUtNE^qh^&eTp-Thv zwF(>ZyQ+B)2)AnPPxudXU>S>EDe~X&|4E`S@X$Bx_C-xi?eYEYWPuy^4RFgEbYlHQ z72K~!!^6W9+t6AuNBF)`Kftd@ztc21k|WJ~MwSiykQuAK0RFFjiGAoGP?yOJ_+>ux zNbm=cZo1_MumT)dRLuXU!9Pf*TTV~@V56I^0T(b_a#~XHPlNH2)8l`h`%l^a(~N9| zR_{B#?Ky}_Ydq??CiBo$(e|L_Ml7Xu;OBuoIpzo-`hE=oHLpx-%?VnIN32}^Z!gp7Rrd#NI;>D`0y26_xG!Abx94ftBV9{_iX7H_M z4Ln=bm$o~PVftWXC;Y7z?J{ri@slaGdlxf4_F1EoZPQhZY_0Ovt%`!Y3ttA{YiWJY z$$|IE%`|?OubEFq(IWUvmv|9dNyr6gy?ZW*O;2cj=0BIrnkRNZRukldw5ox7t%+*A zW(^}6eWV_B#cM^wKZzp}idm=H9apr*S`wQs5=1R~L=&0`dNvbZiuTX)vcLDKxjo4SQYCnwS6VVQhz4oU{ssi z)kLyvaw?cqS~uDO<%AMas($ty;yaidA`gV>HIqSsh}epjUG`836Bilk^E!yCOIaIr z{$c~~+{Pq_f8XS-_RQw9XsA#0@bdH)2#b1VweCr|yd`|M5kFtw7H&zIkL#d*W(bQc znxFNRfzy&soz1wuT*gAZ&bq7IhA!T$%tA5OAattrO?^>y-tk)6g*uor#>IVSSe#_`U`OS`JPAAZFO_Ldd%GuDIwM&R#cdS z6U6e`*j`>^{4%eJ*-K#z6xBS^1;^A4~`sc&|Vm?gDDnkp9%RLslxT^w zaWstWV$TXsP9%qq4be#%TOD%27C2j3~a3i z7Z*2XO&HCYRGe^Q<$Ey4;)j5wvc%<<*`rQ@^_PQ78ZTcSp5Ylk>g-0A*&HcUbPt{} zi2r!J>=iHJOkdM6@z&<`hNy>n<5#>~&CBpAtLu=8fk)-z6Inq(_L-Ib6n5f;%;OQf z$OYd~!_?mW`}GMtVK@3cJNz#Iv0o{F0n!F`(E-rxZn*ocscG{LbfzxlHd-xk3_Bq z!%V+6gF)HDQ*A?K_V5`A$V3aFP`h^)y%uZn%bpMJsqcu;%I(go)u%H0G}4W0gGUd4 z$gE!IxtU*}I2lvO^#i?k>?BMZ)b3f==m-?>u#NnGV}RRd$PAF`M4(rP%_l3 zE*`JW)vo0u%h}ih1)ytZw`5$o$)ofO@%;i?>f&rI=u>XEMQY%SdewSQaEc~+^rHJP zWkR{?wN14XE$o2$;$IRPcvdAvxki-@g0NbKNLt}y7tq2-6n+6ve9i*WXO(al_`a@3 zoNduO(I}s>m%BxSGzHa+t7WZozqp`8s^&(-FkgyIOf~9F4~Zi0cD|`BcC5XYYr2ds zV63ja{+**WB?0Qm@@%DW5klPeW;7<*Jz->-mL8mSU{WNDh>HFe8F5P*aXC2jTRk2R z)+C{(?knd{mq^{PQk+`4J{)t3laeREM{AWnWiCWzem7EKuy_^HSh{36mD6>#q{X=X zanymFA4*Jg3w7`s%j>B#@qbrAYP$HI_xXU_uN()D*}rWDw4IZ>tlhTNwyc{`!AfqA zktH{9s0opkleW@vh&zq{4xha1)*~z}uN8yZ4k(+F^<=qRHBR2UQJ!q`PAxUq@pQr^ z7yq5qLFj_Qn!COkPVb$f+F6q{+nRQ+xPx_VX`jJ*A$m&csoK_C=UJeOl)nsF_;bwl zP2n~~MNshWqnqW;%ub|N;YjILVQheR}a@5gF!)3vP#hx~x*E`pK@ zZu(&Lvl5iBhoE4c7tjyCy&TvvJM0!N8H#iCW9KxLAeLzfwRzxN<@xtQ*sl3s02?>L zPONfK+_P=xw4*N`7j3qWGF4f=oR_cS509)rcqOP7EF(MB%30`+d05OFs-OArvqPdq zUf{sF*^W$e$wDkcE8H=nM>?ab{_QTP=VVj;28kSs8S|9^bH9{fX>?MkcVu%abt( zMPcP3dZ;rON|*U>`@2SPk=FOW(wB-*a=<;1yQoI)alpi%D+8SYR7WZl;(J5GW*5`%kcA_581BKod3f%K4bMx zxc5L$j~WfPIun6THp_qyENa2xlNaJ^w+sK!z58Bl<;~8)VRI{MJNi($0+S3Lr`@C7 z`QgLOGkwMvqS>g-TsJi>R(wo4kGT>lAo)QR<&zIsshfNvz@JS(9b7>%uxlDs6mH!nt@C&d8|KaUf%Q>*(s^#pY;_P1w{$Mjo*7mNf zeWy-DKz%t~`F|Wl1xa+ign@T5snGzC5KxdX&=4?x-{FKngT&N_LPsTLV3ddcz^|)E zA|Pn{=LRNttCJ7n0#gP5oBHR`9~aam$fK)cfB92cH;D-fUd; zt78)Zw9Z8y%}OkUhr%Rih%4$Zk4kj@X#FWk=7DkN3(FC~i+}gaEwd{4nZcQeauS&_ z7h3)+l;7ls$dWEd3!zEigh|-DKLpIjOOm692%96L5Z-Q>uh1JpMGFQc%3Bb@(ck{$47R zboMcYg-U7W#&B!MGvvR1sgx(+c`qIO-a|$MfEykX9vT1x^XIWA@E$T66o!HxDmo^( z?FHmNLw_LQXR`b1Q%$OC8{IYa#~w1|?=CpSG{2#$)v+&@u6sd|JBrYH!SJLdp0d2D zD$hv7s-5m`a8m_MNFgj8>1puLe0+_KYoVT%p%mDXufz*=hv6?#q~*P<@1z(Ymxq8v+%f1x@X;pBVq`7J?T6+Tnw zEA>3pf3=I{BId!4>Kgn-kO|` z+$!;*J%?HZZGAg<23pPW>LJKblA`*3Y>JxrBu?pq&mDMtvvtzcs!;+KShDFbL`7#$ z%VV_M#Z|rE2vUsP=@LC%fgdV|MceJNY_?lDC0Vjo5guf&M?EG@u2$?{%EFLfT!8-H zo<(^gXApqOyL!eHU)5(OQGi@&R}!2}$gRi61PH?p&&O5+xnNw^X+isID!+sNyG#cFs0} zpAr%9mllvvQ1EY{p z3xY+O20`JMPl~%ee*Wb|`GMDJI#(Td!K%-?-&4W)QZ(_I+mWr7~ z$^s93*6B+&y&ti@{{q}l!S*;noWp{@k(M_~nK3U*gu?3XtG}qyF#G8~%&@v?6gB$6 zUe=m;--7-Nlg%f-ZTw$=X;o_k(%cq(w1f&hxH2w6wvX`PF@c@sh7HIer+!0hR6ba@ z<>Em&%lyw#w^8{v-{#_H3-Vb$?t6vIlc0Urqp79xieDFkK@EYWs*ht=Oo`4hx%A&} z68B3lH~mJgj%g{BF=OtJ&R=J!1)K`VhQxE0mNqVHdU-X-5eUC0f10;bXGN^e_}Gp8 z85^HX*~c`Q)x%DmpdY+rYG1Tz55tNiD3ij4xgZvS&XNM_ktq7!GBYo_BnaguLan&C z_`ocf-kKON^?_Nubdaz2yNbgvKpEY^FMz5FDqq0YkH}IoB~?2IP7dN5KaHX=%t{VW zU_IYQ;fvpC{A9*@JVIlrfXVDuo|?#aj@s4AeRya3DzeNM^S?`Auc~Acle632c7ASq z(Ol74Y@T^BptFm9U$~@)WJNG>g#Uh1N;)dgI0mg%g>8VLVUrdI+5X@gL@2cUel7L~ zvrB~_tP1Xel^pxfTdVH+_^_i`=jcw!Xd<93ti<$mRHSC5Xvx zOe5qO<2$r`Zyk7vX_=4{fYclEaZop-2YxJkiUUjJZrDp@DXkWWfknk$sCf%p)(q)LZA*_B3{0nr?DA0~39 z1pE&xu@d1&9od+G?g1K*Dua=d3?$M4DzqPl^i4Ze?qwobQ?}FDWevFUc7EoAn^m2? zRh~f1Uh$3Y3q?%pMMPD$+G^m4w|x!YQy6u9yJK6T#A97>?@%sFbw1^%^*Rn=R=7lC z{8ho>&a=W+$|<2h0$}funl0U1&(N>gYP&V%1gQ!uNi1*Zlt~s?rCkokkeG-A9i8Aj zgkAceT1;!??x@O#{8``NaExP71y@?6=bVMmWDyLoN%FOjopZ0ap+_NrCzAy!Q>ff# zB0DD|B=Ei&1H7}m2h-w(Z=^@Jv$^B$jrCxc9Z23@D{3CJPrOaf4V`8=4?<5&2^&ef z4{F=huOVGA9UJ>z$ce97)l)Jbe^=wKN}}5r0>@cy*31cIjC-603Rq}R5J(Km4-w=Z z%UWR?d;5{X_Ap%BPG692y~ez*oG$&FPG|rE_FPAM9U$`CxeKnDZ#Cwu+K4n^o;FAsl`GcFIWkUJ zHte-<($1I9mv>EBzYVi>1T%o6Kg+f&{SDwY;!Rnz<*b>n5rE6fwhm~)-UL&@v|t~~ z>b4hLeqymUi%l0yi{EXOj^R!`QlO1ZNFZ4PvdX_j&zzR%HaFlI-hETnh9x)LXOL=? zSAo|;hu1v!95QvUuO<%qcJNH~TDCPoAR#ESz`sCFj}{ zlWj-2$;zrooN-=@SVs< zsVfPjK|rj~KJT;}rO#d?RMR*zBa~nA_9G)^Vnd$A*z2AI7JP=-v0Li*%h(f}CQj29 zI1LS0UgfW39?dO~t`>?o3PYb2-Iju3*JK*^;j*ug>u4DJ9W`VUb8i9_FBFM8{Gsyr z3x*e4hl+RQ({7;z_P8Y#fW@l3gjDtFQL1sIde~dd{kzEHq6U3-=qg zZuqMtnhS$PkfykyyPJw}OH5+=AP2Np@;AfMZ1#$kHSdoV=U|{x@9s{*h2&R z>%HW!9;Fht2QM|`4zWj>Jm$zMshdlS^*-xW^0?E1G&@(4aXwov#3-=Ov5hc}4JiRT zOs^h+{y|I)5tV=jT-=6Ajcmo;iQOeW644T|o3yPugz@;!@7dp$y81L#LJKMoVb+w* ziSaeZNSi7} zSV~yxvSwYcoNa>@HM3#_I?~{eklJCN=#vuHIq>B*eaKETZife|?&BsXkBNvFD?cn4 zx9r)av=O+^^??5qu~Euya%!sFFjk3$+h%GG@+%x7`XoO=8FC*`b+q3seKpD}{>atc zVsKXBqTGZMqaj0kjZpHUgC(O*JLm3HQsD5Vm_TO1Q6n-bHe1%BLT0ue;Q$FUXJZ?c zhFNx$SDy3k1)@pZ7?18JiU0Ds0_nh~IV`YaK7ZR>VRqPvvSx+jN@p^lIG~Vk(^|5P zDHT498;59Pv^rA|spo7?4g4AAL_gQca$K@=rRl-!ulV_T%w0s8XTiN>-CMcswX}Us zn`deYfO+edZLau$j+@kNBGP5PC3IL3WGr=_V&1$OX*|O+z~WR;wvz$=gw)x6;a(No z?ltSyCh)i>a0R&sspnS`A@1Cmo6-UI<+VG3`O3pD>KJz#y`BYyrd&f>WqW)`V{J58 zCs+z4r5PoXlNIju<`omlK{Dzk`vWBd4A0IvK|2k>^QD-07E3k(ZF8UJywfcqV~D+u zo2W}l{O;yc)hpitf35~&ChBE;D@`eBKH~>o&*U_fm`~}K{+#18ay%$)Fl^B0%h>^s zgpFI^W9=+pMbNI$kZhSd#`-~I6#PWH=X9JIEh%)+%%LT`IyjBEr3J zGNq|C2lCRhuD8yt);bIA7;$Y^c~DY%l$ygnoIgitX=}~W+0rDh*ftIMw3kdxJ10G- zJYlEEyL4cu5|vfqeVyT#vxexx%285Mf{lpmp5P#!8Dp1GH`b-FCG7AC80dDQmkQ%L z*Q|48^H8Vs*xXvk-G@Im->j%I!b4uln&6l?gSA-#)@t6I(9j^zFF=y#*=~VD+Sn}k zLGu7{CQ#qexvg`~jVUySt}81)roM_!XsO|M?}3uul7cP@pAVRfs3NHvz?iA= zag5pGxl6$*3=Lu9Y>kr4=$U=9EXF9frD{SPLl-%6gH+t7#aHc|Q~cq$KDWDn!X-Cd<2-G5PzL z(&=Q}*)%Cwi1hMQ_jA z$2Cb)sn5EW{eqoGNgO)OiDPs##w@}v_m&WTi8Wvv%KPLhf;Q^TbA}fiWLGPPbxBV? zaFaqMGZb*TVXMaX?R98+O5jt zSfxE^nLf6kw&?pAM`;^>5cxaaeh%Dp{o8!*-M;X^joCDP){$Lf-jOYP!TF_iSDB%j zMwZ(@oF`~FBdND&0J97UNB*v>@~X`$i7!n(n1L;W}N zh7s@P4qy-n7163yUj;rj_lR%>GRKDAPng+SE)h$`T?MzwT26%_aD#s)GZTB(9kza@ zXt0u9U$<(S!%z3j=pQpw!@)X!9Xe?wxFSRHi8M|ic#ydLKtFA?h-Iw%!(-E0v$@RuP`Ct<>8}U%f7cZPqNk|3ZHs>~7zt_IeB)B#z_)Qq7F2Q)nqsh&rsq zNj_1-b_c1}x1HKZf6ydw3)j2Ti#FL!v(#u`A;moCX?#P6BqqhQjr{FOjMA}JjPop% zKIYX#E7j*^lV|BWnaDOj>CPQ1=z2RUomyG{xyqS7URtMNArxh3#~V;S&p5Q70S zBp(v@p_3F)uUfiJv;YY|3|W5VP8@_9Qm>(Ph+P60gQqk#lia?k$b3u>m(Qdn?(qETF1?G!qL`AmFW~lVtc6+2%At z5N61lt#n9yw=wvrQrMHFRes=Vh zshDGWF@>0ciH#$b&`1CIAEVf5E5wPXry*~E#|(iyFToWPiUl`3Tl`i%Tt5-*ReCP)MTCkB0*%Rh#E)p2uJ0l*j;6A0F=75D&j zOF<*CK761eL8FlCCAlw4^|Nk=t2A6EQY%^#Fxi%@mA4Ng3ZWh|BBg>gU+!pz+o5PR8l_P!1Q77kv;d-4i{ArYgSl0mJ z;6Ktm=YH(0pIRl=h|2Wh{L!d6$*gtGQ7LTwuEMOo<>x%{Rv29k`t zL?UndxZGBs`!sNSGVH&9%9WB7e zz-l0;C`%+&mC|T)rTR>R2Z>)!Q$U(5gipskOH+aPDN#6WvV)q2^nbAT7GQBS-NGQj zf@g5IVQ`1RA;2)m4DKG>T|-C$!QI{6CAcOexVuXTBm_tx1b4_zUi-fL$^Q55fA8)- z`)qeTUFV!SUEQa=tLvP?tai+#)+kEd+Ga4%2t+IbO%@!8pN9sq`0~tNw$w>i+i?j$ z62PO>Q|!-4{s;o#cR_{#uFE&ZQxE10}%88kFVugB%r>uk;)xn|33L<4uAgXJ*!;eY`-j zCC8fFC*;ut-E=dY6JMDmE_pa>E}r}lKno+K-7SEKO-M$ZR}Nb~|9n%v!cOFT9J%Pm zsk|1qkCR2hLpxA2Hla~7qWLmzS}e)wsnVB>SczGl9Ds{xMRb=EKgOHK46vFs2J5GD zNzZ;FX^K=5L&~+W3bfcl)c!j`=c=Db$6VGMrL(-7m5y!X?jq;e4>KkxjF@bhkC{Fp z9cfae-D~aiaW~uRipUKEyVm18lP@fnCEAp#qAEkRF_XHWgtBM>jSgF|t(>IL2!Tc} zbtqNlwAmdTtjH&*Kra({izZSk$vV6b@uQzp2GFI~K9$N#8VoaMhaT{&Ix8oACCB+r zUR`nO)LukGqb!Ui=ZCh3co&2nCS)s?$x^b6pr!R69INv^wLGG+b|i_4d_flEbi%jQ z5JVjNXu3H%eXB@5dS@%MDaDss%ImA zyxutJK@)wMu=ERIZ?2{ynaihrk33fl8d_xS%${vEsW-4pMvD*v3oz8ScCF`MSr;r1 z7lI#tvJcfP@)UM- z45`*pzr?2jW;8W%)F&9|nNw*gDvp(EIc~>y`4cjKUz94qI$U zA~SKJC)r25*_Q!bQIttt7^WRlDk4fkE6ve8IH6Mu(UNpPchh`?O^?k{Vqw>xj#A3U`j&Q4=7;&rerp z6jAX|2|`Bsw6sod6-UIC>9Mgj`GREr#Dq{M6JgDV8p|22vHuZhKp?L1n$x8^;sE`# zh$jTq7B6_md8|yzkyK*Cm_v(QEvGa>!OWJSo2L+NN+?p^E)ijSl%wUX-&n|(J)66h zvyJV)%`(lg+@Yc7zqxMq0C-BpqD3bA!$DE3Y+UBm((4F3x;MfTu!%T8IGtm2ZDQ>E z<4X?j-pE)J3U-ATA!#ht;d{P93SxO%EoOp?5gL)pJ~4XneBmzZ>70a_aVZiZf%MC0 zR*X~Y+h5tH#TImlzc-d-Jg{96tm5vlR>Z?m=6oLoP8`m#rwdYu4bxf#%hsEJCMdB& z=3s7vB5DV-K)g$^Ae&rgTX&H?Y$1I)PMT5}fV+=- zr>s7viQnLd4)0?c@>4Ka1ayxQ+tbtF=4iKB;yEdY0E`t4ra9WOoO6C6DQq{gMlU&6 zF$D{oE7PWu$0R{&62#(N2|9H17wq-$(W)1~F-^r6p~;@kcxfO`04F(`uS1QJ@DQN7 zi|%1!QxC?rr0843hz~K6b45{a=b(oX-W2h^+Er<`4Dwp{P>KLtFsVPk_}HXH^2x|* zTE+^;FlTeza=|(4)qSNvxc7mJFPx)4Z6zyf^!%X>OGU;KX_ZcNNk)7pV9v)|wMtURolabMmR^A!kPoyOr?Vm_j`2PF+1zSHn zJbAv0%JK=KHL|>siZqS8N^BRn59kB0pGI9wgY%BO&x+0~-SIi3cKh@EjF0>+6W ztQrM)BEzGT!OI>l%-kN!DfEQUJ=Mw$GhWbG7K^_-TM9HCIn@_>sm_K{Z$RdnM?zO_ zjXA9^k+Yo{+>IzJmDv=zOKLz_z(tfRgn^l1@89kB4G*{+-SjKVLuV zZ6|#)G*>o$;Mg*u9cz&NFdyAFd|qDl8$w3>YEnIyi@Qiq*nGa?o%UPp|E)t;DC{TF zN3C&E@*Lg&Ca0A}TzqwJx~-yVyk6Bg|J1kkhxUhWoo{uYRvw)FXG!G-bdOdf5kKWQ z0fuv|6>vO`(X!Lfdpnv z)E0ne>_+^1EKA@&k?6lZ5D6=ZlO251Z8tM78=tOv)ne{c1%f4XawN&#icGXnZ{Pak z7HSOKhUyp2wwI&H4v7s4tIdWM0HU0lWWwA1n^NPA1MB; zp6QXVG-_zLNy1);Vt4$W2+UKeL%}tKyUYgaL>y_~Jl;05g&fFqUikrpxArYEr2&wF zmR~G4%GUZ#w8NylD{A_t{{ANtzB1ng!Q7&riO98H?N&J#JaDU=nR=}Z}mLwY3X^VxMl8*TyW^-S=+BJ?g^CJpc015 z&Oec2r|C7`4Fx3K4u)iS&Xt0lZa(b}et)KWAHRS5pLCIrBhdkpiRcmV6hE2Q*D_4p zgf<9E6!5rPE49SbWvs+L{>yMRdi~HD!8MSey2NNpcjTJ9P+1KpN$T<=E_K%GLp7TU zScBkLWiYbw>z_z~a+soH^f9~8_jA%11(-knl(&G-%jcix#7E~00xQia>tlOp?B~S? znOdV^O#9Du1{lS7(`Y_$H(8zeNDU+ct?)gWYlZE@FXwWPTCJxv`Ws%8H893hPMEeL zVTv?hFXd7VKabp^ny1lDG+M@w;%wba6g{?@PslJmNK|F$D&Z}M@kYo*#cPN^HW?3a z3ysXRUvyS$XduX(yv$&w86QZ|%)>vXHOCZU=30G(m2B`SP^AQh-jI^ev*CJml!;4_ zUA@am2Hs?id1&wRE_;-p!%tRJlI4mkW0TpUglj)ts6;Bvt6q&U`mTUDOf$GrLuiey zXQ*|}4?TlhZfHv>BgFaqCsF{KS}!O0>reFI$#Y;q(IkJZF+p90NSwA5Ur~5*YuUAJ)J0nK&6C0 zDyG23B%4ioarm+-(;0=H%|Ny_cK~r_K})b0uX;Bd7JlosC`{kq)}ZQKdH#md?|aNU z?}3k<7A_y^TMw32FC3k2S_JP_|348xDX)2mN!O^LB*)gQ$6b^1xb)@aYAq*b}F>7OKAo$t1>13RdbA7 zsY(`Qm?SvzbBd=Xge15}!;Q%k7dCbbls88egVsELSnxQwYnt0H_$}&N)cxxWH#^Od zIEGsqhfDfO0nH^vBMkICrg`jRT3o<|L_gBak9JhRbN1j02+ox@KDk2{1uGQr70Eu9 zarQAN!0KEVyc%JX0}%=LDxSokbHJdBCMfKQr8hx~_$*B4r3= z8Y#Ecjo`Xd?b9t|r6|bgiO@Sf1*>=+D^5qPg;e|y<|By?DNx3;HKCcOmV`Jmh9yZC ze2Lk9DrnilWDQ|$1j2kdG^vuu-Cx(;&b?77ku!Zc_;D(98xw?Clk_Z(h46cN@Y|s; z_;u2yFlGV#{-k<>lom=h7BNP*rqEP1`V7J7siequpZekCswB)^<_+eoTN2Z$)i+Rg zS%Ge5*Gn0-Z~4VQ4C+DF_-U$(Cq}rK?ppgWVx69X>0#7?b2D`ur@N_5^T=cPNBjhd z42cZ!NV{W|(F&mVBQV3zG#uh=KOC!TXpd87J!0!}xSF#o?+LC5b~Mymg(7pLGG`Ab z!nd=Q=x!$8y*3lk5EJ667hLmXy20hFwjhyim9dq9x>88h1jFYu5^eDrR?Oi{!%I%v zVT@?}wZmd&qg24ayZU3sBFhl+UK*0Z-Bp0892a;QauQ5?G46K6&gUo*%_kxIZKhRcrurR5GFceddU(%5b6%)P)#Hm+qW+ zDP~$3wLlqW&=p*RT0_2nozyzC-gCuJAZPmw6=Odew7rk~fw9`zI8Z#1lD)NqaC%1d z6t-(O5}db2I623xV5xW$+hgI=x=ajL#HZO>uw2$MbL?HuI3=_ZD$7n7om=coe;~6K^FhA(jQ*WEfdc9D zyJe(~PXYs&Wx2|E^-H!ZS8^Xm$l$ac6z}M_<5)oSFJfoKX23hg!jDyY$S`UiOhR&8 zjqU-*gnolw^dDaqLf%?;S7F4)2J5wBk~;Meh+)T?I-oX5GgehJu9NgGsY9Bl{Oc2{ zMJ7D*%D?PXJk{9foS);^FJcp^{mz!G{LoP(1H&jngDBNB4Qwm7H;$p~nhcM9WCQWy z3h^?=Sc`!O@X_oDX+FOa)5TH8?VvISls`!Jm7?VHF&sE*bDg5)5A=VY31 z#3?T9LhNE+-(xdzCgb+XF4Vo|VuFEtzf+zdrex8W&E)oVrEaFtM+ zAOm6FIQV>+djy5K^VzgUd6+=UylL!=<)Kldc0Cg%#u|lEgca;LVO?6iIL#i-{!>SS zk5BZZaS&Qd0O@lzK$eEs5@gO{0{w@xRpeR}VnrG6BT`nbV2z1hwH3d&!8gRg<%h58 zUlqpSOh-~s4-3NgE8^^waMDvlLOBA<_HprM+9MNDDzv`|2(^#IOsyQQs`nfV%Qsd? zq)+>82>|eB7|IHKRFP-!P@TSpTCC2Z5>_wVp<18WXc3!+eEXV-vC0tWv~h-#!>+W zb9nHr!yPx=;7#K(p7!ndfEGE=aLa`EX+^v6eEaOmOxqx*CFwW2E-^<<11VO|vD@)= zr57{DF3D~J^W80%V1NkoI`8-C6d@V{1m($o;i@2ap>z$ULrxyVwx?wHj<6m`1-7+7}%?HQ;v$0yXnXa|)hko2RC4U-ir4 zv(?*i^KKGZT9}rviji~sLjacjS`iUR4n)I*l<4$j=)Q5FuZm&1eTA!bM7>PqmV6Rr zdg_D0L+bFtx@8$ba*npGA|O>(bk2%aU?FifAQto$zhqrDb05xcp{hLvI}f*7G)7&y zB{IOsigSA|D~At_u#7XtaJSmkpeZ!i2#&$U31IA2!eZNz6R3#~iCFjSVfXEOt)nmuIAD zV@!N2)bh;C;?>+Zi?@cf_IKgxmh5sSmaw|#It_G_tBI6(50hy$I%1Z~lTbz-rx(ze)RUqwwi)qVgnqGnPLmWmdWQZJiN)at zRs4rzm81t*pyaDTvx!pz7ASkW&fK%yBNU^i!tEzU0$lq;Q>Aw5nexNF3?B|8B*LrM zQV2UJzK!{*d+5j36fo2l{|I2r_tuxQ7@`Dt(2WC?rt;FW?}VmZr`c?rkp;URF6mv= ze{;0!Lcx(`%$MI1jDIK9(ttr1$jca>u}q)^dRVVcxu&N%77;G9I_K2cGSJpjmfvt4 zZLOJkT%gP1)`}^PXPKN7$Vjmq*sfEO+3no%&Rn(a@d8?9#3MV*0x`^F79|WKaV)%O zvrOWmGZlRO(`7-)bF*dDfFw<)If5afLJK&4Acc-Q3YBO-u|&Z4r~iuTDHyu#+vye0a&$xtQ=ZPGJlhE3Av zX5Vzx0pg~R@uBplh^#q7UeSz=rsySwlOAj{;3eOg0AGmo7p67~4`r-I5-gT=3v^Am z(Ma$nA3+%(2-I`|r#6LyTv+%XtipaVX!KmqenG(zmhDT=-T2ENJ+=P+P0H@mC!3PO;kE#%5` z=H(lQ7Q3-|`6R*`xC$_)LI)H=O9bfJ7B(_%8-(G6s-&?!jonL^wpaU?7*{{qW}X4z zCrZUrUhk)Tc&n)wI9p9PnDoJN>ngHud+HdU#p~ft;C+hE5Y&#ClEpKZ<@cpDm^x@bxEf5vBGblf4^Im@R z<)OmUs!dR$2&FIKl$V88j*=xiJ6__Z8;+wUqBn=Jj`$K7k-rFl7Z4)@xJ>P-XFp)B zI~ZUk-&R1pv-B}Uk{-tSoOZ|f4aw+CBJD`+B&DfiTF2y45>N_3m?+{&0su3Ur$C_Z zH}JPgp{apPFSS8b0k-R`H0gUakD*JeX;KW^p*p*EDtX?w!C|^rIVhK$7`b={PXVc|#s#sX*F!DWEA?8JUASfZ)~Cjh2Ui9?0q_k^{8qPsExP&nxz$MWAz+Q)ud= zC$m8512k`eHNHYcEZO-1%XO^tIOg)Hf;s!Nb8EXP*|@i;Kao(_ESxB#RkJ0{8t!nW z!Wfh-DV^rRN(o?~h=WrV%#1hv<<11m^}v^nNfn&eNsNUcI6S$UF1yJ&QMBwCuxE3q zIdZ?)e>*TolS?{An=>{&6E!L17T=`>S@HSZVb(Ea1f6}H8~!dtCV6;#3GQsnrJ`?iMj8{ zOwXvotxMT-=HN1Wq~!9#9QOY3GTi=i2q|K3k&roq(i;nyx8O)L?>48cNHqmeafd>A zNI?&FOQ10xKW&^GsiA;fY_=JYz>!;qe5XYcM&7L6AN z=)Dac9d_omW#_En)#2-(m%GNdqmb61Yq9`o_NJFslClPy3FSCk5FPM-mlv3d1C-c2 z?mL=FR_RN7*uzI`7`~fW*lYVNG*T~AQN@{*sFzS1nl$^My!#ChCc^?IbMz6{5X6mU zTJrS^&p{t}onPB8ECb}x={EGLqGEAxqqN$8Ss-9eZpv5wnWMYa$|~`(h zmCsIU@rgm=;Y(+yfM!;LMx#k6d|0T5VxXMJIH8m(aq<DTMR>xco``zm z6|t61Idz9084!Ahm)=W`<(SNTj#FpP5AB)Xf|;J`&Y$xnwqk9M<{QO%FupmIDIKS! zL}t@Xy2&nGC5h^B91uRE(Xi;r(NhExtru_eF*2Bktx?!+3=?CBrC@PrRt8A!YMblu zG3iH$j2nJq8b`M4W!hymwb5tiKwsvl;Hba}lx0179O)OLS368!{W+mylyZnM2P=#6 z!k60>de-zFF2cPo=15V4t=k8y_Whi!ufby7Cjf+bu`P!YLZ&+OQf4joUOUok8%v!w zR1fp$uvnd8D%UH;$O6Zevg5Zxe@>(%WEVI{F~hr}bo&`zjh2m>P3R zidbkP#xJp!;+2SvA4zj!t0`BJ$Y8^!4jA-W%hQHJgR#^?$MpERBf@Lna-+FE#+S1_ zCKM+2q!!pmk7zHbHYq52rQ*38eQVcj{cKDVl=za=hp*ReoHkJu{ge=->uC{Yh4LajwJUIuzzOBa9?mo71{%w< zPLSn37B(wNj*Pa9-Tp|D`vu`sm!;wQe6`c<4#*dB(*+K3iEvzAP@=-2F4>`)C_?c? z?^;0-FenvRz5b(ZKQw80Q)0f^eL{e*3Ng{EQ0dFU+IJIKl+o^b$QAxDZEJ-l8v`p| zd`#0&X2Wl+H?pFjaQiv}%bag5jOkejPLrXntdT1nb+N?bjY@7)8}*@ixq%42GDbp% zS8;tfjZnr+tfLk>2pw+>d)OpFV28|VrbHg1bt8z2H7H5*j?J}t%cFr2&zo0Fuila^_^+zXB~eYUNZf9>PhIrShq2t z6|GMShiSTLZs(9|&Zd#8c#QGo=>>yGc)A~RCkvdBW=Yx@HHD2JUzu;x{HZtrgYD?7 zrL;zl5A#%pUWQr*kjJM|oOa4bQi%_}2#c5HItrdhKs_j$joA~(sSVQ*;*UuV;$7Y$ z>kGgn4A_T)^=4p<_QOTQzESwO2wNvf`GIB3`xi+MQ-ui;TXgpM}drBW$G0D#F8Q z-bWEv54fOaHFS#%fe5Cu81dUVFabk!kRElGuzb}@)4bwr++p(6NSp4Esl^fx>H&_# zC-oA8Lf@eAV3}~uEW&6aJP~60kY#wX4SF%zcoa|X;^BLdWebi}g#;k<4P79{llD{k zI}9If`c00suR5!NOdp>5s$z)K9R>|N0*Ff;q4fRc{f4O>$@HPGo<5AEVetvrln=?J z@~Qtc7)68S!}_@_Hdpj7Z=)zw~~VnKVgloiFrl@E~;v2P~ioa|1e}t+vlL%CQok30=`_l*zEiw1bH@ zbR=s%J@p9=Mg1UEm>czWSd@*&fT!8-$Ww#ME>Od2Po>Cusp%(DSMmnjP#-^Y?SXMM zg@8eext0~ZPz3W6Un8suK8?v2fNcn?QyiNO?we>nW?TQsa87Nay>czuDB2CS0u4BN zGO=8SbP3fhMIfv^d5>mrZTp+)+~++<-M67hbCd-i>(W4}Mcxd=FkBfs83MOJ%n4-~ zwHbuzR(I+mHaHiBCpuSt_n)7?D=TJr+oy_M>dIH~=^YXmRA9Q-#D`ko+oxx);**3X zTXwu|GOk}rD!iPqMOY2AjJ(S)`)BCooS0iwBRgNl^gR&i_JDP7SKTzc*dyv_3CWI9 znu9n}%y|j0_2ClzU>}AsFQrp6fc<*Y9IKMW^B!GnG^RN1q(r!{7u9yd&>m(h`*$ay z$tmj7PxXkHyGU+C*(B=ig%tY@tTiPM)9j<21&^>jj*Y~jw5ddm3Lj}!tv7TxY|Q0HEwP7%u1CjmWj^?wiHg1Z<+;UQG!6@8 zElaZGQH`-G5ZfP-Ks*&5PiqgTiVg!y!XoN)G62@Qi9+)OEa1#AExrne;`pHrFdP$i zk7M&H5K~QgTGIlY=vbPFruI61DH!B`fEX<&{+FEUlneK+-DHh1V#~+&>xCD0+z-x* z2sFl`IMtK=(j35*8Rl&Z5Ep`@_L)|be6KEa2xOF=wR(Z}Iab11jL{>rh27vC>;iI# zi(C+k({6k)f#sYssKG(|Rx!6ZPf~6NWv5`891<*~te@aLRWlx=v%5>zlcC#rOA!GR zh!3~icGf3MwNsdhoP8=?c}8sj=S!G#?^kVSoA)9V{qd^a6#t;Ydsq@F zN{bqZVHqZJ-AF)K8hQVnSI)H_ZF#It zi`v3LuviZ|T;zQNq&mTxW#0-p9N|;wf`wSg?P7jw0($9$h>n&GRZ^r6z}1?+kQJ)!dUt?h$3NoLU{UTaW!Ss%!Z{KE&kwJwnHHq`Bg%T;n$VgQZMmezvCcBZX zy0G~e#7hyqx4g37X-+>LUa@LLv5u@g9>D{vT<|i)k@;G2sHib(*)}q{HLVRPuc4nV zzQL<%z|LP=6zcD ziX8<0C@j#jIX_Inoq$8LVjWA`#AE(7^sygeUP$gs@$?-R|NY zHlnONj$odeu`AO$V1qMBHL<1n*L}OfVqF|v(vxtAv!~exf3X_z6^RA%m@tcpQVtF+-lZSel3Em$< zLddOW-U?|K%th-kA+}q@(LnL3xI_2SUWEWcnQ}6FTxI*(eN>MQ5IK5BnT?4eCr_f_ z5nTIC%(nF09P<#uN<|;QqMg*-1~oL$aRK7wl_j#DC}M(GwR#CZ+Y@D!Ock^gsJPEl zECvtq6F*|v?ljNOS8weW*mkcjsHa=_pyt^ake*2HzAOx*$#=N*(SDP;UR7>B2zPtd zUbl7Bs&roe6RC45oJdUZ!yE*pkEE6o9H)+{I%_vpB5+Cmi8-@$#Z?07uwcxS7iVIn_mZ6*g$aK;gNcq@r3dg_ z<=ET6B?MklK3o3zimoXBdQwMa#w}gNmtg9926fe3$xkGPQKfyM*IN#cT}ZkMl@23yM=JRymMF3k{k8NZ|*0M%0r$= zm{Eo{4G~^0N;o`rQ^^UJp=MLoDo!|B8HOdW4K&%@+Yu&k6qIT>ff}?p_2ho9hEXrY zEDH#Vxg?m{g)9Q(Tniy;MMV9M-AU8>K_1!|-s2w<;(=Q4Os{JQX00ypn>-nO>)Vvy zgvKEYiElJxL!PRd)0IYA{!#i*A=7}SC&3D{jRmwL9#y~!_W^hNt;LnKu~}}`ilUuJ zjC!0X`Agt5>*IiW{N7LZd2Y_*?x!i3VeG2u{A$69AV_T9>92O=j-&*f?F>y(>d?6+ z{6<=pz?a~Rs&jY{e==%V-0=BfkpO|5OAE86G&$!zAi<$?jqDY>TyeW$%!wD{yK7QJ z68IOapLKZL2k(}oDo!pGhbo`pD%=N3=Ev*3N8@WOg>tcKmdWlN=HyHArc(@d7`u3%#7Cgw;AVy1it z(M(LYzaMpAYuXBCv2Eboud%#X3Tr6d$-kP(Z(L${NLQ2_zbRz6~D*K2y-2jeyY1Q7N?szTUE2 zz`}B~syK>22-Sp<-X{4~IAa-uUq5@d`9IW$m`VRg{U@z#NYC=b)Ms3{`6p$Lf zNo1(0>!_0{_<^SdzeO!_tw6OIwWpboWsAQ)SvxeDA&lD$U}CqFc{frAfsM?|;%uKd z{kW|{^kKp+8W3fgO}7=pT1DvUg`Mb*2F0248wPS#bQUbp^%APbA21MaO+M?2$Ty z{;RcBkKhhF(ah$sWbl&61bK>OL$_9N{DKx%m5{Zv`cTAds9T~xV~S;vX^ZVi?jODH z?o$cx*mqO=IWOIC0-wqY$z&CbPi^mdc#3pTeZX@L`+tIfv6Z!?2yMDnYofP>OobF+ zBNm8oVi*AaZ$eGx|ErxoqSD{t>i$*d$BUg36$RNUOwN95T0#2y@U;9}a506wNPqkk z-{BNf%oXtlo2TA9p72WzmkfqQBGyhyf+0opX9HoOJw&AFGHn6%rK75ekzn6O=vs3@ z3pv5C8a--lcZ8nVh;3YXA8UCGik)2i;%(G#WjUc`lf9tZZOwjM(;~mA2O_#T?_0q_#5r6KUwT z;bqMLGm2qfi3dePPPHa#dCAV#5FdIomHJ>#5==%*a5eJ;X%{OSJ{NjQ@Kw(OC087x z>0|m;uUH!8dlJcVlb=-Z%1%QnBKJb2K2IgqHi^Ez5&G5A5PpS$=E_q%(A7!ehd zb4i5NHyniBD`X@Tgn>T5Po)3K`90#B(7)optoyAiv_On>f1QZco%d5-o&LYz8y^R~ zkH3JC-|YdSm>^6woA}Or4qY((o%<(J%Z1bLVEXSoXnzJ=e|+hEiT5Y=_x{bK_{pUB zjpX0ce!<^S{*m&Z!S8-Ceg1pSd;g1H=;BYLcYja*d-%ZR@3CD;x#Tc8xL0TP-&6mD zZ~g>+_wRpvczKh1eev=?l7Gjt-3F=tjU%Jluo6ERqf)odpZ)xe{MBphiM^M^qi^e9 zG#iffb_=7RROk1B3z-uzRp#@9SAQb)MvmzH;Ef-J43N>IgLsBH+-0x~`oo{b1^Jgq zjf`D_RrPUXk!GTairzEz1lH0+ovT%%nWys!4r5VVBxU?9ou@r{-7^20gqbVMVqLYlH7dXvn%V&i`@h{6Q{^98tpqP!LXO)O|u?&sOjzBIEaZ0 z?KuiW7tP&Xs!u5d6N|27xqL+Gse~05Bb^#Nk8CSXl+gZCJ`4@i_qZiE`2q=l>~0#) zH$qCrQF_O@w^@M2*`+C{uO{`lw>lA3^AY-IoHuJWg~FVLwL?^T>>33yr=dsGezsC* zoYem6NFmH4{)3YaiRidQ{G3oI&Vq#cN96w$B%F_g zB!k1#`>&i7Lb!h!fFL3^Kz;P@;-o`DLj;K|u6qqWdA4KZwMgdGYVrqjJ`&N%>}~0+ z@%gNB*~gcs^TyVH2K|z*r^I8`xP8f47z7=tvb}^;#U$2Ca?i0V~;hGlu zD1x8*Wb|)u`&-`Co@hDgro8xz{|^8m-J`$a{|A5tQ7r$Bcw`94=>ENQD8Ik_KVOG_ zOU%iaC2MYrdH?V-EC}h49+7LOI;E`2di=+Gf8`zOn?KUzKL-7hZc_aCKNA0v4hi=k zg!&8p_iz9Ihx`wv0P>&3>7V0A1^ihd5N+Kb2SSI5!eX_Bne>kBC0)4Ui2BtcPs><`eMF$64P-VAnG?>W1+l^ zguZei|3w9Ikjf!xFsIj$sU-m(Xr?k_F7}_s5vP5d$d7lc{6UZ3@~;G}ITMq#I(GWaIu{ zQ&!f9p(aA_4j=Im@BkSV?U&-+pJkRFz)L5se#G-j^-e8dTB@MF+x1oa=3mC50oSOQ z3N%S~D5(?7W0>21?c!neTM}{f`_CR(3_YijSvscaag;f}!qaJg+=b<85$yZ%wRFT| zkOUZRk@10}%d<%vKje{^WjtK&cr)7MCaLQ_;g+%u!y~>PKLmg_v{EAaEi@bw8%*dp+c$X`(u9>P}!{ z;qmQb-jiGcKF6ewE;cyt@c5S}m;F8sr|OFD&A8u>u4KXAG~FIGKFP=^dXvD|X=lZG zb%X6nN$jTmBCqVgaUjuV?$GVU>R4E+Z~9<65DvN!t_ktjHl={EKYivh; zIU|KTs=Gg1_si`Ml>OZD#Dwi|HT0Rs-MavK9utW-aokSlUl*QXs+_7e5M&{AqYZHn zx*RUPF*b;I`rX7iyzrqE!F)V0pE`Cn`XY4rZN|;n*-@v3*uOd%{-835{R#ae*Pryi z{G+KeEB0x)vgT$9Yk=!VOlN_j>0N%;!&8k~v?8W>#lfN%ia~Boh5>V0Ku)fx5|%c5 zHdc5fV%6axB&6J{T5UXV?Ikj65yhOAIvG6%6dE4h21rDxX%fuf+By~uO|u5kT@VFz z1}|dG`>?1&BT863i|FPlhQYNxP{G{_(-WduU^#WGFCcqC)pDH)nRM*M{{@9biS% zTtaP`Zvep?xDFT)a={YEH$uZK%S1$R&QVqBSxiB}Cb*eB1GP!C9)1AYOIQi^I(iCf~tY&;* z@vF|Vb1*MTMJJM|&=lM~Nv%_T*go?_fv{jHJ>abS>vdYu51ibLlsA^X&gh7QQJv#P zyH9l+DVzFKiG(l>R~ZMg$FAV-fqBZ;DcAs~@sp2B027WW(kNk%&?gJ!* zD(){$TtGlV{UKdJ_w?owkCf@(tKuSN5k3kkHU(+!=nVmxipVUuLVqj=Dvdt6l(yvi zWQXzX#U6Pubk00vhWVH#FC0@3zF6dnnPGN+6T>RN{mSaO)c2;b>$r8U(j|$l7m^eI z8RyycawneA#qeb*<}S-?=Ukg?(EEBy!aI7`(THM;ij(SgBs~kas&~F(ataWSQ2QH- z`*1Wk=X5J-Myh|u>n9J~GpTh1z0}_V9G~yqXF*$XjKwEbMRsmOJttkthEH=`9<%o%FGS*s?#41&1R?wE>dw1OXL&sO&;?Rr88tvfPFEmVQc8k zER^;%A506yIN{6C*nTOB2Xf}UhBK+yZLDs!be!POm{)iU!h6CK=<(oZcmm#$rotY_ zrx{#BjaDhx#FLp&rA$4#H&R6p}2|TQD%4}i<3W<5{J+w4S!#5C(wz!cVMr~A} zR`?M^Kc`V;BGmHEccdXu*KhY%HXT`@bYTRq9Jk6AEsGaA2)n!e@TP;4icKp?g1(sPBLar8WABd7ljVD7<93lZg9_ zMp~WEaMG)-Z#R(ewySo#i~CG0UQ$XCbxg$gAr(ov*7Ig~E) zIwnn>hK7=!c9KEcv@tr`} z3$J)O&E!L?VD+kU7gbJD$$qY-3ojqp%P;8lqE8YhN-91-*mUa!N4*GX;py%uZYJJ` zm@l;}=b_C%k-{%tAR>#I>(ypGk_+Op!R{9NjwtQk?|tqq)ALD9A_C(Rr@l=4Ncl?ZxmCIkX4Z@Uo*OQ<<3zJxS~bCLVN)yd}gl z4NrNMIX{M0AS15`eU0WmWBXVO=B;1?Pj9zx)*^jBl6~|=o5aBbsZ$_ck8tE=4#&sh zK|3q6X&lDsZRx;XMl4xibtR>}0eV|n^Fr)pvz8Ow2zl8h(lMqNxeng`Aw*>7?!&X- ziUTnQC61bzVbSKveR?e5`9rAxTv0pSB8P-TVKQ;QibU_qiwlhMZ$eC+o>7BPp^0@} zH3Cd-eoFoo^87bT*%`wtIAZsgQhV>zfC20-OST*&_Dz{s3b?gj7B(#4)Od20qt%7x z_eXpb*oxnLFWD5j-*d1ISU>u1uOg!-)f12}b%jka9%(w!kd0JK1gV+0w;Y>}U3svh z*5L%75a{Y-tI!f%*{|rG?e!q{bk^qde*<}xFy}3AxtxBp5N6!Dw2ICx{1ZtH%n>t) z$s(iuR9X%_Y@45UYNoREd|-C?Ags(Xh~)OUwG}lgPic{nG;2Bovkj6d{XWt;Q+e8g zHqMQvR>N)lmDAMmLv2HCLw&tm4#i5$I9Brxy#6Z1s&HbnVpEn~c-tO2N>_J{g94rz zR)@}-@lLPotqz({)M+vk2fgyNK+ueO&Zq-lDeIU;UB4#VZd6>UnO-^5hYH?}`MF-t zBCG1fl!>26hv!5jtFk6{GLic0q;xIsK2d;er;Frb{x5og3S6Hg%wr6O9zxA+MMy&O z_sQ^bG4ES9-hFkweJ9qC1H`vKjTVa#x zWghGi^3I9qBWw+;+^c73J7`SqP5Ccm7JkPhPoN#gnCKVt%cZ|Qx!$@jk*t+QG-J0U z-xXZ~2ha3=BH`pMSbw@#r4hXY%6WLqLeFm#0!-9ZE3g*p(}osxNmq>CQeT(&UXP3% z0TytoP|xE@zp%Zrr}f0HVGQMr`v4{TKbm{%s5+XiU+{2ncRM)b;2JDw4lW0G*I)+? zE+N6)-QC^Y-Ge&>NFcadkUYclelz#Zn*Z)vbLX4hwN_VmSy#*MT~&Mkwjc5x)_eDq z7QH0P4>*SlIxS*^>KwSNAIAIqWK)MgzzLqB@FaOaD$|e*j-jk{#S~bxV&(@G9tH1R zj-zg77S@%fW@RNtcPc`cVu_Xsg54ZQHfo5s{3f8BIi)Drow_t(8BMT?DKRZ_k=w5e z!UG>gOS{1Ck5y=}_LOS(@}$K3kXi#kKO(4{wr(SkhmGc+ygai1C_0kSy;)~CW$+d# zenlX@M`-z*z#eftlN0pS{Om(uzo{F7h(~4;qUqyrD9n z&mJiTeR`0Ds4cxUwkX@gN4yW0=H|3>Re^-N|xHKXMFNR%ri{BV$sda(2Zguev z20amRfmhX<@Cv-wX&;Yz5jn9X4Vz@EHcRyS$j`>sOaPo<42125ha>Jk2<)QLS86sZd0?Z# z2P$)dwX#3S@DitxY=*7Sxd*U(GRH(KnfN&;J4L!KfO9kgi^#Xg41}oW#*c9vec`O+^OeZOYcsPMAQ-{j2T&n zGOo+$Dn8*eI@M}`T*#fiL`hH>g)4};S1Ar5PE>Y%m9I}e%KjDV`gubR7Pm=UvjGLr z1naUO^PsKU2ItRr^|}C{D-)DeDUrTEcL+E8RaF5BUxxPn+$Q}+zGBjOrdtp=V;`Ga zyeaG2{x+kY*pamQG?|;h8yJ#UCCF&IOKh_(IzQ#ew%j59&N@R(Z>6a)S?9fnLVG-) zg?>O-V3u%a24(#Qj~uWp%u0vf56xaTl*rc5w9}PmL*J1N37NSu_eEyI%}VgA9r|Ev z6+hBeW@z*aj+Iu7t=AE=f0^QYqDQ3(@ANNSP-u6=7B#APmF4GIrpX_o?=zy!t(hvF z58^I8b60pJMEi|95;h?>%|YpZE7e=n*{vOp2F_uH#z~St;gj?{>!sWZjvyR|YkT0@ z43zNwB*{d5Drhgj(|R3_j53fgmV1u;+O$Y$n0KsVC9slaee73~N*py1*i@h@UL0^1 z9sSF&vXZ5;i^=r!N~h?`W-@SJKABk;XT1A}!dk5*suHLYJLPHsWf~Kmqpp?@Xf5N8 z*7+=^tgA|g_YOzv&R=XhI|ta8(~4-i_=U>cPnON-e6AAt;8o(Ggu2qt=#)i_sQCJU;|x9gCQ#AgA#ybo`Z{^toAvjn42SKdl>M$o#HzWrby<52 zTl`E)myEiY()|T)Uv&8&(yZ!g^RY4*=%AMunHm#q>9^TD2&U&bBnz9K8d%8-~NK}L1DOX3uhx~7MAAXHj=we7kMM;ol_AcOCN*rG*rOv zDnEIF-HF{KVO&>4x^@FL`fa}%@E3^GkfWaQ*LemvG7|Jt0Tdmv84|*(vXM_QiXnFV z%o>s@Re=7kAr8qSnuMs|#a(cORJY;)j6km#zL>flzv`Je6IMv-!m>`Xll- z-^%Qpqy}Uvrc|lC$t_>GgSOt$u7EuxGxQH$hlE0F&mAfk{=|$QN;X>piy0vNo`E#; zufNUb-NM%+9K_14jNF7j9l!AF3lN-iTdAh(XG`m+*+)Y3Chm6LMD+S8qrnc~SeSGB|K_E_|u0aoI!;NrKfK&!Kt<~ljk0BGjme~Be}?ZXM8| z%c+6bv=vah^l*tfPhcyXmLxBX7J!Wc{lbiDy_EW8W^*Q^+nl?~irrRRl;@Cd)CRRv zHwZf@)6#=={nI5D&a&G6fF4JUPiqo5%9|?Be783Lgw=bSN>BnVS)ovN!5D2slTl$1 zUmX1$^2)>Tb#n+{huNFcu$=a;I#qW8Lv*3#G{@G&Ip@WRFqKMXXT6JQ1t5Le}p z{DX8^6&gZ;nVv0ZR9HBU;kR?io2I)I(t|S@CSm7gu3x?pu5hbpZ;~DZ){dkuvP+Rs zmW#ql$Su;@1NGu&*VSxZ{pL(szI$`q=@)Mo9W}5RVBB{b?bby4O|Xd?nQi2A0bhO_ z)5Y^N{UK4KJz|(*AO`1c#&;5Ha${*Ta?#5p{ekx-oE9mE!xiZ1GYImNp>iRv^={h+ zEoK=%g@@YD(pzwI!N!ujT+guenj!DAwAYPEo>9&yN~F1|@j`e5O1{(v2_4@> zx}v@*47F$;I{(Nq{(uR8of9%*e`f9ru%5KxT+r!Pj350R)=>jx7w~OEVX9;es$y!1 zwYcdEHl<+@Gq-)L27gQ)lL0>f=0>M*A%Z%()pJC@ral#*#g2?iXfyTGb+Rg{fTH)5 za^VGHUPdV*Eqyi}N?v;c^}FwUeL~ii2RMJ!)z&b}^=>UvsWCQL6Imd9wdET|E)1}E<`DU`I^!M+PQPOGXlxzbGAyb2 z0Db5PA|{Bw8c5__Cg6TEWR%|qb_>wpo&Q~%R2&kYw>|IzX;zwijO9oGR6j9vk*~PC z4D|lx>9Irje~YT&UkipL}<>2x>fDu(!W4>j05p})yW=Ctx}F6y7%8Z zjMEDkJiCdTAU0oRSD9TT>j$zg?hvdyFWy^+t1zubC5P-#}l_tXLuU7okuamrYs#@xu ztV_lMGAhaI@BzrqfO+s4Ck7ila?IZwZI7`+uef{a)e}|K0Kls0Ty|5J()SIZ3btgSwOl^m#`8zuc?hDlLIf88 z$ymTe_lFaG_!&M0q43#5N?T&SnsBZN0PY5ekf4Eig$A0{p!?^G*3Tdh=V;sNgV)^8BwJw&SHcySRXheU5 ziuIl=!u4rY49=+%!RN`9(yrLe>xSeh+SA+c3Z57|P8|Yl@$_Jb_@N=b@nu^N7X3q7 zOMfgBqM|P-fi=Y$=ZzQor8=6P2Hk;Ez1FC1{R}ndZS>9bVBv^E4rb>>W&b6C**Q#U zzrMpSycQTFA@Yb+4N^RCw<5U!=*0T}bo%1JPL1^Ghy+1KHT_eMnO>n&O9qYrk#7ON z`ETU4X~m}kvN}G0d_Tbfp6>>9FSejduRO9%!Aa=k+a}g25n&weKt~-(VRtECr%}Ai zzK9bIy4r@#PZEB_RucxCA@2M-TnlZ~D@5}Cm|YIsGLo=DUwmiV?qi|rkDLpdyAP&(W$!OI2~(Gt zO$-b8iVT@(LX4YKmW*|@7puMZ!1g6<7NBSgoMOg@Fh0&HybEO@C8&7K2?*y$mR_WD>Xj}5t!eBYn~4Z=qU+=*Zv^(~f%6~eHS3c=WVv9a7EjhL;H%uTo08!LSX2+dzU=MyY1`=tVYMndn`#hB@ze zSrKX8b*}lbn2na^DYaC!<7}Let^u3H3>C|{EpjwYu@u*xxk&5yjv-_QY~1dj?7F-| zb(1zXdOdbURm;Dd8m>FRDpR;Pz%~w%Le&!)YpV;a23+&J(mi})nRMf81{8etgSu$= za;`?_1H>WsY?6+hj39T56#O`G4T=^&LbIV-ON;soAI61Fkts0VvC!SuVoQ84V=w8? zYTqRSyOt$*&>jnKIH!BCyJ2D}x(g4=Gl|>Gtww&lLYneZ3M>9j%yY8SZiuA0;KIcl z`Y05lkfnUk zki(W4(VPb@0{8MKvCeW+YmWf(oX({Paz}AT3IUdiVAmb?ahNNV zE0d_Nvgvv19((G$saB(4-qQmLoJN}o{=4Hg!UPA-7GL^2!3Qyu!fx)oj>+55H+1Gz;&EcBoc1774k4}wg~NDN$l>TnW`+1M z8NboovP2-C5jQb8iSuj7wc&jag}(`i29UJUwYWIEOtqR0VXdRZTP zP_JIP2o-mKA%HIR)M!e+?6i6h%P{JbwYxe-vffrdwFUF{D|IgyE~buiDa5+SY8=#S zabrO9I0AL#19m1+p)LCtyaE!42RtF`kp0;}S)*d#UCq(HCv|K9XD$yH#U+TqX9=g{ zeyyE9fcjv*SgC%lGcsIi9pkCa%^rLr5_kgws{1c7!kN#$Y&j)QEbDOs~Wmk+Ij&A~(HCts)gU@c@Z6a*tSa_NyS z!7*Im?pS{ldXyrrdo#QZQOPjk8D^#5PpNlMy|y@C@@3n~hukc2TJ&ppmh%#uBZWU#5K|2Kw|t7_eWwnC6_Q1N~urgX_EpA@`><0n5(b|LYl z#!qhDra#t#TPeArJT{Fm~OnntQozO!*s5vL^n$wx${J5Z8h z%V^ruNiScEncvF>VxTPfkFK~9k+zPs^k&_(Lf+Kg$d#0}73AAR+L|7!J3S{9d65Ul zh^8i$GnY0%5FsLp5hY)_CT0_h!M?!62l#yoZ^Q_NT6y zmC66g*dyU8+I6gQ*KiNqjBZZI65bzdzfIqygdt0wW@{JWhkDhFCp|V4{)Ok9GZBI; zhEPfgB%vh4@$a=@$?69SuTsz32E4eSEE$oySSQ1Oo+o=G^;xaCMBktB_Jk6$8QB=X0bO8s{uWnAPS~eI zgw)FZH~AHqK7}(Y-%hvYE_1=>w98IV;cTWq;-vFD@wNJ+3ZwTvg&u|21O2aaY;(2} zw%j2IzwA|L*EdnB^ooyW2ROVF;kz!9q`%n>+MV}a#Yi~mFB^3Z@`719wa+IVEiwWh zEdth~^*&=Gn=b>IGS+KnbPa@!%O$HEWX@DSC+8cTN0MM7h4j*+5jhgVw$&JiWg}C+ zeT`4R)6cjQwC5F~N=x{~v&<_U?m5Kwbu5yyNxXzQf=c7sZ~3p2;b;~oBr6at34f1P zL$9)tm-$*S;poVkMR-b+nDjn~80#`vAnD-IVtP}y5zrrATGbH6uaaq2=#D5M2E4qM zB!+e|9-l5!k={?bQtad`$iF68f6s_*=V4T;W?JfKdKty|19%x~^`dok7`>L-)L!}% zJNVaJi7GScb@GnI^Nwn<0XoLX`v?slESSQ*P3Eh)f)6py`pQaZYOIkGJks|nF&0xM z9{WMcdvDP<&(kN~Idh;l4TZp=xt7I$`B$gw^R!JN${?lrrB1%a{L&7;1&ISv^3whZ za>28r!{~uV5D`lST2VKx1AOOavNN%+9ilIXjK8iWhE?8y_Z(P0l+f3E_(Vs5tVx(F z?Pkx2-FUjk#Xr~CjvnweQeKWD=!G|gkZjV8gX+a~GyQmUN(m?mY7EWer+N;djN;Wt z1Q+kkjNd2qlcf32lL7TU^{DpB6nX5Yn6Jf5Jk40#MQ8NX0i(e_eQKkYU`R~h&;z$L zGZmb*oCRSk95x*%;CMoGmdLLLGz!Iq=s}VPINBq2BEEx3?H71?T~;Sc z5IsV{lf^P!66xZ)oI~KpfFC&Up5ZdGsVPQZm|^lrq^zIeYX#MQ6!pg+$D50teZx`U zcJYGPb%(y2#jd<98+5T0$}$8mhGjPRO#2=OzDN7r*B!Sl0w&5I~+8^uc4i9Hqx zaksqm>N}?(Sl5=`Mf@>)ac$5kBQRAOBrQ^aH!Czo{u>1PM2T7 zOfKzEP^0C@rZQh)ix>5%(UEE|wnz&(q~4yP(;G}2)o*GnV(daXr;TgEgED( zWaTqoFjwB4Q1-Z)+|8pltzY19-}(yh!H!bvXilzn3n6>c#r%n zmHmlJ-Co2uoNh$OiNUvD8xpUmcZ8EHefJTkW30IeGkijdMKcn*ttUbWr~mu?UarM+ zMA%;U*fsQe5-MZkVP11hVl3{%)IyvLh3XwA(i#P_>pnmaML!QX02imyu2W5k^#&83 zfP44wrtj}+z;o9v-DBgR_iis@tw3El@?FVKZl;Jh?J$Fk0$LB~HaABBubGL!R|TpH z35RRTo0Y&>54tADca;{~$_r`8tE@^to1AKOq8@^lX@(!I12rE}T+#w9)}C}_{3CFy zqb2#kKQ19-o#LZiO>GN=e}0pjZMxuwH0o~~hw1&e$uU*@`lIc~XEMq|5#fTUrD+Ky zZfOU8fD3ya49Yc2sn)GLL7z|0YqR6W8*xJy7uYo}=DS*TNX8gmr>biiX9iy;4Py$p zX1~~@aoTJcGAqU0M6onHDawzUj9(^N4cEP_DqFCLv&$H^4)kuN#iv7t#MG*%yEVdn zpg)atj`hTR#aB~3`w*^MS0Ar)qE^AGA+c|d$+M@g>Dig|zR>gJR>)JxPB>cmytl1l zePe}l$TT97d^f^kGLpPi(O}fJ{!c7KM!iC7l~T0=p1T-}CRzho2fBogn|CVZb{j7h zOu-grq~svHO>zG; z7H>%7L+XBL9o9<7wpU=0T$T6J1#YluDa?kMf`&gW$0TY~B0awK{isf_6dkGE0lCR8 zaeC{H1CqB`dXE(mHKE#Fkoj>6=g)yI$KgOiI%$f@3D1)B%XvyabiD;c`qnJD5h@=3on_%DUcG|5THgL7TcmH>C>Lku2e;CGb!uo`u08 zO$Lp1b5TUuI(-ngQFXYk9rvf}MY_ofD%%vz018Z=i^3yn}?_@lh3LbH1Dxz!MuvRqu-L@h+0t3r{-E6SI{98JYei#FUP!U+%{{&3 z`}oGmL12~IaFRzw8%s4SY=fboAE*Ju=y0=C9C=@9Xk=zB6~R^QsI$DEEWQYf$gH70 zbhwi33YK7)Xv^;AnNM}s7u8WW4|6q%F;&qIShu&`cSC44z52rVW!xzug@*lq z_R0rGf^XOvOQi)&bCKA;;DMa_mUokP>Zi)$z?6ht>H{aTDix8WA%@%rp>7bAmOzHt z$6mQIqukjRha{X&Ndda|{)g!5SY-Qbqttx!p-mlLGP}QVxVRqh&dHylQqK;^)t#si zi>`3<6jzcnyq%6cJ1ePVXp5>74UXrxFzA3aTDjAA*GIDc>y~|PBXyeJV?nsC`VkRX z&@1+bXcys~rf&0|;cMZ&cMUo*J@3+^4X2w@*6ElTbX2+ck};}|c1(9u#W8Gz!u@?7 zk>#AI$S&uN{oQWaX%)cL-`(L2#WK(s1r=U+=^%)$^P&TlXwCM|jcAFhuM_&+qDQu! zELFAdv-(^Zm+epzIIC^Dit*zFC$4*lEBK1~mt5^%CbR2|EEu@ik(E=gq^xVjP*uq*V$rIsd*D4` zR9e-TxU4&V!usnj#o2rEKe-xa{*%k{=Q8k4#PaP_$nXD|E8Y6_r>4QSYqIvD{S7oE z{t9Z-j6{& zh{-eCT<|A9V|4r7%CF$N*R>q*ZEzhu#(?Z4m!&>pyG?q!EpiKXlB+Gc+a?VYr5p8_ zAWz2dSqq(y6!U0P@eIXydj1)p${Tuz(+3g6>G)}hnIe?KmYASoBZ$yv&$t{XL?Iv30?9O`Y~U z2E2P_jY$n|W{3($7d*}N^jrH4!3ju7;S-HpV#A$x5*`)E7xn>u@K zNVkQjdEdl`q|Y2hMhW|mgnPyziZ+}csoP%A3lXcTp1-I>eOmth1>xQMw`q00rOqrv zMwi}Fo>rK7ktdh~ zlYOO}uycmDx|za{!cx3{ME*xpS8v7NntHnms>fXH|J3XNsXhA#uz|e=O|l7IjC9)E;9XYP zV@BjJbg0HjKAo|hnDaKA)VxaA^|mSJ-ml0yU!ruHKv6XliZbfLcW*K|c`v+I1`2zi z6?(%&YDJm_!Qrwf2>QaYW>iccDa*-`TDEVKp%KP4GDP576Ag%(fC@5B3h!bk)$H>p z{w4+vG$B=tLZ%H`)#iK|a+K1`GQtNrV2hZTeD+zMmA};FYhsz&TzeAwF39^E$}l4^ zt)g>*UGoG0y{V5cDoZN`Qh0&Ub;0{7$r#ls~{w zl(k&?S*kg^BUkcXmg5k$P_B{ zk7|MjbHgyJNNv1H`^o(lA*yl15erxhn<8B(45*67{;qDpUXm@mY}&(32BZe?Vs@al zdi?ar(mFC7LAH@L>M0~u&~*r_R@!Igv>gpWJm#ooF=S~(I5weZ-8nGshe}43Zs4Gl zwn;$TxGukhK4Utot(y8v5gOic{$w_aB#O9JS>LwK579In{{E6X5_38DmV0*3$noS- z7||ztGb7aaKYU{Su-1G^MIRINJmQLld14zCT~tn5rjVgD9$Y_dy*ZvKI(rg8UXs2G zSy@N{P0UlDL36df6?A>`S~_@Vw*zsWx$S_(c9L07(|o#-N}%JHi~y`ewjr0c6%!bO zu0#CM5R_Dh$dis>Yf0QF$rup)1Rva%E88){88t7sjQ{PvRj987kE`Ll6E7s#)+N$a z5I2FgB~CZxJgZ0M{p%P=uQ1ODvvZOa5Tg<-VzAA=tBtPbr-BIxV})#cQ*$S5;qV?6 zHbj2pow!dK2>tHXuCiZTGdE+a6~gKexLg_5yJv1^4A!(5yc(QuiWC;CM}}ekI$(Tn6V#%v?P*R<%=UwZ zj60eXQl~m+@hXr0<9%|aX~(|>D~5_R+2XsI&K^Vc(eY9UtEuTqEX=Lq+Z0n`vkc6- z!pMHj(>g^<=$17aG{Ca z;U;o{hCE7i4ediJKeQP-SYgP6;0Zk;g5$`LrD+Pw!_SbE5EP5kB#o0n;=7Qo!%Kz6iqUCm#*kbQ1{2SP<{TzMH=Hl&CTO2N zeAZI{#^uc}fFL7_Xz=yiLk@de$1l7a@rb{*dGTwaJLd%O4>!8;_vH@Ts~BVsRCBRI z|I*3DKrSSybqnFAsozZ1@USH5ws4y+|+ zSl-l~Evk{uM?2iLwdUc?IJW#rOAVK-%HoENL3Op{FP_2cmT_CflUz|LY!7cZ%>_Z6 zTt)UQSLFxr8QI{IS%MifVNa2(OGYSX1=hStdV15YYbgjGQQ+xTgoxxeo$prL#^t9@ zhfPEoOzU^Sk??{=BC zzTQWn;^y^3heP(WZ4NZS>sa!$Gs8O&0YeqJo zsC*TJGzi|j7{q_VE`-U+*tgt>?X1ad!ds=lw5E|i(GZn2o`2Z^w6^r6th$^pk6XA&hD?yIIP*gX`@1{oL5^jiC z>J|_4qcv~zOv7R5$RI)Y$zq5mHJT3TcBrS>xe867FPkr|J{Xz$D1p1_$PO5}UAQU4 zS)xtkLtPvPBK1ybtY0S6JR9Xi=b$n(+s_CyX(hDR*m7h9Xo#+N<|`?Fj%-7TVot`U zvC~n+WHR8>HCien#nYVRb9=j8rD;k@pOxe5ej6^tqPfD;s{Cks>TiI}FD;?eM+RwU z<K)8 zvarG1Sfa}KQh;}!`oD=S5C^$LM(AasZPwK0KIN=zoGkr>w+3?xdC;nN{GEB-1DY7F zSiqj4*+uA@HRr|!G1$t5V^@WNFFa1(--7gkG-hs5L~%4{Ca-t0Ah^E|&G%1to?}1k z>{VUeq8S5KsXn-=Ws03Jet=Us_bel7!pC%AJn%bl;#Ce&jTxTsaU|AUHm!?R`?bwu zjUCK7I8S!~jW_pjxEvKd^J@|E&YJclhSN=3RRR!xz0g~&{X2_x zU*o(?fd3qY#YfRT)?+k|P%TijpOj!ST2$qx*ty@B+TCA1U9j17qo}2@S(Lfe*94D5NW2xVTuFZV$KTL@`|~Yiz7NVI zm~D!CoQ$q-bl^S9%6?&S7X}YnYPAVoo6&p^v0yRb$CSvpoMi}=1+szBpXX2s_-($Fk1_;%=H>{x63LUHQb(^@&_{l;PN=~48LS-!T= zgwQkZO>^(#|2GoesqS$Q;D852wO9V8N1M#7@xQoZ`Kw8vp55>Qy?W#Qc>ka5giI(t z_GjdLyEH6@K8>u@zK{*BoGkrio~#sYWai_<(wwKFs>g5eWkFyR-v&87F6aW$`yF}& zJ+rXJ-T!vCk_G;~|q78}6+6 z0)p*b&Qz4M@Ul~C0Wbm4%_A~OREPamuCJwi~u zL2!Y&tTnHaKl9(Q6hiiz;4K)jv|E`+#}ol5XO7GqrY4Vxl+kT#8)4`dOP3BScGRLt zu%Lv|D0PK-sjl0|V7O>HG;MA_Nr3Os%eIWRPfmbIg5sEkq1rkT7!6Gst!!UyUmb1F z?vAgT2xpgKU5DT+;F&nD*!VryGM9fMczX=h#W-pKoS|A(XrC#frme2{JPf0x=QkP^~D1v|_ z`qJf9?7*p2BQ^Fl2fBe^n?)b$gh@K7#z1svU^N1DJt78G*_=YfrM^Fuw_}KFbXOL_<)-jo{ zz5CjqrG0ry6$=QGO?FK;7TscnGej|kzsDmbvH{oFOx}~t=b1+(I?1YZ42J2YX=;#; z1v?vR(5|nQbRp?R7Y-<$5{C`qVp7yaK{OmDSh~+XtKntwHQRScCu3`YK4|G_`@+il zC4O4CYxzvNGzAox6DLn`hDHXaR=!zt>Hqux>!M@z(X>Y4wTHdIbizRQUYp*abr;KS z*JSEEL*mF^91Cx-gDV4DJ(-uyOBpt|_WGXslP7l%mja5P5agx7o^Xis6~|O?N7PUD z`*#r?{{ZU$6-6;B+;sIOue1O%>Ec&7x;U`~QqT}H||>ESAR4Kxb3l%CLvX(49= ziW-DYIz>(MK)k`KgQk@{uPSr{w&sKD!F|#aqLtfBAq${ZOe23oJ!`Lxi+GuXj;*%4 zu1`|6%eVjfXZ$5i0#Wk{PEuU(6vC>P4xF@|4R;UQesy3K3=nafoG(Fd1@gFMeu)T^ zv-#DbDk~H;YHVZ@VX06Kp{QK4p~djDbV|g;^rOL?L!<&QX#)XpS;+tOmw030+oKyN z+A$eEZ&4b&KplO;H#@w(`o6D7y_dlMyFu^&H0}L=#?VD17Rz9MpEw!+0br8jW&Jl& z%*TBkrL_$qE4#Do#uoRP|2L!k{}-!nPU1KrQ+hKZ{6A&#qD5b@uxJh%uneh^L)Iba zNnK$PuI4X;s%sr~Z-gli4u|6r1Qk<_1$V_WA3-BEes>i|yHe z01J45^2>U^r=47h!oFl>%BPgPS4|k|JwZ3E*>l`x?~-jE18nJ0f0nO^iB#mjZ!g|g zaI%ab6`Ba35ejBdwlu-%UxxuLvn<&9ISApL2*-|=1xh#cmLzCuyTyHlHBK<<`1psp zJR!}+tbIYrr)iRU=i@A!?WE zS`)wv1S%%+OtmWmPz*2+eMvq66~J-x^|f5Anw+@JEM$2co-`Hg>svN%)_fxurR2dgu54W zp}KpQz0+yefRKkCEQzx4d=kJ{zVEj}>uSEy9o*48SGkUaZ-b65Jz`+E69Z7otJX8cPpd zB^rim3ih7;E1_uzS$-%nAQ&jr-xCynQ@va>dA?r~{KNN^m}YReqjI5ptkM#%a9Vf)-cm|~wEYxllr zUx5(Z(AW0(m{As#y!*dul47AAsdm~HF`|tv42^dO4CvcAFF%dgVRp1tZar9j8fnj2 z^=J!k=3S8ah4KLU9QtuVIUar!liOjc6R)P3ehJ3^p1j~ak^~(3uWjuA;{0#MkK%1O z#S7Dtjn-YDa(nkfRS~3;=HJ!JAHwyK0=8RQ2ccC4#Vm6&`u!$%d6$w!)Es=>yzR9) z_{@>#!27_Tn1-w698^U;%R8(pQr>k*vz*o{@Bp&^A!EOFs=3=H{>NWbh-O}@I`hh1 zv=T)Qee~!c{%@E6MsnVgC}O7V)%GM%{fp3TB_}91uaw}LSd{(lh~adW=S zk}L@UJ<|~@Q~57vEh|1m>tluhBaK2y*0Q~I0KQE6>~!*qQmmad97=RFRU{}Oip>il zYBry$?P~sTEr#p~nxE#TdmJmUMl;At6&x@ip3ELgB6_bD_?=}N$=P_34_8Oujmm_J z1z*Q%{-7632*%5UXxOxnhP;Z`W~NxHr*`Oy7G0yAd? zD*~2+VqtX@RGau(sAYy6cPQ-{w1T2Eb9krdUx!-g{XkDhlq$U3nGkjg#`o>28}$x* zj+sBdNFS?QVI*SK^0=UrXIABB`%IO2!IxGuWSuy;L%P{+QYKsTw$|)zk~glySFcj3OxbHYgEUeh0Vwsb7A>bvCT%xhfTrUW#ja zkycLv1R~KK5!wwlQ~KRGjHIu;k9C!48gk!|9Ii!bTURPa+S#3f8euRn_vbDP#dpXqgd8Ax6f=$<(;iH%qE?g^=?;pV0f8GPowy~~*v92RW)tf9k($lM7 z$xms)54La8iP7BpcJKRdA70d#RH~txKa8#Ze*bsm{;y2-CKoIU#y)}zHt`NStDbI0 zLL}E=RAwVz1_d3ZUALo-x=9zjxl3-X6c1-I=d$?=|NngYT^oVKShmq6pzsAnFtH$; z;ILFmkZDdS!d3l$+W}nOKY#~uF|9d>bG@Vk!|q4*x3K?F{n!6`cq{c5{;LLD2cqpC zPuRg`Y^)AB@kAj4t;gS-UX?GX%3pupeeC*L`VhPL_v$Hk`=k2v= + +# 2. Native Android (Kotlin) From cd4ee4af1f48a80db52506b5cf98cc7eca629cb1 Mon Sep 17 00:00:00 2001 From: DimaDemchenko Date: Thu, 30 Jan 2025 14:43:54 +0200 Subject: [PATCH 03/14] Chore: sample of article --- ...P2P-Media-Loader-in-mobile-app-for-free.md | 179 +++++++++++++++++- 1 file changed, 170 insertions(+), 9 deletions(-) diff --git a/src/content/blog/Integrate-P2P-Media-Loader-in-mobile-app-for-free.md b/src/content/blog/Integrate-P2P-Media-Loader-in-mobile-app-for-free.md index 6e86f67..ba2d089 100644 --- a/src/content/blog/Integrate-P2P-Media-Loader-in-mobile-app-for-free.md +++ b/src/content/blog/Integrate-P2P-Media-Loader-in-mobile-app-for-free.md @@ -6,22 +6,183 @@ title: "Integrating P2P Video streaming into Mobile Applications: Flutter and Na description: "In this article you can find ways how to set up Mobile P2P Video streaming" --- -In the world of video streaming, low cost and q content delivery is a top priority. Our library [P2P Media Loader](https://github.com/novage/p2p-media-loader) offers an efficient way to reduce the load on traditional CDNs by leveraging peer-to-peer connections. With more users viewing content on mobile devices, integrating P2P Media Loader into mobile apps can significantly improve streaming performance and scalability. +In today’s digital age, video streaming has become an integral part of mobile applications, from social media platforms to on-demand entertainment services. However, delivering high-quality video content efficiently and cost-effectively remains a significant challenge. Traditional Content Delivery Networks (CDNs) often incur substantial bandwidth costs and can struggle with scalability as your user base grows. + +Enter Peer-to-Peer (P2P) Streaming Technology. Leveraging the power of WebRTC and peer-to-peer connections, [P2P Media Loader](https://github.com/novage/p2p-media-loader) offers an efficient approach to video streaming. By enabling users to share video data directly with each other, P2P Media Loader reduces reliance on CDNs, leading to lower bandwidth costs, enhanced streaming performance, and improved scalability—crucial benefits as more users access content via mobile devices. We found a way how to integrate the library into mobile application without maintaining and supporting a lot of different code for different platforms. We wanted to have same codebase for all platforms and we successfully managed to do it. Both Approaches provided in the article are fully compatible with WEB P2P Media Loader integration. It means that users form browser will share the traffic with mobile users and in reverse. -If you want to test any of approaches keep in mind that ⚠️ P2P (WebRTC) may not connect to the outer world if it runs on Android emulators due to its virtual machine network configuration (NAT). Please test P2P connectivity on real devices. ⚠️ +**Important Note:** P2P (WebRTC) may not connect to the outer world if it runs on Android emulators due to its virtual machine [network configuration](https://developer.android.com/studio/run/emulator-networking) (NAT). Please test P2P connectivity on real devices. + +## Flutter Integration + +The Flutter integration approach uses a **WebView** that contains a video player with P2P Media Loader integration. Below is a more detailed breakdown for clarity and maintainability: + +To setup a video player with P2P Media Loader using webview you need: + +### 1. Add the WebView Dependency + +We'll use [InAppWebView](https://inappwebview.dev/docs/webview/in-app-webview/) in our Flutter example. Update your `pubspec.yaml` with: + +```yaml +dependencies: + flutter_inappwebview: ^6.1.5 +``` + +### 2. Prepare an HTML File with a Player & P2P Media Loader + +We need an HTML file that includes: + +- A video player (in this example, the Vidstack player with HLS.js). +- P2P Media Loader to enable peer-to-peer streaming. + +Below is a minimal example of an index.html file you can store in your project’s assets folder. This file uses the Vidstack player and configures the P2P engine if it’s supported on the device. + +```html + + + + + + + + + + + + +
+ + + + +``` + +In your project’s root pubspec.yaml, ensure that the HTML file is declared as an asset: + +```yml +flutter: + assets: + - assets/index.html +``` + +**Note:** You can also host this HTML file remotely on a CDN or your own server and load it by URL. + +### 3. Create a Flutter Widget with InAppWebView + +Below is an example of how to create a simple widget that loads your index.html into the InAppWebView: + +```dart +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + void _onWebViewCreated(InAppWebViewController controller) { + // Load the HTML file from the asset path + controller.loadFile(assetFilePath: 'assets/index.html'); + + // or Load the HTML file from URL + // controller.loadUrl( + // urlRequest: URLRequest(url: WebUri('https://example.com'))); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: AspectRatio( + aspectRatio: 16 / 9, + child: InAppWebView( + initialSettings: InAppWebViewSettings( + javaScriptEnabled: true, + allowsInlineMediaPlayback: true, + allowUniversalAccessFromFileURLs: true, + mediaPlaybackRequiresUserGesture: false, + ), + onWebViewCreated: _onWebViewCreated, + ))), + ); + } +} +``` + +### 4. Test P2P with other peers + +After integrating the P2P Media Loader into your Flutter application, it's crucial to verify that the peer-to-peer connections are functioning as intended. + +The simpliest way to test is to run the flutter application on a real device and open our [demo](https://novage.com.ua/p2p-media-loader/demo) with same url. + +**Steps to debug the WeView** + +When integrating P2P Media Loader within a WebView, debugging is essential to identify and resolve any issues that may arise. Below are the steps to enable and perform debugging for both Android and iOS platforms. + +In the HTML files you can set up logging. To be able to see logs: +update initialSettings of InAppWebView: + +```dart + InAppWebView( + // ... prev params + isInspectable: true, + ), +``` + +1. Android Debug steps: + When the app is running open chrome with url chrome://inspect. Choose the webview to inspect +2. iOS Debug steps: + When the app is running open safari: + +**For a more extensive example that gathers P2P engine stats and manages P2P state according to app lifecycle, see our [P2P Media Loader Flutter Demo](https://github.com/Novage/p2p-media-loader-flutter-demo)** -# 1. Flutter Integration +# Native Android (Kotlin) -So the Flutter integration is about starting a webview with a player inside it. +In this section, we introduce our [Kotlin library](https://github.com/Novage/p2p-media-loader-mobile) designed to leverage the capabilities of [P2P Media Loader](https://github.com/novage/p2p-media-loader) and WebRTC for efficient peer-to-peer streaming. -So we need to have a html file with a player on full width of the screen, also we need to setup p2p media loader in our html file. In flutter we need to setup inappwebview controller and load the file. +Our native Android library is crafted in Kotlin and is fully compatible with [ExoPlayer](https://exoplayer.dev/), one of the most popular media players for Android. The library is also designed to support other media players with minimal adjustments. -You can check code example in our github repository -Here is a screenshot of our demo: +How the library works? -Flutter Demo Example +Inside the library we launch embedded server that will respond on players request. To setup P2P Media Loader we decided to use a WebView without binding to a view. The approach with WebView allows us to maintain the same codebase across different platforms. Moreover, with our approach there is no need to write custom WebRTC implementation for Native Android, since in WebView we already have WebRTC. This means that our WEB integration of P2P Media Loader is fully compatible with Native Android integration, as a result consumers may have a bigger mesh of peers to efficiently transfer traffic between each other. -# 2. Native Android (Kotlin) +**Note:** The library is in development, so the API might be changed by the time. From 5f2d83b544813f7fc90a9619d0bf014973feff53 Mon Sep 17 00:00:00 2001 From: DimaDemchenko Date: Fri, 31 Jan 2025 17:30:37 +0200 Subject: [PATCH 04/14] Chore: Improve article about mobile --- src/assets/kotlin-diagram.png | Bin 0 -> 42988 bytes ...P2P-Media-Loader-in-mobile-app-for-free.md | 188 --------- ...Video-streaming-into-Mobile-Application.md | 362 ++++++++++++++++++ 3 files changed, 362 insertions(+), 188 deletions(-) create mode 100644 src/assets/kotlin-diagram.png delete mode 100644 src/content/blog/Integrate-P2P-Media-Loader-in-mobile-app-for-free.md create mode 100644 src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md diff --git a/src/assets/kotlin-diagram.png b/src/assets/kotlin-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b6d89496c363989ba94ca70b04ce550b4bfdf5 GIT binary patch literal 42988 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ð5~Vr71BMiJvXW+#N|pAS^3v;D0SC7fU`IsmAk z&&Cq($@4yG5}7=SGRWf*65`O+{Y_Vaf%HDf7`SuC;7|7W?n zPlyE%-J0Ctdkw#um8Mo#Ee~{3?g|Wa(JX^cf}p{3P6Y)&Wz?G=6YTO_T*2$L=kM6K zEXg@WQ{TS*4mQN}%)7jrlk(rA|!(f=gESRF(DW4lJ>+*bh$m&;M*+f>A)wR7`>2 znx1_l5Ktc`eukJ8kgYw?deZNk&loMBj~8POkC;ffjl2Q&`TS7)qna?Hd1QnZlY1jR z-k3Px{DGF1v$J#K$OtJ^3e^UMjE;`8=gyK)Ya_=o>=+D|FNIE-+JeKupbJKx1yog4 zdyD!4JLAeeK=Yu<_C2yb$(U}q%8oI;)y-hO7f9RuAjyRTI)3f6X#k!yCU8rE>=}q{w-MJ9D61V>gPawYm`Ee( zNHjLFb{F?w{LYF(I9yqvb#_|sU8e=4_@!Obwh^pGMN+`5uHoGD{ ze{`NSYbpH)4R-dGoH^8Qbfs$0?YvOPHwTA{(pHKf$OhP)MrO80boJXBH_Vnh7v?7B-QF*ya zIuZ?`E33x{o-IAJH2%WbhgXMM7H-*^hPvwpE)~{%#sc#Mf>KDkzsnWk3hUxwS?`Dv zs&>3=8OG91iBaAhsxB@9w82Dzg7=Gyi`%>OT@Kn%AiNY@Tx7`^u!l}h;+ULII{15q zriw;NIaJUeRAgt{0bu`(!NfN>(GpGSO9S3|cKVzJK22?SH9FodD+qW2T_4Wl>Uzw@ zZ+cGt$DS|V`KQCr(~aoONbAewr6uV{yn-qrdh6Ycs9ibn|hc&a0C zFFz>6>#e`PtbJJkmC`~tKsRQl9lA6&%99PhwVl^>WHB*}_|J7ySpu0S^+v*l^VRye zo%V(@zJvjiSN)TK%(7~*ONhri0_ z;NZ*B(gq(!$>#&F&byv^GLQW%*APa`23}=?Qn9;@1||Atfk5C;-{!0_S}%V|V_JO| zXl`c_Zc-qke&pwq`$lt;6js7JG_G^M0AmL8P>O;90S%^ZOHQp`#ZuEt>id+uP3hFbnHv9|{R>W7Fni{MGVLK+^ z<7>SbIag*P1c1cIC{Ahnn{%0o7VM;UcbATfldtWQgkaQboi(|(hBa(b@_L4T!hh@5 zXUI=4u3ZnU_4eH8{^Mk2Y1s`pHD1!=;XA%KpeEww?6?79-F<^s40&H?ZGTKoij`f=EAg17g~DGOXrs%S%E0+14*|!dd}Eu9V$Uwym_q&|yNfVyy)~A@ z70?V39dD=s|D?d8>TvkB!*U~G>7(*5j& z0X)qM&ud+HuEJj8Z+DJkBppm%7S4rS_bfdlgd@wWV9N?tC%+~5pj+fHJd;U6QPq{> zlr8!ii8?(&N2KZG8dcj+!0lq$oVDvoGEt%aP`uooOv0UE1yP4fRyMl7Us954|IR5w z!KB8^tqF_$gNk_giWu`e(tcA-hT-HU2>(| zQY_6>`Rv=6EZ9J0Y1@O-+a33EM@s{Mm-(iM8~qv4DJc!`5$nBh^;oH!enR_h&{tJQ zhg7V{Sub}b - - - - - - - - - - - -
- - - - -``` - -In your project’s root pubspec.yaml, ensure that the HTML file is declared as an asset: - -```yml -flutter: - assets: - - assets/index.html -``` - -**Note:** You can also host this HTML file remotely on a CDN or your own server and load it by URL. - -### 3. Create a Flutter Widget with InAppWebView - -Below is an example of how to create a simple widget that loads your index.html into the InAppWebView: - -```dart -class MainApp extends StatelessWidget { - const MainApp({super.key}); - - void _onWebViewCreated(InAppWebViewController controller) { - // Load the HTML file from the asset path - controller.loadFile(assetFilePath: 'assets/index.html'); - - // or Load the HTML file from URL - // controller.loadUrl( - // urlRequest: URLRequest(url: WebUri('https://example.com'))); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - body: AspectRatio( - aspectRatio: 16 / 9, - child: InAppWebView( - initialSettings: InAppWebViewSettings( - javaScriptEnabled: true, - allowsInlineMediaPlayback: true, - allowUniversalAccessFromFileURLs: true, - mediaPlaybackRequiresUserGesture: false, - ), - onWebViewCreated: _onWebViewCreated, - ))), - ); - } -} -``` - -### 4. Test P2P with other peers - -After integrating the P2P Media Loader into your Flutter application, it's crucial to verify that the peer-to-peer connections are functioning as intended. - -The simpliest way to test is to run the flutter application on a real device and open our [demo](https://novage.com.ua/p2p-media-loader/demo) with same url. - -**Steps to debug the WeView** - -When integrating P2P Media Loader within a WebView, debugging is essential to identify and resolve any issues that may arise. Below are the steps to enable and perform debugging for both Android and iOS platforms. - -In the HTML files you can set up logging. To be able to see logs: -update initialSettings of InAppWebView: - -```dart - InAppWebView( - // ... prev params - isInspectable: true, - ), -``` - -1. Android Debug steps: - When the app is running open chrome with url chrome://inspect. Choose the webview to inspect -2. iOS Debug steps: - When the app is running open safari: - -**For a more extensive example that gathers P2P engine stats and manages P2P state according to app lifecycle, see our [P2P Media Loader Flutter Demo](https://github.com/Novage/p2p-media-loader-flutter-demo)** - -# Native Android (Kotlin) - -In this section, we introduce our [Kotlin library](https://github.com/Novage/p2p-media-loader-mobile) designed to leverage the capabilities of [P2P Media Loader](https://github.com/novage/p2p-media-loader) and WebRTC for efficient peer-to-peer streaming. - -Our native Android library is crafted in Kotlin and is fully compatible with [ExoPlayer](https://exoplayer.dev/), one of the most popular media players for Android. The library is also designed to support other media players with minimal adjustments. - -How the library works? - -Inside the library we launch embedded server that will respond on players request. To setup P2P Media Loader we decided to use a WebView without binding to a view. The approach with WebView allows us to maintain the same codebase across different platforms. Moreover, with our approach there is no need to write custom WebRTC implementation for Native Android, since in WebView we already have WebRTC. This means that our WEB integration of P2P Media Loader is fully compatible with Native Android integration, as a result consumers may have a bigger mesh of peers to efficiently transfer traffic between each other. - -**Note:** The library is in development, so the API might be changed by the time. diff --git a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md new file mode 100644 index 0000000..b0c48e9 --- /dev/null +++ b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md @@ -0,0 +1,362 @@ +--- +canonicalURL: https://novage.com.ua/blog/setting-up-P2P-video-in-mobile-app-for-free +author: Dmytro Demchenko +date: "2025-01-29" +title: "Integrate P2P Video streaming into Mobile Applications: Native Android and Flutter Approaches" +description: "In this article you can find ways how to set up Mobile P2P Video streaming" +--- + +In today’s digital age, video streaming has become an integral part of mobile applications, from social media platforms to on-demand entertainment services. However, delivering high-quality video content efficiently and cost-effectively remains a significant challenge. Traditional Content Delivery Networks (CDNs) often incur substantial bandwidth costs and can struggle with scalability as your user base grows. + +Enter Peer-to-Peer (P2P) Streaming Technology. Leveraging the power of WebRTC and peer-to-peer connections, [P2P Media Loader](https://github.com/novage/p2p-media-loader) offers an efficient approach to video streaming. By enabling users to share video data directly with each other, P2P Media Loader reduces reliance on CDNs, leading to lower bandwidth costs, enhanced streaming performance, and improved scalability—crucial benefits as more users access content via mobile devices. + +**Important Note:** P2P (WebRTC) may not connect to the outer world if it runs on Android emulators due to its virtual machine [network configuration](https://developer.android.com/studio/run/emulator-networking) (NAT). Please test P2P connectivity on real devices. + +## Native Android (Kotlin) + +**Pros:** + +- **Seamless Integration with Android Ecosystem:** Direct access to Android-specific APIs and features, enabling more comprehensive customization and functionality. +- **Better Control Over Media Playback:** Utilizing libraries like ExoPlayer offers robust control over media streaming, buffering, and caching mechanisms. +- **Access to Latest Android Features:** Native development ensures immediate access to the latest Android platform updates and features without waiting for framework support. + +**Cons:** + +- **Platform-Specific:** The native approach is limited to Android. +- **Dependency on WebView:** Integrating P2P via WebView may introduce potential performance bottlenecks. + +In this section, we introduce our [Kotlin library](https://github.com/Novage/p2p-media-loader-mobile) designed to leverage the capabilities of [P2P Media Loader](https://github.com/novage/p2p-media-loader) and WebRTC for efficient peer-to-peer streaming. + +Our native Android library is crafted in Kotlin and is fully compatible with [ExoPlayer](https://exoplayer.dev/), one of the most popular media players for Android. The library is also designed to support other media players with minimal adjustments. + +**How the library works?** + +![Kotlin Library Architecture](../../assets/kotlin-diagram.png) + +Inside the library we launch embedded server that will respond on players request. To setup P2P Media Loader we decided to use a WebView without binding to a view. The approach with WebView allows us to maintain the same codebase across different platforms. Moreover, with our approach there is no need to write custom WebRTC implementation for Native Android, since in WebView we already have WebRTC. This means that our WEB integration of P2P Media Loader is fully compatible with Native Android integration, as a result consumers may have a bigger mesh of peers to efficiently transfer traffic between each other. + +**Note:** The library is in development, so the API might be changed by the time. + +### 1. Add JitPack to Your Project + +To include the P2P Media Loader Mobile library, first, configure **dependencyResolutionManagement** in your **settings.gradle** file: + +```kotlin +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + maven(url = "https://jitpack.io") + } +} +``` + +### 2. Add the Library Dependency + +Add the following implementation line to your **build.gradle** (app module): + +```kotlin +implementation("com.github.Novage:p2p-media-loader-mobile:main-SNAPSHOT") +``` + +### 3. Configure the AndroidManifest + +Ensure that your app has the necessary permissions and configurations by updating the **AndroidManifest.xml** file: + +```xml + + +``` + +### 4. Allow Localhost Connections + +Create or update the **res/xml/network_security_config.xml** file to allow localhost connections: + +```xml + + + + 127.0.0.1 + + +``` + +Make sure to reference this file in the **** tag of your **AndroidManifest.xml**. + +### 5. Use the Library + +Below is a simple example that illustrates how to integrate P2P with ExoPlayer: + +```kotlin +class MainActivity : ComponentActivity() { + companion object { + // URL to the media manifest + private const val MANIFEST_URL = "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8" + + // JSON configuration for P2P Media Loader + // See https://novage.github.io/p2p-media-loader/docs/v2.1.0/types/p2p-media-loader-core.CoreConfig.html + private const val CORE_CONFIG_JSON = "{\"swarmId\":\"TEST_KOTLIN\"}" + + // Port on which the P2P server will run + private const val SERVER_PORT = 8081 + } + + private lateinit var exoPlayer: ExoPlayer + private lateinit var p2pml: P2PMediaLoader + + // State variables to manage UI state + private val isLoading = mutableStateOf(true) + private val videoTitle = mutableStateOf("Loading Video...") + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + + // Initialize ExoPlayer + exoPlayer = ExoPlayer.Builder(this).build() + + // Initialize P2P Media Loader with callbacks + p2pml = P2PMediaLoader( + onP2PReadyCallback = { initializePlayback() }, + onP2PReadyErrorCallback = { onP2PReadyErrorCallback(it) }, + coreConfigJson = CORE_CONFIG_JSON, + serverPort = SERVER_PORT, + ) + + // Event listeners for P2P Media Loader + p2pml.addEventListener(CoreEventMap.OnPeerConnect) { params -> + // Implement logic to handle peer connection + Log.d("P2PML", "Peer connected: ${params.peerId} - ${params.streamType}") + } + + p2pml.addEventListener(CoreEventMap.OnSegmentLoaded) { params -> + // Implement logic to handle loaded segment + Log.d("P2PML", "Segment loaded: ${params.segmentUrl} - ${params.bytesLength} - ${params.downloadSource}") + } + + p2pml.addEventListener(CoreEventMap.OnChunkDownloaded) { params -> + // Implement logic to handle downloaded chunk + Log.d("P2PML", "Chunk downloaded: ${params.bytesLength} - ${params.downloadSource} - ${params.downloadSource}") + } + + // Start P2P Media Loader with the activity context and ExoPlayer instance + p2pml.start(this, exoPlayer) + + // Listener to update UI based on playback state + exoPlayer.addListener(object : Player.Listener { + override fun onPlaybackStateChanged(playbackState: Int) { + if (playbackState == Player.STATE_READY) { + isLoading.value = false + videoTitle.value = "Big Buck Bunny" + } + } + }) + + // Set the Compose UI content + setContent { + ExoPlayerScreen( + player = exoPlayer, + videoTitle = videoTitle.value, + isLoading = isLoading.value, + ) + } + } + + private fun initializePlayback() { + val manifest = p2pml.getManifestUrl(MANIFEST_URL) + + val httpDataSource = DefaultHttpDataSource.Factory() + .setReadTimeoutMs(15000) // Read timeout + .setConnectTimeoutMs(15000) // Connect timeout + + val mediaItem = MediaItem.fromUri(manifest) + val mediaSource = HlsMediaSource.Factory(httpDataSource) + .createMediaSource(mediaItem) + + exoPlayer.apply { + playWhenReady = true + setMediaSource(mediaSource) + prepare() + } + } + + private fun onP2PReadyErrorCallback(error: String) { + // Implement error handling logic here + } + + override fun onStop() { + super.onStop() + // Disable P2P features when the activity stops + // See https://novage.github.io/p2p-media-loader/docs/v2.1.0/types/p2p-media-loader-core.DynamicCoreConfig.html + p2pml.applyDynamicConfig("{\"isP2PDisabled\": true}") + } + + override fun onRestart() { + super.onRestart() + // Re-enable P2P features when the activity restarts + // See https://novage.github.io/p2p-media-loader/docs/v2.1.0/types/p2p-media-loader-core.DynamicCoreConfig.html + p2pml.applyDynamicConfig("{\"isP2PDisabled\": false}") + } + + override fun onDestroy() { + super.onDestroy() + // Release ExoPlayer resources and stop P2P Media Loader + exoPlayer.release() + p2pml.stop() + } +} +``` + +More examples are available in the library [repository](https://github.com/Novage/p2p-media-loader-mobile) + +## Flutter Integration + +**Pros:** + +- **Cross-Platform Capability:** Write once, deploy on both Android and iOS, reducing development time and effort for multi-platform support. + +**Cons:** + +- **Dependency on WebView:** Integrating P2P via WebView may introduce potential performance bottlenecks. + +The Flutter integration approach uses a **WebView** that contains a video player with P2P Media Loader integration. Below is a more detailed breakdown for clarity and maintainability: + +To setup a video player with P2P Media Loader using webview you need: + +### 1. Add the WebView Dependency + +We'll use [InAppWebView](https://inappwebview.dev/docs/webview/in-app-webview/) in our Flutter example. Update your **pubspec.yaml** with: + +```yaml +dependencies: + flutter_inappwebview: ^6.1.5 +``` + +### 2. Prepare an HTML File with a Player & P2P Media Loader + +We need an HTML file that includes: + +- A video player (in this example, the Vidstack player with HLS.js). +- P2P Media Loader to enable peer-to-peer streaming. + +Below is a minimal example of an index.html file you can store in your project’s assets folder. This file uses the Vidstack player and configures the P2P engine if it’s supported on the device. + +```html + + + + + + + + + + + + +
+ + + + +``` + +In your project’s root pubspec.yaml, ensure that the HTML file is declared as an asset: + +```yml +flutter: + assets: + - assets/index.html +``` + +**Note:** You can also host this HTML file remotely on a CDN or your own server and load it by URL. + +### 3. Create a Flutter Widget with InAppWebView + +Below is an example of how to create a simple widget that loads your index.html into the InAppWebView: + +```dart +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + void _onWebViewCreated(InAppWebViewController controller) { + // Load the HTML file from the asset path + controller.loadFile(assetFilePath: 'assets/index.html'); + + // or Load the HTML file from URL + // controller.loadUrl( + // urlRequest: URLRequest(url: WebUri('https://example.com'))); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: AspectRatio( + aspectRatio: 16 / 9, + child: InAppWebView( + initialSettings: InAppWebViewSettings( + javaScriptEnabled: true, + allowsInlineMediaPlayback: true, + allowUniversalAccessFromFileURLs: true, + mediaPlaybackRequiresUserGesture: false, + // Enable to debug WebView + isInspectable: true, + ), + onWebViewCreated: _onWebViewCreated, + ))), + ); + } +} +``` + +**For a more extensive example that gathers P2P engine stats and manages P2P state according to app lifecycle, see our [P2P Media Loader Flutter Demo](https://github.com/Novage/p2p-media-loader-flutter-demo)** + +## Testing P2P with Other Peers + +After integrating the P2P Media Loader into your Flutter application, it's crucial to verify that the peer-to-peer connections are functioning as intended. + +The simpliest way to test is to run the application with integrated P2P on a real device and open our [demo](https://novage.com.ua/p2p-media-loader/demo) with same manifest url. From aa8576319c76df597ba461a80a1ed99f44a4605b Mon Sep 17 00:00:00 2001 From: DimaDemchenko Date: Mon, 3 Feb 2025 11:49:58 +0200 Subject: [PATCH 05/14] Chore: enhance article on integrating P2P video streaming in mobile applications --- ...Video-streaming-into-Mobile-Application.md | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md index b0c48e9..7d09f10 100644 --- a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md +++ b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md @@ -3,27 +3,29 @@ canonicalURL: https://novage.com.ua/blog/setting-up-P2P-video-in-mobile-app-for- author: Dmytro Demchenko date: "2025-01-29" title: "Integrate P2P Video streaming into Mobile Applications: Native Android and Flutter Approaches" -description: "In this article you can find ways how to set up Mobile P2P Video streaming" +description: "Discover how to integrate P2P Media Loader into your mobile applications to achieve scalable, cost-efficient video streaming. This article explores two practical approaches — Native Android and Flutter — to leverage peer-to-peer (P2P) streaming technology powered by WebRTC. Learn step-by-step integration techniques, review the pros and cons of each method." --- -In today’s digital age, video streaming has become an integral part of mobile applications, from social media platforms to on-demand entertainment services. However, delivering high-quality video content efficiently and cost-effectively remains a significant challenge. Traditional Content Delivery Networks (CDNs) often incur substantial bandwidth costs and can struggle with scalability as your user base grows. +In today’s rapidly evolving digital landscape, delivering high-quality video content seamlessly and cost-effectively is essential for modern mobile applications. Traditional Content Delivery Networks (CDNs) often face scalability challenges and incur significant bandwidth costs, especially as user bases grow. This is where Peer-to-Peer (P2P) streaming technology steps in. -Enter Peer-to-Peer (P2P) Streaming Technology. Leveraging the power of WebRTC and peer-to-peer connections, [P2P Media Loader](https://github.com/novage/p2p-media-loader) offers an efficient approach to video streaming. By enabling users to share video data directly with each other, P2P Media Loader reduces reliance on CDNs, leading to lower bandwidth costs, enhanced streaming performance, and improved scalability—crucial benefits as more users access content via mobile devices. +P2P streaming leverages WebRTC to enable devices to share video data directly with one another, thereby reducing the load on centralized servers. This approach not only cuts down bandwidth expenses but also enhances streaming performance and scalability. Whether you're developing an on-demand video service, or live-streaming platform, P2P streaming offers a robust alternative that can lead to smoother playback experiences and lower operational costs. -**Important Note:** P2P (WebRTC) may not connect to the outer world if it runs on Android emulators due to its virtual machine [network configuration](https://developer.android.com/studio/run/emulator-networking) (NAT). Please test P2P connectivity on real devices. +Enter Peer-to-Peer (P2P) Streaming Technology with [P2P Media Loader](https://github.com/Novage/p2p-media-loader) — an open-source JavaScript library that leverages modern web browser features to enable media delivery over peer-to-peer (P2P) connections. The library enables the creation of a huge P2P mesh networks, also known as peer-to-peer content delivery network (P2P CDN), peer-to-peer television (P2PTV), and Enterprise Content Delivery Network (eCDN), which allows traffic sharing among users who are simultaneously viewing the same live or video on demand (VOD) stream via HLS or MPEG-DASH protocols. + +In this article, we will show you how to integrate P2P Media Loader into your mobile application. Integrations are fully compatible with web-based solutions, meaning that if you have both web and mobile integrations, your users can share traffic across platforms when watching the same content. As a result, you'll build a larger network of peers, save more on traffic costs, and enjoy enhanced streaming performance. ## Native Android (Kotlin) **Pros:** - **Seamless Integration with Android Ecosystem:** Direct access to Android-specific APIs and features, enabling more comprehensive customization and functionality. -- **Better Control Over Media Playback:** Utilizing libraries like ExoPlayer offers robust control over media streaming, buffering, and caching mechanisms. +- **Better Control Over Media Playback:** Native players like ExoPlayer offer better control over media streaming. - **Access to Latest Android Features:** Native development ensures immediate access to the latest Android platform updates and features without waiting for framework support. **Cons:** - **Platform-Specific:** The native approach is limited to Android. -- **Dependency on WebView:** Integrating P2P via WebView may introduce potential performance bottlenecks. +- **Dependency on WebView:** The library internally relies on WebView, it may introduce performance overhead. In this section, we introduce our [Kotlin library](https://github.com/Novage/p2p-media-loader-mobile) designed to leverage the capabilities of [P2P Media Loader](https://github.com/novage/p2p-media-loader) and WebRTC for efficient peer-to-peer streaming. @@ -220,7 +222,7 @@ More examples are available in the library [repository](https://github.com/Novag - **Dependency on WebView:** Integrating P2P via WebView may introduce potential performance bottlenecks. -The Flutter integration approach uses a **WebView** that contains a video player with P2P Media Loader integration. Below is a more detailed breakdown for clarity and maintainability: +The Flutter integration approach uses a WebView that contains a video player with P2P Media Loader integration. Below is a more detailed breakdown for clarity and maintainability: To setup a video player with P2P Media Loader using webview you need: @@ -357,6 +359,22 @@ class MainApp extends StatelessWidget { ## Testing P2P with Other Peers +**Important Note:** P2P (WebRTC) may not connect to the outer world if it runs on Android emulators due to its virtual machine [network configuration](https://developer.android.com/studio/run/emulator-networking) (NAT). Please test P2P connectivity on real devices. + After integrating the P2P Media Loader into your Flutter application, it's crucial to verify that the peer-to-peer connections are functioning as intended. The simpliest way to test is to run the application with integrated P2P on a real device and open our [demo](https://novage.com.ua/p2p-media-loader/demo) with same manifest url. + +**For Production Use:** + +- Setting up a production WebTorrent tracker. +- Customizing RTC configurations to suit your network conditions. +- Specifying other configuration parameters such as **swarmId** and other settings required for optimal performance, + +For detailed guidance on production configurations and advanced customizations options, please refer to our [documentation](https://novage.github.io/p2p-media-loader/docs/latest/). + +## Conclusion + +Integrating P2P Media Loader into your mobile application opens the door to a more scalable, cost-efficient, and robust video streaming solution. By leveraging WebRTC and peer-to-peer connections, you can reduce the dependency on traditional CDNs, lower bandwidth costs, and enhance the overall streaming experience for your users. + +We encourage you to experiment with these integration techniques, explore real-world scenarios, and tailor the solutions to best fit your project’s needs. For additional examples, troubleshooting tips, and community support, please refer to our [GitHub repositories](https://github.com/Novage) and join the ongoing discussions. If you encounter any issues, have suggestions for improvement, or discover bugs, don't hesitate to report them on our GitHub issue tracker. Your feedback is invaluable in helping us enhance the P2P Media Loader experience for everyone. From 620a04452dd17684823eb54358d35918031dda2e Mon Sep 17 00:00:00 2001 From: DimaDemchenko Date: Mon, 3 Feb 2025 12:27:30 +0200 Subject: [PATCH 06/14] Fix: exclude "os" polyfill to support image optimization in md files in dev mode --- astro.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astro.config.mjs b/astro.config.mjs index c2af875..e17a977 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -7,7 +7,7 @@ export default defineConfig({ vite: { plugins: [ nodePolyfills({ - exclude: ["path"], + exclude: ["path", "os"], }), ], }, From 559cb686412333197b6b438f406179e1a3aa8349 Mon Sep 17 00:00:00 2001 From: DimaDemchenko Date: Tue, 4 Feb 2025 10:48:23 +0200 Subject: [PATCH 07/14] Fix: add suggested changes to the article --- ...Video-streaming-into-Mobile-Application.md | 306 +++++++++--------- 1 file changed, 153 insertions(+), 153 deletions(-) diff --git a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md index 7d09f10..2c6d6de 100644 --- a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md +++ b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md @@ -2,17 +2,162 @@ canonicalURL: https://novage.com.ua/blog/setting-up-P2P-video-in-mobile-app-for-free author: Dmytro Demchenko date: "2025-01-29" -title: "Integrate P2P Video streaming into Mobile Applications: Native Android and Flutter Approaches" +title: "Integrate P2P Video Streaming into Mobile Applications: Native Android and Flutter Approaches" description: "Discover how to integrate P2P Media Loader into your mobile applications to achieve scalable, cost-efficient video streaming. This article explores two practical approaches — Native Android and Flutter — to leverage peer-to-peer (P2P) streaming technology powered by WebRTC. Learn step-by-step integration techniques, review the pros and cons of each method." --- In today’s rapidly evolving digital landscape, delivering high-quality video content seamlessly and cost-effectively is essential for modern mobile applications. Traditional Content Delivery Networks (CDNs) often face scalability challenges and incur significant bandwidth costs, especially as user bases grow. This is where Peer-to-Peer (P2P) streaming technology steps in. -P2P streaming leverages WebRTC to enable devices to share video data directly with one another, thereby reducing the load on centralized servers. This approach not only cuts down bandwidth expenses but also enhances streaming performance and scalability. Whether you're developing an on-demand video service, or live-streaming platform, P2P streaming offers a robust alternative that can lead to smoother playback experiences and lower operational costs. +P2P streaming enable devices to share video data directly with one another, thereby reducing the load on centralized servers. This approach not only cuts down bandwidth expenses but also enhances streaming performance and scalability. Whether you're developing an on-demand video service, or live-streaming platform, P2P streaming offers a robust alternative that can lead to smoother playback experiences and lower operational costs. -Enter Peer-to-Peer (P2P) Streaming Technology with [P2P Media Loader](https://github.com/Novage/p2p-media-loader) — an open-source JavaScript library that leverages modern web browser features to enable media delivery over peer-to-peer (P2P) connections. The library enables the creation of a huge P2P mesh networks, also known as peer-to-peer content delivery network (P2P CDN), peer-to-peer television (P2PTV), and Enterprise Content Delivery Network (eCDN), which allows traffic sharing among users who are simultaneously viewing the same live or video on demand (VOD) stream via HLS or MPEG-DASH protocols. +Enter Peer-to-Peer Streaming Technology with [P2P Media Loader](https://github.com/Novage/p2p-media-loader) — an open-source JavaScript library that leverages modern web browser features to enable media delivery over peer-to-peer connections. The library enables the creation of a huge P2P mesh networks, also known as peer-to-peer content delivery network (P2P CDN), peer-to-peer television (P2PTV), and Enterprise Content Delivery Network (eCDN), which allows traffic sharing among users who are simultaneously viewing the same live or video on demand (VOD) stream via HLS or MPEG-DASH protocols. -In this article, we will show you how to integrate P2P Media Loader into your mobile application. Integrations are fully compatible with web-based solutions, meaning that if you have both web and mobile integrations, your users can share traffic across platforms when watching the same content. As a result, you'll build a larger network of peers, save more on traffic costs, and enjoy enhanced streaming performance. +In this article, we will showcase the available integration samples for both iOS and Android, demonstrating how to leverage P2P Media Loader in your mobile applications. Integrations are fully compatible with web-based integration, meaning that whether your users are on the web, iOS, or Android, they all become part of a single, unified P2P network. As a result, traffic is shared more efficiently across platforms, leading to a larger network of peers, reduced traffic costs, and enhanced streaming performance. + +## Flutter Integration (iOS and Android) + +**Pros:** + +- **Cross-Platform Capability:** Write once, deploy on both Android and iOS, reducing development time and effort for multi-platform support. + +**Cons:** + +- **Dependency on WebView:** Integrating P2P via WebView may introduce potential performance bottlenecks. + +The Flutter integration approach uses a WebView that contains a video player with P2P Media Loader integration. Below is a more detailed breakdown for clarity and maintainability: + +To setup a video player with P2P Media Loader using webview you need: + +### 1. Add the WebView Dependency + +We'll use [InAppWebView](https://inappwebview.dev/docs/webview/in-app-webview/) in our Flutter example. Update your **pubspec.yaml** with: + +```yaml +dependencies: + flutter_inappwebview: ^6.1.5 +``` + +### 2. Prepare an HTML File with a Player & P2P Media Loader + +We need an HTML file that includes: + +- A video player (in this example, the Vidstack player with HLS.js). +- P2P Media Loader to enable peer-to-peer streaming. + +Below is a minimal example of an index.html file you can store in your project’s assets folder. This file uses the Vidstack player and configures the P2P engine if it’s supported on the device. + +```html + + + + + + + + + + + + +
+ + + + +``` + +In your project’s root pubspec.yaml, ensure that the HTML file is declared as an asset: + +```yml +flutter: + assets: + - assets/index.html +``` + +**Note:** You can also host this HTML file remotely on a CDN or your own server and load it by URL. + +### 3. Create a Flutter Widget with InAppWebView + +Below is an example of how to create a simple widget that loads your index.html into the InAppWebView: + +```dart +class MainApp extends StatelessWidget { + const MainApp({super.key}); + + void _onWebViewCreated(InAppWebViewController controller) { + // Load the HTML file from the asset path + controller.loadFile(assetFilePath: 'assets/index.html'); + + // or Load the HTML file from URL + // controller.loadUrl( + // urlRequest: URLRequest(url: WebUri('https://example.com'))); + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: AspectRatio( + aspectRatio: 16 / 9, + child: InAppWebView( + initialSettings: InAppWebViewSettings( + javaScriptEnabled: true, + allowsInlineMediaPlayback: true, + allowUniversalAccessFromFileURLs: true, + mediaPlaybackRequiresUserGesture: false, + // Enable to debug WebView + isInspectable: true, + ), + onWebViewCreated: _onWebViewCreated, + ))), + ); + } +} +``` + +**For a more extensive example that gathers P2P engine stats and manages P2P state according to app lifecycle, see our [P2P Media Loader Flutter Demo](https://github.com/Novage/p2p-media-loader-flutter-demo)** ## Native Android (Kotlin) @@ -35,7 +180,7 @@ Our native Android library is crafted in Kotlin and is fully compatible with [Ex ![Kotlin Library Architecture](../../assets/kotlin-diagram.png) -Inside the library we launch embedded server that will respond on players request. To setup P2P Media Loader we decided to use a WebView without binding to a view. The approach with WebView allows us to maintain the same codebase across different platforms. Moreover, with our approach there is no need to write custom WebRTC implementation for Native Android, since in WebView we already have WebRTC. This means that our WEB integration of P2P Media Loader is fully compatible with Native Android integration, as a result consumers may have a bigger mesh of peers to efficiently transfer traffic between each other. +Inside the library we launch embedded HTTP server that will respond on players request. To setup P2P Media Loader we decided to use an off-screen WebView. This approach is lightweight because WebView is a part of OS and no need to bundle external libraries. Additionally, this means that our WEB integration of P2P Media Loader is fully compatible with Native Android integration, as a result consumers may have a bigger mesh of peers to efficiently transfer traffic between each other. **Note:** The library is in development, so the API might be changed by the time. @@ -210,152 +355,7 @@ class MainActivity : ComponentActivity() { } ``` -More examples are available in the library [repository](https://github.com/Novage/p2p-media-loader-mobile) - -## Flutter Integration - -**Pros:** - -- **Cross-Platform Capability:** Write once, deploy on both Android and iOS, reducing development time and effort for multi-platform support. - -**Cons:** - -- **Dependency on WebView:** Integrating P2P via WebView may introduce potential performance bottlenecks. - -The Flutter integration approach uses a WebView that contains a video player with P2P Media Loader integration. Below is a more detailed breakdown for clarity and maintainability: - -To setup a video player with P2P Media Loader using webview you need: - -### 1. Add the WebView Dependency - -We'll use [InAppWebView](https://inappwebview.dev/docs/webview/in-app-webview/) in our Flutter example. Update your **pubspec.yaml** with: - -```yaml -dependencies: - flutter_inappwebview: ^6.1.5 -``` - -### 2. Prepare an HTML File with a Player & P2P Media Loader - -We need an HTML file that includes: - -- A video player (in this example, the Vidstack player with HLS.js). -- P2P Media Loader to enable peer-to-peer streaming. - -Below is a minimal example of an index.html file you can store in your project’s assets folder. This file uses the Vidstack player and configures the P2P engine if it’s supported on the device. - -```html - - - - - - - - - - - - -
- - - - -``` - -In your project’s root pubspec.yaml, ensure that the HTML file is declared as an asset: - -```yml -flutter: - assets: - - assets/index.html -``` - -**Note:** You can also host this HTML file remotely on a CDN or your own server and load it by URL. - -### 3. Create a Flutter Widget with InAppWebView - -Below is an example of how to create a simple widget that loads your index.html into the InAppWebView: - -```dart -class MainApp extends StatelessWidget { - const MainApp({super.key}); - - void _onWebViewCreated(InAppWebViewController controller) { - // Load the HTML file from the asset path - controller.loadFile(assetFilePath: 'assets/index.html'); - - // or Load the HTML file from URL - // controller.loadUrl( - // urlRequest: URLRequest(url: WebUri('https://example.com'))); - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - body: AspectRatio( - aspectRatio: 16 / 9, - child: InAppWebView( - initialSettings: InAppWebViewSettings( - javaScriptEnabled: true, - allowsInlineMediaPlayback: true, - allowUniversalAccessFromFileURLs: true, - mediaPlaybackRequiresUserGesture: false, - // Enable to debug WebView - isInspectable: true, - ), - onWebViewCreated: _onWebViewCreated, - ))), - ); - } -} -``` - -**For a more extensive example that gathers P2P engine stats and manages P2P state according to app lifecycle, see our [P2P Media Loader Flutter Demo](https://github.com/Novage/p2p-media-loader-flutter-demo)** +**More examples are available in the library's [repository](https://github.com/Novage/p2p-media-loader-mobile)** ## Testing P2P with Other Peers @@ -369,9 +369,9 @@ The simpliest way to test is to run the application with integrated P2P on a rea - Setting up a production WebTorrent tracker. - Customizing RTC configurations to suit your network conditions. -- Specifying other configuration parameters such as **swarmId** and other settings required for optimal performance, +- Specifying other configuration parameters such as **swarmId** and other settings required for optimal performance. -For detailed guidance on production configurations and advanced customizations options, please refer to our [documentation](https://novage.github.io/p2p-media-loader/docs/latest/). +For detailed guidance on production configurations and advanced customizations options, please refer to our [GitHub](https://github.com/Novage) and [documentation](https://novage.github.io/p2p-media-loader/docs/latest/). ## Conclusion From b85e78fa4c3ed09f70f591f7d810818b31c06b1c Mon Sep 17 00:00:00 2001 From: DimaDemchenko Date: Tue, 4 Feb 2025 10:48:55 +0200 Subject: [PATCH 08/14] Refactor: remove unused image --- public/images/flutter_demo_example.jpg | Bin 56047 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/images/flutter_demo_example.jpg diff --git a/public/images/flutter_demo_example.jpg b/public/images/flutter_demo_example.jpg deleted file mode 100644 index ed15aa9928dae0b90ce9a44b628956c0ecf145af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56047 zcmeFZ1#}&~k|2CdF~{u09JAwVcFfESFGdpHxW@g76vz@*9zW2Vj zGqZ2@yq%qM{ypbc>qw*Q;;Ifeuk+c2F?pHSe4GsnXDFX#T0)Rw=fI@@#)eFD_ z3keDJTim}K1SAwR%o|v6CN9L^++TTsKQn(V1CXG=jHpnk;QRbZdaWJ(50d{G0!?XJ z6IJcHwOqQTwRg(tNMwf1Ts$xQ)5q zt-d?A$5ie34gUMJo?@8^&GI%L008CPt|x5fQybLOp8~_qc4*w_ynV{ubq17_6*Z>Z zw6s$uq-%G!W?Han67f~W_8e5bWDsVu#SVL_J2iH&c@c1FMuD#ME6%GMGbfzAw4KGM zz-`dGvFe!NU0(OeH6uXt2k+rqB>>=xm;Pjf^|7s4=+NP}$N=cLpE_J8USjeWH&7VV z)l6R_onKObhGvRcvj-cFpngmJF<2DEDSMuD_I5%?m-92&k*hx#e+NLl?t{k#kNdkS zvz_(tU+$_1c}`)Y+#&v!P^q8P55oOBwJ6P$CNE#r^iQWF6v_{O$Nq;H0v!M-2wWrn z`e#m`+UE+(0$f`J{Cj4(Xf8=9!P+#+Ajy^`oT5`Ai$zjLkQ88_|HMGEm z-`--@s;M}BWTRgx(OEivvR7K`mtI)7oc6to&bhd}X ze!k9fTUvUs3lB=0Rlj~|vv-67e#}6dwLjMer(!YS`$R`t@=A7jy|(M*Vpnax3a&ei zF}2lX19F>)MIus4Y7>0VH{7TAA!SvC#%^sYx~#g{VpNRWh1Wt1BDf z@e<(SdCprXy=D)=YNHpLzE74DIw&RmHnWfS#Hn^O#!fb2i6aq=fe)W3kDCFKUMYcQHev0bM5w2rz=mPU2PVv%OCMwWF zfT^fQSC5?gCH6|Y^)($3W^=}RY6S!yru*e>l` zs*H+-`%r82tJK7q>>u%Gp!ZT4`#p?ECIzpQ?L;l!<8i@qxzx7Ux9~tK%!ek&6y~=V zm~Afg75jYosF{3-d~9(uE;$E4*C-xdi4Z+Y(4gR8(m{?Wd&Jq9Sm^vdw)*2CvaBWL ziIdfhH!3>(WY&(&Q89Ds;Kt|%bHZ}nD@jAlL8jW3#o!Z&W029IrLCK3g|(oSvwB^h zE|^wBM8((>)1i?SjgdM8(gOQUL*i??+4fS8aqA}#jmCQm+-|m;S{%og)tcf#gS1>s zONqwp>O_v21l9d%6*_j-3%xQ6tL?5--|FDCNr_G?tKgYadsgFi|I5Z&r)C~6-s}9? z9m@gd)Njlco~-p{_HJpVtju~7#lmC4+WD3k7|l3t_pDj)!jq8V$-WFG{bt+Cd*4n< zwPae3<(Dh6mWRf&=jWzE*UTbHbirLV2mKvgcrZjYWGroV=FDL1;LvhAJWfC>!bXUW z&cr4t!e*w0_vqp-{dCcON#A^-?~VC(wbhxIVy6|J==0$o ztI1ozL3DV3j362zIp?>aPA6^aj5tt})2Ues*7A4Vg?#ku@K(_DO3jD>JbajfP1;<; zy7ny5mAI1eWa(- zzawNmDjaSfh2y|wY%Cz{_sgXvvfIfaUAJ}K9f|S@tQXPxrz+`Eq-(YRtZ=jrn z9EarOp;W91>XxZ8WW9A|kNny814Y@JgeOuC$6@XvFx>iuZ&yd0TWp3`=0>P@MjJ({ zb70)jL~wuCLL!A>zH)SDd{ml0!DJqBSLn*?j+S|uP$h53}S`RZ6= z9O;s^Lm-mnwS@a;@WeZZ&{e;joa{O*eGa7 ze#V+si%Q0~^=iBkZgD)FoU)u}R58IRudEM0Xec$#Gb~n1jV~_|*+y!d$BQdAT241( zHPM!S{J9`3;saf-uHHb6N}iltDr2aF&T6L&D#^=Yb*jZv=V~!AFi_O5#M;=pxk;_f zXgj`XaUs-qX0%AR-x*pt&~6AWTQA@ORX18`Fzc7Hqa5%dW@t(D`f|XJo zxuJd}OIRB1L;0~X1Ar{wUj8dTg#`;s3zMtW8jINO(Kg{$t~M2d9ahiGacYmQYfD$f6v1d#;Z9}W__ zTe7zcAWc2&4~Onc0sUQE0s1?=Kqe-zG*g3VU)TQ5M4t}C7!z!y7YD@r_C6#bP=#hw z)VRTC-Y&?PgTWbJZ^TQS!zf&*xmG%$FT?(*iqs;78;pf5E(ottaPD}>YI%FCbEok%F|z~P4Rdgu}L z;U{k}uLGY55l?1TRK~=lKCgGwVeY{)pPb*`18)-L=;aH)M?!uf(zB;^3O_&3G za`_6t? zcSOz%KRpJ_tNJXhXXKLIv=5?g5qDq2{BO)AjxMiK)!G*LJMdjebMeb_`Ah;%%6A{m z6~D_Sr5qm-Mn%bT%$^=uiMT%DE6&<+K9?NocZG7gt)yVhoqp*w{i}KeO-7^lHnuPz ztZ(mY0y&!U3^AMZ+WTp;Bdr<7`t-Mx-gJCd*p7)7u?9vlC~Sv?(gAh_=aI=;A-Nqhf6=Hb94V0MbfJL;Cu zv8SFC+ii9zRSK;=Z=RKrRZe90MFnZsP3G<8?p>`l{uqkTAn@4M1cLvMdfw%K2N(>6 zM{^ez?K#?e+7Oi(;`a!zf0EgUlLmaapa0bek{^Ju{Po`n_*W7;WfAa(J9!9<5DS&Fyw06sw|8D$ zw>!)YQk>*Im)@{v8Q**EP@I}cJ(w_eC7sh5IU^W=;#jo1N@t@KzERx2BrLiTD~|%U zxMVoQy9YsaK>n?=zc=i`!;*VL`@5v%o1IW@o7(v6N5Ur8GnX2CTsO4c^JB5-l^efd z9@VSob9?Uj%<5R~g?vKKL)gs9972nCC4@RC<=gnDuaSG)6UDgNE(=2=Tkh`}jWGXq z3xDs5FUL=8Dv=9!)Nd&=Hdr{_QZ<>&k&HdsR*iqUE{#36orV5QtiSPrBgE-V0OM}I zH~;|4mBV;!6XE%_FUrtdbaP?xA4GqHAlx*;?UX<)-~==KPG0L@jwEPp|3jJoGXh59 z|DbFC(1jGl9Dabp{qG(GI|y_*GHCD}0m#0>fB22~!(o{JmLA;8TMKqw=ki8`-jnw? z>-DaMHahBo8;WB#c#97l(#<~~OiHiaQ%q{F33JD=*5~7RwbUPm;Uznf!Ae@Yyt1D49MaJcV{b$ry995@BD^w3pV(?m06R? zCNOK3d_!v4&x*f-1=_lU_hZijk6?cY_ebz|Wr_MQ;0h39E*_Q5M5!(?Og+VKxFr>R zVo=GhtoplR{lx`&^QUe33-RxO-!frUb&tKF_#6_iZ}k3~=zk3`1egD>n#&x100ajA zzZ2}QB%+MvAJ*q906-|iW1txC1`By$*SEs9S{`RNv_sfF;#abJz_u#EC5d(~QX~D*y`Ro6R;7>hJ z3iv;JOu*0882|uDCMf(b`QHlv|GWSDE$|^Rc-=H&|DOhtLZ<(r(z#{A&&LDtZq<8) zWv*hS|4BlTvhXi%BJhGVGb#WA8WI2l1qBTO{l}{H@6~H)G;|nL3{0#K#Ec9~{3Of* z@}zG*vFMW7ekIQWuT;Zg|`r_!*3nSzzG9M54U+bdpu&2oL> z?5d)0YTEkp_i5=F&0NEzM%A_Tr?0V-lI#9G(gZh+`dJ%ZZmS81Y9vBq+-zYPt%bOJ zK3>ag(PP|mDs`_(aT)Rp5V%<;kU&r-Kp_8qAvxcoqm;7I>4uimS=k%47DI;&E3f$% z!0%Jiai8_hH=tzU3{0eTA`D^#|oIvSB{+}VvIRb^Kdv?&%47qU*( z--=a6dbdBzBER-b#iWJrnvhcWT6@S9gP;UcbK(KeC7?u!VTz=h)a#sbxEWwzzHA2efn=b*Xy>TMjA^xfvbkZu;jr2IDpC4QursU5QWY@_ z!cLcN&peGa7$Tb;7FM9VaRqC?f3(?9qZMYW}UH>t%feum0*Y4b72RFOHYpi;vS|#68$T*Ufl;=z* zaxCM)7VDQZj9mjB8wb@%A>YJNh88XcNi9;`Ux35a&Hgw_j6_yeRxhGcJ6=*^BNezT z#pR@ag!sG z3Vd~}W->ioh;7_Pi%}@0ZcxPoo+?|8pQ?Q;X^{9(vY0^~xOmF%fu#l=7$(#z-eZ6!E9G~wMQsTpyCwAG zpIxcLhLrxFKnC041~C7uU#g{-2+Ql6)<0r&%+;b=kYt&T_~(E=Bco|wE+|5fl`ifb zn6LLX;sQI{96K8s(=xciU#c;}QD5tgNg+G|w(iYL%2+DC>QR5o=ZbKPtiCDz!)iy> z7HKVtKX?oNtTVYqMvI~%?wtr&h^aqo{w>dp{!z7KE_MD8Rgu_zRaI3a<@>`txw)btLRe|WafHr6+P&^O6@ZY4gWaB`y)%SES|Av&Flst(=@A0)NBNNr4=wzqSWa|P?&(%z`4ccrWHJ>aM* zf2>+y)vahXC1+;nqi?CbTX@N^w(fcMVN4dOSPlP522pkw6EH|i&=5&gb#{My6L+4F zkPy!ybL&k`6mWeE`-Vdk%QgA7Ijg?BCk97Lg++Ml!$JngD+=zRoZEJBn;roVZM^KD z=}!A3Nc4Uy14oUPJ!3dd_*SYI^oB_1)+-R?3AGULwW_Lmyz6$au?7~AgS#ee&6RCY zl*BeFrx%Vp_(k?1|0$q&R3usbYJlp|G%gM8F#D5jE)R*8ajqY&l77O9REE4(?E9=_ zUL5-N*tEE_vX`H~04B47-QC>-G&G*b?JumndjVe~88$Kn1m5X3jQSv2Q8(mA-CCmm zRO~Q)J&s#TR|!yik>95UVFU{8)6%%-xpdACgB!%<-dTe-aRdm|ZvZ;AtXbFWJtiG% zAD&{L7-}|hsHqOq+7g~QX8*u*-=(Sc$`EjO(>Tq2ARvP=!msKlGV%w-3uo}03@+vw zg6E$k#hF(LCEl%mwiLmb^Vn$#u?-qDj|g`MXI1qe-g~DbuYkvQhx}D^Sz7#!h_+$L zAOj82M*ZVDx+*Q*mMy356KG?^l6OjUEhiPtS}L?dvM*8vdow`c4|W6$EmDO6F(YeU z`H1TK5_o=fK#?qUXcBWPzWXy%vjAp$hTLnOqXlnCrSoPe)T=~ zN1oS!$~G?~+xBBlA2Imv6?0SJBmg?OdO%26RQ$`Ru{MLQ2vT zpJC_C#}wOb=x|clM3C#J%IL!pO<85;vI?*6g*AX#LR4V2MareF<%kZsB41gQmEz7@ zQEb0b(ECowTQ#*klXC;6HG~%djEpZpg?gZZAHtMrZh4KBm7=aGZ_gZwy-U_3uC3gO z-h1BYEbq1-KOub-h33s*^2;0pInP5hpT3eM=Rwqp&tYZMT6y*<5mhSt+v49b>-pA; zEg6BG`qSdH#tg8a-u(N`E`0)l{oV`$`_D&uSrH=Dhk#+{N5+XQhO+@S*l7&OY7C># zW=Mgi@x5^vemdOcUzA=?`0SKb_lJfT)^y85izz^bmUX!Sr|k)y9rPTn`-v_zTV%Ok>0Gxoffj!DdLI?qg=YBvg`gId-Y?DfX$BalpbI4~L4B2;~HO zWJ%Z1$4ce0q(Iq$RGBsPy?3L$TVpVsBw_YWppJWQD?^${*S+vEO7Dnp+{Po+U}0KN zsdCN~cD-I0vKpLtKPgbEWvXJA?yzECWFf)HNTc1btl6;AOLZ?wDEAmHMQZPDI91%M zB5}+x+@rqSs?Ru0{V)s4A_qrS4%WnK(Cs{rlUiN4KRj>ZyB01=ONdO$qMxnv<2uDg zBji|7-4Jk-x-z%ST{VZpX#*^xX}%$;Y`BFl7oH7Xn35>92~i=DYQ!ViFCA(+Kv3m$ z&0I}69m;1*-fZ6cVJGMK<8j%LE%V>n-rdbRIM@g*@`0TT`0Yw8rQ|uH;&9AU$qFbv z0;Ul<-lyLQ@>^Bbo2<8wVcOTog1koen;*auV!vxFU=H%Fsqvfqq6T~1TyD>@7-4v5 z1Q$*jJ$V{iJr-+ZSyNNfpz%R#L^+)1ni`uVj$Efz%0Q7-uEy2w=daFYJ4 zxnhBUH}v3Ji+_LBg7UGNG5Csl1S*-A!!Tgh4Pz9O&S5OGG5MB@RYWU4GWyl;8s*2< z8xGSw-><_ni1O9Lt?j|)bEu!yG-$3?E2`nt;N)-w#`r{qN;%lJHfWx-?x?Fp?^{ii ztov5#oquSxzO%t~#Eo3n-A`i!QngOXVudvOQzDk*p1|Ps#Qy^5TN;fN1n;Ry+!Cd1 z)P8NB*9-wFv@f*WX&0B_PaNT{*;{Z>q~&n2Xf?-HZ8;SLCDg?4 zbC(r7bM0kXyzWWewyW&{<>Xb`Y*@mc{bgH-jXg5A*mhCrhXS76cJoc$RB{fD0j zHt2<=`FAF0#ijXpPMDzg{VvjiJ@2$if1A`SjesUC{+0;%tA1fc$B}YM+3i40Egbxs z&PeG%F&}l|`*71Mvs=n^Lw>Yh0EXA)E>$2LGcd0X5mfN(+acC%w$CrhT`0UOfZqT# zsuEK^tv+$-EG{Lt1oc@qXq3MJbFi2K4HE^bq1j!DxDUxykD*}XGr6yAPg@ndxS$&4)Cr1`HIHB z_3p`@h%hjB(8Hnf`k4>MkAQxVVVgfKS(9$nOl->bt^ zVDo`K-w8Bv(fAGG(;Q5@>Ve;+uzka&^1!|hs6s0V9&2Z51!uv=0Bm6p1*;D&f;F01 zUeDYoDwo)BxPw^h`JEj)Huh_S#DHt=mEJ0yH1QLL@=wh{^gC1u@mhxf62ak#$?xg` zMZY~vmik-pQq%x_rd-YKkj#S!ia!8iz)0oHrR$;m2?*pK9%mmpnm z-VA7<+h&>9(|BugxRVI-6wU$3-|anm5{>`~3!bkKmx9w0v=-evP{zC$2h|XDYv!sn zV5+qE!-j2I?)RBK13eWb&AlgDh@}XJrkdQC8mYJ|a#m>*RcdZ`!YS;laIt=nfA2ZN`!nC2a)ms!;CBc-I{u{^cQ9%W61?Y~=TO1LdZ} z_J~q89jiL9K_lE%_38=PG9#aX@ZW}R$ypYm$lmp1?CUcJEFcyqWQszv@2;z=-spLF z8r(dF)QDyX*cWy`rQCh^Q6|>qV%#F>g))i)NtdNI920?AR9#uETpq(yZp52(pZ_x9 z6pwHxY=mMQElF&m+!jy)^L|xD#PPd~J~5#;P`(Nqn*&9gk4Ad{MU(fygknX!Gnvl} zb4izFE0M~whf>x;AtcXnZr3p7%!{8KB1(c?ZMc7w-JFThNxfwYCnmvUh1>`dlJ^%N zB2&VQNC6i)HBbs~+Z%bSKn1OA1Z=k3hmrY&sM?6D)vqQfV{XnBt z*o!8|d=S$Hno)l{p)*QUKY@sdf7PA{0(rjeMiw#xG9Gn-n?^m0kBBdDBSZdmgQl#k zJQ3uTC^=D^wp|AltQUfdZbU4?9^q{(EBgfyiN~aT7CM*-h{}zUtNE^qh^&eTp-Thv zwF(>ZyQ+B)2)AnPPxudXU>S>EDe~X&|4E`S@X$Bx_C-xi?eYEYWPuy^4RFgEbYlHQ z72K~!!^6W9+t6AuNBF)`Kftd@ztc21k|WJ~MwSiykQuAK0RFFjiGAoGP?yOJ_+>ux zNbm=cZo1_MumT)dRLuXU!9Pf*TTV~@V56I^0T(b_a#~XHPlNH2)8l`h`%l^a(~N9| zR_{B#?Ky}_Ydq??CiBo$(e|L_Ml7Xu;OBuoIpzo-`hE=oHLpx-%?VnIN32}^Z!gp7Rrd#NI;>D`0y26_xG!Abx94ftBV9{_iX7H_M z4Ln=bm$o~PVftWXC;Y7z?J{ri@slaGdlxf4_F1EoZPQhZY_0Ovt%`!Y3ttA{YiWJY z$$|IE%`|?OubEFq(IWUvmv|9dNyr6gy?ZW*O;2cj=0BIrnkRNZRukldw5ox7t%+*A zW(^}6eWV_B#cM^wKZzp}idm=H9apr*S`wQs5=1R~L=&0`dNvbZiuTX)vcLDKxjo4SQYCnwS6VVQhz4oU{ssi z)kLyvaw?cqS~uDO<%AMas($ty;yaidA`gV>HIqSsh}epjUG`836Bilk^E!yCOIaIr z{$c~~+{Pq_f8XS-_RQw9XsA#0@bdH)2#b1VweCr|yd`|M5kFtw7H&zIkL#d*W(bQc znxFNRfzy&soz1wuT*gAZ&bq7IhA!T$%tA5OAattrO?^>y-tk)6g*uor#>IVSSe#_`U`OS`JPAAZFO_Ldd%GuDIwM&R#cdS z6U6e`*j`>^{4%eJ*-K#z6xBS^1;^A4~`sc&|Vm?gDDnkp9%RLslxT^w zaWstWV$TXsP9%qq4be#%TOD%27C2j3~a3i z7Z*2XO&HCYRGe^Q<$Ey4;)j5wvc%<<*`rQ@^_PQ78ZTcSp5Ylk>g-0A*&HcUbPt{} zi2r!J>=iHJOkdM6@z&<`hNy>n<5#>~&CBpAtLu=8fk)-z6Inq(_L-Ib6n5f;%;OQf z$OYd~!_?mW`}GMtVK@3cJNz#Iv0o{F0n!F`(E-rxZn*ocscG{LbfzxlHd-xk3_Bq z!%V+6gF)HDQ*A?K_V5`A$V3aFP`h^)y%uZn%bpMJsqcu;%I(go)u%H0G}4W0gGUd4 z$gE!IxtU*}I2lvO^#i?k>?BMZ)b3f==m-?>u#NnGV}RRd$PAF`M4(rP%_l3 zE*`JW)vo0u%h}ih1)ytZw`5$o$)ofO@%;i?>f&rI=u>XEMQY%SdewSQaEc~+^rHJP zWkR{?wN14XE$o2$;$IRPcvdAvxki-@g0NbKNLt}y7tq2-6n+6ve9i*WXO(al_`a@3 zoNduO(I}s>m%BxSGzHa+t7WZozqp`8s^&(-FkgyIOf~9F4~Zi0cD|`BcC5XYYr2ds zV63ja{+**WB?0Qm@@%DW5klPeW;7<*Jz->-mL8mSU{WNDh>HFe8F5P*aXC2jTRk2R z)+C{(?knd{mq^{PQk+`4J{)t3laeREM{AWnWiCWzem7EKuy_^HSh{36mD6>#q{X=X zanymFA4*Jg3w7`s%j>B#@qbrAYP$HI_xXU_uN()D*}rWDw4IZ>tlhTNwyc{`!AfqA zktH{9s0opkleW@vh&zq{4xha1)*~z}uN8yZ4k(+F^<=qRHBR2UQJ!q`PAxUq@pQr^ z7yq5qLFj_Qn!COkPVb$f+F6q{+nRQ+xPx_VX`jJ*A$m&csoK_C=UJeOl)nsF_;bwl zP2n~~MNshWqnqW;%ub|N;YjILVQheR}a@5gF!)3vP#hx~x*E`pK@ zZu(&Lvl5iBhoE4c7tjyCy&TvvJM0!N8H#iCW9KxLAeLzfwRzxN<@xtQ*sl3s02?>L zPONfK+_P=xw4*N`7j3qWGF4f=oR_cS509)rcqOP7EF(MB%30`+d05OFs-OArvqPdq zUf{sF*^W$e$wDkcE8H=nM>?ab{_QTP=VVj;28kSs8S|9^bH9{fX>?MkcVu%abt( zMPcP3dZ;rON|*U>`@2SPk=FOW(wB-*a=<;1yQoI)alpi%D+8SYR7WZl;(J5GW*5`%kcA_581BKod3f%K4bMx zxc5L$j~WfPIun6THp_qyENa2xlNaJ^w+sK!z58Bl<;~8)VRI{MJNi($0+S3Lr`@C7 z`QgLOGkwMvqS>g-TsJi>R(wo4kGT>lAo)QR<&zIsshfNvz@JS(9b7>%uxlDs6mH!nt@C&d8|KaUf%Q>*(s^#pY;_P1w{$Mjo*7mNf zeWy-DKz%t~`F|Wl1xa+ign@T5snGzC5KxdX&=4?x-{FKngT&N_LPsTLV3ddcz^|)E zA|Pn{=LRNttCJ7n0#gP5oBHR`9~aam$fK)cfB92cH;D-fUd; zt78)Zw9Z8y%}OkUhr%Rih%4$Zk4kj@X#FWk=7DkN3(FC~i+}gaEwd{4nZcQeauS&_ z7h3)+l;7ls$dWEd3!zEigh|-DKLpIjOOm692%96L5Z-Q>uh1JpMGFQc%3Bb@(ck{$47R zboMcYg-U7W#&B!MGvvR1sgx(+c`qIO-a|$MfEykX9vT1x^XIWA@E$T66o!HxDmo^( z?FHmNLw_LQXR`b1Q%$OC8{IYa#~w1|?=CpSG{2#$)v+&@u6sd|JBrYH!SJLdp0d2D zD$hv7s-5m`a8m_MNFgj8>1puLe0+_KYoVT%p%mDXufz*=hv6?#q~*P<@1z(Ymxq8v+%f1x@X;pBVq`7J?T6+Tnw zEA>3pf3=I{BId!4>Kgn-kO|` z+$!;*J%?HZZGAg<23pPW>LJKblA`*3Y>JxrBu?pq&mDMtvvtzcs!;+KShDFbL`7#$ z%VV_M#Z|rE2vUsP=@LC%fgdV|MceJNY_?lDC0Vjo5guf&M?EG@u2$?{%EFLfT!8-H zo<(^gXApqOyL!eHU)5(OQGi@&R}!2}$gRi61PH?p&&O5+xnNw^X+isID!+sNyG#cFs0} zpAr%9mllvvQ1EY{p z3xY+O20`JMPl~%ee*Wb|`GMDJI#(Td!K%-?-&4W)QZ(_I+mWr7~ z$^s93*6B+&y&ti@{{q}l!S*;noWp{@k(M_~nK3U*gu?3XtG}qyF#G8~%&@v?6gB$6 zUe=m;--7-Nlg%f-ZTw$=X;o_k(%cq(w1f&hxH2w6wvX`PF@c@sh7HIer+!0hR6ba@ z<>Em&%lyw#w^8{v-{#_H3-Vb$?t6vIlc0Urqp79xieDFkK@EYWs*ht=Oo`4hx%A&} z68B3lH~mJgj%g{BF=OtJ&R=J!1)K`VhQxE0mNqVHdU-X-5eUC0f10;bXGN^e_}Gp8 z85^HX*~c`Q)x%DmpdY+rYG1Tz55tNiD3ij4xgZvS&XNM_ktq7!GBYo_BnaguLan&C z_`ocf-kKON^?_Nubdaz2yNbgvKpEY^FMz5FDqq0YkH}IoB~?2IP7dN5KaHX=%t{VW zU_IYQ;fvpC{A9*@JVIlrfXVDuo|?#aj@s4AeRya3DzeNM^S?`Auc~Acle632c7ASq z(Ol74Y@T^BptFm9U$~@)WJNG>g#Uh1N;)dgI0mg%g>8VLVUrdI+5X@gL@2cUel7L~ zvrB~_tP1Xel^pxfTdVH+_^_i`=jcw!Xd<93ti<$mRHSC5Xvx zOe5qO<2$r`Zyk7vX_=4{fYclEaZop-2YxJkiUUjJZrDp@DXkWWfknk$sCf%p)(q)LZA*_B3{0nr?DA0~39 z1pE&xu@d1&9od+G?g1K*Dua=d3?$M4DzqPl^i4Ze?qwobQ?}FDWevFUc7EoAn^m2? zRh~f1Uh$3Y3q?%pMMPD$+G^m4w|x!YQy6u9yJK6T#A97>?@%sFbw1^%^*Rn=R=7lC z{8ho>&a=W+$|<2h0$}funl0U1&(N>gYP&V%1gQ!uNi1*Zlt~s?rCkokkeG-A9i8Aj zgkAceT1;!??x@O#{8``NaExP71y@?6=bVMmWDyLoN%FOjopZ0ap+_NrCzAy!Q>ff# zB0DD|B=Ei&1H7}m2h-w(Z=^@Jv$^B$jrCxc9Z23@D{3CJPrOaf4V`8=4?<5&2^&ef z4{F=huOVGA9UJ>z$ce97)l)Jbe^=wKN}}5r0>@cy*31cIjC-603Rq}R5J(Km4-w=Z z%UWR?d;5{X_Ap%BPG692y~ez*oG$&FPG|rE_FPAM9U$`CxeKnDZ#Cwu+K4n^o;FAsl`GcFIWkUJ zHte-<($1I9mv>EBzYVi>1T%o6Kg+f&{SDwY;!Rnz<*b>n5rE6fwhm~)-UL&@v|t~~ z>b4hLeqymUi%l0yi{EXOj^R!`QlO1ZNFZ4PvdX_j&zzR%HaFlI-hETnh9x)LXOL=? zSAo|;hu1v!95QvUuO<%qcJNH~TDCPoAR#ESz`sCFj}{ zlWj-2$;zrooN-=@SVs< zsVfPjK|rj~KJT;}rO#d?RMR*zBa~nA_9G)^Vnd$A*z2AI7JP=-v0Li*%h(f}CQj29 zI1LS0UgfW39?dO~t`>?o3PYb2-Iju3*JK*^;j*ug>u4DJ9W`VUb8i9_FBFM8{Gsyr z3x*e4hl+RQ({7;z_P8Y#fW@l3gjDtFQL1sIde~dd{kzEHq6U3-=qg zZuqMtnhS$PkfykyyPJw}OH5+=AP2Np@;AfMZ1#$kHSdoV=U|{x@9s{*h2&R z>%HW!9;Fht2QM|`4zWj>Jm$zMshdlS^*-xW^0?E1G&@(4aXwov#3-=Ov5hc}4JiRT zOs^h+{y|I)5tV=jT-=6Ajcmo;iQOeW644T|o3yPugz@;!@7dp$y81L#LJKMoVb+w* ziSaeZNSi7} zSV~yxvSwYcoNa>@HM3#_I?~{eklJCN=#vuHIq>B*eaKETZife|?&BsXkBNvFD?cn4 zx9r)av=O+^^??5qu~Euya%!sFFjk3$+h%GG@+%x7`XoO=8FC*`b+q3seKpD}{>atc zVsKXBqTGZMqaj0kjZpHUgC(O*JLm3HQsD5Vm_TO1Q6n-bHe1%BLT0ue;Q$FUXJZ?c zhFNx$SDy3k1)@pZ7?18JiU0Ds0_nh~IV`YaK7ZR>VRqPvvSx+jN@p^lIG~Vk(^|5P zDHT498;59Pv^rA|spo7?4g4AAL_gQca$K@=rRl-!ulV_T%w0s8XTiN>-CMcswX}Us zn`deYfO+edZLau$j+@kNBGP5PC3IL3WGr=_V&1$OX*|O+z~WR;wvz$=gw)x6;a(No z?ltSyCh)i>a0R&sspnS`A@1Cmo6-UI<+VG3`O3pD>KJz#y`BYyrd&f>WqW)`V{J58 zCs+z4r5PoXlNIju<`omlK{Dzk`vWBd4A0IvK|2k>^QD-07E3k(ZF8UJywfcqV~D+u zo2W}l{O;yc)hpitf35~&ChBE;D@`eBKH~>o&*U_fm`~}K{+#18ay%$)Fl^B0%h>^s zgpFI^W9=+pMbNI$kZhSd#`-~I6#PWH=X9JIEh%)+%%LT`IyjBEr3J zGNq|C2lCRhuD8yt);bIA7;$Y^c~DY%l$ygnoIgitX=}~W+0rDh*ftIMw3kdxJ10G- zJYlEEyL4cu5|vfqeVyT#vxexx%285Mf{lpmp5P#!8Dp1GH`b-FCG7AC80dDQmkQ%L z*Q|48^H8Vs*xXvk-G@Im->j%I!b4uln&6l?gSA-#)@t6I(9j^zFF=y#*=~VD+Sn}k zLGu7{CQ#qexvg`~jVUySt}81)roM_!XsO|M?}3uul7cP@pAVRfs3NHvz?iA= zag5pGxl6$*3=Lu9Y>kr4=$U=9EXF9frD{SPLl-%6gH+t7#aHc|Q~cq$KDWDn!X-Cd<2-G5PzL z(&=Q}*)%Cwi1hMQ_jA z$2Cb)sn5EW{eqoGNgO)OiDPs##w@}v_m&WTi8Wvv%KPLhf;Q^TbA}fiWLGPPbxBV? zaFaqMGZb*TVXMaX?R98+O5jt zSfxE^nLf6kw&?pAM`;^>5cxaaeh%Dp{o8!*-M;X^joCDP){$Lf-jOYP!TF_iSDB%j zMwZ(@oF`~FBdND&0J97UNB*v>@~X`$i7!n(n1L;W}N zh7s@P4qy-n7163yUj;rj_lR%>GRKDAPng+SE)h$`T?MzwT26%_aD#s)GZTB(9kza@ zXt0u9U$<(S!%z3j=pQpw!@)X!9Xe?wxFSRHi8M|ic#ydLKtFA?h-Iw%!(-E0v$@RuP`Ct<>8}U%f7cZPqNk|3ZHs>~7zt_IeB)B#z_)Qq7F2Q)nqsh&rsq zNj_1-b_c1}x1HKZf6ydw3)j2Ti#FL!v(#u`A;moCX?#P6BqqhQjr{FOjMA}JjPop% zKIYX#E7j*^lV|BWnaDOj>CPQ1=z2RUomyG{xyqS7URtMNArxh3#~V;S&p5Q70S zBp(v@p_3F)uUfiJv;YY|3|W5VP8@_9Qm>(Ph+P60gQqk#lia?k$b3u>m(Qdn?(qETF1?G!qL`AmFW~lVtc6+2%At z5N61lt#n9yw=wvrQrMHFRes=Vh zshDGWF@>0ciH#$b&`1CIAEVf5E5wPXry*~E#|(iyFToWPiUl`3Tl`i%Tt5-*ReCP)MTCkB0*%Rh#E)p2uJ0l*j;6A0F=75D&j zOF<*CK761eL8FlCCAlw4^|Nk=t2A6EQY%^#Fxi%@mA4Ng3ZWh|BBg>gU+!pz+o5PR8l_P!1Q77kv;d-4i{ArYgSl0mJ z;6Ktm=YH(0pIRl=h|2Wh{L!d6$*gtGQ7LTwuEMOo<>x%{Rv29k`t zL?UndxZGBs`!sNSGVH&9%9WB7e zz-l0;C`%+&mC|T)rTR>R2Z>)!Q$U(5gipskOH+aPDN#6WvV)q2^nbAT7GQBS-NGQj zf@g5IVQ`1RA;2)m4DKG>T|-C$!QI{6CAcOexVuXTBm_tx1b4_zUi-fL$^Q55fA8)- z`)qeTUFV!SUEQa=tLvP?tai+#)+kEd+Ga4%2t+IbO%@!8pN9sq`0~tNw$w>i+i?j$ z62PO>Q|!-4{s;o#cR_{#uFE&ZQxE10}%88kFVugB%r>uk;)xn|33L<4uAgXJ*!;eY`-j zCC8fFC*;ut-E=dY6JMDmE_pa>E}r}lKno+K-7SEKO-M$ZR}Nb~|9n%v!cOFT9J%Pm zsk|1qkCR2hLpxA2Hla~7qWLmzS}e)wsnVB>SczGl9Ds{xMRb=EKgOHK46vFs2J5GD zNzZ;FX^K=5L&~+W3bfcl)c!j`=c=Db$6VGMrL(-7m5y!X?jq;e4>KkxjF@bhkC{Fp z9cfae-D~aiaW~uRipUKEyVm18lP@fnCEAp#qAEkRF_XHWgtBM>jSgF|t(>IL2!Tc} zbtqNlwAmdTtjH&*Kra({izZSk$vV6b@uQzp2GFI~K9$N#8VoaMhaT{&Ix8oACCB+r zUR`nO)LukGqb!Ui=ZCh3co&2nCS)s?$x^b6pr!R69INv^wLGG+b|i_4d_flEbi%jQ z5JVjNXu3H%eXB@5dS@%MDaDss%ImA zyxutJK@)wMu=ERIZ?2{ynaihrk33fl8d_xS%${vEsW-4pMvD*v3oz8ScCF`MSr;r1 z7lI#tvJcfP@)UM- z45`*pzr?2jW;8W%)F&9|nNw*gDvp(EIc~>y`4cjKUz94qI$U zA~SKJC)r25*_Q!bQIttt7^WRlDk4fkE6ve8IH6Mu(UNpPchh`?O^?k{Vqw>xj#A3U`j&Q4=7;&rerp z6jAX|2|`Bsw6sod6-UIC>9Mgj`GREr#Dq{M6JgDV8p|22vHuZhKp?L1n$x8^;sE`# zh$jTq7B6_md8|yzkyK*Cm_v(QEvGa>!OWJSo2L+NN+?p^E)ijSl%wUX-&n|(J)66h zvyJV)%`(lg+@Yc7zqxMq0C-BpqD3bA!$DE3Y+UBm((4F3x;MfTu!%T8IGtm2ZDQ>E z<4X?j-pE)J3U-ATA!#ht;d{P93SxO%EoOp?5gL)pJ~4XneBmzZ>70a_aVZiZf%MC0 zR*X~Y+h5tH#TImlzc-d-Jg{96tm5vlR>Z?m=6oLoP8`m#rwdYu4bxf#%hsEJCMdB& z=3s7vB5DV-K)g$^Ae&rgTX&H?Y$1I)PMT5}fV+=- zr>s7viQnLd4)0?c@>4Ka1ayxQ+tbtF=4iKB;yEdY0E`t4ra9WOoO6C6DQq{gMlU&6 zF$D{oE7PWu$0R{&62#(N2|9H17wq-$(W)1~F-^r6p~;@kcxfO`04F(`uS1QJ@DQN7 zi|%1!QxC?rr0843hz~K6b45{a=b(oX-W2h^+Er<`4Dwp{P>KLtFsVPk_}HXH^2x|* zTE+^;FlTeza=|(4)qSNvxc7mJFPx)4Z6zyf^!%X>OGU;KX_ZcNNk)7pV9v)|wMtURolabMmR^A!kPoyOr?Vm_j`2PF+1zSHn zJbAv0%JK=KHL|>siZqS8N^BRn59kB0pGI9wgY%BO&x+0~-SIi3cKh@EjF0>+6W ztQrM)BEzGT!OI>l%-kN!DfEQUJ=Mw$GhWbG7K^_-TM9HCIn@_>sm_K{Z$RdnM?zO_ zjXA9^k+Yo{+>IzJmDv=zOKLz_z(tfRgn^l1@89kB4G*{+-SjKVLuV zZ6|#)G*>o$;Mg*u9cz&NFdyAFd|qDl8$w3>YEnIyi@Qiq*nGa?o%UPp|E)t;DC{TF zN3C&E@*Lg&Ca0A}TzqwJx~-yVyk6Bg|J1kkhxUhWoo{uYRvw)FXG!G-bdOdf5kKWQ z0fuv|6>vO`(X!Lfdpnv z)E0ne>_+^1EKA@&k?6lZ5D6=ZlO251Z8tM78=tOv)ne{c1%f4XawN&#icGXnZ{Pak z7HSOKhUyp2wwI&H4v7s4tIdWM0HU0lWWwA1n^NPA1MB; zp6QXVG-_zLNy1);Vt4$W2+UKeL%}tKyUYgaL>y_~Jl;05g&fFqUikrpxArYEr2&wF zmR~G4%GUZ#w8NylD{A_t{{ANtzB1ng!Q7&riO98H?N&J#JaDU=nR=}Z}mLwY3X^VxMl8*TyW^-S=+BJ?g^CJpc015 z&Oec2r|C7`4Fx3K4u)iS&Xt0lZa(b}et)KWAHRS5pLCIrBhdkpiRcmV6hE2Q*D_4p zgf<9E6!5rPE49SbWvs+L{>yMRdi~HD!8MSey2NNpcjTJ9P+1KpN$T<=E_K%GLp7TU zScBkLWiYbw>z_z~a+soH^f9~8_jA%11(-knl(&G-%jcix#7E~00xQia>tlOp?B~S? znOdV^O#9Du1{lS7(`Y_$H(8zeNDU+ct?)gWYlZE@FXwWPTCJxv`Ws%8H893hPMEeL zVTv?hFXd7VKabp^ny1lDG+M@w;%wba6g{?@PslJmNK|F$D&Z}M@kYo*#cPN^HW?3a z3ysXRUvyS$XduX(yv$&w86QZ|%)>vXHOCZU=30G(m2B`SP^AQh-jI^ev*CJml!;4_ zUA@am2Hs?id1&wRE_;-p!%tRJlI4mkW0TpUglj)ts6;Bvt6q&U`mTUDOf$GrLuiey zXQ*|}4?TlhZfHv>BgFaqCsF{KS}!O0>reFI$#Y;q(IkJZF+p90NSwA5Ur~5*YuUAJ)J0nK&6C0 zDyG23B%4ioarm+-(;0=H%|Ny_cK~r_K})b0uX;Bd7JlosC`{kq)}ZQKdH#md?|aNU z?}3k<7A_y^TMw32FC3k2S_JP_|348xDX)2mN!O^LB*)gQ$6b^1xb)@aYAq*b}F>7OKAo$t1>13RdbA7 zsY(`Qm?SvzbBd=Xge15}!;Q%k7dCbbls88egVsELSnxQwYnt0H_$}&N)cxxWH#^Od zIEGsqhfDfO0nH^vBMkICrg`jRT3o<|L_gBak9JhRbN1j02+ox@KDk2{1uGQr70Eu9 zarQAN!0KEVyc%JX0}%=LDxSokbHJdBCMfKQr8hx~_$*B4r3= z8Y#Ecjo`Xd?b9t|r6|bgiO@Sf1*>=+D^5qPg;e|y<|By?DNx3;HKCcOmV`Jmh9yZC ze2Lk9DrnilWDQ|$1j2kdG^vuu-Cx(;&b?77ku!Zc_;D(98xw?Clk_Z(h46cN@Y|s; z_;u2yFlGV#{-k<>lom=h7BNP*rqEP1`V7J7siequpZekCswB)^<_+eoTN2Z$)i+Rg zS%Ge5*Gn0-Z~4VQ4C+DF_-U$(Cq}rK?ppgWVx69X>0#7?b2D`ur@N_5^T=cPNBjhd z42cZ!NV{W|(F&mVBQV3zG#uh=KOC!TXpd87J!0!}xSF#o?+LC5b~Mymg(7pLGG`Ab z!nd=Q=x!$8y*3lk5EJ667hLmXy20hFwjhyim9dq9x>88h1jFYu5^eDrR?Oi{!%I%v zVT@?}wZmd&qg24ayZU3sBFhl+UK*0Z-Bp0892a;QauQ5?G46K6&gUo*%_kxIZKhRcrurR5GFceddU(%5b6%)P)#Hm+qW+ zDP~$3wLlqW&=p*RT0_2nozyzC-gCuJAZPmw6=Odew7rk~fw9`zI8Z#1lD)NqaC%1d z6t-(O5}db2I623xV5xW$+hgI=x=ajL#HZO>uw2$MbL?HuI3=_ZD$7n7om=coe;~6K^FhA(jQ*WEfdc9D zyJe(~PXYs&Wx2|E^-H!ZS8^Xm$l$ac6z}M_<5)oSFJfoKX23hg!jDyY$S`UiOhR&8 zjqU-*gnolw^dDaqLf%?;S7F4)2J5wBk~;Meh+)T?I-oX5GgehJu9NgGsY9Bl{Oc2{ zMJ7D*%D?PXJk{9foS);^FJcp^{mz!G{LoP(1H&jngDBNB4Qwm7H;$p~nhcM9WCQWy z3h^?=Sc`!O@X_oDX+FOa)5TH8?VvISls`!Jm7?VHF&sE*bDg5)5A=VY31 z#3?T9LhNE+-(xdzCgb+XF4Vo|VuFEtzf+zdrex8W&E)oVrEaFtM+ zAOm6FIQV>+djy5K^VzgUd6+=UylL!=<)Kldc0Cg%#u|lEgca;LVO?6iIL#i-{!>SS zk5BZZaS&Qd0O@lzK$eEs5@gO{0{w@xRpeR}VnrG6BT`nbV2z1hwH3d&!8gRg<%h58 zUlqpSOh-~s4-3NgE8^^waMDvlLOBA<_HprM+9MNDDzv`|2(^#IOsyQQs`nfV%Qsd? zq)+>82>|eB7|IHKRFP-!P@TSpTCC2Z5>_wVp<18WXc3!+eEXV-vC0tWv~h-#!>+W zb9nHr!yPx=;7#K(p7!ndfEGE=aLa`EX+^v6eEaOmOxqx*CFwW2E-^<<11VO|vD@)= zr57{DF3D~J^W80%V1NkoI`8-C6d@V{1m($o;i@2ap>z$ULrxyVwx?wHj<6m`1-7+7}%?HQ;v$0yXnXa|)hko2RC4U-ir4 zv(?*i^KKGZT9}rviji~sLjacjS`iUR4n)I*l<4$j=)Q5FuZm&1eTA!bM7>PqmV6Rr zdg_D0L+bFtx@8$ba*npGA|O>(bk2%aU?FifAQto$zhqrDb05xcp{hLvI}f*7G)7&y zB{IOsigSA|D~At_u#7XtaJSmkpeZ!i2#&$U31IA2!eZNz6R3#~iCFjSVfXEOt)nmuIAD zV@!N2)bh;C;?>+Zi?@cf_IKgxmh5sSmaw|#It_G_tBI6(50hy$I%1Z~lTbz-rx(ze)RUqwwi)qVgnqGnPLmWmdWQZJiN)at zRs4rzm81t*pyaDTvx!pz7ASkW&fK%yBNU^i!tEzU0$lq;Q>Aw5nexNF3?B|8B*LrM zQV2UJzK!{*d+5j36fo2l{|I2r_tuxQ7@`Dt(2WC?rt;FW?}VmZr`c?rkp;URF6mv= ze{;0!Lcx(`%$MI1jDIK9(ttr1$jca>u}q)^dRVVcxu&N%77;G9I_K2cGSJpjmfvt4 zZLOJkT%gP1)`}^PXPKN7$Vjmq*sfEO+3no%&Rn(a@d8?9#3MV*0x`^F79|WKaV)%O zvrOWmGZlRO(`7-)bF*dDfFw<)If5afLJK&4Acc-Q3YBO-u|&Z4r~iuTDHyu#+vye0a&$xtQ=ZPGJlhE3Av zX5Vzx0pg~R@uBplh^#q7UeSz=rsySwlOAj{;3eOg0AGmo7p67~4`r-I5-gT=3v^Am z(Ma$nA3+%(2-I`|r#6LyTv+%XtipaVX!KmqenG(zmhDT=-T2ENJ+=P+P0H@mC!3PO;kE#%5` z=H(lQ7Q3-|`6R*`xC$_)LI)H=O9bfJ7B(_%8-(G6s-&?!jonL^wpaU?7*{{qW}X4z zCrZUrUhk)Tc&n)wI9p9PnDoJN>ngHud+HdU#p~ft;C+hE5Y&#ClEpKZ<@cpDm^x@bxEf5vBGblf4^Im@R z<)OmUs!dR$2&FIKl$V88j*=xiJ6__Z8;+wUqBn=Jj`$K7k-rFl7Z4)@xJ>P-XFp)B zI~ZUk-&R1pv-B}Uk{-tSoOZ|f4aw+CBJD`+B&DfiTF2y45>N_3m?+{&0su3Ur$C_Z zH}JPgp{apPFSS8b0k-R`H0gUakD*JeX;KW^p*p*EDtX?w!C|^rIVhK$7`b={PXVc|#s#sX*F!DWEA?8JUASfZ)~Cjh2Ui9?0q_k^{8qPsExP&nxz$MWAz+Q)ud= zC$m8512k`eHNHYcEZO-1%XO^tIOg)Hf;s!Nb8EXP*|@i;Kao(_ESxB#RkJ0{8t!nW z!Wfh-DV^rRN(o?~h=WrV%#1hv<<11m^}v^nNfn&eNsNUcI6S$UF1yJ&QMBwCuxE3q zIdZ?)e>*TolS?{An=>{&6E!L17T=`>S@HSZVb(Ea1f6}H8~!dtCV6;#3GQsnrJ`?iMj8{ zOwXvotxMT-=HN1Wq~!9#9QOY3GTi=i2q|K3k&roq(i;nyx8O)L?>48cNHqmeafd>A zNI?&FOQ10xKW&^GsiA;fY_=JYz>!;qe5XYcM&7L6AN z=)Dac9d_omW#_En)#2-(m%GNdqmb61Yq9`o_NJFslClPy3FSCk5FPM-mlv3d1C-c2 z?mL=FR_RN7*uzI`7`~fW*lYVNG*T~AQN@{*sFzS1nl$^My!#ChCc^?IbMz6{5X6mU zTJrS^&p{t}onPB8ECb}x={EGLqGEAxqqN$8Ss-9eZpv5wnWMYa$|~`(h zmCsIU@rgm=;Y(+yfM!;LMx#k6d|0T5VxXMJIH8m(aq<DTMR>xco``zm z6|t61Idz9084!Ahm)=W`<(SNTj#FpP5AB)Xf|;J`&Y$xnwqk9M<{QO%FupmIDIKS! zL}t@Xy2&nGC5h^B91uRE(Xi;r(NhExtru_eF*2Bktx?!+3=?CBrC@PrRt8A!YMblu zG3iH$j2nJq8b`M4W!hymwb5tiKwsvl;Hba}lx0179O)OLS368!{W+mylyZnM2P=#6 z!k60>de-zFF2cPo=15V4t=k8y_Whi!ufby7Cjf+bu`P!YLZ&+OQf4joUOUok8%v!w zR1fp$uvnd8D%UH;$O6Zevg5Zxe@>(%WEVI{F~hr}bo&`zjh2m>P3R zidbkP#xJp!;+2SvA4zj!t0`BJ$Y8^!4jA-W%hQHJgR#^?$MpERBf@Lna-+FE#+S1_ zCKM+2q!!pmk7zHbHYq52rQ*38eQVcj{cKDVl=za=hp*ReoHkJu{ge=->uC{Yh4LajwJUIuzzOBa9?mo71{%w< zPLSn37B(wNj*Pa9-Tp|D`vu`sm!;wQe6`c<4#*dB(*+K3iEvzAP@=-2F4>`)C_?c? z?^;0-FenvRz5b(ZKQw80Q)0f^eL{e*3Ng{EQ0dFU+IJIKl+o^b$QAxDZEJ-l8v`p| zd`#0&X2Wl+H?pFjaQiv}%bag5jOkejPLrXntdT1nb+N?bjY@7)8}*@ixq%42GDbp% zS8;tfjZnr+tfLk>2pw+>d)OpFV28|VrbHg1bt8z2H7H5*j?J}t%cFr2&zo0Fuila^_^+zXB~eYUNZf9>PhIrShq2t z6|GMShiSTLZs(9|&Zd#8c#QGo=>>yGc)A~RCkvdBW=Yx@HHD2JUzu;x{HZtrgYD?7 zrL;zl5A#%pUWQr*kjJM|oOa4bQi%_}2#c5HItrdhKs_j$joA~(sSVQ*;*UuV;$7Y$ z>kGgn4A_T)^=4p<_QOTQzESwO2wNvf`GIB3`xi+MQ-ui;TXgpM}drBW$G0D#F8Q z-bWEv54fOaHFS#%fe5Cu81dUVFabk!kRElGuzb}@)4bwr++p(6NSp4Esl^fx>H&_# zC-oA8Lf@eAV3}~uEW&6aJP~60kY#wX4SF%zcoa|X;^BLdWebi}g#;k<4P79{llD{k zI}9If`c00suR5!NOdp>5s$z)K9R>|N0*Ff;q4fRc{f4O>$@HPGo<5AEVetvrln=?J z@~Qtc7)68S!}_@_Hdpj7Z=)zw~~VnKVgloiFrl@E~;v2P~ioa|1e}t+vlL%CQok30=`_l*zEiw1bH@ zbR=s%J@p9=Mg1UEm>czWSd@*&fT!8-$Ww#ME>Od2Po>Cusp%(DSMmnjP#-^Y?SXMM zg@8eext0~ZPz3W6Un8suK8?v2fNcn?QyiNO?we>nW?TQsa87Nay>czuDB2CS0u4BN zGO=8SbP3fhMIfv^d5>mrZTp+)+~++<-M67hbCd-i>(W4}Mcxd=FkBfs83MOJ%n4-~ zwHbuzR(I+mHaHiBCpuSt_n)7?D=TJr+oy_M>dIH~=^YXmRA9Q-#D`ko+oxx);**3X zTXwu|GOk}rD!iPqMOY2AjJ(S)`)BCooS0iwBRgNl^gR&i_JDP7SKTzc*dyv_3CWI9 znu9n}%y|j0_2ClzU>}AsFQrp6fc<*Y9IKMW^B!GnG^RN1q(r!{7u9yd&>m(h`*$ay z$tmj7PxXkHyGU+C*(B=ig%tY@tTiPM)9j<21&^>jj*Y~jw5ddm3Lj}!tv7TxY|Q0HEwP7%u1CjmWj^?wiHg1Z<+;UQG!6@8 zElaZGQH`-G5ZfP-Ks*&5PiqgTiVg!y!XoN)G62@Qi9+)OEa1#AExrne;`pHrFdP$i zk7M&H5K~QgTGIlY=vbPFruI61DH!B`fEX<&{+FEUlneK+-DHh1V#~+&>xCD0+z-x* z2sFl`IMtK=(j35*8Rl&Z5Ep`@_L)|be6KEa2xOF=wR(Z}Iab11jL{>rh27vC>;iI# zi(C+k({6k)f#sYssKG(|Rx!6ZPf~6NWv5`891<*~te@aLRWlx=v%5>zlcC#rOA!GR zh!3~icGf3MwNsdhoP8=?c}8sj=S!G#?^kVSoA)9V{qd^a6#t;Ydsq@F zN{bqZVHqZJ-AF)K8hQVnSI)H_ZF#It zi`v3LuviZ|T;zQNq&mTxW#0-p9N|;wf`wSg?P7jw0($9$h>n&GRZ^r6z}1?+kQJ)!dUt?h$3NoLU{UTaW!Ss%!Z{KE&kwJwnHHq`Bg%T;n$VgQZMmezvCcBZX zy0G~e#7hyqx4g37X-+>LUa@LLv5u@g9>D{vT<|i)k@;G2sHib(*)}q{HLVRPuc4nV zzQL<%z|LP=6zcD ziX8<0C@j#jIX_Inoq$8LVjWA`#AE(7^sygeUP$gs@$?-R|NY zHlnONj$odeu`AO$V1qMBHL<1n*L}OfVqF|v(vxtAv!~exf3X_z6^RA%m@tcpQVtF+-lZSel3Em$< zLddOW-U?|K%th-kA+}q@(LnL3xI_2SUWEWcnQ}6FTxI*(eN>MQ5IK5BnT?4eCr_f_ z5nTIC%(nF09P<#uN<|;QqMg*-1~oL$aRK7wl_j#DC}M(GwR#CZ+Y@D!Ock^gsJPEl zECvtq6F*|v?ljNOS8weW*mkcjsHa=_pyt^ake*2HzAOx*$#=N*(SDP;UR7>B2zPtd zUbl7Bs&roe6RC45oJdUZ!yE*pkEE6o9H)+{I%_vpB5+Cmi8-@$#Z?07uwcxS7iVIn_mZ6*g$aK;gNcq@r3dg_ z<=ET6B?MklK3o3zimoXBdQwMa#w}gNmtg9926fe3$xkGPQKfyM*IN#cT}ZkMl@23yM=JRymMF3k{k8NZ|*0M%0r$= zm{Eo{4G~^0N;o`rQ^^UJp=MLoDo!|B8HOdW4K&%@+Yu&k6qIT>ff}?p_2ho9hEXrY zEDH#Vxg?m{g)9Q(Tniy;MMV9M-AU8>K_1!|-s2w<;(=Q4Os{JQX00ypn>-nO>)Vvy zgvKEYiElJxL!PRd)0IYA{!#i*A=7}SC&3D{jRmwL9#y~!_W^hNt;LnKu~}}`ilUuJ zjC!0X`Agt5>*IiW{N7LZd2Y_*?x!i3VeG2u{A$69AV_T9>92O=j-&*f?F>y(>d?6+ z{6<=pz?a~Rs&jY{e==%V-0=BfkpO|5OAE86G&$!zAi<$?jqDY>TyeW$%!wD{yK7QJ z68IOapLKZL2k(}oDo!pGhbo`pD%=N3=Ev*3N8@WOg>tcKmdWlN=HyHArc(@d7`u3%#7Cgw;AVy1it z(M(LYzaMpAYuXBCv2Eboud%#X3Tr6d$-kP(Z(L${NLQ2_zbRz6~D*K2y-2jeyY1Q7N?szTUE2 zz`}B~syK>22-Sp<-X{4~IAa-uUq5@d`9IW$m`VRg{U@z#NYC=b)Ms3{`6p$Lf zNo1(0>!_0{_<^SdzeO!_tw6OIwWpboWsAQ)SvxeDA&lD$U}CqFc{frAfsM?|;%uKd z{kW|{^kKp+8W3fgO}7=pT1DvUg`Mb*2F0248wPS#bQUbp^%APbA21MaO+M?2$Ty z{;RcBkKhhF(ah$sWbl&61bK>OL$_9N{DKx%m5{Zv`cTAds9T~xV~S;vX^ZVi?jODH z?o$cx*mqO=IWOIC0-wqY$z&CbPi^mdc#3pTeZX@L`+tIfv6Z!?2yMDnYofP>OobF+ zBNm8oVi*AaZ$eGx|ErxoqSD{t>i$*d$BUg36$RNUOwN95T0#2y@U;9}a506wNPqkk z-{BNf%oXtlo2TA9p72WzmkfqQBGyhyf+0opX9HoOJw&AFGHn6%rK75ekzn6O=vs3@ z3pv5C8a--lcZ8nVh;3YXA8UCGik)2i;%(G#WjUc`lf9tZZOwjM(;~mA2O_#T?_0q_#5r6KUwT z;bqMLGm2qfi3dePPPHa#dCAV#5FdIomHJ>#5==%*a5eJ;X%{OSJ{NjQ@Kw(OC087x z>0|m;uUH!8dlJcVlb=-Z%1%QnBKJb2K2IgqHi^Ez5&G5A5PpS$=E_q%(A7!ehd zb4i5NHyniBD`X@Tgn>T5Po)3K`90#B(7)optoyAiv_On>f1QZco%d5-o&LYz8y^R~ zkH3JC-|YdSm>^6woA}Or4qY((o%<(J%Z1bLVEXSoXnzJ=e|+hEiT5Y=_x{bK_{pUB zjpX0ce!<^S{*m&Z!S8-Ceg1pSd;g1H=;BYLcYja*d-%ZR@3CD;x#Tc8xL0TP-&6mD zZ~g>+_wRpvczKh1eev=?l7Gjt-3F=tjU%Jluo6ERqf)odpZ)xe{MBphiM^M^qi^e9 zG#iffb_=7RROk1B3z-uzRp#@9SAQb)MvmzH;Ef-J43N>IgLsBH+-0x~`oo{b1^Jgq zjf`D_RrPUXk!GTairzEz1lH0+ovT%%nWys!4r5VVBxU?9ou@r{-7^20gqbVMVqLYlH7dXvn%V&i`@h{6Q{^98tpqP!LXO)O|u?&sOjzBIEaZ0 z?KuiW7tP&Xs!u5d6N|27xqL+Gse~05Bb^#Nk8CSXl+gZCJ`4@i_qZiE`2q=l>~0#) zH$qCrQF_O@w^@M2*`+C{uO{`lw>lA3^AY-IoHuJWg~FVLwL?^T>>33yr=dsGezsC* zoYem6NFmH4{)3YaiRidQ{G3oI&Vq#cN96w$B%F_g zB!k1#`>&i7Lb!h!fFL3^Kz;P@;-o`DLj;K|u6qqWdA4KZwMgdGYVrqjJ`&N%>}~0+ z@%gNB*~gcs^TyVH2K|z*r^I8`xP8f47z7=tvb}^;#U$2Ca?i0V~;hGlu zD1x8*Wb|)u`&-`Co@hDgro8xz{|^8m-J`$a{|A5tQ7r$Bcw`94=>ENQD8Ik_KVOG_ zOU%iaC2MYrdH?V-EC}h49+7LOI;E`2di=+Gf8`zOn?KUzKL-7hZc_aCKNA0v4hi=k zg!&8p_iz9Ihx`wv0P>&3>7V0A1^ihd5N+Kb2SSI5!eX_Bne>kBC0)4Ui2BtcPs><`eMF$64P-VAnG?>W1+l^ zguZei|3w9Ikjf!xFsIj$sU-m(Xr?k_F7}_s5vP5d$d7lc{6UZ3@~;G}ITMq#I(GWaIu{ zQ&!f9p(aA_4j=Im@BkSV?U&-+pJkRFz)L5se#G-j^-e8dTB@MF+x1oa=3mC50oSOQ z3N%S~D5(?7W0>21?c!neTM}{f`_CR(3_YijSvscaag;f}!qaJg+=b<85$yZ%wRFT| zkOUZRk@10}%d<%vKje{^WjtK&cr)7MCaLQ_;g+%u!y~>PKLmg_v{EAaEi@bw8%*dp+c$X`(u9>P}!{ z;qmQb-jiGcKF6ewE;cyt@c5S}m;F8sr|OFD&A8u>u4KXAG~FIGKFP=^dXvD|X=lZG zb%X6nN$jTmBCqVgaUjuV?$GVU>R4E+Z~9<65DvN!t_ktjHl={EKYivh; zIU|KTs=Gg1_si`Ml>OZD#Dwi|HT0Rs-MavK9utW-aokSlUl*QXs+_7e5M&{AqYZHn zx*RUPF*b;I`rX7iyzrqE!F)V0pE`Cn`XY4rZN|;n*-@v3*uOd%{-835{R#ae*Pryi z{G+KeEB0x)vgT$9Yk=!VOlN_j>0N%;!&8k~v?8W>#lfN%ia~Boh5>V0Ku)fx5|%c5 zHdc5fV%6axB&6J{T5UXV?Ikj65yhOAIvG6%6dE4h21rDxX%fuf+By~uO|u5kT@VFz z1}|dG`>?1&BT863i|FPlhQYNxP{G{_(-WduU^#WGFCcqC)pDH)nRM*M{{@9biS% zTtaP`Zvep?xDFT)a={YEH$uZK%S1$R&QVqBSxiB}Cb*eB1GP!C9)1AYOIQi^I(iCf~tY&;* z@vF|Vb1*MTMJJM|&=lM~Nv%_T*go?_fv{jHJ>abS>vdYu51ibLlsA^X&gh7QQJv#P zyH9l+DVzFKiG(l>R~ZMg$FAV-fqBZ;DcAs~@sp2B027WW(kNk%&?gJ!* zD(){$TtGlV{UKdJ_w?owkCf@(tKuSN5k3kkHU(+!=nVmxipVUuLVqj=Dvdt6l(yvi zWQXzX#U6Pubk00vhWVH#FC0@3zF6dnnPGN+6T>RN{mSaO)c2;b>$r8U(j|$l7m^eI z8RyycawneA#qeb*<}S-?=Ukg?(EEBy!aI7`(THM;ij(SgBs~kas&~F(ataWSQ2QH- z`*1Wk=X5J-Myh|u>n9J~GpTh1z0}_V9G~yqXF*$XjKwEbMRsmOJttkthEH=`9<%o%FGS*s?#41&1R?wE>dw1OXL&sO&;?Rr88tvfPFEmVQc8k zER^;%A506yIN{6C*nTOB2Xf}UhBK+yZLDs!be!POm{)iU!h6CK=<(oZcmm#$rotY_ zrx{#BjaDhx#FLp&rA$4#H&R6p}2|TQD%4}i<3W<5{J+w4S!#5C(wz!cVMr~A} zR`?M^Kc`V;BGmHEccdXu*KhY%HXT`@bYTRq9Jk6AEsGaA2)n!e@TP;4icKp?g1(sPBLar8WABd7ljVD7<93lZg9_ zMp~WEaMG)-Z#R(ewySo#i~CG0UQ$XCbxg$gAr(ov*7Ig~E) zIwnn>hK7=!c9KEcv@tr`} z3$J)O&E!L?VD+kU7gbJD$$qY-3ojqp%P;8lqE8YhN-91-*mUa!N4*GX;py%uZYJJ` zm@l;}=b_C%k-{%tAR>#I>(ypGk_+Op!R{9NjwtQk?|tqq)ALD9A_C(Rr@l=4Ncl?ZxmCIkX4Z@Uo*OQ<<3zJxS~bCLVN)yd}gl z4NrNMIX{M0AS15`eU0WmWBXVO=B;1?Pj9zx)*^jBl6~|=o5aBbsZ$_ck8tE=4#&sh zK|3q6X&lDsZRx;XMl4xibtR>}0eV|n^Fr)pvz8Ow2zl8h(lMqNxeng`Aw*>7?!&X- ziUTnQC61bzVbSKveR?e5`9rAxTv0pSB8P-TVKQ;QibU_qiwlhMZ$eC+o>7BPp^0@} zH3Cd-eoFoo^87bT*%`wtIAZsgQhV>zfC20-OST*&_Dz{s3b?gj7B(#4)Od20qt%7x z_eXpb*oxnLFWD5j-*d1ISU>u1uOg!-)f12}b%jka9%(w!kd0JK1gV+0w;Y>}U3svh z*5L%75a{Y-tI!f%*{|rG?e!q{bk^qde*<}xFy}3AxtxBp5N6!Dw2ICx{1ZtH%n>t) z$s(iuR9X%_Y@45UYNoREd|-C?Ags(Xh~)OUwG}lgPic{nG;2Bovkj6d{XWt;Q+e8g zHqMQvR>N)lmDAMmLv2HCLw&tm4#i5$I9Brxy#6Z1s&HbnVpEn~c-tO2N>_J{g94rz zR)@}-@lLPotqz({)M+vk2fgyNK+ueO&Zq-lDeIU;UB4#VZd6>UnO-^5hYH?}`MF-t zBCG1fl!>26hv!5jtFk6{GLic0q;xIsK2d;er;Frb{x5og3S6Hg%wr6O9zxA+MMy&O z_sQ^bG4ES9-hFkweJ9qC1H`vKjTVa#x zWghGi^3I9qBWw+;+^c73J7`SqP5Ccm7JkPhPoN#gnCKVt%cZ|Qx!$@jk*t+QG-J0U z-xXZ~2ha3=BH`pMSbw@#r4hXY%6WLqLeFm#0!-9ZE3g*p(}osxNmq>CQeT(&UXP3% z0TytoP|xE@zp%Zrr}f0HVGQMr`v4{TKbm{%s5+XiU+{2ncRM)b;2JDw4lW0G*I)+? zE+N6)-QC^Y-Ge&>NFcadkUYclelz#Zn*Z)vbLX4hwN_VmSy#*MT~&Mkwjc5x)_eDq z7QH0P4>*SlIxS*^>KwSNAIAIqWK)MgzzLqB@FaOaD$|e*j-jk{#S~bxV&(@G9tH1R zj-zg77S@%fW@RNtcPc`cVu_Xsg54ZQHfo5s{3f8BIi)Drow_t(8BMT?DKRZ_k=w5e z!UG>gOS{1Ck5y=}_LOS(@}$K3kXi#kKO(4{wr(SkhmGc+ygai1C_0kSy;)~CW$+d# zenlX@M`-z*z#eftlN0pS{Om(uzo{F7h(~4;qUqyrD9n z&mJiTeR`0Ds4cxUwkX@gN4yW0=H|3>Re^-N|xHKXMFNR%ri{BV$sda(2Zguev z20amRfmhX<@Cv-wX&;Yz5jn9X4Vz@EHcRyS$j`>sOaPo<42125ha>Jk2<)QLS86sZd0?Z# z2P$)dwX#3S@DitxY=*7Sxd*U(GRH(KnfN&;J4L!KfO9kgi^#Xg41}oW#*c9vec`O+^OeZOYcsPMAQ-{j2T&n zGOo+$Dn8*eI@M}`T*#fiL`hH>g)4};S1Ar5PE>Y%m9I}e%KjDV`gubR7Pm=UvjGLr z1naUO^PsKU2ItRr^|}C{D-)DeDUrTEcL+E8RaF5BUxxPn+$Q}+zGBjOrdtp=V;`Ga zyeaG2{x+kY*pamQG?|;h8yJ#UCCF&IOKh_(IzQ#ew%j59&N@R(Z>6a)S?9fnLVG-) zg?>O-V3u%a24(#Qj~uWp%u0vf56xaTl*rc5w9}PmL*J1N37NSu_eEyI%}VgA9r|Ev z6+hBeW@z*aj+Iu7t=AE=f0^QYqDQ3(@ANNSP-u6=7B#APmF4GIrpX_o?=zy!t(hvF z58^I8b60pJMEi|95;h?>%|YpZE7e=n*{vOp2F_uH#z~St;gj?{>!sWZjvyR|YkT0@ z43zNwB*{d5Drhgj(|R3_j53fgmV1u;+O$Y$n0KsVC9slaee73~N*py1*i@h@UL0^1 z9sSF&vXZ5;i^=r!N~h?`W-@SJKABk;XT1A}!dk5*suHLYJLPHsWf~Kmqpp?@Xf5N8 z*7+=^tgA|g_YOzv&R=XhI|ta8(~4-i_=U>cPnON-e6AAt;8o(Ggu2qt=#)i_sQCJU;|x9gCQ#AgA#ybo`Z{^toAvjn42SKdl>M$o#HzWrby<52 zTl`E)myEiY()|T)Uv&8&(yZ!g^RY4*=%AMunHm#q>9^TD2&U&bBnz9K8d%8-~NK}L1DOX3uhx~7MAAXHj=we7kMM;ol_AcOCN*rG*rOv zDnEIF-HF{KVO&>4x^@FL`fa}%@E3^GkfWaQ*LemvG7|Jt0Tdmv84|*(vXM_QiXnFV z%o>s@Re=7kAr8qSnuMs|#a(cORJY;)j6km#zL>flzv`Je6IMv-!m>`Xll- z-^%Qpqy}Uvrc|lC$t_>GgSOt$u7EuxGxQH$hlE0F&mAfk{=|$QN;X>piy0vNo`E#; zufNUb-NM%+9K_14jNF7j9l!AF3lN-iTdAh(XG`m+*+)Y3Chm6LMD+S8qrnc~SeSGB|K_E_|u0aoI!;NrKfK&!Kt<~ljk0BGjme~Be}?ZXM8| z%c+6bv=vah^l*tfPhcyXmLxBX7J!Wc{lbiDy_EW8W^*Q^+nl?~irrRRl;@Cd)CRRv zHwZf@)6#=={nI5D&a&G6fF4JUPiqo5%9|?Be783Lgw=bSN>BnVS)ovN!5D2slTl$1 zUmX1$^2)>Tb#n+{huNFcu$=a;I#qW8Lv*3#G{@G&Ip@WRFqKMXXT6JQ1t5Le}p z{DX8^6&gZ;nVv0ZR9HBU;kR?io2I)I(t|S@CSm7gu3x?pu5hbpZ;~DZ){dkuvP+Rs zmW#ql$Su;@1NGu&*VSxZ{pL(szI$`q=@)Mo9W}5RVBB{b?bby4O|Xd?nQi2A0bhO_ z)5Y^N{UK4KJz|(*AO`1c#&;5Ha${*Ta?#5p{ekx-oE9mE!xiZ1GYImNp>iRv^={h+ zEoK=%g@@YD(pzwI!N!ujT+guenj!DAwAYPEo>9&yN~F1|@j`e5O1{(v2_4@> zx}v@*47F$;I{(Nq{(uR8of9%*e`f9ru%5KxT+r!Pj350R)=>jx7w~OEVX9;es$y!1 zwYcdEHl<+@Gq-)L27gQ)lL0>f=0>M*A%Z%()pJC@ral#*#g2?iXfyTGb+Rg{fTH)5 za^VGHUPdV*Eqyi}N?v;c^}FwUeL~ii2RMJ!)z&b}^=>UvsWCQL6Imd9wdET|E)1}E<`DU`I^!M+PQPOGXlxzbGAyb2 z0Db5PA|{Bw8c5__Cg6TEWR%|qb_>wpo&Q~%R2&kYw>|IzX;zwijO9oGR6j9vk*~PC z4D|lx>9Irje~YT&UkipL}<>2x>fDu(!W4>j05p})yW=Ctx}F6y7%8Z zjMEDkJiCdTAU0oRSD9TT>j$zg?hvdyFWy^+t1zubC5P-#}l_tXLuU7okuamrYs#@xu ztV_lMGAhaI@BzrqfO+s4Ck7ila?IZwZI7`+uef{a)e}|K0Kls0Ty|5J()SIZ3btgSwOl^m#`8zuc?hDlLIf88 z$ymTe_lFaG_!&M0q43#5N?T&SnsBZN0PY5ekf4Eig$A0{p!?^G*3Tdh=V;sNgV)^8BwJw&SHcySRXheU5 ziuIl=!u4rY49=+%!RN`9(yrLe>xSeh+SA+c3Z57|P8|Yl@$_Jb_@N=b@nu^N7X3q7 zOMfgBqM|P-fi=Y$=ZzQor8=6P2Hk;Ez1FC1{R}ndZS>9bVBv^E4rb>>W&b6C**Q#U zzrMpSycQTFA@Yb+4N^RCw<5U!=*0T}bo%1JPL1^Ghy+1KHT_eMnO>n&O9qYrk#7ON z`ETU4X~m}kvN}G0d_Tbfp6>>9FSejduRO9%!Aa=k+a}g25n&weKt~-(VRtECr%}Ai zzK9bIy4r@#PZEB_RucxCA@2M-TnlZ~D@5}Cm|YIsGLo=DUwmiV?qi|rkDLpdyAP&(W$!OI2~(Gt zO$-b8iVT@(LX4YKmW*|@7puMZ!1g6<7NBSgoMOg@Fh0&HybEO@C8&7K2?*y$mR_WD>Xj}5t!eBYn~4Z=qU+=*Zv^(~f%6~eHS3c=WVv9a7EjhL;H%uTo08!LSX2+dzU=MyY1`=tVYMndn`#hB@ze zSrKX8b*}lbn2na^DYaC!<7}Let^u3H3>C|{EpjwYu@u*xxk&5yjv-_QY~1dj?7F-| zb(1zXdOdbURm;Dd8m>FRDpR;Pz%~w%Le&!)YpV;a23+&J(mi})nRMf81{8etgSu$= za;`?_1H>WsY?6+hj39T56#O`G4T=^&LbIV-ON;soAI61Fkts0VvC!SuVoQ84V=w8? zYTqRSyOt$*&>jnKIH!BCyJ2D}x(g4=Gl|>Gtww&lLYneZ3M>9j%yY8SZiuA0;KIcl z`Y05lkfnUk zki(W4(VPb@0{8MKvCeW+YmWf(oX({Paz}AT3IUdiVAmb?ahNNV zE0d_Nvgvv19((G$saB(4-qQmLoJN}o{=4Hg!UPA-7GL^2!3Qyu!fx)oj>+55H+1Gz;&EcBoc1774k4}wg~NDN$l>TnW`+1M z8NboovP2-C5jQb8iSuj7wc&jag}(`i29UJUwYWIEOtqR0VXdRZTP zP_JIP2o-mKA%HIR)M!e+?6i6h%P{JbwYxe-vffrdwFUF{D|IgyE~buiDa5+SY8=#S zabrO9I0AL#19m1+p)LCtyaE!42RtF`kp0;}S)*d#UCq(HCv|K9XD$yH#U+TqX9=g{ zeyyE9fcjv*SgC%lGcsIi9pkCa%^rLr5_kgws{1c7!kN#$Y&j)QEbDOs~Wmk+Ij&A~(HCts)gU@c@Z6a*tSa_NyS z!7*Im?pS{ldXyrrdo#QZQOPjk8D^#5PpNlMy|y@C@@3n~hukc2TJ&ppmh%#uBZWU#5K|2Kw|t7_eWwnC6_Q1N~urgX_EpA@`><0n5(b|LYl z#!qhDra#t#TPeArJT{Fm~OnntQozO!*s5vL^n$wx${J5Z8h z%V^ruNiScEncvF>VxTPfkFK~9k+zPs^k&_(Lf+Kg$d#0}73AAR+L|7!J3S{9d65Ul zh^8i$GnY0%5FsLp5hY)_CT0_h!M?!62l#yoZ^Q_NT6y zmC66g*dyU8+I6gQ*KiNqjBZZI65bzdzfIqygdt0wW@{JWhkDhFCp|V4{)Ok9GZBI; zhEPfgB%vh4@$a=@$?69SuTsz32E4eSEE$oySSQ1Oo+o=G^;xaCMBktB_Jk6$8QB=X0bO8s{uWnAPS~eI zgw)FZH~AHqK7}(Y-%hvYE_1=>w98IV;cTWq;-vFD@wNJ+3ZwTvg&u|21O2aaY;(2} zw%j2IzwA|L*EdnB^ooyW2ROVF;kz!9q`%n>+MV}a#Yi~mFB^3Z@`719wa+IVEiwWh zEdth~^*&=Gn=b>IGS+KnbPa@!%O$HEWX@DSC+8cTN0MM7h4j*+5jhgVw$&JiWg}C+ zeT`4R)6cjQwC5F~N=x{~v&<_U?m5Kwbu5yyNxXzQf=c7sZ~3p2;b;~oBr6at34f1P zL$9)tm-$*S;poVkMR-b+nDjn~80#`vAnD-IVtP}y5zrrATGbH6uaaq2=#D5M2E4qM zB!+e|9-l5!k={?bQtad`$iF68f6s_*=V4T;W?JfKdKty|19%x~^`dok7`>L-)L!}% zJNVaJi7GScb@GnI^Nwn<0XoLX`v?slESSQ*P3Eh)f)6py`pQaZYOIkGJks|nF&0xM z9{WMcdvDP<&(kN~Idh;l4TZp=xt7I$`B$gw^R!JN${?lrrB1%a{L&7;1&ISv^3whZ za>28r!{~uV5D`lST2VKx1AOOavNN%+9ilIXjK8iWhE?8y_Z(P0l+f3E_(Vs5tVx(F z?Pkx2-FUjk#Xr~CjvnweQeKWD=!G|gkZjV8gX+a~GyQmUN(m?mY7EWer+N;djN;Wt z1Q+kkjNd2qlcf32lL7TU^{DpB6nX5Yn6Jf5Jk40#MQ8NX0i(e_eQKkYU`R~h&;z$L zGZmb*oCRSk95x*%;CMoGmdLLLGz!Iq=s}VPINBq2BEEx3?H71?T~;Sc z5IsV{lf^P!66xZ)oI~KpfFC&Up5ZdGsVPQZm|^lrq^zIeYX#MQ6!pg+$D50teZx`U zcJYGPb%(y2#jd<98+5T0$}$8mhGjPRO#2=OzDN7r*B!Sl0w&5I~+8^uc4i9Hqx zaksqm>N}?(Sl5=`Mf@>)ac$5kBQRAOBrQ^aH!Czo{u>1PM2T7 zOfKzEP^0C@rZQh)ix>5%(UEE|wnz&(q~4yP(;G}2)o*GnV(daXr;TgEgED( zWaTqoFjwB4Q1-Z)+|8pltzY19-}(yh!H!bvXilzn3n6>c#r%n zmHmlJ-Co2uoNh$OiNUvD8xpUmcZ8EHefJTkW30IeGkijdMKcn*ttUbWr~mu?UarM+ zMA%;U*fsQe5-MZkVP11hVl3{%)IyvLh3XwA(i#P_>pnmaML!QX02imyu2W5k^#&83 zfP44wrtj}+z;o9v-DBgR_iis@tw3El@?FVKZl;Jh?J$Fk0$LB~HaABBubGL!R|TpH z35RRTo0Y&>54tADca;{~$_r`8tE@^to1AKOq8@^lX@(!I12rE}T+#w9)}C}_{3CFy zqb2#kKQ19-o#LZiO>GN=e}0pjZMxuwH0o~~hw1&e$uU*@`lIc~XEMq|5#fTUrD+Ky zZfOU8fD3ya49Yc2sn)GLL7z|0YqR6W8*xJy7uYo}=DS*TNX8gmr>biiX9iy;4Py$p zX1~~@aoTJcGAqU0M6onHDawzUj9(^N4cEP_DqFCLv&$H^4)kuN#iv7t#MG*%yEVdn zpg)atj`hTR#aB~3`w*^MS0Ar)qE^AGA+c|d$+M@g>Dig|zR>gJR>)JxPB>cmytl1l zePe}l$TT97d^f^kGLpPi(O}fJ{!c7KM!iC7l~T0=p1T-}CRzho2fBogn|CVZb{j7h zOu-grq~svHO>zG; z7H>%7L+XBL9o9<7wpU=0T$T6J1#YluDa?kMf`&gW$0TY~B0awK{isf_6dkGE0lCR8 zaeC{H1CqB`dXE(mHKE#Fkoj>6=g)yI$KgOiI%$f@3D1)B%XvyabiD;c`qnJD5h@=3on_%DUcG|5THgL7TcmH>C>Lku2e;CGb!uo`u08 zO$Lp1b5TUuI(-ngQFXYk9rvf}MY_ofD%%vz018Z=i^3yn}?_@lh3LbH1Dxz!MuvRqu-L@h+0t3r{-E6SI{98JYei#FUP!U+%{{&3 z`}oGmL12~IaFRzw8%s4SY=fboAE*Ju=y0=C9C=@9Xk=zB6~R^QsI$DEEWQYf$gH70 zbhwi33YK7)Xv^;AnNM}s7u8WW4|6q%F;&qIShu&`cSC44z52rVW!xzug@*lq z_R0rGf^XOvOQi)&bCKA;;DMa_mUokP>Zi)$z?6ht>H{aTDix8WA%@%rp>7bAmOzHt z$6mQIqukjRha{X&Ndda|{)g!5SY-Qbqttx!p-mlLGP}QVxVRqh&dHylQqK;^)t#si zi>`3<6jzcnyq%6cJ1ePVXp5>74UXrxFzA3aTDjAA*GIDc>y~|PBXyeJV?nsC`VkRX z&@1+bXcys~rf&0|;cMZ&cMUo*J@3+^4X2w@*6ElTbX2+ck};}|c1(9u#W8Gz!u@?7 zk>#AI$S&uN{oQWaX%)cL-`(L2#WK(s1r=U+=^%)$^P&TlXwCM|jcAFhuM_&+qDQu! zELFAdv-(^Zm+epzIIC^Dit*zFC$4*lEBK1~mt5^%CbR2|EEu@ik(E=gq^xVjP*uq*V$rIsd*D4` zR9e-TxU4&V!usnj#o2rEKe-xa{*%k{=Q8k4#PaP_$nXD|E8Y6_r>4QSYqIvD{S7oE z{t9Z-j6{& zh{-eCT<|A9V|4r7%CF$N*R>q*ZEzhu#(?Z4m!&>pyG?q!EpiKXlB+Gc+a?VYr5p8_ zAWz2dSqq(y6!U0P@eIXydj1)p${Tuz(+3g6>G)}hnIe?KmYASoBZ$yv&$t{XL?Iv30?9O`Y~U z2E2P_jY$n|W{3($7d*}N^jrH4!3ju7;S-HpV#A$x5*`)E7xn>u@K zNVkQjdEdl`q|Y2hMhW|mgnPyziZ+}csoP%A3lXcTp1-I>eOmth1>xQMw`q00rOqrv zMwi}Fo>rK7ktdh~ zlYOO}uycmDx|za{!cx3{ME*xpS8v7NntHnms>fXH|J3XNsXhA#uz|e=O|l7IjC9)E;9XYP zV@BjJbg0HjKAo|hnDaKA)VxaA^|mSJ-ml0yU!ruHKv6XliZbfLcW*K|c`v+I1`2zi z6?(%&YDJm_!Qrwf2>QaYW>iccDa*-`TDEVKp%KP4GDP576Ag%(fC@5B3h!bk)$H>p z{w4+vG$B=tLZ%H`)#iK|a+K1`GQtNrV2hZTeD+zMmA};FYhsz&TzeAwF39^E$}l4^ zt)g>*UGoG0y{V5cDoZN`Qh0&Ub;0{7$r#ls~{w zl(k&?S*kg^BUkcXmg5k$P_B{ zk7|MjbHgyJNNv1H`^o(lA*yl15erxhn<8B(45*67{;qDpUXm@mY}&(32BZe?Vs@al zdi?ar(mFC7LAH@L>M0~u&~*r_R@!Igv>gpWJm#ooF=S~(I5weZ-8nGshe}43Zs4Gl zwn;$TxGukhK4Utot(y8v5gOic{$w_aB#O9JS>LwK579In{{E6X5_38DmV0*3$noS- z7||ztGb7aaKYU{Su-1G^MIRINJmQLld14zCT~tn5rjVgD9$Y_dy*ZvKI(rg8UXs2G zSy@N{P0UlDL36df6?A>`S~_@Vw*zsWx$S_(c9L07(|o#-N}%JHi~y`ewjr0c6%!bO zu0#CM5R_Dh$dis>Yf0QF$rup)1Rva%E88){88t7sjQ{PvRj987kE`Ll6E7s#)+N$a z5I2FgB~CZxJgZ0M{p%P=uQ1ODvvZOa5Tg<-VzAA=tBtPbr-BIxV})#cQ*$S5;qV?6 zHbj2pow!dK2>tHXuCiZTGdE+a6~gKexLg_5yJv1^4A!(5yc(QuiWC;CM}}ekI$(Tn6V#%v?P*R<%=UwZ zj60eXQl~m+@hXr0<9%|aX~(|>D~5_R+2XsI&K^Vc(eY9UtEuTqEX=Lq+Z0n`vkc6- z!pMHj(>g^<=$17aG{Ca z;U;o{hCE7i4ediJKeQP-SYgP6;0Zk;g5$`LrD+Pw!_SbE5EP5kB#o0n;=7Qo!%Kz6iqUCm#*kbQ1{2SP<{TzMH=Hl&CTO2N zeAZI{#^uc}fFL7_Xz=yiLk@de$1l7a@rb{*dGTwaJLd%O4>!8;_vH@Ts~BVsRCBRI z|I*3DKrSSybqnFAsozZ1@USH5ws4y+|+ zSl-l~Evk{uM?2iLwdUc?IJW#rOAVK-%HoENL3Op{FP_2cmT_CflUz|LY!7cZ%>_Z6 zTt)UQSLFxr8QI{IS%MifVNa2(OGYSX1=hStdV15YYbgjGQQ+xTgoxxeo$prL#^t9@ zhfPEoOzU^Sk??{=BC zzTQWn;^y^3heP(WZ4NZS>sa!$Gs8O&0YeqJo zsC*TJGzi|j7{q_VE`-U+*tgt>?X1ad!ds=lw5E|i(GZn2o`2Z^w6^r6th$^pk6XA&hD?yIIP*gX`@1{oL5^jiC z>J|_4qcv~zOv7R5$RI)Y$zq5mHJT3TcBrS>xe867FPkr|J{Xz$D1p1_$PO5}UAQU4 zS)xtkLtPvPBK1ybtY0S6JR9Xi=b$n(+s_CyX(hDR*m7h9Xo#+N<|`?Fj%-7TVot`U zvC~n+WHR8>HCien#nYVRb9=j8rD;k@pOxe5ej6^tqPfD;s{Cks>TiI}FD;?eM+RwU z<K)8 zvarG1Sfa}KQh;}!`oD=S5C^$LM(AasZPwK0KIN=zoGkr>w+3?xdC;nN{GEB-1DY7F zSiqj4*+uA@HRr|!G1$t5V^@WNFFa1(--7gkG-hs5L~%4{Ca-t0Ah^E|&G%1to?}1k z>{VUeq8S5KsXn-=Ws03Jet=Us_bel7!pC%AJn%bl;#Ce&jTxTsaU|AUHm!?R`?bwu zjUCK7I8S!~jW_pjxEvKd^J@|E&YJclhSN=3RRR!xz0g~&{X2_x zU*o(?fd3qY#YfRT)?+k|P%TijpOj!ST2$qx*ty@B+TCA1U9j17qo}2@S(Lfe*94D5NW2xVTuFZV$KTL@`|~Yiz7NVI zm~D!CoQ$q-bl^S9%6?&S7X}YnYPAVoo6&p^v0yRb$CSvpoMi}=1+szBpXX2s_-($Fk1_;%=H>{x63LUHQb(^@&_{l;PN=~48LS-!T= zgwQkZO>^(#|2GoesqS$Q;D852wO9V8N1M#7@xQoZ`Kw8vp55>Qy?W#Qc>ka5giI(t z_GjdLyEH6@K8>u@zK{*BoGkrio~#sYWai_<(wwKFs>g5eWkFyR-v&87F6aW$`yF}& zJ+rXJ-T!vCk_G;~|q78}6+6 z0)p*b&Qz4M@Ul~C0Wbm4%_A~OREPamuCJwi~u zL2!Y&tTnHaKl9(Q6hiiz;4K)jv|E`+#}ol5XO7GqrY4Vxl+kT#8)4`dOP3BScGRLt zu%Lv|D0PK-sjl0|V7O>HG;MA_Nr3Os%eIWRPfmbIg5sEkq1rkT7!6Gst!!UyUmb1F z?vAgT2xpgKU5DT+;F&nD*!VryGM9fMczX=h#W-pKoS|A(XrC#frme2{JPf0x=QkP^~D1v|_ z`qJf9?7*p2BQ^Fl2fBe^n?)b$gh@K7#z1svU^N1DJt78G*_=YfrM^Fuw_}KFbXOL_<)-jo{ zz5CjqrG0ry6$=QGO?FK;7TscnGej|kzsDmbvH{oFOx}~t=b1+(I?1YZ42J2YX=;#; z1v?vR(5|nQbRp?R7Y-<$5{C`qVp7yaK{OmDSh~+XtKntwHQRScCu3`YK4|G_`@+il zC4O4CYxzvNGzAox6DLn`hDHXaR=!zt>Hqux>!M@z(X>Y4wTHdIbizRQUYp*abr;KS z*JSEEL*mF^91Cx-gDV4DJ(-uyOBpt|_WGXslP7l%mja5P5agx7o^Xis6~|O?N7PUD z`*#r?{{ZU$6-6;B+;sIOue1O%>Ec&7x;U`~QqT}H||>ESAR4Kxb3l%CLvX(49= ziW-DYIz>(MK)k`KgQk@{uPSr{w&sKD!F|#aqLtfBAq${ZOe23oJ!`Lxi+GuXj;*%4 zu1`|6%eVjfXZ$5i0#Wk{PEuU(6vC>P4xF@|4R;UQesy3K3=nafoG(Fd1@gFMeu)T^ zv-#DbDk~H;YHVZ@VX06Kp{QK4p~djDbV|g;^rOL?L!<&QX#)XpS;+tOmw030+oKyN z+A$eEZ&4b&KplO;H#@w(`o6D7y_dlMyFu^&H0}L=#?VD17Rz9MpEw!+0br8jW&Jl& z%*TBkrL_$qE4#Do#uoRP|2L!k{}-!nPU1KrQ+hKZ{6A&#qD5b@uxJh%uneh^L)Iba zNnK$PuI4X;s%sr~Z-gli4u|6r1Qk<_1$V_WA3-BEes>i|yHe z01J45^2>U^r=47h!oFl>%BPgPS4|k|JwZ3E*>l`x?~-jE18nJ0f0nO^iB#mjZ!g|g zaI%ab6`Ba35ejBdwlu-%UxxuLvn<&9ISApL2*-|=1xh#cmLzCuyTyHlHBK<<`1psp zJR!}+tbIYrr)iRU=i@A!?WE zS`)wv1S%%+OtmWmPz*2+eMvq66~J-x^|f5Anw+@JEM$2co-`Hg>svN%)_fxurR2dgu54W zp}KpQz0+yefRKkCEQzx4d=kJ{zVEj}>uSEy9o*48SGkUaZ-b65Jz`+E69Z7otJX8cPpd zB^rim3ih7;E1_uzS$-%nAQ&jr-xCynQ@va>dA?r~{KNN^m}YReqjI5ptkM#%a9Vf)-cm|~wEYxllr zUx5(Z(AW0(m{As#y!*dul47AAsdm~HF`|tv42^dO4CvcAFF%dgVRp1tZar9j8fnj2 z^=J!k=3S8ah4KLU9QtuVIUar!liOjc6R)P3ehJ3^p1j~ak^~(3uWjuA;{0#MkK%1O z#S7Dtjn-YDa(nkfRS~3;=HJ!JAHwyK0=8RQ2ccC4#Vm6&`u!$%d6$w!)Es=>yzR9) z_{@>#!27_Tn1-w698^U;%R8(pQr>k*vz*o{@Bp&^A!EOFs=3=H{>NWbh-O}@I`hh1 zv=T)Qee~!c{%@E6MsnVgC}O7V)%GM%{fp3TB_}91uaw}LSd{(lh~adW=S zk}L@UJ<|~@Q~57vEh|1m>tluhBaK2y*0Q~I0KQE6>~!*qQmmad97=RFRU{}Oip>il zYBry$?P~sTEr#p~nxE#TdmJmUMl;At6&x@ip3ELgB6_bD_?=}N$=P_34_8Oujmm_J z1z*Q%{-7632*%5UXxOxnhP;Z`W~NxHr*`Oy7G0yAd? zD*~2+VqtX@RGau(sAYy6cPQ-{w1T2Eb9krdUx!-g{XkDhlq$U3nGkjg#`o>28}$x* zj+sBdNFS?QVI*SK^0=UrXIABB`%IO2!IxGuWSuy;L%P{+QYKsTw$|)zk~glySFcj3OxbHYgEUeh0Vwsb7A>bvCT%xhfTrUW#ja zkycLv1R~KK5!wwlQ~KRGjHIu;k9C!48gk!|9Ii!bTURPa+S#3f8euRn_vbDP#dpXqgd8Ax6f=$<(;iH%qE?g^=?;pV0f8GPowy~~*v92RW)tf9k($lM7 z$xms)54La8iP7BpcJKRdA70d#RH~txKa8#Ze*bsm{;y2-CKoIU#y)}zHt`NStDbI0 zLL}E=RAwVz1_d3ZUALo-x=9zjxl3-X6c1-I=d$?=|NngYT^oVKShmq6pzsAnFtH$; z;ILFmkZDdS!d3l$+W}nOKY#~uF|9d>bG@Vk!|q4*x3K?F{n!6`cq{c5{;LLD2cqpC zPuRg`Y^)AB@kAj4t;gS-UX?GX%3pupeeC*L`VhPL_v$Hk`=k2v= Date: Tue, 4 Feb 2025 11:32:05 +0200 Subject: [PATCH 09/14] Refactor: update the kotlin architecture diagram in the article about mobile integration --- src/assets/kotlin-diagram.png | Bin 42988 -> 61384 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/assets/kotlin-diagram.png b/src/assets/kotlin-diagram.png index d4b6d89496c363989ba94ca70b04ce550b4bfdf5..c6389f7172b0f0e2572b5cf6c838c8ab31a818ec 100644 GIT binary patch literal 61384 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ð5~Vr71BMiJvXW+#N|pAS^3v;D0SC7fU`IsmAk z&&Cq($@4yG5}7=SGRWf*65`O+{Y_Vaf%HDf7`SuC;7|7W?n zPlyE%-J0Ctdkw#um8Mo#Ee~{3?g|Wa(JX^cf}p{3P6Y)&Wz?G=6YTO_T*2$L=kM6K zEXg@WQ{TS*4mQN}%)7jrlk(rA|!(f=gESRF(DW4lJ>+*bh$m&;M*+f>A)wR7`>2 znx1_l5Ktc`eukJ8kgYw?deZNk&loMBj~8POkC;ffjl2Q&`TS7)qna?Hd1QnZlY1jR z-k3Px{DGF1v$J#K$OtJ^3e^UMjE;`8=gyK)Ya_=o>=+D|FNIE-+JeKupbJKx1yog4 zdyD!4JLAeeK=Yu<_C2yb$(U}q%8oI;)y-hO7f9RuAjyRTI)3f6X#k!yCU8rE>=}q{w-MJ9D61V>gPawYm`Ee( zNHjLFb{F?w{LYF(I9yqvb#_|sU8e=4_@!Obwh^pGMN+`5uHoGD{ ze{`NSYbpH)4R-dGoH^8Qbfs$0?YvOPHwTA{(pHKf$OhP)MrO80boJXBH_Vnh7v?7B-QF*ya zIuZ?`E33x{o-IAJH2%WbhgXMM7H-*^hPvwpE)~{%#sc#Mf>KDkzsnWk3hUxwS?`Dv zs&>3=8OG91iBaAhsxB@9w82Dzg7=Gyi`%>OT@Kn%AiNY@Tx7`^u!l}h;+ULII{15q zriw;NIaJUeRAgt{0bu`(!NfN>(GpGSO9S3|cKVzJK22?SH9FodD+qW2T_4Wl>Uzw@ zZ+cGt$DS|V`KQCr(~aoONbAewr6uV{yn-qrdh6Ycs9ibn|hc&a0C zFFz>6>#e`PtbJJkmC`~tKsRQl9lA6&%99PhwVl^>WHB*}_|J7ySpu0S^+v*l^VRye zo%V(@zJvjiSN)TK%(7~*ONhri0_ z;NZ*B(gq(!$>#&F&byv^GLQW%*APa`23}=?Qn9;@1||Atfk5C;-{!0_S}%V|V_JO| zXl`c_Zc-qke&pwq`$lt;6js7JG_G^M0AmL8P>O;90S%^ZOHQp`#ZuEt>id+uP3hFbnHv9|{R>W7Fni{MGVLK+^ z<7>SbIag*P1c1cIC{Ahnn{%0o7VM;UcbATfldtWQgkaQboi(|(hBa(b@_L4T!hh@5 zXUI=4u3ZnU_4eH8{^Mk2Y1s`pHD1!=;XA%KpeEww?6?79-F<^s40&H?ZGTKoij`f=EAg17g~DGOXrs%S%E0+14*|!dd}Eu9V$Uwym_q&|yNfVyy)~A@ z70?V39dD=s|D?d8>TvkB!*U~G>7(*5j& z0X)qM&ud+HuEJj8Z+DJkBppm%7S4rS_bfdlgd@wWV9N?tC%+~5pj+fHJd;U6QPq{> zlr8!ii8?(&N2KZG8dcj+!0lq$oVDvoGEt%aP`uooOv0UE1yP4fRyMl7Us954|IR5w z!KB8^tqF_$gNk_giWu`e(tcA-hT-HU2>(| zQY_6>`Rv=6EZ9J0Y1@O-+a33EM@s{Mm-(iM8~qv4DJc!`5$nBh^;oH!enR_h&{tJQ zhg7V{Sub}b Date: Tue, 4 Feb 2025 11:37:24 +0200 Subject: [PATCH 10/14] Refactor: improve article's conclusion --- .../Integrate-P2P-Video-streaming-into-Mobile-Application.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md index 2c6d6de..b1f4f6c 100644 --- a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md +++ b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md @@ -377,4 +377,4 @@ For detailed guidance on production configurations and advanced customizations o Integrating P2P Media Loader into your mobile application opens the door to a more scalable, cost-efficient, and robust video streaming solution. By leveraging WebRTC and peer-to-peer connections, you can reduce the dependency on traditional CDNs, lower bandwidth costs, and enhance the overall streaming experience for your users. -We encourage you to experiment with these integration techniques, explore real-world scenarios, and tailor the solutions to best fit your project’s needs. For additional examples, troubleshooting tips, and community support, please refer to our [GitHub repositories](https://github.com/Novage) and join the ongoing discussions. If you encounter any issues, have suggestions for improvement, or discover bugs, don't hesitate to report them on our GitHub issue tracker. Your feedback is invaluable in helping us enhance the P2P Media Loader experience for everyone. +We encourage you to experiment with these integration techniques, explore real-world scenarios, and tailor the solutions to best fit your project’s needs. For additional examples, troubleshooting tips, and community support, please refer to our [GitHub repositories](https://github.com/Novage) and join the ongoing discussions. If you encounter any issues, have suggestions for improvement, or discover bugs, don't hesitate to report them on our GitHub issue tracker. Your feedback is essential in helping us improve the P2P Media Loader experience for everyone. From 36f3e35a2a110673059edb71912d45f99722ae97 Mon Sep 17 00:00:00 2001 From: Andriy Lysnevych Date: Fri, 7 Feb 2025 16:25:39 +0200 Subject: [PATCH 11/14] Update Integrate-P2P-Video-streaming-into-Mobile-Application.md (#30) * Update Integrate-P2P-Video-streaming-into-Mobile-Application.md * Changes * Remove line * Some fixes * More improvements --- ...Video-streaming-into-Mobile-Application.md | 74 +++++++++---------- ...deo-on-a-web-page-in-5-minutes-for-free.md | 2 +- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md index b1f4f6c..4c2aa89 100644 --- a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md +++ b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md @@ -1,32 +1,36 @@ --- -canonicalURL: https://novage.com.ua/blog/setting-up-P2P-video-in-mobile-app-for-free -author: Dmytro Demchenko -date: "2025-01-29" -title: "Integrate P2P Video Streaming into Mobile Applications: Native Android and Flutter Approaches" -description: "Discover how to integrate P2P Media Loader into your mobile applications to achieve scalable, cost-efficient video streaming. This article explores two practical approaches — Native Android and Flutter — to leverage peer-to-peer (P2P) streaming technology powered by WebRTC. Learn step-by-step integration techniques, review the pros and cons of each method." +canonicalURL: https://novage.com.ua/blog/integrate-p2p-video-streaming-into-mobile-applications +author: Dmytro Demchenko, Andriy Lysnevych +date: "2025-02-07" +title: "Integrate P2P Video Streaming into Mobile Applications" +description: "Discover how to integrate P2P Media Loader into Android and iOS applications to achieve scalable, cost-efficient video streaming. This article explores two practical approaches — Native on Android and Flutter on iOS/Android — to leverage peer-to-peer (P2P) streaming technology powered by WebRTC. Learn step-by-step integration techniques, and review the pros and cons of each method." --- -In today’s rapidly evolving digital landscape, delivering high-quality video content seamlessly and cost-effectively is essential for modern mobile applications. Traditional Content Delivery Networks (CDNs) often face scalability challenges and incur significant bandwidth costs, especially as user bases grow. This is where Peer-to-Peer (P2P) streaming technology steps in. +[P2P Media Loader](https://github.com/Novage/p2p-media-loader) by [Novage](https://novage.com.ua) 🇺🇦 is an open-source JavaScript library that leverages modern web browser features to enable media delivery over peer-to-peer (P2P) connections. The library enables the creation of a huge P2P mesh networks, also known as peer-to-peer content delivery network (P2P CDN), peer-to-peer television (P2PTV), and Enterprise Content Delivery Network (eCDN), which allows traffic sharing among users who are simultaneously viewing the same live or video on demand (VOD) stream via HLS or MPEG-DASH protocols. -P2P streaming enable devices to share video data directly with one another, thereby reducing the load on centralized servers. This approach not only cuts down bandwidth expenses but also enhances streaming performance and scalability. Whether you're developing an on-demand video service, or live-streaming platform, P2P streaming offers a robust alternative that can lead to smoother playback experiences and lower operational costs. - -Enter Peer-to-Peer Streaming Technology with [P2P Media Loader](https://github.com/Novage/p2p-media-loader) — an open-source JavaScript library that leverages modern web browser features to enable media delivery over peer-to-peer connections. The library enables the creation of a huge P2P mesh networks, also known as peer-to-peer content delivery network (P2P CDN), peer-to-peer television (P2PTV), and Enterprise Content Delivery Network (eCDN), which allows traffic sharing among users who are simultaneously viewing the same live or video on demand (VOD) stream via HLS or MPEG-DASH protocols. - -In this article, we will showcase the available integration samples for both iOS and Android, demonstrating how to leverage P2P Media Loader in your mobile applications. Integrations are fully compatible with web-based integration, meaning that whether your users are on the web, iOS, or Android, they all become part of a single, unified P2P network. As a result, traffic is shared more efficiently across platforms, leading to a larger network of peers, reduced traffic costs, and enhanced streaming performance. +In this article, we will showcase the available integration samples for both **iOS** and **Android**, demonstrating how to leverage P2P Media Loader in your mobile applications. Integrations are fully compatible with web-based integration, meaning that whether your users are on the web, iOS, or Android, they all become part of a single, unified peer-to-peer network. As a result, traffic is shared more efficiently across platforms, leading to a larger network of peers, reduced traffic costs, and enhanced streaming performance. ## Flutter Integration (iOS and Android) +In this method, your Flutter application includes a WebView that loads a HTML/JavaScript-based video player. The P2P Media Loader library runs in the WebView context to handle peer-to-peer streaming via WebRTC. + **Pros:** - **Cross-Platform Capability:** Write once, deploy on both Android and iOS, reducing development time and effort for multi-platform support. +- **No Native Video Player Dependencies:** By relying on the WebView rather than each platform’s video player, this approach reduces compatibility issues and streamlines maintenance. + **Cons:** -- **Dependency on WebView:** Integrating P2P via WebView may introduce potential performance bottlenecks. +- **Limited Native Feature Support:** Certain platform-specific features (e.g., Picture-in-Picture, casting, DRM, advanced hardware acceleration, or certain OS-level optimizations) may not be directly accessible or as seamless as with a native player. + +- **Less Control Over Player Lifecycle:** Integrating deeper with the OS-level media controls (lock screen controls, Bluetooth headset events, or background playback) can be more involved than it is with a native player. -The Flutter integration approach uses a WebView that contains a video player with P2P Media Loader integration. Below is a more detailed breakdown for clarity and maintainability: +- **Complex Debugging:** Troubleshooting playback issues, network behavior, or UI glitches can be more challenging, because you have two layers of code: Flutter (Dart) and the embedded web content (HTML/JavaScript). -To setup a video player with P2P Media Loader using webview you need: +- **Cross-Layer Interactions:** When integrating a WebView-based player within a Flutter app, coordinating playback events and controls across Dart and JavaScript can become more complex. + +To setup a video player with P2P Media Loader in a WebView you need: ### 1. Add the WebView Dependency @@ -157,32 +161,30 @@ class MainApp extends StatelessWidget { } ``` -**For a more extensive example that gathers P2P engine stats and manages P2P state according to app lifecycle, see our [P2P Media Loader Flutter Demo](https://github.com/Novage/p2p-media-loader-flutter-demo)** +For a more extensive example that gathers P2P engine stats and manages P2P state according to app lifecycle, check our [P2P Media Loader Flutter Demo](https://github.com/Novage/p2p-media-loader-flutter-demo). + +## Native Android -## Native Android (Kotlin) +In this section, we introduce our [native Android library](https://github.com/Novage/p2p-media-loader-mobile) fully compatible with [ExoPlayer](https://exoplayer.dev/), one of the most popular media players for Android. The library is also designed to support other media players with minimal adjustments. + +Under the hood, it runs the P2P Media Loader within a hidden WebView and uses a local HTTP proxy to feed the peer-to-peer stream into the native player. This approach enables seamless integration of P2P streaming while preserving the performance and feature set of a fully native media player like ExoPlayer. + +![Kotlin Library Architecture](../../assets/kotlin-diagram.png) **Pros:** - **Seamless Integration with Android Ecosystem:** Direct access to Android-specific APIs and features, enabling more comprehensive customization and functionality. -- **Better Control Over Media Playback:** Native players like ExoPlayer offer better control over media streaming. -- **Access to Latest Android Features:** Native development ensures immediate access to the latest Android platform updates and features without waiting for framework support. **Cons:** - **Platform-Specific:** The native approach is limited to Android. -- **Dependency on WebView:** The library internally relies on WebView, it may introduce performance overhead. - -In this section, we introduce our [Kotlin library](https://github.com/Novage/p2p-media-loader-mobile) designed to leverage the capabilities of [P2P Media Loader](https://github.com/novage/p2p-media-loader) and WebRTC for efficient peer-to-peer streaming. -Our native Android library is crafted in Kotlin and is fully compatible with [ExoPlayer](https://exoplayer.dev/), one of the most popular media players for Android. The library is also designed to support other media players with minimal adjustments. +- **HLS only:** The integration is currently limeted to HLS and doesn't support MPEG-DASH streams. -**How the library works?** - -![Kotlin Library Architecture](../../assets/kotlin-diagram.png) -Inside the library we launch embedded HTTP server that will respond on players request. To setup P2P Media Loader we decided to use an off-screen WebView. This approach is lightweight because WebView is a part of OS and no need to bundle external libraries. Additionally, this means that our WEB integration of P2P Media Loader is fully compatible with Native Android integration, as a result consumers may have a bigger mesh of peers to efficiently transfer traffic between each other. +**Note:** The library is in active development, so the API and features might be changed by the time. -**Note:** The library is in development, so the API might be changed by the time. +To setup ExoPlayer with peer-to-peer streaming you need: ### 1. Add JitPack to Your Project @@ -355,23 +357,13 @@ class MainActivity : ComponentActivity() { } ``` -**More examples are available in the library's [repository](https://github.com/Novage/p2p-media-loader-mobile)** - -## Testing P2P with Other Peers - -**Important Note:** P2P (WebRTC) may not connect to the outer world if it runs on Android emulators due to its virtual machine [network configuration](https://developer.android.com/studio/run/emulator-networking) (NAT). Please test P2P connectivity on real devices. - -After integrating the P2P Media Loader into your Flutter application, it's crucial to verify that the peer-to-peer connections are functioning as intended. - -The simpliest way to test is to run the application with integrated P2P on a real device and open our [demo](https://novage.com.ua/p2p-media-loader/demo) with same manifest url. +More examples are available in the library's [repository](https://github.com/Novage/p2p-media-loader-mobile). -**For Production Use:** +## Testing P2P -- Setting up a production WebTorrent tracker. -- Customizing RTC configurations to suit your network conditions. -- Specifying other configuration parameters such as **swarmId** and other settings required for optimal performance. +P2P (WebRTC) may not connect to the outer world if it runs on Android emulator or iOS simulator due to [network configuration](https://developer.android.com/studio/run/emulator-networking) (NAT). Please test P2P connectivity on real devices. -For detailed guidance on production configurations and advanced customizations options, please refer to our [GitHub](https://github.com/Novage) and [documentation](https://novage.github.io/p2p-media-loader/docs/latest/). +The simpliest way to test is to run an application with integrated P2P on a real device and open our [web demo](https://novage.com.ua/p2p-media-loader/demo) with same video URL. ## Conclusion diff --git a/src/content/blog/Setting-up-P2P-video-on-a-web-page-in-5-minutes-for-free.md b/src/content/blog/Setting-up-P2P-video-on-a-web-page-in-5-minutes-for-free.md index ecbcbce..16154f8 100644 --- a/src/content/blog/Setting-up-P2P-video-on-a-web-page-in-5-minutes-for-free.md +++ b/src/content/blog/Setting-up-P2P-video-on-a-web-page-in-5-minutes-for-free.md @@ -2,7 +2,7 @@ canonicalURL: https://novage.com.ua/blog/setting-up-p2p-video-on-a-web-page-in-5-minutes-for-free author: Andriy Lysnevych date: "2019-03-22" -title: "Setting up p2p video on a web page in 5 minutes for free" +title: "Setting up P2P Video on a Web Page in 5 Minutes for Free" description: 'This article will give you instructions on how to easily, quickly and 100% for free enable P2P video delivery on your HTML5 web pages that stream HLS or MPEG-DASH videos with open-source P2P Media Loader JavaScript library by Novage (see the demo).' --- From 95a1f5d4262da9de34ecfca789561913ba68b60e Mon Sep 17 00:00:00 2001 From: DimaDemchenko Date: Fri, 7 Feb 2025 17:34:07 +0200 Subject: [PATCH 12/14] feat: add image to article about mobile integration --- src/assets/flutter_demo_example.jpg | Bin 0 -> 21394 bytes ...P-Video-streaming-into-Mobile-Application.md | 3 ++- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/assets/flutter_demo_example.jpg diff --git a/src/assets/flutter_demo_example.jpg b/src/assets/flutter_demo_example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3341b06467233a689e4365fece1f160fd85cb75f GIT binary patch literal 21394 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 literal 0 HcmV?d00001 diff --git a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md index 4c2aa89..325e5ea 100644 --- a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md +++ b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md @@ -163,6 +163,8 @@ class MainApp extends StatelessWidget { For a more extensive example that gathers P2P engine stats and manages P2P state according to app lifecycle, check our [P2P Media Loader Flutter Demo](https://github.com/Novage/p2p-media-loader-flutter-demo). +![Our Flutter Demo Example](../../assets/flutter_demo_example.jpg) + ## Native Android In this section, we introduce our [native Android library](https://github.com/Novage/p2p-media-loader-mobile) fully compatible with [ExoPlayer](https://exoplayer.dev/), one of the most popular media players for Android. The library is also designed to support other media players with minimal adjustments. @@ -181,7 +183,6 @@ Under the hood, it runs the P2P Media Loader within a hidden WebView and uses a - **HLS only:** The integration is currently limeted to HLS and doesn't support MPEG-DASH streams. - **Note:** The library is in active development, so the API and features might be changed by the time. To setup ExoPlayer with peer-to-peer streaming you need: From 9f62a92b9213d20fd4d7c59d69321273fd176633 Mon Sep 17 00:00:00 2001 From: DimaDemchenko Date: Fri, 7 Feb 2025 17:38:18 +0200 Subject: [PATCH 13/14] build: update dependencies --- package-lock.json | 480 ++++++++++++++++++++++++++++++++-------------- package.json | 4 +- 2 files changed, 338 insertions(+), 146 deletions(-) diff --git a/package-lock.json b/package-lock.json index d53543f..6d3ddd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,8 +12,8 @@ "@astrojs/react": "^4.2.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", - "astro": "^5.1.10", - "p2p-media-loader-demo": "^2.1.1", + "astro": "^5.2.5", + "p2p-media-loader-demo": "^2.1.2", "react": "^18.3.1", "react-dom": "^18.3.1", "typescript": "^5.7.3" @@ -59,9 +59,10 @@ "integrity": "sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==" }, "node_modules/@astrojs/internal-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.4.2.tgz", - "integrity": "sha512-EdDWkC3JJVcpGpqJAU/5hSk2LKXyG3mNGkzGoAuyK+xoPHbaVdSuIWoN1QTnmK3N/gGfaaAfM8gO2KDCAW7S3w==" + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.5.1.tgz", + "integrity": "sha512-M7rAge1n2+aOSxNvKUFa0u/KFn0W+sZy7EW91KOSERotm2Ti8qs+1K0xx3zbOxtAVrmJb5/J98eohVvvEqtNkw==", + "license": "MIT" }, "node_modules/@astrojs/language-server": { "version": "2.15.4", @@ -104,9 +105,10 @@ } }, "node_modules/@astrojs/markdown-remark": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.0.2.tgz", - "integrity": "sha512-aAoHGVRK3rebCYbaLjyyR+3VeAuTz4q49syUxJP29Oo5yZHdy4cCAXRqLBdr9mJVlxCUUjZiF0Dau6YBf65SGg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.1.0.tgz", + "integrity": "sha512-emZNNSTPGgPc3V399Cazpp5+snogjaF04ocOSQn9vy3Kw/eIC4vTQjXOrWDEoSEy+AwPDZX9bQ4wd3bxhpmGgQ==", + "license": "MIT", "dependencies": { "@astrojs/prism": "3.2.0", "github-slugger": "^2.0.0", @@ -121,7 +123,8 @@ "remark-parse": "^11.0.0", "remark-rehype": "^11.1.1", "remark-smartypants": "^3.0.2", - "shiki": "^1.26.2", + "shiki": "^1.29.1", + "smol-toml": "^1.3.1", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", @@ -133,6 +136,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.2.0.tgz", "integrity": "sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==", + "license": "MIT", "dependencies": { "prismjs": "^1.29.0" }, @@ -1695,57 +1699,63 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.1.tgz", - "integrity": "sha512-Mo1gGGkuOYjDu5H8YwzmOuly9vNr8KDVkqj9xiKhhhFS8jisAtDSEWB9hzqRHLVQgFdA310e8XRJcW4tYhRB2A==", - "dependencies": { - "@shikijs/engine-javascript": "1.29.1", - "@shikijs/engine-oniguruma": "1.29.1", - "@shikijs/types": "1.29.1", + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz", + "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==", + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "node_modules/@shikijs/engine-javascript": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.1.tgz", - "integrity": "sha512-Hpi8k9x77rCQ7F/7zxIOUruNkNidMyBnP5qAGbLFqg4kRrg1HZhkB8btib5EXbQWTtLb5gBHOdBwshk20njD7Q==", + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz", + "integrity": "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==", + "license": "MIT", "dependencies": { - "@shikijs/types": "1.29.1", + "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "oniguruma-to-es": "^2.2.0" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.1.tgz", - "integrity": "sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw==", + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", + "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", + "license": "MIT", "dependencies": { - "@shikijs/types": "1.29.1", + "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1" } }, "node_modules/@shikijs/langs": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.1.tgz", - "integrity": "sha512-iERn4HlyuT044/FgrvLOaZgKVKf3PozjKjyV/RZ5GnlyYEAZFcgwHGkYboeBv2IybQG1KVS/e7VGgiAU4JY2Gw==", + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.2.tgz", + "integrity": "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==", + "license": "MIT", "dependencies": { - "@shikijs/types": "1.29.1" + "@shikijs/types": "1.29.2" } }, "node_modules/@shikijs/themes": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.1.tgz", - "integrity": "sha512-lb11zf72Vc9uxkl+aec2oW1HVTHJ2LtgZgumb4Rr6By3y/96VmlU44bkxEb8WBWH3RUtbqAJEN0jljD9cF7H7g==", + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz", + "integrity": "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==", + "license": "MIT", "dependencies": { - "@shikijs/types": "1.29.1" + "@shikijs/types": "1.29.2" } }, "node_modules/@shikijs/types": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.1.tgz", - "integrity": "sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA==", + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", + "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", + "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" @@ -1754,12 +1764,14 @@ "node_modules/@shikijs/vscode-textmate": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.1.tgz", - "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==" + "integrity": "sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==", + "license": "MIT" }, "node_modules/@thaunknown/simple-peer": { "version": "10.0.11", "resolved": "https://registry.npmjs.org/@thaunknown/simple-peer/-/simple-peer-10.0.11.tgz", "integrity": "sha512-A5MdmtZ6HUzRa4gwPOS4jG+09HvpTv2rFo4kk7Vwveo2ELm+WmbO124ZrJrQnZc2D7z2Q3AWKSitjl9OKXO88g==", + "license": "MIT", "dependencies": { "debug": "^4.3.7", "err-code": "^3.0.1", @@ -1772,6 +1784,7 @@ "version": "9.1.3", "resolved": "https://registry.npmjs.org/@thaunknown/simple-websocket/-/simple-websocket-9.1.3.tgz", "integrity": "sha512-pf/FCJsgWtLJiJmIpiSI7acOZVq3bIQCpnNo222UFc8Ph1lOUOTpe6LoYhhiOSKB9GUaWJEVUtZ+sK1/aBgU5Q==", + "license": "MIT", "dependencies": { "debug": "^4.3.5", "queue-microtask": "^1.2.3", @@ -1826,6 +1839,7 @@ "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", "dependencies": { "@types/ms": "*" } @@ -1854,12 +1868,14 @@ "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" }, "node_modules/@types/nlcst": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -2016,6 +2032,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -2038,6 +2055,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/addr-to-ip-port/-/addr-to-ip-port-2.0.0.tgz", "integrity": "sha512-9bYbtjamtdLHZSqVIUXhilOryNPiL+x+Q5J/Unpg4VY3ZIkK3fT52UoErj1NdUeVm3J1t2iBEAur4Ywbl/bahw==", + "license": "MIT", "engines": { "node": ">=12.20.0" } @@ -2139,7 +2157,8 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.2", @@ -2153,6 +2172,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2189,13 +2209,14 @@ } }, "node_modules/astro": { - "version": "5.1.10", - "resolved": "https://registry.npmjs.org/astro/-/astro-5.1.10.tgz", - "integrity": "sha512-qFu4jC7BRlhwHgk9Pa1sTQWw60zYWlriNTt6bMGMKkPxCd4Dd84fGn+NjbrJ/JeKwF7YXX0gY1saDF/RS6TMVA==", + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.2.5.tgz", + "integrity": "sha512-AYXyYkc+c5xbKTm48FyQA91y81nXyNPAaoyafR0LUugE4lAwuvIUcXDBfMzmbuP1lGRvsE33G2oypv6gbGaPFg==", + "license": "MIT", "dependencies": { "@astrojs/compiler": "^2.10.3", - "@astrojs/internal-helpers": "0.4.2", - "@astrojs/markdown-remark": "6.0.2", + "@astrojs/internal-helpers": "0.5.1", + "@astrojs/markdown-remark": "6.1.0", "@astrojs/telemetry": "3.2.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.4", @@ -2221,7 +2242,7 @@ "fast-glob": "^3.3.3", "flattie": "^1.1.1", "github-slugger": "^2.0.0", - "html-escaper": "^3.0.3", + "html-escaper": "3.0.3", "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", @@ -2231,24 +2252,24 @@ "mrmime": "^2.0.0", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", - "p-queue": "^8.0.1", - "preferred-pm": "^4.0.0", + "p-queue": "^8.1.0", + "preferred-pm": "^4.1.1", "prompts": "^2.4.2", "rehype": "^13.0.2", - "semver": "^7.6.3", - "shiki": "^1.29.1", + "semver": "^7.7.1", + "shiki": "^1.29.2", "tinyexec": "^0.3.2", "tsconfck": "^3.1.4", "ultrahtml": "^1.5.3", "unist-util-visit": "^5.0.0", "unstorage": "^1.14.4", "vfile": "^6.0.3", - "vite": "^6.0.9", + "vite": "^6.0.11", "vitefu": "^1.0.5", - "which-pm": "^3.0.0", + "which-pm": "^3.0.1", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", - "yocto-spinner": "^0.1.2", + "yocto-spinner": "^0.2.0", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.1", "zod-to-ts": "^1.2.0" @@ -2329,7 +2350,8 @@ "node_modules/b4a": { "version": "1.6.7", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" + "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "license": "Apache-2.0" }, "node_modules/bail": { "version": "2.0.2", @@ -2349,6 +2371,7 @@ "version": "2.5.4", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", + "license": "Apache-2.0", "optional": true }, "node_modules/base-64": { @@ -2360,6 +2383,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -2387,6 +2411,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz", "integrity": "sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ==", + "license": "MIT", "dependencies": { "uint8-util": "^2.2.2" }, @@ -2422,7 +2447,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/bittorrent-tracker": { "version": "11.2.1", @@ -2442,6 +2468,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "@thaunknown/simple-peer": "^10.0.8", "@thaunknown/simple-websocket": "^9.1.3", @@ -2480,6 +2507,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -2717,6 +2745,7 @@ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.9.tgz", "integrity": "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==", "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { "node-gyp-build": "^4.3.0" @@ -2804,6 +2833,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -2844,7 +2874,8 @@ "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" }, "node_modules/chrome-dgram": { "version": "3.0.6", @@ -2864,6 +2895,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "run-series": "^1.1.9" @@ -3092,6 +3124,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/compact2string/-/compact2string-1.4.1.tgz", "integrity": "sha512-3D+EY5nsRhqnOwDxveBv5T8wGo4DEvYxjDtPGmdOX+gfr5gE92c2RC0w2wa+xEefm07QuVqqcF3nZJUZ92l/og==", + "license": "BSD", "dependencies": { "ipaddr.js": ">= 0.1.5" } @@ -3203,6 +3236,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/cross-fetch-ponyfill/-/cross-fetch-ponyfill-1.0.3.tgz", "integrity": "sha512-uOBkDhUAGAbx/FEzNKkOfx3w57H8xReBBXoZvUnOKTI0FW0Xvrj3GrYv2iZXUqlffC1LMGfQzhmBM/ke+6eTDA==", + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", "node-fetch": "^3.3.0" @@ -3212,6 +3246,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -3650,6 +3685,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", "engines": { "node": ">= 12" } @@ -3674,6 +3710,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, @@ -3686,6 +3723,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -3700,6 +3738,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -3910,9 +3949,10 @@ "dev": true }, "node_modules/eme-encryption-scheme-polyfill": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/eme-encryption-scheme-polyfill/-/eme-encryption-scheme-polyfill-2.2.0.tgz", - "integrity": "sha512-wfgRcR2cGAX0WKbPahhI13dr2mzFQ/rMnoDibRIdScQlv9S0rtnXd25XF17IUdNJw/voJoFpYQp33C3xkFnyEw==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eme-encryption-scheme-polyfill/-/eme-encryption-scheme-polyfill-2.2.1.tgz", + "integrity": "sha512-GzgrLuZPYGijd8oaKuBqYv3Tc2oruDZM3V2982KOuy/PA1N3zwMe+/oIXJYfZ3BH3PwW5nONdBBE+VY6jlwbrw==", + "license": "Apache-2.0" }, "node_modules/emmet": { "version": "2.4.11", @@ -3937,12 +3977,14 @@ "node_modules/emoji-regex-xs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", - "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==" + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "license": "MIT" }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } @@ -3961,7 +4003,8 @@ "node_modules/err-code": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", + "license": "MIT" }, "node_modules/es-define-property": { "version": "1.0.0", @@ -4040,6 +4083,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", "engines": { "node": ">=12" }, @@ -4051,6 +4095,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -4071,6 +4116,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4078,7 +4124,8 @@ "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", @@ -4103,6 +4150,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", "engines": { "node": ">=6" } @@ -4120,7 +4168,8 @@ "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", @@ -4164,6 +4213,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -4203,6 +4253,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.0.tgz", "integrity": "sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==", + "license": "MIT", "engines": { "node": ">=18" }, @@ -4214,6 +4265,7 @@ "version": "1.2.16", "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", + "license": "Apache-2.0", "dependencies": { "micromatch": "^4.0.2", "pkg-dir": "^4.2.0" @@ -4272,6 +4324,7 @@ "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" }, @@ -4282,7 +4335,8 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" }, "node_modules/fsevents": { "version": "2.3.3", @@ -4355,12 +4409,14 @@ "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" }, "node_modules/github-slugger": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", - "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==" + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" }, "node_modules/glob-parent": { "version": "5.1.2", @@ -4405,7 +4461,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" }, "node_modules/h3": { "version": "1.14.0", @@ -4570,6 +4627,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -4594,6 +4652,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -4640,6 +4699,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", @@ -4658,6 +4718,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -4794,6 +4855,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -4807,7 +4869,8 @@ "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, "node_modules/internmap": { "version": "2.0.3", @@ -4820,12 +4883,14 @@ "node_modules/ip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==" + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", + "license": "MIT" }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -4838,6 +4903,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", "engines": { "node": ">= 10" } @@ -5071,6 +5137,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -5081,7 +5148,8 @@ "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" }, "node_modules/jsesc": { "version": "3.1.0", @@ -5127,6 +5195,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.13.0", @@ -5141,6 +5210,7 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -5149,6 +5219,7 @@ "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -5160,7 +5231,8 @@ "node_modules/load-yaml-file/node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" }, "node_modules/loadjs": { "version": "4.3.0", @@ -5191,6 +5263,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5211,6 +5284,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", "integrity": "sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1" }, @@ -5248,6 +5322,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5268,6 +5343,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -5282,6 +5358,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", @@ -5297,6 +5374,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -5320,6 +5398,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", @@ -5338,6 +5417,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -5354,6 +5434,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", @@ -5370,6 +5451,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -5384,6 +5466,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -5400,6 +5483,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", @@ -5415,6 +5499,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" @@ -5448,6 +5533,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -5468,6 +5554,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, @@ -5515,6 +5602,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -5549,6 +5637,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -5572,6 +5661,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", @@ -5591,6 +5681,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", @@ -5606,6 +5697,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", @@ -5625,6 +5717,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -5642,6 +5735,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -5658,6 +5752,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, @@ -5670,6 +5765,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -5696,6 +5792,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -5716,6 +5813,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -5737,6 +5835,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -5756,6 +5855,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -5777,6 +5877,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -5817,6 +5918,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -5835,6 +5937,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -5855,6 +5958,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -5874,6 +5978,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -5892,6 +5997,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -5927,7 +6033,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.1", @@ -5943,6 +6050,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } @@ -5961,6 +6069,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } @@ -5999,6 +6108,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -6101,6 +6211,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -6139,7 +6250,8 @@ "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" }, "node_modules/mrmime": { "version": "2.0.0", @@ -6162,7 +6274,8 @@ "node_modules/nano-md5": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nano-md5/-/nano-md5-1.0.5.tgz", - "integrity": "sha512-1VAOX0EiuwAdCMGpnglxp9r6ylm+gXwQi+UPAnc/Oj1tLLJ8D1I8rLZeiO4MWsUAqH8tuBAHweT1LYSrDfJlPg==" + "integrity": "sha512-1VAOX0EiuwAdCMGpnglxp9r6ylm+gXwQi+UPAnc/Oj1tLLJ8D1I8rLZeiO4MWsUAqH8tuBAHweT1LYSrDfJlPg==", + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.8", @@ -6184,7 +6297,8 @@ "node_modules/napi-build-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==" + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" }, "node_modules/neo-async": { "version": "2.6.2", @@ -6203,6 +6317,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0" }, @@ -6212,9 +6327,10 @@ } }, "node_modules/node-abi": { - "version": "3.73.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.73.0.tgz", - "integrity": "sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==", + "version": "3.74.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz", + "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==", + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -6227,6 +6343,7 @@ "resolved": "https://registry.npmjs.org/node-datachannel/-/node-datachannel-0.12.0.tgz", "integrity": "sha512-pZ9FsVZpHdUKqyWynuCc9IBLkZPJMpDzpNk4YNPCizbIXHYifpYeWqSF35REHGIWi9JMCf11QzapsyQGo/Y4Ig==", "hasInstallScript": true, + "license": "MPL 2.0", "dependencies": { "node-domexception": "^2.0.1", "prebuild-install": "^7.0.1" @@ -6249,6 +6366,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "engines": { "node": ">=16" } @@ -6267,6 +6385,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "engines": { "node": ">=10.5.0" } @@ -6299,6 +6418,7 @@ "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", "optional": true, "bin": { "node-gyp-build": "bin.js", @@ -6443,6 +6563,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -6451,6 +6572,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz", "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==", + "license": "MIT", "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.1.1", @@ -6532,9 +6654,10 @@ } }, "node_modules/p-queue": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.0.1.tgz", - "integrity": "sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.0.tgz", + "integrity": "sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==", + "license": "MIT", "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" @@ -6547,9 +6670,10 @@ } }, "node_modules/p-timeout": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.2.tgz", - "integrity": "sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -6561,14 +6685,16 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/p2p-media-loader-core": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p2p-media-loader-core/-/p2p-media-loader-core-2.1.1.tgz", - "integrity": "sha512-sqQGeAuZejIC0e0gCj1kDqEuGqIewqhtDC2zIkesmJfBCW3gspg2NW8a5zl3H56vFBf3GleyYwgjAV01N2hBvQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/p2p-media-loader-core/-/p2p-media-loader-core-2.1.2.tgz", + "integrity": "sha512-fAeoXANKFRnHF17a706Bd6WtMdi5a9Ac78b39TBaGBWLFGfNWVj249ysuY8c5beLlgpGNnl5J4w9VH+I1UH2nQ==", + "license": "Apache-2.0", "dependencies": { "@types/debug": "^4.1.12", "bittorrent-tracker": "^11.2.1", @@ -6577,21 +6703,22 @@ } }, "node_modules/p2p-media-loader-demo": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p2p-media-loader-demo/-/p2p-media-loader-demo-2.1.1.tgz", - "integrity": "sha512-0OYsUMCVTxkuZnWA+N1bSV70Kmjx48GxggIhaehruqSXAKr1HNCdZGysAzMG20mV5k506nQxFu1gfKx93CmWHg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/p2p-media-loader-demo/-/p2p-media-loader-demo-2.1.2.tgz", + "integrity": "sha512-Z22AdXl90DW0e7KgJk4gPPiMfcHmTkzCnOZ56e4eQ5iFlzeGeSFjMbyBm8FFQqCJ2/LeAAmlvMqjw9wniOR5Lw==", + "license": "Apache-2.0", "dependencies": { "@vidstack/react": "^1.12.12", "d3": "^7.9.0", "dplayer": "^1.27.1", - "hls.js": "^1.5.19", + "hls.js": "^1.5.20", "mediaelement": "^7.0.7", "openplayerjs": "^2.14.7", - "p2p-media-loader-core": "2.1.1", - "p2p-media-loader-hlsjs": "2.1.1", - "p2p-media-loader-shaka": "2.1.1", + "p2p-media-loader-core": "2.1.2", + "p2p-media-loader-hlsjs": "2.1.2", + "p2p-media-loader-shaka": "2.1.2", "plyr": "^3.7.8", - "shaka-player": "^4.12.8" + "shaka-player": "^4.13.2" }, "peerDependencies": { "react": ">=16", @@ -6599,19 +6726,21 @@ } }, "node_modules/p2p-media-loader-hlsjs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-2.1.1.tgz", - "integrity": "sha512-72/5bchePCaHin7/OB58mseCx598ysdHKOsKJow0yygX0YQ/t3oMTF/Cg1RyxpAgSmDvf32cGIAmYsIXGZRSXQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-2.1.2.tgz", + "integrity": "sha512-97iCj6qlyHbBDTDHpbyuKejBdljA0gahq0Fa2B7GhiIJNqPN4nJe0KzycE1Yket8JpDKqGGE1747PpTSz2qLaA==", + "license": "Apache-2.0", "dependencies": { - "p2p-media-loader-core": "2.1.1" + "p2p-media-loader-core": "2.1.2" } }, "node_modules/p2p-media-loader-shaka": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p2p-media-loader-shaka/-/p2p-media-loader-shaka-2.1.1.tgz", - "integrity": "sha512-3ViABRLZOIvwDdxFUu0G2KY7uzA5DBo1F834/TpwYhVv5XGTz9ta67HQVi0JJbZxEnWiLhJ0fse328kBe4mBvg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/p2p-media-loader-shaka/-/p2p-media-loader-shaka-2.1.2.tgz", + "integrity": "sha512-RehhKFkvvRNF6p5+3c1E++kCEFRZ3BMS0nwav+GqD9lMYLLLXQaI0YBuhiS6bL38r266SHM3PFL6vxk4T3YsnQ==", + "license": "Apache-2.0", "dependencies": { - "p2p-media-loader-core": "2.1.1" + "p2p-media-loader-core": "2.1.2" } }, "node_modules/pako": { @@ -6652,6 +6781,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", @@ -6736,6 +6866,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", "engines": { "node": ">=6" } @@ -6744,6 +6875,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -6755,6 +6887,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -6767,6 +6900,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -6778,6 +6912,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -6792,6 +6927,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -6851,6 +6987,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -6873,13 +7010,14 @@ } }, "node_modules/preferred-pm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.0.0.tgz", - "integrity": "sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-4.1.1.tgz", + "integrity": "sha512-rU+ZAv1Ur9jAUZtGPebQVQPzdGhNzaEiQ7VL9+cjsAWPHFYOccNXPNiev1CCDSOg/2j7UujM7ojNhpkuILEVNQ==", + "license": "MIT", "dependencies": { "find-up-simple": "^1.0.0", "find-yarn-workspace-root2": "1.2.16", - "which-pm": "^3.0.0" + "which-pm": "^3.0.1" }, "engines": { "node": ">=18.12" @@ -6918,6 +7056,7 @@ "version": "1.29.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "license": "MIT", "engines": { "node": ">=6" } @@ -6999,6 +7138,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -7053,11 +7193,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, "node_modules/radix3": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", @@ -7066,7 +7201,8 @@ "node_modules/random-iterate": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/random-iterate/-/random-iterate-1.0.1.tgz", - "integrity": "sha512-Jdsdnezu913Ot8qgKgSgs63XkAjEsnMcS1z+cC6D6TNXsUXsMxy0RpclF2pzGZTEiTXL9BiArdGTEexcv4nqcA==" + "integrity": "sha512-Jdsdnezu913Ot8qgKgSgs63XkAjEsnMcS1z+cC6D6TNXsUXsMxy0RpclF2pzGZTEiTXL9BiArdGTEexcv4nqcA==", + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", @@ -7096,6 +7232,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -7166,6 +7303,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz", "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==", + "license": "MIT", "dependencies": { "regex-utilities": "^2.3.0" } @@ -7174,6 +7312,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz", "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==", + "license": "MIT", "dependencies": { "regex": "^5.1.1", "regex-utilities": "^2.3.0" @@ -7182,7 +7321,8 @@ "node_modules/regex-utilities": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" }, "node_modules/rehype": { "version": "13.0.2", @@ -7217,6 +7357,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", @@ -7245,6 +7386,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", @@ -7262,6 +7404,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", @@ -7277,6 +7420,7 @@ "version": "11.1.1", "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -7293,6 +7437,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", @@ -7307,6 +7452,7 @@ "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", @@ -7367,6 +7513,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", @@ -7382,6 +7529,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", @@ -7396,6 +7544,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", @@ -7410,6 +7559,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", @@ -7520,7 +7670,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/rw": { "version": "1.3.3", @@ -7575,9 +7726,10 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -7622,11 +7774,12 @@ } }, "node_modules/shaka-player": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-4.13.0.tgz", - "integrity": "sha512-FZToyYl7IXvt1oMEWVbU0tjWJpJ+oSYpUibNMxSqVQx2pLfSBDfEuodGJV+pRgiydYQ58+VFLftAylDx/Qvfdw==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/shaka-player/-/shaka-player-4.13.2.tgz", + "integrity": "sha512-LbdIJdRB8ZuBR2+MbU+N1cdeVNT/F57Hn+7alurxUm9jLZIXXM+qp/sQIfpoLChdrc+HU2fGI4q1NssHByV4Xw==", + "license": "Apache-2.0", "dependencies": { - "eme-encryption-scheme-polyfill": "^2.2.0" + "eme-encryption-scheme-polyfill": "^2.2.1" }, "engines": { "node": ">=18" @@ -7673,16 +7826,17 @@ } }, "node_modules/shiki": { - "version": "1.29.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.1.tgz", - "integrity": "sha512-TghWKV9pJTd/N+IgAIVJtr0qZkB7FfFCUrrEJc0aRmZupo3D1OCVRknQWVRVA7AX/M0Ld7QfoAruPzr3CnUJuw==", - "dependencies": { - "@shikijs/core": "1.29.1", - "@shikijs/engine-javascript": "1.29.1", - "@shikijs/engine-oniguruma": "1.29.1", - "@shikijs/langs": "1.29.1", - "@shikijs/themes": "1.29.1", - "@shikijs/types": "1.29.1", + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz", + "integrity": "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/langs": "1.29.2", + "@shikijs/themes": "1.29.2", + "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } @@ -7722,7 +7876,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/simple-get": { "version": "4.0.1", @@ -7742,6 +7897,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -7766,15 +7922,29 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, + "node_modules/smol-toml": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.1.tgz", + "integrity": "sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, "node_modules/socks": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -7812,7 +7982,8 @@ "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" }, "node_modules/stream-browserify": { "version": "3.0.0", @@ -7837,12 +8008,12 @@ } }, "node_modules/streamx": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", - "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", + "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" }, "optionalDependencies": { @@ -7877,6 +8048,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/string2compact/-/string2compact-2.0.1.tgz", "integrity": "sha512-Bm/T8lHMTRXw+u83LE+OW7fXmC/wM+Mbccfdo533ajSBNxddDHlRrvxE49NdciGHgXkUQM5WYskJ7uTkbBUI0A==", + "license": "MIT", "dependencies": { "addr-to-ip-port": "^2.0.0", "ipaddr.js": "^2.0.0" @@ -7916,6 +8088,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", "engines": { "node": ">=4" } @@ -7924,6 +8097,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7961,6 +8135,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -7972,6 +8147,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -7987,6 +8163,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" } @@ -8077,6 +8254,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -8141,6 +8319,7 @@ "version": "2.2.5", "resolved": "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.5.tgz", "integrity": "sha512-/QxVQD7CttWpVUKVPz9znO+3Dd4BdTSnFQ7pv/4drVhC9m4BaL2LFHTkJn6EsYoxT79VDq/2Gg8L0H22PrzyMw==", + "license": "MIT", "dependencies": { "base64-arraybuffer": "^1.0.2" } @@ -8189,6 +8368,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" @@ -8214,6 +8394,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" @@ -8239,6 +8420,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" @@ -8278,6 +8460,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, @@ -8302,7 +8485,8 @@ "node_modules/unordered-array-remove": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", - "integrity": "sha512-45YsfD6svkgaCBNyvD+dFHm4qFX9g3wRSIVgWVPtm2OCnphvPxzJoe20ATsiNpNJrmzHifnxm+BN5F7gFT/4gw==" + "integrity": "sha512-45YsfD6svkgaCBNyvD+dFHm4qFX9g3wRSIVgWVPtm2OCnphvPxzJoe20ATsiNpNJrmzHifnxm+BN5F7gFT/4gw==", + "license": "MIT" }, "node_modules/unstorage": { "version": "1.14.4", @@ -8483,6 +8667,7 @@ "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-6.0.5.tgz", "integrity": "sha512-EYZR+OpIXp9Y1eG1iueg8KRsY8TuT8VNgnanZ0uA3STqhHQTLwbl+WX76/9X5OY12yQubymBpaBSmMPkSTQcKA==", "hasInstallScript": true, + "license": "MIT", "optional": true, "dependencies": { "node-gyp-build": "^4.3.0" @@ -8889,6 +9074,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", "engines": { "node": ">= 8" } @@ -8902,6 +9088,7 @@ "version": "1.1.10", "resolved": "https://registry.npmjs.org/webrtc-polyfill/-/webrtc-polyfill-1.1.10.tgz", "integrity": "sha512-sOn0bj3/noUdzQX7rvk0jFbBurqWDGGo2ipl+WfgoOe/x3cxbGLk/ZUY+WHCISSlLaIeBumi1X3wxQZnUESExQ==", + "license": "MIT", "dependencies": { "node-datachannel": "^v0.12.0", "node-domexception": "^1.0.0" @@ -8920,9 +9107,10 @@ } }, "node_modules/which-pm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-3.0.0.tgz", - "integrity": "sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-3.0.1.tgz", + "integrity": "sha512-v2JrMq0waAI4ju1xU5x3blsxBBMgdgZve580iYMN5frDaLGjbA24fok7wKCsya8KLVO19Ju4XDc5+zTZCJkQfg==", + "license": "MIT", "dependencies": { "load-yaml-file": "^0.2.0" }, @@ -8995,12 +9183,14 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -9213,9 +9403,10 @@ } }, "node_modules/yocto-spinner": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.1.2.tgz", - "integrity": "sha512-VfmLIh/ZSZOJnVRQZc/dvpPP90lWL4G0bmxQMP0+U/2vKBA8GSpcBuWv17y7F+CZItRuO97HN1wdbb4p10uhOg==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.0.tgz", + "integrity": "sha512-Qu6WAqNLGleB687CCGcmgHIo8l+J19MX/32UrSMfbf/4L8gLoxjpOYoiHT1asiWyqvjRZbgvOhLlvne6E5Tbdw==", + "license": "MIT", "dependencies": { "yoctocolors": "^2.1.1" }, @@ -9230,6 +9421,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "license": "MIT", "engines": { "node": ">=18" }, diff --git a/package.json b/package.json index 721ab9c..f447059 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,8 @@ "@astrojs/react": "^4.2.0", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", - "astro": "^5.1.10", - "p2p-media-loader-demo": "^2.1.1", + "astro": "^5.2.5", + "p2p-media-loader-demo": "^2.1.2", "react": "^18.3.1", "react-dom": "^18.3.1", "typescript": "^5.7.3" From cda6a4b35c7cd47f8a52db18ea83b53995c1574b Mon Sep 17 00:00:00 2001 From: Andriy Lysnevych Date: Fri, 7 Feb 2025 15:51:44 +0000 Subject: [PATCH 14/14] Move image to the top of the chapter --- .../Integrate-P2P-Video-streaming-into-Mobile-Application.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md index 325e5ea..004caec 100644 --- a/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md +++ b/src/content/blog/Integrate-P2P-Video-streaming-into-Mobile-Application.md @@ -12,6 +12,8 @@ In this article, we will showcase the available integration samples for both **i ## Flutter Integration (iOS and Android) +![Our Flutter Demo Example](../../assets/flutter_demo_example.jpg) + In this method, your Flutter application includes a WebView that loads a HTML/JavaScript-based video player. The P2P Media Loader library runs in the WebView context to handle peer-to-peer streaming via WebRTC. **Pros:** @@ -163,8 +165,6 @@ class MainApp extends StatelessWidget { For a more extensive example that gathers P2P engine stats and manages P2P state according to app lifecycle, check our [P2P Media Loader Flutter Demo](https://github.com/Novage/p2p-media-loader-flutter-demo). -![Our Flutter Demo Example](../../assets/flutter_demo_example.jpg) - ## Native Android In this section, we introduce our [native Android library](https://github.com/Novage/p2p-media-loader-mobile) fully compatible with [ExoPlayer](https://exoplayer.dev/), one of the most popular media players for Android. The library is also designed to support other media players with minimal adjustments.